深入解析mysql中distinct的用法
DISTINCT簡(jiǎn)介
DISTINCT 的作用是消除結(jié)果集中的重復(fù)行,語(yǔ)法如下:
SELECT DISTINCT
columns
FROM
table_name
WHERE
where_conditions; mysql中的distinct的用法
distinct的作用
在mysql中,distinct關(guān)鍵字的主要作用就是對(duì)數(shù)據(jù)庫(kù)表中一個(gè)或者多個(gè)字段重復(fù)的數(shù)據(jù)進(jìn)行過(guò)濾,只返回其中的一條數(shù)據(jù)給用戶,distinct只可以在select中使用
distinct的原理
distinct進(jìn)行去重的主要原理是通過(guò)先對(duì)要進(jìn)行去重的數(shù)據(jù)進(jìn)行分組操作,然后從分組后的每組數(shù)據(jù)中去一條返回給客戶端,在這個(gè)分組的過(guò)程可能會(huì)出現(xiàn)兩種不同的情況:
- distinct 依賴的字段全部包含索引:
- 該情況mysql直接通過(guò)操作索引對(duì)滿足條件的數(shù)據(jù)進(jìn)行分組,然后從分組后的每組數(shù)據(jù)中去一條數(shù)據(jù)。
- distinct 依賴的字段未全部包含索引:
- 該情況由于索引不能滿足整個(gè)去重分組的過(guò)程,所以需要用到臨時(shí)表,mysql首先需要將滿足條件的數(shù)據(jù)放到臨時(shí)表中,然后在臨時(shí)表中對(duì)該部分?jǐn)?shù)據(jù)進(jìn)行分組,然后從臨時(shí)表中每個(gè)分組的數(shù)據(jù)中去一條數(shù)據(jù),在臨時(shí)表中進(jìn)行分組的過(guò)程中不會(huì)對(duì)數(shù)據(jù)進(jìn)行排序。
distinct的用法
distinct的使用語(yǔ)法是這樣的:
select distinct expression[,expression...] from tables [where conditions];
在使用distinct的過(guò)程中主要注意一下幾點(diǎn):
- 在對(duì)字段進(jìn)行去重的時(shí)候,要保證distinct在所有字段的最前面
- 如果distinct關(guān)鍵字后面有多個(gè)字段時(shí),則會(huì)對(duì)多個(gè)字段進(jìn)行組合去重,只有多個(gè)字段組合起來(lái)的值是相等的才會(huì)被去重
下面我們通過(guò)在開(kāi)發(fā)過(guò)程中經(jīng)常遇到的一些關(guān)于distinct的實(shí)例來(lái)加深大家對(duì)該關(guān)鍵字用法的理解:
數(shù)據(jù)庫(kù)表結(jié)構(gòu)和數(shù)據(jù)如下圖所示:

- 對(duì)單個(gè)字段進(jìn)行去重sql:
select distinct age from user; 查詢結(jié)果 age 10 20 30
- 對(duì)多個(gè)字段進(jìn)行去重sql:
select distinct name,age from user; 查詢結(jié)果 name age One 10 Zero 20 Two 20 Four 30 One 30
- 對(duì)多個(gè)字段進(jìn)行去重并求count的sql:
select count(distinct name,age) as total from user; 查詢結(jié)果 total 5
- 對(duì)select * 進(jìn)行去重
select distinct * from user; 由于 * 代表所有字段,所以該sql和 select distinct id,name,age,sign from user 語(yǔ)義相同 查詢結(jié)果: id name age sign 1 One 10 夢(mèng)想要有的,萬(wàn)一實(shí)現(xiàn)了呢 2 Zero 20 http://www.chaoshizhushou.com 3 Two 20 OneZeroTwoFour 4 Four 30 加油 5 One 30 學(xué)習(xí)才是硬道理 6 Four 30 一日三省吾身
到此這篇關(guān)于mysql中的distinct的用法的文章就介紹到這了,更多相關(guān)mysql distinct用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL分支和循環(huán)結(jié)構(gòu)方式
在MySQL中,IF函數(shù)用于根據(jù)條件返回不同的值,類似于Java的三目運(yùn)算符,CASE語(yǔ)句則提供了兩種形式:簡(jiǎn)單CASE函數(shù)和搜索CASE函數(shù),分別類似于Java中的switch-case結(jié)構(gòu)和多重if判斷,這些控制流函數(shù)在數(shù)據(jù)庫(kù)查詢和數(shù)據(jù)處理中非常有用,可以實(shí)現(xiàn)復(fù)雜的邏輯判斷2024-10-10
Linux中部署MySQL環(huán)境的四種方式圖文詳解
這篇文章主要介紹了Linux中部署MySQL環(huán)境的四種方式,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-11-11
在MySQL中用正則表達(dá)式替換數(shù)據(jù)庫(kù)中的內(nèi)容的方法
在MySQL中用正則表達(dá)式替換數(shù)據(jù)庫(kù)中的內(nèi)容的方法...2007-03-03
MySQL多表聯(lián)查的實(shí)現(xiàn)思路
數(shù)據(jù)庫(kù)應(yīng)用在我們的生活中是很常見(jiàn)的,在編輯一些應(yīng)用以及軟件的時(shí)候都需要用到數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于MongoDB中實(shí)現(xiàn)多表聯(lián)查的相關(guān)資料,需要的朋友可以參考下2023-02-02
常見(jiàn)php與mysql中文亂碼問(wèn)題解決辦法
MySQL對(duì)中文的支持程度還是很有限的,尤其是新手,但凡出現(xiàn)亂碼問(wèn)題,就會(huì)頭大。2014-09-09
Mysql如何將數(shù)據(jù)按照年月分組的統(tǒng)計(jì)
這篇文章主要介紹了Mysql如何將數(shù)據(jù)按照年月分組的統(tǒng)計(jì)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
MySQL 8.0 之索引跳躍掃描(Index Skip Scan)
這篇文章主要介紹了MySQL 8.0 之索引跳躍掃描(Index Skip Scan)的相關(guān)資料,幫助大家學(xué)習(xí)MySQL8.0的新特性,感興趣的朋友可以了解下2020-10-10

