sql 中 distinct 用法_sql 中 distinct 去重技巧

distinct在sql中的核心作用是去重,其用法需注意以下要點(diǎn):1. 基本用法為對單列去重,如select distinct city from users; 2. 對多列組合去重時(shí),distinct作用于整行,若字段組合重復(fù)則會被去除,但join操作可能導(dǎo)致意外結(jié)果;3. 與聚合函數(shù)結(jié)合使用時(shí),count(distinct city)可統(tǒng)計(jì)不同值的數(shù)量,誤用count(city)則統(tǒng)計(jì)非空值;4. 性能上distinct依賴排序,大數(shù)據(jù)量下會影響效率,可通過group by替代或確認(rèn)數(shù)據(jù)無重復(fù)時(shí)省略;5. 特殊情況中NULL值視為相同,僅保留一個(gè)。使用時(shí)應(yīng)結(jié)合業(yè)務(wù)邏輯避免踩坑。

sql 中 distinct 用法_sql 中 distinct 去重技巧

distinct 在 SQL 中的作用很簡單:去重。但怎么用好它,尤其是在復(fù)雜查詢里不踩坑,還是有一些細(xì)節(jié)需要注意的。

sql 中 distinct 用法_sql 中 distinct 去重技巧


distinct 基本用法:去重單列

最簡單的場景就是對某一列去重,比如你想查用戶表中不同的城市:

sql 中 distinct 用法_sql 中 distinct 去重技巧

SELECT DISTINCT city FROM users;

這樣就能返回所有不同的城市名稱。注意,distinct 是作用在整個(gè)結(jié)果行上的,不是只看某一個(gè)字段。也就是說,即使你只寫了一個(gè)字段,數(shù)據(jù)庫也會把整行數(shù)據(jù)拿來比對是否重復(fù)。

小提示:如果字段值是 NULL,distinct 會把多個(gè) NULL 當(dāng)成一個(gè)來處理,在大多數(shù)數(shù)據(jù)庫中只會保留一個(gè) NULL 值。


多列去重:別以為加幾個(gè)字段就萬事大吉

當(dāng)你想對多個(gè)字段組合去重時(shí),很多人直接這么寫:

SELECT DISTINCT name, age FROM users;

這確實(shí)是對 name 和 age 的組合進(jìn)行去重。但問題往往出在“你以為這是唯一的組合”,其實(shí)可能還有隱藏的重復(fù)情況。比如:

name age
張三 25
張三 25

這種情況下,distinct 能正常去掉重復(fù)行。但如果這兩個(gè)字段來自多個(gè)表的 join 結(jié)果,那就要小心了,因?yàn)?join 本身可能會放大行數(shù),導(dǎo)致 distinct 沒有達(dá)到預(yù)期效果。


distinct 和聚合函數(shù)配合使用:常見又容易忽略

distinct 最常見的搭配之一就是和 count、sum 等聚合函數(shù)一起用。比如統(tǒng)計(jì)不同城市的用戶數(shù)量:

SELECT COUNT(DISTINCT city) FROM users;

這表示統(tǒng)計(jì)有多少個(gè)不同的城市。如果你不小心寫成了:

SELECT COUNT(city) FROM users;

那你統(tǒng)計(jì)的就是所有非空 city 的數(shù)量,而不是“不同”城市的數(shù)量。

注意:有些數(shù)據(jù)庫(如 mysql)允許你在 GROUP BY 查詢中混用未聚合的字段,但這會導(dǎo)致 distinct 不生效或結(jié)果不可控,建議養(yǎng)成良好的寫法習(xí)慣。


distinct 的性能問題:別濫用

雖然 distinct 很方便,但它背后其實(shí)是排序 + 去重的過程,尤其在大數(shù)據(jù)量下會拖慢查詢速度。有時(shí)候你會發(fā)現(xiàn)用了 distinct 反而讓結(jié)果變少得離譜,其實(shí)是邏輯沒理清。

什么時(shí)候可以避免用 distinct?

  • 使用 GROUP BY 替代,尤其是已經(jīng)按某些字段分組的情況下。
  • 如果你知道數(shù)據(jù)本來就沒有重復(fù),就不需要加。
  • 對于 join 后的結(jié)果,先檢查是否有重復(fù)來源,再決定是否需要用 distinct。

基本上就這些。distinct 不復(fù)雜,但真正在項(xiàng)目里用的時(shí)候,還是要結(jié)合業(yè)務(wù)邏輯和數(shù)據(jù)結(jié)構(gòu)來看,不然很容易變成“看起來沒問題,實(shí)際數(shù)據(jù)錯(cuò)亂”。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊13 分享