拖了一個星期,終于開始寫第三篇了。走起!
?
聚合函數:
SQL中提供的聚合函數可以用來統計、求和、求最值等等。
分類:
SELECT
COUNT
(
<
計數規范
>
)
FROM
<
表名
>
其中,計數規范包括:
- * :計數所有選擇的行,包括NULL值;
- ALL 列名:計數指定列的所有非空值行,如果不寫,默認為ALL;
- DISTINCT 列名:計數指定列的唯一非空值行。
SELECT
COUNT
(
*
)
FROM
t_student;
?
也可加入篩選條件,如求女學生數目:
SELECT
COUNT
(
*
)
FROM
t_student
WHERE
student_sex
=
'
女
'
;
SELECT
COUNT
(
DISTINCT
student_class)
FROM
t_student;
DISTINCT即去重,如果不加DISTINCT則結果為表行數——5。
SELECT
SUM
(student_age)
FROM
t_student;
?
返回列平均值(AVG):
計算 學生平均年齡:
SELECT
AVG
(student_age)
FROM
t_student;
?
返回最大值/最小值(MAX/MIN):
求 年齡最大的學生信息(最小值同理):
SELECT
MAX
(student_age)
FROM
t_student;
注:這里只能求出最大年齡,要想顯示年齡最大的學生全部信息,需要用到之后的子查詢。
?
數據分組(GROUP BY):
SQL中數據可以按列名分組,搭配聚合函數十分實用。
例,統計每個班的人數:
SELECT
student_class,
COUNT
(
ALL
student_name)
AS
總人數
FROM
t_student
GROUP
BY
(student_class);
AS為定義別名,別名的使用在組合及聯接查詢時會有很好的效果,之后再說。
?
分組中也可以加入篩選條件WHERE,不過這里一定要注意的是,執行順序為:WHERE過濾→分組→聚合函數。牢記!
統計每個班上20歲以上的學生人數:
SELECT
student_class,
COUNT
(student_name)
AS
總人數
FROM
t_student
WHERE
student_age
>
20
GROUP
BY
(student_class);
?
HAVING過濾條件:
之前說了分組操作、聚合函數、WHERE過濾的執行順序,那如果我們希望在聚合之后執行過濾條件怎么辦?
例,我們想查詢平均年齡在20歲以上的班級
能用下面的語句嗎?
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語句用到了別名,寫法為在FORM的表名后加上某個字符比如FROM t_student s,這樣在之后調用t_student的某一列時就可以用s.student_id來強調此列來源于對應別名的那張表。
別名在子查詢及聯接查詢中的應用有著很好效果,當兩張表有相同列名或者為了加強可讀性,給表加上不同的別名,就能很好的區分哪些列屬于哪張表。
還有種情況就是在子查詢或聯接查詢時,主查詢及子查詢均為對同一張表進行操作,為主、子查詢中的表加上不同的別名能夠很好的區分哪些列的操作是在主查詢中進行的,哪些列的操作是在子查詢中進行的,下文會有實例說明。
SELECT
*
FROM
t_student
WHERE
student_subject
=
'
C語言
'
AND
student_score
>=ALL
(
SELECT
student_score
FROM
t_student
WHERE
student_subject
=
'
C語言
'
) ;
結果:
SELECT
*
FROM
t_student
WHERE
student_subject
=
'
C語言
'
AND
student_score
>
(
SELECT
student_score
FROM
t_student
WHERE
student_name
=
'
李四
'
AND
student_subject
=
'
C語言
'
);
通過上面兩例,應該可以明白子查詢在WHERE中嵌套的作用。通過子查詢中返回的列值來作為比較對象,在WHERE中運用不同的比較運算符來對其進行比較,從而得到結果。
現在我們回到最開始的問題,怎么查出每門課最高成績的學生的信息:
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);
這里就是上文提到的別名的第二種用法,主、子查詢對同一張表操作,區分開位于內外表中相同的列名。
結果:
?
子查詢的分類:
?
組合查詢:
通過UNION運算符來將兩張表縱向聯接,基本方式為:
SELECT
列1 , 列2
FROM
表1
UNION
SELECT
列3 , 列4
FROM
表2;
UNION ALL為保留重復行:
SELECT
列1 , 列2
FROM
表1
UNION
ALL
SELECT
列3 , 列4
FROM
表2;
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

