1. 程式人生 > >MySql單表查詢練習(1)

MySql單表查詢練習(1)

目錄

一、需求

二、解答

本篇從經典的單表複雜查詢入手,回顧前面的常用子句,子查詢和聚合函式知識,多多練習,才能對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