最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解MySQL中DISTINCT去重的核心注意事項(xiàng)

 更新時(shí)間:2025年06月18日 15:00:29   作者:步行cgn  
為了實(shí)現(xiàn)查詢不重復(fù)的數(shù)據(jù),MySQL 提供了DISTINCT關(guān)鍵字,它的主要作用就是對(duì)數(shù)據(jù)表中一個(gè)或多個(gè)字段重復(fù)的數(shù)據(jù)進(jìn)行過(guò)濾,只返回其中的一條數(shù)據(jù)給用戶,下面小編就來(lái)和大家簡(jiǎn)單講講DISTINCT去重的核心注意事項(xiàng)吧

DISTINCT 六大注意事項(xiàng)

1. 作用范圍:所有 SELECT 字段

SELECT DISTINCT a, b FROM table;  -- 對(duì)(a,b)組合整體去重

誤以為只作用于第一個(gè)字段:

-- 錯(cuò)誤理解:以為只對(duì)name去重
SELECT DISTINCT name, class FROM students;  

實(shí)際效果:對(duì) (name, class) 組合去重(如 ('張三','一班') 和 ('張三','二班') 算不同記錄)

2. NULL 值的特殊處理

INSERT INTO students (name, class, score) VALUES (NULL, '三班', 90);

???????SELECT DISTINCT name FROM students;

結(jié)果:

+--------+
| name   |
+--------+
| 張三   |
| 李四   |
| 王五   |
| NULL   |  -- NULL被視為獨(dú)立值保留
+--------+

3. 性能陷阱(大數(shù)據(jù)量)

-- 當(dāng)表有百萬(wàn)行時(shí)慎用
SELECT DISTINCT text_column FROM huge_table; 

優(yōu)化方案:

-- 先通過(guò)WHERE縮小范圍再去重
SELECT DISTINCT text_column 
FROM huge_table 
WHERE create_time > '2023-01-01';

-- 或添加索引(對(duì)text類型有限制)
ALTER TABLE huge_table ADD INDEX idx_text(text_column(20)); -- 前綴索引

4. 與 ORDER BY 的優(yōu)先級(jí)

SELECT DISTINCT class 
FROM students 
ORDER BY score DESC; -- 錯(cuò)誤!score不在SELECT中

正確寫法:

-- 方案1:排序字段必須在SELECT中
SELECT DISTINCT class, MAX(score) AS max_score 
FROM students 
GROUP BY class 
ORDER BY max_score DESC;

-- 方案2:子查詢
SELECT DISTINCT class FROM (
  SELECT class, score FROM students ORDER BY score DESC
) AS tmp;

5. 聚合函數(shù)中的 DISTINCT

-- 統(tǒng)計(jì)不重復(fù)的班級(jí)數(shù)量
SELECT COUNT(DISTINCT class) FROM students; 

-- 錯(cuò)誤用法(語(yǔ)法無(wú)效):
SELECT DISTINCT COUNT(class) FROM students; 

6. 不可用于部分字段計(jì)算

-- 嘗試計(jì)算不同班級(jí)的平均分(錯(cuò)誤?。?
SELECT DISTINCT class, AVG(score) FROM students; 

正確做法:必須配合 GROUP BY

SELECT class, AVG(score) 
FROM students 
GROUP BY class;  -- 這才是標(biāo)準(zhǔn)解法

高級(jí)注意點(diǎn)

7. 與 LIMIT 的配合問(wèn)題

SELECT DISTINCT class FROM students LIMIT 2;

結(jié)果不確定性:

返回的 2 條記錄是隨機(jī)的(除非指定 ORDER BY),不同執(zhí)行可能結(jié)果不同。

8. 臨時(shí)表空間占用

DISTINCT 操作會(huì)在內(nèi)存/磁盤創(chuàng)建臨時(shí)表存儲(chǔ)唯一值

當(dāng)去重字段總數(shù)據(jù)量超過(guò) tmp_table_size 時(shí),性能急劇下降

查看閾值:

SHOW VARIABLES LIKE 'tmp_table_size'; -- 默認(rèn)16MB

對(duì)比 GROUP BY 去重

特性DISTINCTGROUP BY
是否可搭配聚合函數(shù)?? (如SUM/AVG)
結(jié)果排序無(wú)序可按分組鍵排序
執(zhí)行效率簡(jiǎn)單場(chǎng)景更快復(fù)雜聚合時(shí)更優(yōu)
索引利用可使用索引必須用分組字段索引

最佳實(shí)踐總結(jié)

小數(shù)據(jù)量:直接 DISTINCT 簡(jiǎn)潔高效

需要聚合計(jì)算:用 GROUP BY 替代

精確去重計(jì)數(shù):優(yōu)先 COUNT(DISTINCT column)

排序需求:必須顯式寫 ORDER BY

超大數(shù)據(jù):先過(guò)濾再去重 + 合理索引

實(shí)戰(zhàn)檢驗(yàn)

訂單表 orders 結(jié)構(gòu):

CREATE TABLE orders (
    id INT PRIMARY KEY,
    product_id INT,
    user_id INT,
    amount DECIMAL(10,2),
    coupon_code VARCHAR(20) -- 允許為NULL
);

問(wèn)題:

如何高效獲取使用過(guò)不同優(yōu)惠券的用戶ID列表(含NULL)?

寫出你的解決方案:

SELECT _______________________________
FROM orders;

答案(折疊):

-- 方案1:基礎(chǔ)寫法
SELECT DISTINCT user_id, coupon_code 
FROM orders 
WHERE coupon_code IS NOT NULL; -- 若需包含NULL則去掉WHERE

???????-- 方案2:大數(shù)據(jù)量?jī)?yōu)化(添加聯(lián)合索引)
ALTER TABLE orders ADD INDEX idx_user_coupon(user_id, coupon_code);
SELECT DISTINCT user_id, coupon_code FROM orders;

到此這篇關(guān)于詳解MySQL中DISTINCT去重的核心注意事項(xiàng)的文章就介紹到這了,更多相關(guān)MySQL DISTINCT去重內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中操作表常用的sql總結(jié)

    mysql中操作表常用的sql總結(jié)

    這篇文章主要給大家介紹了mysql中操作表常用的sql的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • MySQL數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語(yǔ)言

    MySQL數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語(yǔ)言

    這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)之?dāng)?shù)據(jù)表操作DDL數(shù)據(jù)定義語(yǔ)言,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Mysql隔離性之Read View的用法說(shuō)明

    Mysql隔離性之Read View的用法說(shuō)明

    這篇文章主要介紹了Mysql隔離性之Read View的用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • 如何恢復(fù)Mysql數(shù)據(jù)庫(kù)的詳細(xì)介紹

    如何恢復(fù)Mysql數(shù)據(jù)庫(kù)的詳細(xì)介紹

    這里說(shuō)的MySql恢復(fù)數(shù)據(jù)庫(kù),是指沒有通過(guò)正常備份的情況下,通過(guò)Mysql保存的數(shù)據(jù)文件如何恢復(fù)數(shù)據(jù)庫(kù)
    2013-09-09
  • win10 下安裝 mysql 5.7.14 詳細(xì)圖文教程

    win10 下安裝 mysql 5.7.14 詳細(xì)圖文教程

    本文通過(guò)文字和圖片相結(jié)合的形式給大家介紹了win10 下安裝 mysql 5.7.14的教程的,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-09-09
  • MySQL中正則表達(dá)式用法示例詳解

    MySQL中正則表達(dá)式用法示例詳解

    MySQL 中正則表達(dá)式通過(guò) REGEXP 或 RLIKE 操作符實(shí)現(xiàn)(兩者等價(jià)),用于在 WHERE 子句中進(jìn)行復(fù)雜的字符串模式匹配,這篇文章主要介紹了MySQL中正則表達(dá)式用法,需要的朋友可以參考下
    2025-06-06
  • mysql存儲(chǔ)過(guò)程?返回?list結(jié)果集方式

    mysql存儲(chǔ)過(guò)程?返回?list結(jié)果集方式

    這篇文章主要介紹了mysql存儲(chǔ)過(guò)程?返回?list結(jié)果集方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • 詳解MySQL事務(wù)的隔離級(jí)別與MVCC

    詳解MySQL事務(wù)的隔離級(jí)別與MVCC

    這篇文章主要介紹了MySQL事務(wù)的隔離級(jí)別與MVCC的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-04-04
  • 詳解Mysql中保證緩存與數(shù)據(jù)庫(kù)的雙寫一致性

    詳解Mysql中保證緩存與數(shù)據(jù)庫(kù)的雙寫一致性

    在一些高并發(fā)場(chǎng)景下,為了提升系統(tǒng)的性能,我們通常會(huì)將數(shù)據(jù)存儲(chǔ)在 Redis 緩存中,并通過(guò) Redis 緩存來(lái)提高系統(tǒng)的讀取速度,這篇文章主要介紹了詳解Mysql中保證緩存與數(shù)據(jù)庫(kù)的雙寫一致性,需要的朋友可以參考下
    2024-03-03
  • MySQL優(yōu)化器的SQL重寫規(guī)則介紹

    MySQL優(yōu)化器的SQL重寫規(guī)則介紹

    這篇文章主要介紹了MySQL優(yōu)化器的SQL重寫規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

淮安市| 长沙县| 兰西县| 松桃| 大同市| 靖江市| 长海县| 盐亭县| 桑植县| 周至县| 平顺县| 宣化县| 黔西县| 抚州市| 阿拉尔市| 永新县| 泌阳县| 桃江县| 黄山市| 汝城县| 肃宁县| 赫章县| 武川县| 西宁市| 观塘区| 修文县| 巢湖市| 措勤县| 封开县| 南昌市| 马山县| 家居| 应城市| 绵阳市| 保康县| 巴中市| 伊吾县| 碌曲县| 黑山县| 镇康县| 祁门县|