成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試突擊:MySQL 中如何去重?

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

作者 | 磊哥

來源 | Java面試真題解析(ID:aimianshi666)

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

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

1、創(chuàng)建測試數據

-- 創(chuàng)建測試表
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 '創(chuàng)建時間'
) 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)聯(lián)合去重,具體實現如下:

圖片

(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)聯(lián)合去重,具體實現如下:

圖片

(3)聚合函數 + group by

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

4、distinct 和 group by 的區(qū)別

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

圖片

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

區(qū)別1:查詢結果集不同

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

圖片

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

圖片

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

圖片

區(qū)別2:使用業(yè)務場景不同

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

圖片

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

圖片

區(qū)別3:性能不同

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

總結

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

責任編輯:姜華 來源: Java面試真題解析
相關推薦

2022-09-12 22:27:05

編程式事務聲明式事務對象

2022-02-28 07:01:22

線程中斷interrupt

2021-12-15 06:58:13

List 集合LinkedHashS

2022-06-06 07:35:26

MySQLInnoDBMyISAM

2022-04-13 14:43:05

JVM同步鎖Monitor 監(jiān)視

2023-09-07 13:32:00

MySQL數據庫

2022-04-11 07:40:45

synchroniz靜態(tài)方法程序

2022-07-11 07:10:48

HTTP協(xié)議類型

2022-03-28 08:31:29

線程池定時任務

2022-09-07 07:05:25

跨域問題安全架構

2022-06-27 07:23:44

MySQL常量優(yōu)化

2022-06-29 11:01:05

MySQL事務隔離級別

2023-12-05 07:59:08

JS小技巧數組對象去重

2022-04-06 07:50:28

線程安全代碼

2023-11-14 14:41:01

數據庫清除

2022-05-05 07:38:32

volatilJava并發(fā)

2022-04-20 07:47:00

notify喚醒線程JVM

2022-07-27 07:36:01

TCP可靠性

2022-03-23 08:51:21

線程池Java面試題

2013-08-06 09:42:59

技術人員面試
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精彩免费视频 | www.狠狠干 | 午夜天堂精品久久久久 | 亚洲日韩中文字幕一区 | 在线中文字幕国产 | 成人妇女免费播放久久久 | 成年人视频免费在线观看 | 欧美日韩在线视频一区 | 你懂的国产 | 亚洲国产欧美一区二区三区久久 | xx视频在线观看 | 我爱操| 人人操日日干 | 欧美激情精品久久久久久变态 | 久久久国产精品 | 特级一级黄色片 | 日韩91 | 日韩精品一区二区三区在线观看 | 毛片a级毛片免费播放100 | 亚洲精品视频在线 | 黄色一级视频 | cao视频| 中文区中文字幕免费看 | 四虎在线播放 | 在线观看免费毛片 | 欧美日韩免费一区二区三区 | 国产精品夜夜夜一区二区三区尤 | av中文网| 日韩成人精品视频 | 欧美一级二级视频 | 午夜影院在线观看版 | www,黄色,com| 免费看国产精品视频 | 精品日韩欧美一区二区 | 欧美一区二区三区四区视频 | 99久久久国产精品 | 一区中文字幕 | 亚洲色图网址 | 在线观看国产视频 | 久久精品国产久精国产 | 欧美精品在线看 |