拖了一個(gè)星期,終于開(kāi)始寫(xiě)第三篇了。走起!
?
聚合函數(shù):
SQL中提供的聚合函數(shù)可以用來(lái)統(tǒng)計(jì)、求和、求最值等等。
分類:

SELECT COUNT ( < 計(jì)數(shù)規(guī)范 > ) FROM < 表名 >
其中,計(jì)數(shù)規(guī)范包括:
- * :計(jì)數(shù)所有選擇的行,包括NULL值;
- ALL 列名:計(jì)數(shù)指定列的所有非空值行,如果不寫(xiě),默認(rèn)為ALL;
- DISTINCT 列名:計(jì)數(shù)指定列的唯一非空值行。
SELECT COUNT ( * ) FROM t_student;
?
也可加入篩選條件,如求女學(xué)生數(shù)目:
SELECT COUNT ( * ) FROM t_student WHERE student_sex = ' 女 ' ;

SELECT COUNT ( DISTINCT student_class) FROM t_student;
DISTINCT即去重,如果不加DISTINCT則結(jié)果為表行數(shù)——5。
SELECT SUM (student_age) FROM t_student;
?
返回列平均值(AVG):
計(jì)算 學(xué)生平均年齡:
SELECT AVG (student_age) FROM t_student;
?
返回最大值/最小值(MAX/MIN):
求 年齡最大的學(xué)生信息(最小值同理):
SELECT MAX (student_age) FROM t_student;
注:這里只能求出最大年齡,要想顯示年齡最大的學(xué)生全部信息,需要用到之后的子查詢。
?
數(shù)據(jù)分組(GROUP BY):
SQL中數(shù)據(jù)可以按列名分組,搭配聚合函數(shù)十分實(shí)用。
例,統(tǒng)計(jì)每個(gè)班的人數(shù):
SELECT student_class, COUNT ( ALL student_name) AS 總?cè)藬?shù) FROM t_student GROUP BY (student_class);
AS為定義別名,別名的使用在組合及聯(lián)接查詢時(shí)會(huì)有很好的效果,之后再說(shuō)。
?
分組中也可以加入篩選條件WHERE,不過(guò)這里一定要注意的是,執(zhí)行順序?yàn)椋篧HERE過(guò)濾→分組→聚合函數(shù)。牢記!
統(tǒng)計(jì)每個(gè)班上20歲以上的學(xué)生人數(shù):
SELECT student_class, COUNT (student_name) AS 總?cè)藬?shù) FROM t_student WHERE student_age > 20 GROUP BY (student_class);
?
HAVING過(guò)濾條件:
之前說(shuō)了分組操作、聚合函數(shù)、WHERE過(guò)濾的執(zhí)行順序,那如果我們希望在聚合之后執(zhí)行過(guò)濾條件怎么辦?
例,我們想查詢平均年齡在20歲以上的班級(jí)
能用下面的語(yǔ)句嗎?
SELECT student_class, AVG (student_age) FROM t_student WHERE AVG (student_age) > 20 GROUP BY student_class;
SELECT student_class, AVG (student_age) AS 平均年齡 FROM t_student GROUP BY (student_class) HAVING AVG (student_age) > 20 ;



SELECT s.student_id,s.student_name,( SELECT class_name FROM t_class c WHERE c.class_id = s.class_id) FROM t_student s GROUP BY s.student_id;
* 首先這條SQL語(yǔ)句用到了別名,寫(xiě)法為在FORM的表名后加上某個(gè)字符比如FROM t_student s,這樣在之后調(diào)用t_student的某一列時(shí)就可以用s.student_id來(lái)強(qiáng)調(diào)此列來(lái)源于對(duì)應(yīng)別名的那張表。
別名在子查詢及聯(lián)接查詢中的應(yīng)用有著很好效果,當(dāng)兩張表有相同列名或者為了加強(qiáng)可讀性,給表加上不同的別名,就能很好的區(qū)分哪些列屬于哪張表。
還有種情況就是在子查詢或聯(lián)接查詢時(shí),主查詢及子查詢均為對(duì)同一張表進(jìn)行操作,為主、子查詢中的表加上不同的別名能夠很好的區(qū)分哪些列的操作是在主查詢中進(jìn)行的,哪些列的操作是在子查詢中進(jìn)行的,下文會(huì)有實(shí)例說(shuō)明。


SELECT * FROM t_student WHERE student_subject = ' C語(yǔ)言 ' AND student_score >=ALL ( SELECT student_score FROM t_student WHERE student_subject = ' C語(yǔ)言 ' ) ;
結(jié)果:
SELECT * FROM t_student WHERE student_subject = ' C語(yǔ)言 ' AND student_score > ( SELECT student_score FROM t_student WHERE student_name = ' 李四 ' AND student_subject = ' C語(yǔ)言 ' );
通過(guò)上面兩例,應(yīng)該可以明白子查詢?cè)赪HERE中嵌套的作用。通過(guò)子查詢中返回的列值來(lái)作為比較對(duì)象,在WHERE中運(yùn)用不同的比較運(yùn)算符來(lái)對(duì)其進(jìn)行比較,從而得到結(jié)果。
現(xiàn)在我們回到最開(kāi)始的問(wèn)題,怎么查出每門(mén)課最高成績(jī)的學(xué)生的信息:
SELECT * FROM t_student s1 WHERE s1.student_score >= ALL ( SELECT s2.student_score FROM t_student s2 WHERE s1.`student_subject` = s2.student_subject);
這里就是上文提到的別名的第二種用法,主、子查詢對(duì)同一張表操作,區(qū)分開(kāi)位于內(nèi)外表中相同的列名。
結(jié)果:
?
子查詢的分類:
?
組合查詢:
通過(guò)UNION運(yùn)算符來(lái)將兩張表縱向聯(lián)接,基本方式為:
SELECT 列1 , 列2 FROM 表1 UNION SELECT 列3 , 列4 FROM 表2;
UNION ALL為保留重復(fù)行:
SELECT 列1 , 列2 FROM 表1 UNION ALL SELECT 列3 , 列4 FROM 表2;
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
