1. 什麼聚合函數
- 對一組值進行計算,並返回計算後的值,一般用來統計數據
1.1 SUM
SELECT SUM(age) AS '總年齡' FROM studb.student WHERE city='上海';
//返回結果
總年齡
70
1.2 AVG
SELECT AVG(age) AS '平均年齡' FROM student WHERE city='上海';
//返回結果
平均年齡
35.0000
1.3 MAX、MIN
SELECT MAX(age) AS '最大年齡',MIN(age) AS '最小年齡' FROM student WHERE city='上海';
//返回兩個表
//最大值表
最大年齡
40
//最小值表
最小年齡
30
1.4 COUNT
SELECT COUNT(*) AS '上海人數' FROM student WHERE city='上海';
//返回結果爲
上海人數
2
2. 分組
- 分組查詢就是按牟烈的值進行分組,相同的值分成一組,然後可以對此組內進行求平均值、和等計算
2.1 語法
SELECT 列名,查詢表達式/聚合表達式
FROM <表名>
WHERE <條件>
GROUP BY <分組字段>
HAVING 分組後的過濾條件
ORDER BY 列名 [ASC,DESC]
LIMIT 偏移量,條數
- 上面的關鍵字可以不出現,但是如果出現,順序是固定的
- SELECT列表中只能包含:
- 被分組的列
- 爲每個分組返回一個值的表達式,如聚合函數
2.2 練習
- 單列分組
SELECT student_id,AVG(grade)
FROM score
GROUP BY student_id
- 統計每門課程的最高分,並按分數從高到低排列 - 單列分組
SELECT course_id,MAX(grade)
FROM score
GROUP BY course_id
ORDER BY MAX(grade) DESC
//注意排序的時候是根據MAX(grade),而不是根據grade
- 多列分組
SELECT province,gender,COUNT(*) AS '總人數'
FROM student
GROUP BY province,gender
2.3 分組篩選
2.3.1 語法
- 對分組後的結果進行過濾,就是分組篩選
- 使用HAVING關鍵字
2.3.2 練習
SELECT province,COUNT(*)
FROM student
GROUP BY province
HAVING COUNT(*) > 1
SELECT student_id,COUNT(*) 不及格次數
FROM score
WHERE grade<60
GROUP BY student_id
HAVING COUNT(*) > 1;
3. 子查詢
- 子查詢就是指出現在其他SQL語句中的SELECT語句,必須使用出現在圓括號()中
- 子查詢可以包含多個關鍵字或條件
- 子查詢的外層查詢可以是:SELECT、INSERT、UPDATE、SET等
- 子查詢可以返回常量、一行數據、一列數據或其他字查詢
3.1 比較運算符的子查詢
- = 等於
- > 大於
- < 小於
- >= 大於等於
- <= 小於等於
- <> 不等於
- != 不等於
- <=> 安全不等於
3.2 舉例:查詢年齡大於平均年齡的學生
SELECT *
FROM student
WHERE age > (SELECT AVG(age) FROM student);
3.3 ANY SOME ALL
- ANY 任何
- SOME 存在
- ALL 所有
SELECT *
FROM student
WHERE age > ANY (SELECT age FROM student WHERE province='陝西省');
SELECT *
FROM student
WHERE age > ALL (SELECT age FROM student WHERE province='陝西省');
SELECT *
FROM student
WHERE age = SOME (SELECT age FROM student WHERE provice='陝西省');
3.4 IN與NOT IN
- IN 在…範圍內
- NOT IN 不在…範圍內
- 舉例:查詢一下有考試成績的學生信息
SELECT *
FROM student
WHERE id IN (SELECT student_id FROM score WHERE grade IS NOT NULL);
3.5 EXITS與NOT EXITS 這個性能比 IN與NOT IN 要高
- EXITS 存在於
- NOT EXITS 不存在於…
- 舉例:查詢下有考試成績的學生信息
SELECT *
FROM student
WHERE EXITS (SELECT * FROM score WHERE score.student_id = student.id)