題目敘述
題目會給我們一張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.
約束條件
以課程做分群,列出至少有五位同學的課程。
演算法1-分群
這題主要的考點落在分群,可以使用經典的SQL 分群語法去解開
SELECT ...欄位 FROM ...表格 WHERE ...條件
GROUP BY ...分群的依據欄位
HAVING ...過濾的條件
這題已經要求針對課程去做分群
所以使用 GROUP by class
同時,要求列出的課程必須有至少五位學生,
所以使用HAVING COUNT(student) >= 5
程式碼1-分群
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;
演算法2-子查詢
也可以用前面學過的SQL subquery子查詢語法,相當於先建出一張臨時表,包含課程和和每堂課程對應的學生總數。接著,再列出至少有五位學生的課程,即為所求。
SELECT ...欄位
FROM (課程和和每堂課程對應的學生總數的臨時表)
WHERE ...欄位 ... 做條件判斷(至少有五位學生的課程)
程式碼2-子查詢
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: