SQL去重語句【distinct】和【group by】究竟用哪個?
阿新 • • 發佈:2020-12-19
我是幫助主人快速定位的目錄錄~
問題丟擲
當一個表中有重複資料時,該怎麼在查詢時去重呢?
一般是採用 distinct 或者 group by 進行去重操作
但是!!!
該用哪一個呢?
distinct和group by的用法
俗話說:“知己知彼”,先了解它們的用法,才能知道在什麼情況下用哪個
已經知道用法的,可以直接跳過這一節啦~
distinct
select distinct 欄位[,欄位2,...] from 表
- distinct可以對一個欄位或多個欄位進行去重
- distinct必須在select後的首位
- distinct後面的所有欄位都會作為去重的欄位,即使欄位由()括起來
-- 只有field1和field2都重複時,才認為其是重複資料
-- 例如上圖的第一條和第十條資料就是重複資料
select distinct field1,field2 from testDistinct;
select distinct (field1),field2 from testDistinct;
執行結果(第一條和第二條的執行結果相同):
只是將第十條資料去掉了,field1欄位還是有多個重複資料
你不會還以為第二條語句的執行結果是這個吧(偷笑.jpg):
group by
select * from 表 GROUP BY 欄位[,欄位2,...];
- group by可以對一個欄位或多個欄位進行分組(變相去重)
- 查詢的欄位和分組的欄位互不影響,即可以查詢所有欄位,但只對某個欄位進行去重
distinct也可以實現這個效果,只是需要子查詢等方式
將distinct查詢的去重後的資料作為條件再次查詢表,得到想要的欄位
group by本身是分組的,它的 “不務正業” 也說明了 “程式碼是死的,人是活的” 這句話,嘿嘿
它能夠去重,是利用了它 只顯示同組的第一條資料 這個特性
例如:
select * from testDistinct GROUP BY field1;
結果:
發現:field1為1的資料本來有很多條,但是隻剩下第一條資料。
用哪個?
瞭解了 distinct 和 group by 的用法,就該聊聊怎麼用了
兩者各有千秋
- distinct適合各種重複資料去重,只是查詢顯示資料和去重不能同時做。畢竟有時候我想要看到的欄位不全是需要查重的欄位
- group by適合做分類統計
– 例如一個班級表,一個班級對應多個學生,我想要知道有多少個班級
– 也適合查詢和去重一步到位,但是一般要以兩個欄位為條件,畢竟group by只會顯示一組裡的一條資料,你需要做的是讓group by認為每條正常不重複的資料就是一組
舉個例子吧~
下面是學校的某張表,記錄了每個年級有幾個班
第5條是重複資料(失敗資料,沒有任何用)
需求:
把重複資料(第5條)去掉
select type_id, type_name, sonType_id, sonType_name from testTable GROUP BY type_id,sonType_id;
小弟無能,distinct的語句沒法寫出來,有能實現的,可以留言,感謝ATA