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

MySQL中數(shù)據(jù)去重的兩種方式詳解(DISTINCT和GROUP BY)

 更新時(shí)間:2025年09月28日 08:40:04   作者:程序新視界  
在日常工作中,數(shù)據(jù)庫(kù)查詢操作無(wú)處不在,而處理數(shù)據(jù)中的重復(fù)項(xiàng)與分組匯總是非常常見(jiàn)的需求,MySQL提供了兩種常見(jiàn)的方式來(lái)管理和檢索唯一值:SELECT DISTINCT和GROUP BY,這篇文章帶大家將從功能、性能以及實(shí)際應(yīng)用等方面詳細(xì)介紹DISTINCT和GROUP BY的差異

引言

在日常工作中,數(shù)據(jù)庫(kù)查詢操作無(wú)處不在,而處理數(shù)據(jù)中的重復(fù)項(xiàng)與分組匯總是非常常見(jiàn)的需求。MySQL 提供了兩種常見(jiàn)的方式來(lái)管理和檢索唯一值:SELECT DISTINCTGROUP BY。這兩者雖然在生成輸出上可能相似,但用途與性能各有不同,使用場(chǎng)景也有所區(qū)分。

這篇文章帶大家將從功能、性能以及實(shí)際應(yīng)用等方面詳細(xì)介紹 DISTINCTGROUP BY 的差異,并結(jié)合具體的示例數(shù)據(jù)來(lái)理解其使用場(chǎng)景。

SELECT DISTINCT

DISTINCT 是一個(gè)用于去重的關(guān)鍵字。SELECT DISTINCT 語(yǔ)句用于從結(jié)果集中刪除重復(fù)行,只返回唯一值。因此,在需要僅獲取數(shù)據(jù)的唯一部分時(shí),DISTINCT 是一種簡(jiǎn)單高效的方式。

基本語(yǔ)法

SELECT DISTINCT column1, column2
FROM table_name;

參數(shù)說(shuō)明:

  • column1, column2:要檢索的字段名。
  • table_name:查詢的表名。

特性說(shuō)明

  • DISTINCT 可以基于單列或多列進(jìn)行去重,只有多列的值完全相同時(shí),才會(huì)被判定為重復(fù)行。
  • DISTINCT中,NULL 被視為一個(gè)獨(dú)立的值,因此即使列中有多個(gè) NULL 值,結(jié)果中只會(huì)保留一個(gè) NULL

GROUP BY

GROUP BY 是一個(gè)用于分組的子句,通常與聚合函數(shù)配合使用以對(duì)分組后的數(shù)據(jù)進(jìn)行匯總處理。它按指定列的值將行劃分為不同的組。

基本語(yǔ)法

SELECT column1, aggregate_function(column_name)
FROM table_name
WHERE condition
GROUP BY column1, column2, ...;

參數(shù)說(shuō)明:

  • column1, column2:分組的字段。
  • aggregate_function(column_name) :用于對(duì)分組內(nèi)的行進(jìn)行計(jì)算的聚合函數(shù),例如 COUNT, SUM, AVG 等。
  • table_name:查詢的表名字。
  • condition:可選,用于過(guò)濾行,在分組之前應(yīng)用。
  • GROUP BY column1, column2... :定義用于分組的字段,具有相同值的行被分配到同一個(gè)組。

示例表結(jié)構(gòu)與數(shù)據(jù):

為了便于說(shuō)明,我們定義兩個(gè)表 customersorders,并插入一些示例數(shù)據(jù)。

創(chuàng)建表:

CREATE TABLE customers (
  customer_id INT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  city VARCHAR(255) NOT NULL
);
?
INSERT INTO customers (customer_id, name, city) VALUES
  (1, 'John Doe', 'New York'),
  (2, 'Jane Smith', 'London'),
  (3, 'Mike Brown', 'Paris'),
  (2, 'Jane Smith', 'London'); -- 存在重復(fù)項(xiàng)
?
CREATE TABLE orders (
  order_id INT PRIMARY KEY,
  customer_id INT NOT NULL,
  product VARCHAR(255) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);
?
INSERT INTO orders (order_id, customer_id, product, price) VALUES
  (1, 1, 'Phone', 100.00),
  (2, 2, 'Laptop', 500.00),
  (3, 1, 'Tablet', 200.00),
  (4, 2, 'Watch', 150.00);

SELECT DISTINCT與GROUP BY使用對(duì)比

示例 1:檢索唯一的客戶城市

場(chǎng)景:我們希望查詢 customers 表中的唯一城市,不關(guān)心重復(fù)的城市名稱。

使用 DISTINCT

SELECT DISTINCT city
FROM customers;

輸出:

city
-----
New York
London
Paris

