MYSQL 的查詢語(yǔ)言——————DQL
一、DQL語(yǔ)言基本規(guī)則
①DQL(Data Query Language):數(shù)據(jù)查詢語(yǔ)言,用來(lái)查詢記錄(數(shù)據(jù))。
②數(shù)據(jù)庫(kù)執(zhí)行DQL語(yǔ)句不會(huì)對(duì)數(shù)據(jù)進(jìn)行改變,而是讓數(shù)據(jù)庫(kù)發(fā)送結(jié)果集給客戶端。查詢返回的結(jié)果集是一張?zhí)摂M表。
③查詢語(yǔ)句書(shū)寫和執(zhí)行順序
書(shū)寫:select -from- where- group by- having- order by-limit
執(zhí)行:from - where -group by -having - select - order by-limit
二、建立數(shù)據(jù)庫(kù)表格
student表

score表

三、DQL基本語(yǔ)法
查詢關(guān)鍵字:SELECT
1、基本查詢:
SELECT * FROM student //查詢student表的全部列
SELECT sno , sname FROM student //查詢表格的某些列的全部信息
2、條件查詢:
①select * from student where class = 95033;

其中“=”可換成 =、!=、<>(不等于)、<、<=、>、>=;等符號(hào)
“*”可換成我們想要顯示的某些列
②select * from student where sno in ( 107,109);//sno等于107,109的信息

其他條件查詢
select * from student where sno BETWEEN 107 AND 109;
select * from student where sno IS NULL;
select * from student where sno IS NULL and sno=107;
select * from student where sno IS NULL or sno=107;
select * from student where sno IS not NULL;
3、模糊查詢
select * from student where sname like "王%";//以王開(kāi)頭的姓名

select * from student where sname like "%王%";//sanme中含有“王”字的信息
select * from student where sname like "_";//”_”表示單個(gè)字母
4、字段控制查詢
(1) 去除重復(fù)記錄
SELECT DISTINCT class FROM student;
(2) 相同類型字段可做運(yùn)算,列名起別名,把NULL值換為0
SELECT class+IFNULL(sno,0) AS 小名 FROM student;//別名的AS可省略
4.png
(3)排序查詢
SELECT * FROM student ORDER BY sno asc;//升序
SELECT * FROM student ORDER BY sno desc;//降序
SELECT * FROM student ORDER BY sno desc , class asc;//先sno降序,sno相同再按class升序
5、聚合函數(shù)(縱向運(yùn)算)
COUNT():統(tǒng)計(jì)指定列不為NULL的記錄行數(shù);
SELECT count(1) FROM student ;
SELECT count(1) FROM student where sno=107;
MAX():計(jì)算指定列的最大值,如果指定列是字符串類型,使用字符串排序運(yùn)算;
SELECT MAX(sno) FROM student ;
MIN():計(jì)算指定列的最小值,如果指定列是字符串類型,使用字符串排序運(yùn)算;
SELECT MIN(sno) FROM student ;
SUM():計(jì)算指定列的數(shù)值和,如果指定列類型不是數(shù)值類型,計(jì)算結(jié)果為0;
SLECT SUM(sno) FROM student ;
AVG():計(jì)算指定列的平均值,如果指定列類型不是數(shù)值類型,那么計(jì)算結(jié)果為0;
SELECT AVG(sno) FROM student ;
6、分組查詢
1、凡和聚合函數(shù)同時(shí)出現(xiàn)的列名,則一定要寫在group by 之后
SELECT class, count(1) FROM student group by class ;
2、對(duì)分組后限定的HAVING 子句
SELECT class, count(1) FROM student group by class HAVING count(1) >=2;
注:having與where的區(qū)別:
1.having是在分組后對(duì)數(shù)據(jù)進(jìn)行過(guò)濾,where是在分組前對(duì)數(shù)據(jù)進(jìn)行過(guò)濾
2.having后面可以使用分組函數(shù)(統(tǒng)計(jì)函數(shù)) where后面不可以使用分組函數(shù)。
3.WHERE是對(duì)分組前記錄的條件,如果某行記錄沒(méi)有滿足WHERE子句的條件,那么這行記錄不會(huì)參加分組;而 HAVING是對(duì)分組后數(shù)據(jù)的約束。
7、控制行數(shù)實(shí)現(xiàn)分頁(yè)查詢
若一頁(yè)行數(shù)為10;
SELECT * FROM student LIMIT 0, 9;//從0行開(kāi)始到第九行結(jié)束,為第一頁(yè)數(shù)據(jù)。
四、多表查詢
1、合并結(jié)果集(union , union all)
SELECT* FROM student UNION SELECT * FROM student;//去除重復(fù)數(shù)據(jù)
SELECT* FROM student UNION ALL SELECT * FROM student;//不去除重復(fù)數(shù)據(jù)
注:要合并的兩表的列數(shù)、列類型必須相同。
2、連接查詢
2.1內(nèi)連接
特點(diǎn):查詢結(jié)果必須滿足條件
SELECT * FROM student,score WHERE student.sno=score.sno ;(方言形式,可將*換成指定列)
SELECT * FROM student INNER JOIN score ON student.sno=score.sno ;(標(biāo)準(zhǔn)形式內(nèi)連接)
2.2 外連接
特點(diǎn):查詢結(jié)果必須滿足條件
①左連接是先查詢出左表(以左表為主),然后查詢右表,右表中滿足條件的顯示出來(lái),不滿足條件的顯示 NULL。
SELECT * FROM student LEFT OUTER JOIN score ON student.sno=score.sno ;
②右連接就是先把右表中所有記錄都查詢出來(lái),然后左表滿足條件的顯示,不滿足顯示NULL;
SELECT * FROM student RIGHT OUTER JOIN score ON student.sno=score.sno
3、子查詢
定義及形式:一個(gè)select語(yǔ)句中包含另一個(gè)完整的select語(yǔ)句。 子查詢就是嵌套查詢,即SELECT中包含SELECT,如果一條語(yǔ)句中存在兩個(gè),或兩個(gè)以上SELECT,那么就是子查詢語(yǔ)句了。
子查詢出現(xiàn)的位置:
a. where后,作為條為被查詢的一條件的一部分;
SELECT * FROM score WHERE degree > (SELECT degree FROM score WHERE cno='3-245' and sno=103);
b. from后,作表;
SELECT count(1) FROM (SELECT sno FROM score WHERE cno='3-245') test;
test為子查詢表的別名。派生表必須有自己的別名;
c. 當(dāng)子查詢出現(xiàn)在where后作為條件且子查詢形式為多行單列時(shí),還可以使用如下關(guān)鍵字:
1.any
SELECT * FROM score WHERE sno = any(SELECT sno FROM score WHERE cno=’3-245’);
2.all
SELECT * FROM score WHERE degree< all(SELECT degree FROM score WHERE sno=103);
DQL語(yǔ)言到此告一段落,欲知其他內(nèi)容,請(qǐng)聽(tīng)下回分解。
