MySql單表查詢練習(1)
阿新 • • 發佈:2019-02-11
目錄
本篇從經典的單表複雜查詢入手,回顧前面的常用子句,子查詢和聚合函式知識,多多練習,才能對sql有更深刻的認識。
對子查詢和函式,子句不熟悉的朋友可以參考本專欄的文章:
1、子查詢
一、需求
假設資料庫中有一張學生成績表tb_grade,欄位如下:
| sno |sname | cno | cname | score |
1、查詢不及格科目數大於等於3的學生學號和不及格科目數量
2、查詢不及格科目數大於等於3的學生學號和學生姓名
3、查詢不及格科目數大於等於3的學生學號、學生姓名、科目號、 科目名稱和分數,並按學號降序、科目號升序排序
二、解答
1、查詢不及格科目數大於等於2的學生學號和不及格科目數量
對於這個需求,首先可以肯定必須先用WHERE篩選出成績小於60的學生,再使用聚合函式COUNT()統計數量,使用GROUP BY通過學生學號分組,所以sql可以這麼寫
SELECT
t.sno,
COUNT(*)
FROM tb_grade t
WHERE t.score < 60
GROUP BY t.sno
HAVING COUNT( * ) >= 3
2、查詢不及格科目數大於等於2的學生學號和學生姓名
這個需求和上面的幾乎是一樣的,我們需要先分組,然後再用HAVING判斷數量即可
SELECT t.sno,t.sname FROM tb_grade t WHERE t.score < 60 GROUP BY t.sno HAVING COUNT(*) >= 3
3、查詢不及格科目數大於等於3的學生學號、學生姓名、科目號、 科目名稱和分數,並按學號降序、科目號升序排序
首先我們需要知道哪些學生不及格科目數大於等於3,這涉及到子查詢;ORDER BY排序中,預設為升序,即ASC,降序需要手動碼上DESC,所以sql可以這樣寫
SELECT t1.sname,t1.cno,t1.cname,t1.score FROM tb_grade t1 WHERE t1.sno IN (SELECT t2.sno FROM tb_grade t2 WHERE t2.score < 60 HAVING COUNT(*) >= 3) ORDER BY t.sno DESC, t.cno ASC