查詢選修全部課程的學生姓名和所屬單位
在解答這個問題之前先舉一個小例子,現有3張表
S (SI,SN,SD,SA) SI,SN,SD,SA 分別代表學號、學員姓名、所屬單位、學員年齡
C (CI,CN ) CI,CN 分別代表課程編號、課程名稱
SC ( SI,CI,G ) SI,CI,G 分別代表學號、所選修的課程編號、學習成績
查看SC表中的全部信息如下:
要求返回每個SC表中每個學生選修的課數
執行如下語句:
SELECT
sc.SI 學號,
COUNT(sc.CI) 選課門數
FROM
sc,c
GROUP BY
sc.SI
執行結果如下:
執行如下語句:
SELECT
sc.SI 學號,
COUNT(sc.CI) 選課門數
FROM
sc
GROUP BY
sc.SI
執行結果如下:
相信看到這裏應該知道我要說的是什麼問題了,可以看到兩次查詢語句的唯一差別就是 from sc和from sc,c,然而結果卻相差很多,這個就是由於關聯查詢造成的,從sc、c兩張表中選擇時結果會存在很多重複的行,所以需要剔除重複的行,因此在查詢時如果涉及到多張表,使用group by分組獲取數據時一定要記得剔除重複數據。
下面解決第一個問題
使用標準SQL嵌套語句查詢選修全部課程的學員姓名和所屬單位
解決方法1:
先在sc表中按學號分組找出選修所有課程的學生的學號,然後在S中通過SI去取學員學號和所屬單位
SELECT
s.SN 姓名,
s.SD 單位
FROM
s
WHERE
s.SI IN (
SELECT
sc.SI
FROM
sc,
c
GROUP BY
sc.SI
HAVING
COUNT(DISTINCT sc.CI) = (SELECT COUNT(*) FROM c)
)
解決方法二:
SELECT
s.SI,
s.SD
FROM
s
WHERE
NOT EXISTS (
SELECT
*
FROM
c
WHERE
NOT EXISTS (
SELECT
*
FROM
sc
WHERE
CI = s.SI
AND CI = c.CI
)
)
兩種方法相比,第一種更加靈活易懂,更加考驗了使用SQL查詢的能力,但是要記得剔除重複數據