日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

在 MySQL 中,最常見的去重方法有兩個:使用 distinct 或使用 group by,那它們有什么區別呢?接下來我們一起來看。

作者 | 磊哥

來源 | JAVA面試真題解析(ID:AImianshi666)

轉載請聯系授權(微信ID:GG_Stone)

在 MySQL 中,最常見的去重方法有兩個:使用 distinct 或使用 group by,那它們有什么區別呢?接下來我們一起來看。

1、創建測試數據

-- 創建測試表
drop table if exists pageview;
create table pageview(
    id bigint primary key auto_increment comment '自增主鍵',
    aid bigint not null comment '文章ID',
    uid bigint not null comment '(訪問)用戶ID',
    createtime datetime default now() comment '創建時間'
) default charset='utf8mb4';
-- 添加測試數據
insert into pageview(aid,uid) values(1,1);
insert into pageview(aid,uid) values(1,1);
insert into pageview(aid,uid) values(2,1);
insert into pageview(aid,uid) values(2,2);

最終展現效果如下:

圖片

2、distinct 使用

distinct 基本語法如下:

SELECT DISTINCT column_name,column_name FROM table_name;

(1)單列去重

我們先用 distinct 實現單列去重,根據 aid(文章 ID)去重,具體實現如下:

圖片

(2)多列去重

除了單列去重之外,distinct 還支持多列(兩列及以上)去重,我們根據 aid(文章 ID)和 uid(用戶 ID)聯合去重,具體實現如下:

圖片

(3)聚合函數+去重

使用 distinct + 聚合函數去重,計算 aid 去重之后的總條數,具體實現如下:

圖片

3、group by 使用

group by 基礎語法如下:

SELECT column_name,column_name FROM table_name 
WHERE column_name operator value 
GROUP BY column_name

(1)單列去重

根據 aid(文章 ID)去重,具體實現如下:

圖片

與 distinct 相比 group by 可以顯示更多的列,而 distinct 只能展示去重的列。

(2)多列去重

根據 aid(文章 ID)和 uid(用戶 ID)聯合去重,具體實現如下:

圖片

(3)聚合函數 + group by

統計每個 aid 的總數量,SQL 實現如下:圖片從上述結果可以看出,使用 group by 和 distinct 加 count 的查詢語義是完全不同的,distinct + count 統計的是去重之后的總數量,而 group by + count 統計的是分組之后的每組數據的總數。

4、distinct 和 group by 的區別

官方文檔在描述 distinct 時提到:在大多數情況下 distinct 是特殊的 group by,如下圖所示:

圖片

官方文檔地址:https://dev.mysql.com/doc/refman/8.0/en/distinct-optimization.html但二者還是有一些細微的不同的,比如以下幾個。

區別1:查詢結果集不同

當使用 distinct 去重時,查詢結果集中只有去重列信息,如下圖所示:

圖片

當你試圖添加非去重字段(查詢)時,SQL 會報錯如下圖所示:

圖片

而使用 group by 排序可以查詢一個或多個字段,如下圖所示:圖片

圖片

區別2:使用業務場景不同

統計去重之后的總數量需要使用 distinct,而統計分組明細,或在分組明細的基礎上添加查詢條件時,就得使用 group by 了。使用 distinct 統計某列去重之后的總數量:

圖片

圖片統計分組之后數量大于 2 的文章,就要使用 group by 了,如下圖所示:圖片

圖片

區別3:性能不同

如果去重的字段有索引,那么 group by 和 distinct 都可以使用索引,此情況它們的性能是相同的;而當去重的字段沒有索引時,distinct 的性能就會高于 group by,因為在 MySQL 8.0 之前,group by 有一個隱藏的功能會進行默認的排序,這樣就會觸發 filesort 從而導致查詢性能降低。

總結

大部分場景下 distinct 是特殊的 group by,但二者也有細微的區別,比如它們在查詢結果集上、使用的具體業務場景上,以及性能上都是不同的。

分享到:
標簽:MySQL
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定