相信小伙伴們在后臺開發(fā)過程中和數(shù)據(jù)庫打交道經(jīng)常需要排重莺掠,因此今天主要來記錄一下和排重相關(guān)的幾個關(guān)鍵字崭歧。
DISTINCT和GROUP BY顿仇,其實在一定情況下之前記錄的TOP關(guān)鍵字也可以用來排重
DISTINCT
DISTINCT中文翻譯為有區(qū)別的角雷,在SQL語句中此關(guān)鍵字也只會返回有所不同的內(nèi)容欣尼,把相同的內(nèi)容過濾掉爆雹,因此起到排重的作用°倒模基本語法為:
SELECT DISTINCT 列名稱 FROM 表名稱
DISTINCT依照 后面跟的列名稱來排重钙态,可以是一個字段,也可以是多個字段拒啰,并且只返回用來排重的這些字段驯绎,接下來就舉例子來看什么情況下使用此排重方法完慧。
首先我們來創(chuàng)建一張排重表
谋旦,并使用INSERT INTO 排重表(id,name,identityid,age) VALUES('4','小果凍','130423199401102534','26')
來插入幾條數(shù)據(jù),我們看最終的結(jié)果為:
現(xiàn)在有一個需求就是需要知道表中到底有幾個身份證號號屈尼,可以發(fā)現(xiàn)
小明
和小紅
的identityid
是相同的册着,接下里我們使用DISTINCT
關(guān)鍵字看是否可以得到理想的結(jié)果
SELECT DISTINCT identityid FROM 排重表
結(jié)果為:
從上面我們可以看到得到了排重之后的
identityid
,由此可見關(guān)鍵字DISTINCT
后面跟的列名稱是用來排重的也是用來返回的脾歧。接下來我們看通過兩個字段來排重甲捏,也就是說這兩個字段均相同才算是重復(fù)
SELECT DISTINCT id,identityid FROM 排重表
結(jié)果為:
當(dāng)然你也可以按除id外的所有字段來排重,但是需要注意的是DISTINCT后面跟的字段是排重字段也是最后輸出結(jié)果的字段鞭执,而且此關(guān)鍵字必須放在SELECT后面司顿,其他的前面芒粹,比如TOP等的前面.
接下來看一下和
COUNT
關(guān)鍵字共同使用的例子
//按一個字段排重后的count數(shù)
SELECT COUNT(DISTINCT age) FROM 排重表
//按多個字段排重的count數(shù)
SELECT COUNT (*)FROM(SELECT DISTINCT name,identityid,age FROM 排重表)AS b
運行結(jié)果大家可以自己試一下。
GROUP BY
GROUP BY分組統(tǒng)計大溜,形式上也是用來排重化漆,但是和上面的DISTINCT的使用場景不太一樣,一般和聚合函數(shù)一起使用钦奋,像SUM座云,MAX,GROUP_CONCAT等付材,小心小伙伴們看到下面的例子就可以體會到和DISTINCT的區(qū)別朦拖。
首先我們先來新建一張表,來簡單的記錄一下班級中學(xué)生的數(shù)學(xué)成績厌衔,通過下面的sql語句來批量的插入數(shù)據(jù)
//注意使用的關(guān)鍵字是VALUES而不是VALUE
INSERT INTO score(id,name,class,mathscore) VALUES('4','小糖豆','二班','79'),('5','小狗答','三班','93'),('6','小烏龜','三班','76')
接下來我們看到這張表中的數(shù)據(jù)是這樣的:
那么我如果想知道各個班級的平均成績怎么辦呢璧帝?
SUM,COUNT
//解釋一下這句sql葵诈,通過class進(jìn)行分組后裸弦,計算SUM(mathscore)就會得到按照某個class計算的分?jǐn)?shù)和,而COUNT(mathscore)則會得到某個class下幾個mathscore作喘,兩者相除則是該班級成績平均數(shù)理疙,AS關(guān)鍵字之前已經(jīng)記錄過了,這就不重申了泞坦。
SELECT class,SUM(mathscore)/COUNT(mathscore) AS average FROM score GROUP BY class ORDER BY average DESC
補充:
COALESCE(SUM(mathscore),0),這句sql的意思是當(dāng)和為null,時轉(zhuǎn)變成0,一般在業(yè)務(wù)中使用到,從數(shù)據(jù)庫中查到的數(shù)據(jù)時null時未做安全判斷直接進(jìn)行操作,會報空指針的錯誤,所以可以直接在sql層處理掉!
運行結(jié)果為:
那如果想要知道某個班的最高分?jǐn)?shù)呢窖贤?
SELECT class,MAX(mathscore) AS maxscore FROM score GROUP BY class ORDER BY maxscore DESC
運行結(jié)果為:
注意:SELECT 后面跟的列名稱必須是GROUP BY子句后面的分組對象或聚合函數(shù),否則會報錯贰锁。如SELECT * FROM score GROUP BY class,id,name赃梧;在這條sql中是按照class,id,name來進(jìn)行分組的,但是SELECT * 表示查詢該表中所有字段豌熄,但又因為mathscore不做分組標(biāo)志授嘀,因此會報錯
[Err] 42000 - [SQL Server]選擇列表中的列 'score.mathscore' 無效,因為該列沒有包含在聚合函數(shù)或 GROUP BY 子句中锣险。
那么如果我們想要看各個班的成績列表呢?
GROUP_CONCAT
SELECT class, GROUP_CONCAT(name,mathscore),GROUP_CONCAT(mathscore) FROM score GROUP BY class