distinct 關(guān)鍵字
有時(shí)需要將表中的記錄去掉重復(fù)后顯示出來(lái),可以用distinct關(guān)鍵字來(lái)實(shí)現(xiàn),例如執(zhí)行語(yǔ)句 SELECT * FROM user;返回結(jié)果如下:

此時(shí)看到id=2,3的記錄username字段相同,如果想查詢所有不重復(fù)的username,可以執(zhí)行如下:
SELECT distinct username FROM user;

limit 關(guān)鍵字
例如執(zhí)行排序語(yǔ)句:SELECT * FROM user order by id asc;得到三條升序的數(shù)據(jù),如果想限制只顯示2條,可以使用LIMIT關(guān)鍵字:SELECT * FROM user order by id asc limit 0,2;。LIMIT后面跟著的表示起始偏移量和前N行記錄,默認(rèn)起始偏移量為0,所以這句話也可以寫(xiě)為:SELECT * FROM user order by id asc limit 2;。 LIMIT經(jīng)常和order by一起配合使用來(lái)進(jìn)行分頁(yè)顯示。
聚合
聚合操作的語(yǔ)法涉及下面幾個(gè)參數(shù):
- fun_name 表示要做的聚合操作,即聚合函數(shù),常用的有求和sum,計(jì)數(shù)count(*),最大值(max),最小值(min)。
- GROUP BY 關(guān)鍵字表示要進(jìn)行分類聚合的字段
- WITH ROLLUP 表明是否對(duì)分類聚合后的結(jié)果進(jìn)行再匯總
- HAVING 關(guān)鍵字表示對(duì)分類后的結(jié)果在進(jìn)行條件的過(guò)濾
示例:
記錄表中的總?cè)藬?shù)用:
select count(1) from user;,結(jié)果為3。-
在1的基礎(chǔ)上依據(jù)username字段進(jìn)行分類,統(tǒng)計(jì)每個(gè)username下的數(shù)量:
select username,count(1) FROM user group by username;:
image.png
可以看到username為bb的有兩條記錄,admin的只有一條。(這個(gè)例子舉得不好,一般用在確認(rèn)公司下某部門(mén)的員工數(shù)量這類情況)。 -
在2的基礎(chǔ)上還想也看到總數(shù),執(zhí)行
select username,count(1) FROM user group by username with rollup;,結(jié)果如下:
image.png
可以看到最后一行相當(dāng)于excel中使用求和函數(shù)算出的總額那一行。 -
在使用group進(jìn)行分組的基礎(chǔ)上使用having:
select username,count(1) FROM user group by username having count(1)>1;,意思是獲取分組后組中記錄數(shù)量大于一的組,結(jié)果如下:
image.png -
統(tǒng)計(jì)id字段的總和,最大值和最小值:
SELECT sum(id),max(id),min(id) FROM user;,結(jié)果如下:
image.png
表連接
表連接從大類上分為內(nèi)連接和外連接。二者區(qū)別在于內(nèi)連接只選出兩張表中互相匹配的記錄,外連接會(huì)選出其他不匹配的記錄。
- 左連接:包含所有左邊的表中的記錄甚至是右邊表中沒(méi)有和它匹配的記錄
- 右連接:包含所有右邊的表中的記錄甚至是左邊的表中沒(méi)有和它匹配的記錄
示例:
創(chuàng)建一個(gè)雇員表deployee,有五個(gè)人:

再創(chuàng)建一個(gè)部門(mén)表,有4個(gè)部門(mén):

-
同時(shí)顯示用戶id和部門(mén)name:
select id,dep_name from deployee,department where deployee.dep_id = department.dep_id;,執(zhí)行后可以清楚的看到每個(gè)人屬于什么部門(mén):
image.png
但是id是5這個(gè)人沒(méi)有查出來(lái),因?yàn)樗环喜樵儣l件。 -
使用左連接:
select id,dep_name from deployee left join department on deployee.dep_id = department.dep_id;left join左邊的表是要全部顯示的。結(jié)果如下:
image.png
這樣id為5這個(gè)人即使沒(méi)有部門(mén)也能查出來(lái)。 使用右連接:
select id,dep_name from department right join deployee on deployee.dep_id = department.dep_id;執(zhí)行后也能把id為5這個(gè)人查出來(lái),同左連接相反,right join 右邊的表要全部顯示。
子查詢
某些情況下,查詢的條件是另外一個(gè)select語(yǔ)句的結(jié)果,這時(shí)用到子查詢。子查詢關(guān)鍵字有in,not in,= ,!=,exists,not exists等。
如執(zhí)行select * from deployee where deployee.dep_id in (select dep_id from department);也表示查詢有部門(mén)的雇員。如果子查詢記錄數(shù)唯一,可以使用=代替in:
select * from deployee where deployee.dep_id in (select dep_id from department where dep_id = 'sale'); 由于子查詢只有一條記錄,所有可以用等號(hào)
聯(lián)合
如果要求將兩個(gè)表的數(shù)據(jù)按照一定的查詢條件查詢出來(lái)后,將結(jié)果合并到一起顯示出來(lái),需要使用union和union all關(guān)鍵字來(lái)實(shí)現(xiàn)。
union 和 union all的主要區(qū)別是union all是把結(jié)果集直接合并在一起,而union 是將union all后的結(jié)果進(jìn)行一次distinct,去除重復(fù)的記錄。
示例:
- 將deployee表和department表中的dep_id字段合并后查詢出來(lái):
select dep_id from deployee union all select dep_id from department;,結(jié)果顯示如下:
image.png
可以看到里面有重復(fù)項(xiàng),就是將兩個(gè)表的數(shù)據(jù)直接加一起,如果使用過(guò) union 呢:
select dep_id from deployee union select dep_id from department;,結(jié)果如下:
image.png
可以看到重復(fù)的數(shù)據(jù)沒(méi)有了。







