快速掌握mysql,可备用查找相关用法(吐血整理)
MySQL使用指南
1.mysql創建數據庫以及相關操作 1
2. mysql常用數據類型 1
3. mysql數據表操作 2
3.1創建表與刪除表 2
3.2添加主鍵 2
3.3添加外鍵 3
3.4其他表操作 3
4. mysql基本操作CRUD 4
4.1插入記錄 4
4.2刪除記錄 4
4.3修改記錄 4
4.4查詢記錄 5
5. mysql查詢語句 5
5.1基礎查詢 5
5.2條件查詢 5
(1) 運算符 5
(2)關鍵字 5
5.3模糊查詢 6
關鍵字 6
通配符 6
5.4排序 6
升序 6
降序 6
5.5聚合函數 6
5.6分組查詢 7
5.7分頁查詢 8
6. mysql多表查詢 8
6.1 union合并結果集 8
6.2普通多表查詢 9
(1) 直接合并兩個表 9
(2)給限定條件合并兩個表 9
6.3連接查詢 10
(1)內連接inner 10
(2) 外連接outer 10
(3) 自然連接natural 10
7.mysql子查詢 11
(1)子查詢出現的位置 11
(2)當子查詢出現在where后作為條件時,可以使用any,all兩個關鍵字 11
?
?
?
1.mysql創建數據庫以及相關操作
創建數據庫:
create database 數據庫名; ?
eg. CREATE DATABASE mydb;
?
刪除數據庫:
drop database 數據庫名;
eg. drop database mydb;
?
啟用數據庫:
use 數據庫名; ????????
eg. USE mydb;
?
查詢當前用戶下的所有數據庫:
SHOW DATABASES;
?
查詢當前連接數據庫的信息:
SHOW CREATE DATABASE 數據庫名;
eg. SHOW CREATE DATABASE mydb;
?
顯示當前所連接的數據庫下所有表:
SHOW TABLES;
?
2.mysql常用數據類型
int?整型
?
double?浮點型
double(6,2) 表示 總位數6位 小數點后2位
?
varchar?可變長度字符
varchar(10) ?'aa' 占兩個字節 ??
數據庫中 utf-8編碼(出中文外一個字符一個字節,中文占3個字節 )
?
char?不可變長度字符串類型
char(10) 10表示的是字節數 ?'aa '占十個字節
?
日期類
date 日期形 yyyy-MM-dd 格式
time 事件形 hh:mm:ss
timestamp 時間戳 yyyy-MM-dd hh:mm:ss
注意時間戳在MySQL中會自動的賦值 在insert 語句中給null 就可以
datetime 日期時間 yyyy-MM-dd hh:mm:ss
3.mysql數據表操作
3.1創建表與刪除表
創建表
CREATE TABLE?users(
uid INT PRIMARY KEY AUTO_INCREMENT,
uname VARCHAR(20) NOT NULL,
upass VARCHAR(20) NOT NULL,
age INT);
?
刪除表
drop table users;
?
3.2添加主鍵
(1) 開頭聲明主鍵
create table users (?
username varchar(50) primary key?
);
(2)結尾聲明主鍵
create table users(?
username varchar(50) ,?
userpwd varchar(50),?
primary key (username)?
);
(3)聲明聯合主鍵?
create table users(?
username varchar(50),?
userpwd varchar(50),?
birth datetime,?
primary key (username, userpwd)?
);
(4)創建表后在添加主鍵
create table users (?
username varchar(50),?
userpwd varchar(50)?
);
alter table users add primary key (username, userpwd);
?
?
?
?
?
?
?
3.3添加外鍵
(1) 添加一個外鍵
create table users(?
username varchar(50),?
role_id int ,?
constraint fk_users_roles foreign key (role_id) references roles(roleid)?
);
?
添加外鍵時:constraint fk_users_roles 可以省略
簡寫為:foreign key (role_id) references roles(roleid)?
(2)添加兩個兩個外鍵
CREATE TABLE roles_menus (?
roles_id INT ,?
menus_id INT,?
PRIMARY KEY (roles_id, menus_id),?
CONSTRAINT fk_users_roles FOREIGN KEY (roles_id) REFERENCES roles(roleid),?
CONSTRAINT fk_users_menus FOREIGN KEY (menus_id) REFERENCES menus(menuid)?
);
?
(3)創建表后再添加外鍵
create table users(?
username varchar (50) primary key,?
role_id int?
);
alter table users add constraint fk_users_roles foreign key (role_id) references roles(roleid);
?
備注:添加外鍵前,必須先創建被參照表
?
3.4其他表操作
(1)創建表后添加或刪除列
alter table student add?score?int;?
alter table?student drop?score;?
(2)修改表某字段類型
alter table student modify age text;?
(3)修改字段名稱
alter table?stu change age ag int;?
(4)修改表名
rename table student to?stu;?
(5)查看表字段信息
desc?student;?
?
?
?
?
4.mysql基本操作CRUD
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(30),
sage INT,
gender VARCHAR(10));
?
4.1插入記錄
(1)插入單條記錄
INSERT INTO student(sid,sname,sage,gender) VALUES(8,"金鳳",20,"女");
INSERT INTO student VALUES(10,"無名",21,"男");
?
(2)插入多條記錄
INSERT INTO student(sid,sname,sage,gender) VALUES
(1,"張三",20,"男"),
(2,"李四",18,"男"),
(3,"王五",22,"男"),
(4,"趙六",21,"男");
或
INSERT INTO student VALUES
(1,"張三",20,"男"),
(2,"李四",18,"男");
?
(3)插入指定字段
INSERT INTO student(sid,sname) VALUES(5,"沈佳1");
INSERT INTO student(sid,sname) VALUES(6,"沈佳2"),(7,"沈佳2");
?
4.2刪除記錄
DELETE FROM student WHERE sid=1 OR sid=2;
DELETE FROM student;//刪除所有數據,表結構還在
TRUNCATE TABLE student2;?//刪除整個表(包括表結構),再創建表結構
?
4.3修改記錄
update student set age=25;?
update student set age=15,name=”哈哈” where id=1 ;?
?
?
?
?
?
?
?
?
4.4查詢記錄
select 列名1,列名2,…….,列名n ?from 表名 where 條件 group by 列名 having 條件 order by 列名?limit 偏移量,記錄條數;
說明:
? 1.where condition //條件,分組前的過濾條件,其實就是對整個表進行第一次篩選;有一張虛擬表1
? 2.group by group_columns //對結果進行分組,對第一次結果虛擬表1進行分組;得到一個虛擬表2
? 3.having condition //分組后的行條件,對虛擬表2進行條件篩選,得到一個虛擬表3
? 4.order by sorting_colunms //對結果排序 ?對虛擬表3再次進行排序;
5.limit offset_start,row_count //結果限定 ??又一次篩選查詢 ,常用來分頁
?
5.mysql查詢語句
5.1基礎查詢
(1)查詢所有字段
SELECT * FROM student;
SELECT sid,sname,sage,gender FROM student;
?
(2)查詢指定字段
SELECT sid,sname FROM student;
?
使用別名:as可以省略
SELECT sid 學號,sname 學生姓名 FROM student;
SELECT sid AS 學號,sname AS 學生姓名 FROM student;
?
5.2條件查詢
(1)運算符?
=、!=、<>(不等于)、<、<=、>、>=;
(2)關鍵字
BETWEEN…AND;NOT BETWEEN…AND
SELECT * FROM student WHERE sage BETWEEN 20 AND 22; ???[20,22]中所有記錄
SELECT * FROM student WHERE sage NOT BETWEEN 20 AND 22; ???[20,22]以外所有記錄
?
IN(set);NOT IN(set)
SELECT * FROM student WHERE sage IN(20,23,222); ?取交集
等價于SELECT * FROM student WHERE sage=20 OR sage=23 OR sage=222;
?
IS NULL; IS NOT NULL
SELECT * FROM student WHERE gender IS NULL; ?
取出gender為null(空)的字段--這里null為:未初始化,未賦值
區別:SELECT * FROM student WHERE gender=NULL; ?
取出gender值為null的記錄,已初始化只是賦值為null
SELECT * FROM student WHERE gender IS NOT NULL;
AND;OR;NOT
SELECT * FROM student WHERE NOT sname='張三';
5.3模糊查詢
關鍵字
like ????模式匹配
not like ?去模式匹配相反的結果
通配符
_ ??任意一個字符 ????相當于占位符,一個 _ 占一位,該位的內容可以任意
% ??任意0~n個字符 ??相當于Java中*,表示任意字符且長短也任意
?
SELECT * FROM student WHERE sage LIKE '_3'; ?取出年齡為2位數,且結尾是3的記錄
SELECT * FROM student WHERE sage LIKE '%3'; ?取出年齡的位數任意,結尾是3的記錄
SELECT * FROM student WHERE sname LIKE '%張%'; 取出名字中含有”張”的記錄
SELECT * FROM student WHERE sname NOT LIKE '%張%';
?
備注:無論字段是何類型,模式匹配時,匹配內容必須放在引號中。
??錯誤語句:SELECT * FROM student WHERE sage LIKE _3; ?
??原因:以為sage是整數,沒將匹配內容放在引號中
5.4排序
升序
order by 列名 asc(默認) ????按主鍵升序排列
降序
order by 列名 desc
?
SELECT * FROM student ORDER BY sage DESC; ??按sage降序排列
SELECT * FROM student ORDER BY sage ASC; ???按sage升序排列
SELECT * FROM student WHERE sage>20 ORDER BY sage DESC; ?先篩選再排序
(3)字段控制
distinct:去除重復
SELECT DISTINCT * FROM student; ?去除每個字段都一樣的記錄 ?[取出所有不重復的記錄]
SELECT DISTINCT sname FROM student; ?去除名字相同的記錄 ???[取出所有不重復的名字]
SELECT DISTINCT sname,sage FROM student; ?去除名字和年齡均相同的記錄
?
備注:distinct只能放在select和from之間,修飾字段
??distinct前不能有其他字段 eg. SELECT sid,DISTINCT sname,sage FROM student;
?
5.5聚合函數
特點:聚合函數是用來做縱向運算的函數:
COUNT():統計指定列不為NULL的記錄行數;
MAX():計算指定列的最大值;
MIN():計算指定列的最小值;
SUM():計算指定列的數值和(非數值計算結果為0);
AVG():計算指定列的平均值(非數值計算結果為0);
?
SELECT COUNT(sid) 學生人數,MAX(sage) 學生最大年齡,MIN(sage) 學生最小年齡,AVG(sage) 學生平均年齡 FROM student;
?
備注:
a.數值類型和非數值類型無法做加法運算
b.數值類型和空數值做加法運算:把NULL轉換成數值0的函數IFNULL,例如IFNULL(列名,0)
c.直接拿某個字段值與null進行運算,結果均為null
d.聚合函數sum,max,min,avg等等,內部對null值做了處理,結果不會直接是null
?
數值和非數值運算
進行加減乘除運算時,非數值默認為0(非數值必須是初始化的,即已賦值的)
SELECT sname,sage,sname+sage FROM student;
SELECT sname,sage,sname*sage FROM student;
?
NULL處理,IFNULL(列名,0)
條件:sid=10學生年齡為初始化,為null
SELECT sid,sage,sid+sage FROM student WHERE sid=10; ?結果為null
SELECT sid,sage,sid+IFNULL(sage,0) FROM student WHERE sid=10; ?結果為sid的值10
?
5.6分組查詢
group by 字段 [having 條件]
根據性別進行分組,并計算每組中的人數
SELECT gender,COUNT(*) FROM student GROUP BY gender;
根據性別進行分組,再取出性別為女的組,并計算該組人數
SELECT gender,COUNT(*) FROM student GROUP BY gender HAVING gender='女';
同上(備注:某些記錄的gender字段沒有初始化,所以為null,即按性別分有3組)
SELECT gender,COUNT(*) FROM student GROUP BY gender HAVING gender IN ('女','男');
?
having與where的區別:
1.having是在分組后對數據進行過濾,后面可以直接使用聚合函數
2.having緊跟group by,它們是一個整體
3.where是在分組前對數據進行過濾,不可以直接使用聚合函數
?
having和where + 聚合函數分析
a.having+聚合函數
SELECT gender,COUNT(*),SUM(sage) FROM student GROUP BY gender HAVING SUM(sage)>43;
SELECT gender,COUNT(*),AVG(sage) FROM student GROUP BY gender HAVING AVG(sage)>22;
默認根據分組后的結果,計算每組的SUM,再與43比較
默認根據分組后的結果,計算每組的AVG,再與22比較
?
b.where直接加聚合函數
SELECT * FROM student WHERE sage>AVG(sage);
報錯:因為mysql引擎不知道計算什么條件下的AVG,改為如下語句則正常執行
SELECT *,AVG(sage) FROM student WHERE sage>(SELECT AVG(sage) FROM student);
5.7分頁查詢
select * from ?表名 ?limit 參數1,參數2
參數1:offset,偏移量 ?????????可省略,默認offset=0
參數2:查詢返回的最大記錄數 ??不可省略
?
偏移量理解:offset=n 表示前面n條數據不用管,從n+1條開始查詢
?
若總記錄數小于5,則有幾條就返回幾條;否則返回5條
SELECT * FROM student LIMIT 5; ?默認偏移量為0,則從第一條數據開始,獲得5條記錄
SELECT * FROM student LIMIT 0,5; 效果同上
?
若去除前7條記錄后,剩下總記錄數小于5,則有幾條就返回幾條;否則返回5條
SELECT * FROM student LIMIT 7,5; 偏移量為7,則從第8條數據開始,獲取5條記錄
?
6.mysql多表查詢
為什么要拆表:去除冗余數據(注意區別于分表)
表與表之間的關系:一對一,一對多(多對一),多對多
?
6.1 union合并結果集
UNION:去除重復數據。例如 select * from t1 UNION select * from t2
UNION ALL:不去除重復紀錄,全部保留。例如 select * from t1 UNION ALL select * from t2
?
重復:指記錄的每個字段完全一樣,若主鍵一樣,其他字段不一樣,是不會去除的
注意:union合并的兩個表或報表的列數,列類型必須相同,列名可以不同
?
CREATE TABLE t1(
tid INT PRIMARY KEY,
tname VARCHAR(20));
?
CREATE TABLE t2(
tid INT PRIMARY KEY,
tn VARCHAR(20));
?
報表與基本表合并
SELECT * FROM t1 UNION SELECT sid,sname FROM student;
兩個完全相同表合并
select * from t1 UNION select * from t2
?
union合并:相當于是將分表合并在一起,這兩個表的結構完全一樣,只是列名可能有差異。
union是將表t2一條條記錄insert進t1表,不會再左側或右側產生新的字段。
?
?
?
6.2普通多表查詢
普通多表查詢相當于下面的內連接,
區別:內連接限定條件的關鍵詞是on,普通多表查詢使用where
?
創員工表emp和部門表dept
CREATE TABLE emp(
empno INT PRIMARY KEY,
ename VARCHAR(20),
job VARCHAR(20),
sal DOUBLE(6,2),
deptno INT);
?
CREATE TABLE dept(
deptno INT PRIMARY KEY,
dname VARCHAR(20),
loc VARCHAR(20));
?
(1)直接合并兩個表
因為沒有給限定條件,所以會產生笛卡爾積
公式:合并后的總記錄數=emp表記錄數*dept表記錄數
| ? |
?
SELECT * FROM emp,dept; ?????等價于內連接:SELECT * FROM emp JOIN dept;
SELECT e.empno,e.ename,e.job,e.sal,d.dname,d.loc FROM emp e,dept d;
?
(2)給限定條件合并兩個表
SELECT * FROM emp e,dept d WHERE e.deptno=d.deptno;
等價于內連接:SELECT * FROM emp e JOIN dept d ON e.deptno=d.deptno;
?
?
6.3連接查詢
(1)內連接inner
語法:select 列名 from 表1 inner ?join 表2 ?on 條件
inner可以省略,只有join關鍵字,mysql默認是內連接
可以沒有on條件
?
SELECT * FROM emp INNER JOIN dept;
SELECT * FROM emp JOIN dept;
SELECT * FROM emp e JOIN dept d ON e.deptno=d.deptno;
?
(2)外連接outer
語法:select 列名 from 表1 left/right ?outer ?join 表2 ?on 條件
outer可省略
必須有on條件
分為左連接和右連接,兩者恰好相反
a.左連接left
左連接是先查詢出左表,然后查詢右表,右表中滿足條件的顯示出來,不滿足的顯示NULL
(先查詢t1表,再根據后面條件查詢t2表中滿足條件的數據)
SELECT * FROM emp e LEFT JOIN dept d ON e.deptno=d.deptno;(outer可以省略)
?
b.右連接right
右連接就是先把右表中所有記錄都查詢出來,然后左表滿足條件的顯示,不滿足顯示NULL
SELECT * FROM emp e RIGHT JOIN dept d ON e.deptno=d.deptno;
?
(3)自然連接natural
自動去除無用重復信息
語法:select 列 from 表1 natural join 表2;
?
內連接和自然連接比較
a.內連接 ?????SELECT * FROM emp INNER JOIN dept;
b.自然連接 ??SELECT * FROM emp NATURAL JOIN dept;
自然連接:1.默認根據兩個表中的相同字段去除重復,emp和dept中都有deptno,
? ??則根據e.deptno=d.deptno來去除重復
??2.若兩個表沒有相同字段,則會直接合并產生笛卡爾積
?
natural可以修飾外連接,此時可以不需要on條件,因為若有相同字段,natural默認會根據該字段進行限定。若是沒有相同字段,不會像使用外連接時,不加on時(SELECT * FROM emp LEFT JOIN dept;),直接報錯,而是產生笛卡爾積?!净蛘哒fleft和不存才是一樣的,因為只有natural時,也是同樣的效果,并且有left時,也不能加on來限制】
SELECT * FROM emp NATURAL LEFT JOIN dept;
?
?
?
?
7.mysql子查詢
定義:子查詢就是嵌套查詢,即select中包含select,如果一條語句中存在兩個或者兩個以上select,那么就是子查詢了
?
(1)子查詢出現的位置
where后,作為條件查詢的中條件的一部分
from后,作為表使用
?
(2)當子查詢出現在where后作為條件時,可以使用any,all兩個關鍵字
?
SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname='銷售部');
等價SELECT * FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname='銷售部');
?
總結
以上是生活随笔為你收集整理的快速掌握mysql,可备用查找相关用法(吐血整理)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中switch语句支持的类型
- 下一篇: 数据库索引的作用和优点缺点以及索引的11