查詢選修全部課程的學生姓名和所屬單位

查詢選修全部課程的學生姓名和所屬單位

在解答這個問題之前先舉一個小例子,現有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查詢的能力,但是要記得剔除重複數據

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章