解釋:

  • SQL 查詢?nèi)コ藬?shù)據(jù)集中重復(fù)的城市,只返回唯一值,簡(jiǎn)單直觀。

示例 2:按客戶城市統(tǒng)計(jì)訂單數(shù)量

場(chǎng)景:我們希望統(tǒng)計(jì)每個(gè)城市對(duì)應(yīng)的訂單數(shù)量,涉及分組統(tǒng)計(jì)。

使用 GROUP BY

SELECT city, COUNT(*) AS order_count
FROM customers c
INNER JOIN orders o ON c.customer_id = o.customer_id
GROUP BY city;

輸出:

city         order_count
------------------------
London       2
New York     2

解釋:

  • SQL 查詢通過(guò) GROUP BY 以城市分組,并結(jié)合 COUNT 聚合函數(shù)統(tǒng)計(jì)每組的訂單數(shù)量,提供了更豐富的匯總信息。

SELECT DISTINCT 與 GROUP BY 的性能分析

雖然 DISTINCTGROUP BY 都會(huì)涉及底層的分組操作,但在某些情況下,它們可以互換使用,而在性能、功能上的表現(xiàn)會(huì)有所偏差。

兩者實(shí)現(xiàn)的相似性

對(duì)于以下兩條查詢:

SELECT DISTINCT int1_index FROM test_table;
SELECT int1_index FROM test_table GROUP BY int1_index;

在某些情況下(如 int1_index 上有索引),兩者使用相同的執(zhí)行計(jì)劃。例如,通過(guò)以下 EXPLAIN 分析,查詢會(huì)通過(guò)索引掃描優(yōu)化:

mysql> explain select distinct int1_index from test_distinct_groupby;
mysql> explain select int1_index from test_distinct_groupby group by int1_index;

兩者結(jié)果中 Extra 字段顯示 Using index for group-by,說(shuō)明索引用于優(yōu)化查詢,效率相當(dāng)。

GROUP BY的隱式排序問(wèn)題

在 MySQL 8.0 之前,GROUP BY 默認(rèn)對(duì)結(jié)果進(jìn)行隱式排序。這可能導(dǎo)致額外的排序操作(filesort),增加了查詢開(kāi)銷。在無(wú)顯式排序要求時(shí),DISTINCT 的性能會(huì)優(yōu)于 GROUP BY。

例如:

SELECT int6_random FROM test_table GROUP BY int6_random;

通過(guò) EXPLAIN 查詢,可以看到隱式排序增加了開(kāi)銷:

Extra: Using filesort

從 MySQL 8.0 開(kāi)始,GROUP BY 不再?gòu)?qiáng)制進(jìn)行隱式排序,性能接近 DISTINCT,尤其是在無(wú)索引的大數(shù)據(jù)場(chǎng)景下,二者效率更加一致。

SELECT DISTINCT 與 GROUP BY 的應(yīng)用場(chǎng)景及差異

功能和目的對(duì)比:

功能SELECT DISTINCTGROUP BY
目的去重分組并聚合數(shù)據(jù)
是否支持聚合函數(shù)
排序行為否(可選)是(默認(rèn)排序,8.0后優(yōu)化)
性能無(wú)索引場(chǎng)景更高效無(wú)索引場(chǎng)景稍慢(排序)
語(yǔ)法復(fù)雜度簡(jiǎn)單較復(fù)雜

適用場(chǎng)景

根據(jù)具體需求選擇 DISTINCTGROUP BY

  1. 使用SELECT DISTINCT
  • 當(dāng)僅需要去除重復(fù)項(xiàng),返回唯一值時(shí)。
  • 適用于簡(jiǎn)單查詢場(chǎng)景。
  1. 使用GROUP BY
  • 當(dāng)需要按特定條件分組并對(duì)分組內(nèi)的數(shù)據(jù)進(jìn)行匯總或聚合(如 COUNT, SUM, AVG)時(shí)。
  • 適合復(fù)雜的業(yè)務(wù)場(chǎng)景,支持更多靈活的操作,如結(jié)合 HAVING 子句篩選分組后的結(jié)果。

結(jié)論

SELECT DISTINCTGROUP BY 是兩種功能強(qiáng)大的工具,用于不同類型的 SQL 查詢需求:

  • DISTINCT 適合簡(jiǎn)單去重,避免數(shù)據(jù)重復(fù)。
  • GROUP BY 更注重分組數(shù)據(jù)并對(duì)分組進(jìn)行匯總分析。

在 MySQL 8.0 后,性能差距進(jìn)一步縮小,但從語(yǔ)義清晰度與靈活性來(lái)看,GROUP BY 在處理復(fù)雜業(yè)務(wù)場(chǎng)景時(shí)更勝一籌。選擇使用哪種方式應(yīng)根據(jù)具體應(yīng)用場(chǎng)景而定。

以上就是MySQL中數(shù)據(jù)去重的兩種方式詳解(DISTINCT和GROUP BY)的詳細(xì)內(nèi)容,更多關(guān)于MySQL數(shù)據(jù)去重方式的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法詳解

    MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法詳解

    本篇文章是對(duì)MySQL數(shù)據(jù)庫(kù)INSERT、UPDATE、DELETE以及REPLACE語(yǔ)句的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 關(guān)于mysql時(shí)間區(qū)間問(wèn)題淺析

    關(guān)于mysql時(shí)間區(qū)間問(wèn)題淺析

    在很多地方都使用到了mysql的日期查詢,下面這篇文章主要給大家介紹了關(guān)于mysql時(shí)間區(qū)間問(wèn)題的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-04-04
  • MySQL replace函數(shù)替換字符串語(yǔ)句的用法

    MySQL replace函數(shù)替換字符串語(yǔ)句的用法

    MySQL replace函數(shù)我們經(jīng)常用到,下面就為您詳細(xì)介紹MySQL replace函數(shù)的用法,希望對(duì)您學(xué)習(xí)MySQL replace函數(shù)方面能有所啟迪。
    2010-12-12
  • 深入理解MySQL聯(lián)合索引最左匹配原則

    深入理解MySQL聯(lián)合索引最左匹配原則

    本文主要介紹了深入理解MySQL聯(lián)合索引最左匹配原則,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2026-01-01
  • Mysql中存儲(chǔ)引擎的區(qū)別及比較

    Mysql中存儲(chǔ)引擎的區(qū)別及比較

    這篇文章主要介紹了Mysql中存儲(chǔ)引擎的區(qū)別及比較,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 完美解決mysql客戶端授權(quán)后連接失敗的問(wèn)題

    完美解決mysql客戶端授權(quán)后連接失敗的問(wèn)題

    下面小編就為大家?guī)?lái)一篇完美解決mysql客戶端授權(quán)后連接失敗的問(wèn)題。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • 關(guān)于MySQL Memory存儲(chǔ)引擎的相關(guān)知識(shí)

    關(guān)于MySQL Memory存儲(chǔ)引擎的相關(guān)知識(shí)

    這篇文章主要介紹了關(guān)于MySQL Memory存儲(chǔ)引擎的相關(guān)知識(shí),幫助大家更好的理解和使用MySQL數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2020-11-11
  • MySQL多表查詢的實(shí)現(xiàn)過(guò)程

    MySQL多表查詢的實(shí)現(xiàn)過(guò)程

    文章講解了SQL多表查詢的核心概念,包括笛卡爾積(交叉連接)、等值/非等值連接、自連接、內(nèi)/外連接分類,強(qiáng)調(diào)避免笛卡爾積需添加連接條件,區(qū)分列名并使用JOIN/ON語(yǔ)法,同時(shí)對(duì)比了UNION與UNION?ALL的區(qū)別,并提及MySQL中滿外連接的替代方法
    2025-10-10
  • 碰到MySQL無(wú)法啟動(dòng)1067錯(cuò)誤問(wèn)題解決方法

    碰到MySQL無(wú)法啟動(dòng)1067錯(cuò)誤問(wèn)題解決方法

    創(chuàng)建primay key過(guò)程中發(fā)生了斷電,當(dāng)電腦再次啟動(dòng)時(shí)候,發(fā)現(xiàn)mysql 服務(wù)無(wú)法啟動(dòng),使用 net start 提示 1067錯(cuò)誤;后來(lái)只能通過(guò)手工刪除數(shù)據(jù)文件,日志文件,再啟動(dòng)服務(wù),然后導(dǎo)入數(shù)據(jù)來(lái)完成
    2013-01-01
  • mysql中添加索引的3種方法及使用注意事項(xiàng)詳解

    mysql中添加索引的3種方法及使用注意事項(xiàng)詳解

    在MySQL中建立索引是一種優(yōu)化查詢性能的技術(shù),它能加快數(shù)據(jù)檢索的速度,這篇文章主要介紹了mysql中添加索引的3種方法及使用注意事項(xiàng)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2026-01-01

最新評(píng)論

内丘县| 凤台县| 将乐县| 昭苏县| 鹿邑县| 韶关市| 思南县| 宕昌县| 舟山市| 游戏| 承德县| 称多县| 邢台县| 股票| 惠水县| 丰顺县| 勃利县| 丰原市| 泰安市| 河东区| 宁南县| 沈阳市| 汶川县| 岢岚县| 马山县| 连山| 惠来县| 西贡区| 社旗县| 久治县| 北宁市| 保靖县| 海原县| 乌拉特后旗| 阿鲁科尔沁旗| 玛多县| 内丘县| 长沙市| 三台县| 察隅县| 博野县|