1. 程式人生 > 其它 >SQL去重語句【distinct】和【group by】究竟用哪個?

SQL去重語句【distinct】和【group by】究竟用哪個?

技術標籤:能工巧匠mysqlsql資料庫

我是幫助主人快速定位的目錄錄~

問題丟擲

當一個表中有重複資料時,該怎麼在查詢時去重呢?
表中有重複資料
一般是採用 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 * fromGROUP 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