快速掌握mysql,可备用查找相关用法(吐血整理)
MySQL使用指南
1.mysql創(chuàng)建數(shù)據(jù)庫以及相關(guān)操作 1
2. mysql常用數(shù)據(jù)類型 1
3. mysql數(shù)據(jù)表操作 2
3.1創(chuàng)建表與刪除表 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基礎(chǔ)查詢 5
5.2條件查詢 5
(1) 運算符 5
(2)關(guān)鍵字 5
5.3模糊查詢 6
關(guān)鍵字 6
通配符 6
5.4排序 6
升序 6
降序 6
5.5聚合函數(shù) 6
5.6分組查詢 7
5.7分頁查詢 8
6. mysql多表查詢 8
6.1 union合并結(jié)果集 8
6.2普通多表查詢 9
(1) 直接合并兩個表 9
(2)給限定條件合并兩個表 9
6.3連接查詢 10
(1)內(nèi)連接inner 10
(2) 外連接outer 10
(3) 自然連接natural 10
7.mysql子查詢 11
(1)子查詢出現(xiàn)的位置 11
(2)當(dāng)子查詢出現(xiàn)在where后作為條件時,可以使用any,all兩個關(guān)鍵字 11
?
?
?
1.mysql創(chuàng)建數(shù)據(jù)庫以及相關(guān)操作
創(chuàng)建數(shù)據(jù)庫:
create database 數(shù)據(jù)庫名; ?
eg. CREATE DATABASE mydb;
?
刪除數(shù)據(jù)庫:
drop database 數(shù)據(jù)庫名;
eg. drop database mydb;
?
啟用數(shù)據(jù)庫:
use 數(shù)據(jù)庫名; ????????
eg. USE mydb;
?
查詢當(dāng)前用戶下的所有數(shù)據(jù)庫:
SHOW DATABASES;
?
查詢當(dāng)前連接數(shù)據(jù)庫的信息:
SHOW CREATE DATABASE 數(shù)據(jù)庫名;
eg. SHOW CREATE DATABASE mydb;
?
顯示當(dāng)前所連接的數(shù)據(jù)庫下所有表:
SHOW TABLES;
?
2.mysql常用數(shù)據(jù)類型
int?整型
?
double?浮點型
double(6,2) 表示 總位數(shù)6位 小數(shù)點后2位
?
varchar?可變長度字符
varchar(10) ?'aa' 占兩個字節(jié) ??
數(shù)據(jù)庫中 utf-8編碼(出中文外一個字符一個字節(jié),中文占3個字節(jié) )
?
char?不可變長度字符串類型
char(10) 10表示的是字節(jié)數(shù) ?'aa '占十個字節(jié)
?
日期類
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數(shù)據(jù)表操作
3.1創(chuàng)建表與刪除表
創(chuàng)建表
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)結(jié)尾聲明主鍵
create table users(?
username varchar(50) ,?
userpwd varchar(50),?
primary key (username)?
);
(3)聲明聯(lián)合主鍵?
create table users(?
username varchar(50),?
userpwd varchar(50),?
birth datetime,?
primary key (username, userpwd)?
);
(4)創(chuàng)建表后在添加主鍵
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)創(chuàng)建表后再添加外鍵
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);
?
備注:添加外鍵前,必須先創(chuàng)建被參照表
?
3.4其他表操作
(1)創(chuàng)建表后添加或刪除列
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;//刪除所有數(shù)據(jù),表結(jié)構(gòu)還在
TRUNCATE TABLE student2;?//刪除整個表(包括表結(jié)構(gòu)),再創(chuàng)建表結(jié)構(gòu)
?
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 偏移量,記錄條數(shù);
說明:
? 1.where condition //條件,分組前的過濾條件,其實就是對整個表進行第一次篩選;有一張?zhí)摂M表1
? 2.group by group_columns //對結(jié)果進行分組,對第一次結(jié)果虛擬表1進行分組;得到一個虛擬表2
? 3.having condition //分組后的行條件,對虛擬表2進行條件篩選,得到一個虛擬表3
? 4.order by sorting_colunms //對結(jié)果排序 ?對虛擬表3再次進行排序;
5.limit offset_start,row_count //結(jié)果限定 ??又一次篩選查詢 ,常用來分頁
?
5.mysql查詢語句
5.1基礎(chǔ)查詢
(1)查詢所有字段
SELECT * FROM student;
SELECT sid,sname,sage,gender FROM student;
?
(2)查詢指定字段
SELECT sid,sname FROM student;
?
使用別名:as可以省略
SELECT sid 學(xué)號,sname 學(xué)生姓名 FROM student;
SELECT sid AS 學(xué)號,sname AS 學(xué)生姓名 FROM student;
?
5.2條件查詢
(1)運算符?
=、!=、<>(不等于)、<、<=、>、>=;
(2)關(guān)鍵字
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為:未初始化,未賦值
區(qū)別: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模糊查詢
關(guān)鍵字
like ????模式匹配
not like ?去模式匹配相反的結(jié)果
通配符
_ ??任意一個字符 ????相當(dāng)于占位符,一個 _ 占一位,該位的內(nèi)容可以任意
% ??任意0~n個字符 ??相當(dāng)于Java中*,表示任意字符且長短也任意
?
SELECT * FROM student WHERE sage LIKE '_3'; ?取出年齡為2位數(shù),且結(jié)尾是3的記錄
SELECT * FROM student WHERE sage LIKE '%3'; ?取出年齡的位數(shù)任意,結(jié)尾是3的記錄
SELECT * FROM student WHERE sname LIKE '%張%'; 取出名字中含有”張”的記錄
SELECT * FROM student WHERE sname NOT LIKE '%張%';
?
備注:無論字段是何類型,模式匹配時,匹配內(nèi)容必須放在引號中。
??錯誤語句:SELECT * FROM student WHERE sage LIKE _3; ?
??原因:以為sage是整數(shù),沒將匹配內(nèi)容放在引號中
5.4排序
升序
order by 列名 asc(默認(rèn)) ????按主鍵升序排列
降序
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:去除重復(fù)
SELECT DISTINCT * FROM student; ?去除每個字段都一樣的記錄 ?[取出所有不重復(fù)的記錄]
SELECT DISTINCT sname FROM student; ?去除名字相同的記錄 ???[取出所有不重復(fù)的名字]
SELECT DISTINCT sname,sage FROM student; ?去除名字和年齡均相同的記錄
?
備注:distinct只能放在select和from之間,修飾字段
??distinct前不能有其他字段 eg. SELECT sid,DISTINCT sname,sage FROM student;
?
5.5聚合函數(shù)
特點:聚合函數(shù)是用來做縱向運算的函數(shù):
COUNT():統(tǒng)計指定列不為NULL的記錄行數(shù);
MAX():計算指定列的最大值;
MIN():計算指定列的最小值;
SUM():計算指定列的數(shù)值和(非數(shù)值計算結(jié)果為0);
AVG():計算指定列的平均值(非數(shù)值計算結(jié)果為0);
?
SELECT COUNT(sid) 學(xué)生人數(shù),MAX(sage) 學(xué)生最大年齡,MIN(sage) 學(xué)生最小年齡,AVG(sage) 學(xué)生平均年齡 FROM student;
?
備注:
a.數(shù)值類型和非數(shù)值類型無法做加法運算
b.數(shù)值類型和空數(shù)值做加法運算:把NULL轉(zhuǎn)換成數(shù)值0的函數(shù)IFNULL,例如IFNULL(列名,0)
c.直接拿某個字段值與null進行運算,結(jié)果均為null
d.聚合函數(shù)sum,max,min,avg等等,內(nèi)部對null值做了處理,結(jié)果不會直接是null
?
數(shù)值和非數(shù)值運算
進行加減乘除運算時,非數(shù)值默認(rèn)為0(非數(shù)值必須是初始化的,即已賦值的)
SELECT sname,sage,sname+sage FROM student;
SELECT sname,sage,sname*sage FROM student;
?
NULL處理,IFNULL(列名,0)
條件:sid=10學(xué)生年齡為初始化,為null
SELECT sid,sage,sid+sage FROM student WHERE sid=10; ?結(jié)果為null
SELECT sid,sage,sid+IFNULL(sage,0) FROM student WHERE sid=10; ?結(jié)果為sid的值10
?
5.6分組查詢
group by 字段 [having 條件]
根據(jù)性別進行分組,并計算每組中的人數(shù)
SELECT gender,COUNT(*) FROM student GROUP BY gender;
根據(jù)性別進行分組,再取出性別為女的組,并計算該組人數(shù)
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的區(qū)別:
1.having是在分組后對數(shù)據(jù)進行過濾,后面可以直接使用聚合函數(shù)
2.having緊跟group by,它們是一個整體
3.where是在分組前對數(shù)據(jù)進行過濾,不可以直接使用聚合函數(shù)
?
having和where + 聚合函數(shù)分析
a.having+聚合函數(shù)
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;
默認(rèn)根據(jù)分組后的結(jié)果,計算每組的SUM,再與43比較
默認(rèn)根據(jù)分組后的結(jié)果,計算每組的AVG,再與22比較
?
b.where直接加聚合函數(shù)
SELECT * FROM student WHERE sage>AVG(sage);
報錯:因為mysql引擎不知道計算什么條件下的AVG,改為如下語句則正常執(zhí)行
SELECT *,AVG(sage) FROM student WHERE sage>(SELECT AVG(sage) FROM student);
5.7分頁查詢
select * from ?表名 ?limit 參數(shù)1,參數(shù)2
參數(shù)1:offset,偏移量 ?????????可省略,默認(rèn)offset=0
參數(shù)2:查詢返回的最大記錄數(shù) ??不可省略
?
偏移量理解:offset=n 表示前面n條數(shù)據(jù)不用管,從n+1條開始查詢
?
若總記錄數(shù)小于5,則有幾條就返回幾條;否則返回5條
SELECT * FROM student LIMIT 5; ?默認(rèn)偏移量為0,則從第一條數(shù)據(jù)開始,獲得5條記錄
SELECT * FROM student LIMIT 0,5; 效果同上
?
若去除前7條記錄后,剩下總記錄數(shù)小于5,則有幾條就返回幾條;否則返回5條
SELECT * FROM student LIMIT 7,5; 偏移量為7,則從第8條數(shù)據(jù)開始,獲取5條記錄
?
6.mysql多表查詢
為什么要拆表:去除冗余數(shù)據(jù)(注意區(qū)別于分表)
表與表之間的關(guān)系:一對一,一對多(多對一),多對多
?
6.1 union合并結(jié)果集
UNION:去除重復(fù)數(shù)據(jù)。例如 select * from t1 UNION select * from t2
UNION ALL:不去除重復(fù)紀(jì)錄,全部保留。例如 select * from t1 UNION ALL select * from t2
?
重復(fù):指記錄的每個字段完全一樣,若主鍵一樣,其他字段不一樣,是不會去除的
注意:union合并的兩個表或報表的列數(shù),列類型必須相同,列名可以不同
?
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合并:相當(dāng)于是將分表合并在一起,這兩個表的結(jié)構(gòu)完全一樣,只是列名可能有差異。
union是將表t2一條條記錄insert進t1表,不會再左側(cè)或右側(cè)產(chǎn)生新的字段。
?
?
?
6.2普通多表查詢
普通多表查詢相當(dāng)于下面的內(nèi)連接,
區(qū)別:內(nèi)連接限定條件的關(guān)鍵詞是on,普通多表查詢使用where
?
創(chuàng)員工表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)直接合并兩個表
因為沒有給限定條件,所以會產(chǎn)生笛卡爾積
公式:合并后的總記錄數(shù)=emp表記錄數(shù)*dept表記錄數(shù)
| ? |
?
SELECT * FROM emp,dept; ?????等價于內(nèi)連接: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;
等價于內(nèi)連接:SELECT * FROM emp e JOIN dept d ON e.deptno=d.deptno;
?
?
6.3連接查詢
(1)內(nèi)連接inner
語法:select 列名 from 表1 inner ?join 表2 ?on 條件
inner可以省略,只有join關(guān)鍵字,mysql默認(rèn)是內(nèi)連接
可以沒有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表,再根據(jù)后面條件查詢t2表中滿足條件的數(shù)據(jù))
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
自動去除無用重復(fù)信息
語法:select 列 from 表1 natural join 表2;
?
內(nèi)連接和自然連接比較
a.內(nèi)連接 ?????SELECT * FROM emp INNER JOIN dept;
b.自然連接 ??SELECT * FROM emp NATURAL JOIN dept;
自然連接:1.默認(rèn)根據(jù)兩個表中的相同字段去除重復(fù),emp和dept中都有deptno,
? ??則根據(jù)e.deptno=d.deptno來去除重復(fù)
??2.若兩個表沒有相同字段,則會直接合并產(chǎn)生笛卡爾積
?
natural可以修飾外連接,此時可以不需要on條件,因為若有相同字段,natural默認(rèn)會根據(jù)該字段進行限定。若是沒有相同字段,不會像使用外連接時,不加on時(SELECT * FROM emp LEFT JOIN dept;),直接報錯,而是產(chǎn)生笛卡爾積?!净蛘哒fleft和不存才是一樣的,因為只有natural時,也是同樣的效果,并且有left時,也不能加on來限制】
SELECT * FROM emp NATURAL LEFT JOIN dept;
?
?
?
?
7.mysql子查詢
定義:子查詢就是嵌套查詢,即select中包含select,如果一條語句中存在兩個或者兩個以上select,那么就是子查詢了
?
(1)子查詢出現(xiàn)的位置
where后,作為條件查詢的中條件的一部分
from后,作為表使用
?
(2)當(dāng)子查詢出現(xiàn)在where后作為條件時,可以使用any,all兩個關(guān)鍵字
?
SELECT * FROM emp WHERE deptno IN(SELECT deptno FROM dept WHERE dname='銷售部');
等價SELECT * FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname='銷售部');
?
總結(jié)
以上是生活随笔為你收集整理的快速掌握mysql,可备用查找相关用法(吐血整理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中switch语句支持的类型
- 下一篇: 数据库索引的作用和优点缺点以及索引的11