Mysql select查詢常用關(guān)鍵字

distinct 關(guān)鍵字

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

image.png

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

image.png

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ò)濾

示例:

  1. 記錄表中的總?cè)藬?shù)用:select count(1) from user;,結(jié)果為3。

  2. 在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ù)量這類情況)。

  3. 在2的基礎(chǔ)上還想也看到總數(shù),執(zhí)行select username,count(1) FROM user group by username with rollup;,結(jié)果如下:

    image.png

    可以看到最后一行相當(dāng)于excel中使用求和函數(shù)算出的總額那一行。

  4. 在使用group進(jìn)行分組的基礎(chǔ)上使用having:select username,count(1) FROM user group by username having count(1)>1;,意思是獲取分組后組中記錄數(shù)量大于一的組,結(jié)果如下:

    image.png

  5. 統(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è)人:


image.png

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


image.png
  1. 同時(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件。

  2. 使用左連接: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)。

  3. 使用右連接: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ù)的記錄。

示例:

  1. 將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)有了。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容