題目會給我們一張Courses資料表,裡面分別有student、class等欄位。其中(student, class) 是這張資料表的複合主鍵Primary key pair。
要求我們,以課程做分群,列出至少有五位同學的課程。
輸出的順序不拘。
Table: Courses
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| student | varchar |
| class | varchar |
+-------------+---------+
(student, class) is the primary key (combination of columns with unique values) for this table.
Each row of this table indicates the name of a student and the class in which they are enrolled.
以課程做分群,列出至少有五位同學的課程。
這題主要的考點落在分群,可以使用經典的SQL 分群語法去解開
SELECT ...欄位 FROM ...表格 WHERE ...條件
GROUP BY ...分群的依據欄位
HAVING ...過濾的條件
這題已經要求針對課程去做分群
所以使用 GROUP by class
同時,要求列出的課程必須有至少五位學生,
所以使用HAVING COUNT(student) >= 5
class SoSELECT class
FROM Courses
GROUP by class
# Select those classes which have at least 5 students for each single class.
HAVING COUNT(student) >= 5;
也可以用前面學過的SQL subquery子查詢語法,相當於先建出一張臨時表,包含課程和和每堂課程對應的學生總數。接著,再列出至少有五位學生的課程,即為所求。
SELECT ...欄位
FROM (課程和和每堂課程對應的學生總數的臨時表)
WHERE ...欄位 ... 做條件判斷(至少有五位學生的課程)
SELECT class
FROM(
SELECT class, COUNT(student) as class_std_num
FROM Courses
GROUP BY class
) AS class_st_table
WHERE class_std_num >= 5;
看到分群 想到GROUP BY ... HAVING ...條件的語法。
可以同步複習 SQL分群語法 列出活躍使用者 Leetcode #1141這一題,鞏固分群GROUP BY的語法和知識點。
另外,條條大路通羅馬,一題多解,也可以用前面學過的子查詢語法,先建立臨時表,再從臨時表裡面撈資料。
(當覺得一步到位很難的時候,可以先拆成臨時表,再從臨時表裡面去查詢撈資料)
可以同步複習 SQL子查詢語法 產品銷售分析III Leetcode #1070 這一題,鞏固子查詢的語法和知識點。
Reference: