1. 程式人生 > >SQL 經典題型解答(4)

SQL 經典題型解答(4)

() 分享圖片 特征 交叉 core 和平 兩個 true order by

SQL 經典題型解答(4)

18、查詢各科成績最高分、最低分和平均分:以如下形式顯示:課程ID,課程name,最高分,最低分,平均分,及格率,中等率,優良率,優秀率
及格為>=60,中等為:70-80,優良為:80-90,優秀為:>=90

SELECT
    a.C,
    a.Cname,
    MAX( b.score ),
    MIN( b.score ),
    CAST( AVG( b.score ) AS DECIMAL ( 18, 2 ) ) pingqunfen,
    CAST(
        ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C AND sc.score > 60 ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C ) AS DECIMAL ( 18, 2 ) 
    ) jigelv,
    CAST(
        (
        SELECT
            COUNT( 1 ) 
        FROM
            sc 
        WHERE
            sc.C = a.c 
            AND sc.score >= 70 
            AND sc.score < 80 
        ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.c = a.c ) AS DECIMAL ( 18, 2 ) 
    ) zhongdneglv,
    CAST(
        (
        SELECT
            COUNT( 1 ) 
        FROM
            sc 
        WHERE
            sc.C = a.C 
            AND sc.score >= 80 
            AND sc.score < 90 
        ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C ) AS DECIMAL ( 18, 2 ) 
    ) youlianglv,
    CAST(
        ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C AND sc.score >= 90 ) / ( SELECT COUNT( 1 ) FROM sc WHERE sc.C = a.C ) AS DECIMAL ( 18, 2 ) 
    ) youxiulv 
FROM
    course a,
    sc b 
WHERE
    a.C = b.C 
GROUP BY
    a.C,
    a.Cname 
ORDER BY
        a.C 

詳解:

SQL 不同於與其他編程語言的最明顯特征是處理代碼的順序。在大數編程語言中,代碼按編碼順序被處理,但是在 SQL 語言中,第一個被處理的子句是 FROM 子句,盡管 SELECT 語句第一個出現,但是幾乎總是最後被處理。 每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只是最後一步生成的表才會返回 給調用者
上面代碼的運行順序如下:

  1. FROM:對 FROM 子句中的前兩個表執行笛卡爾積( Cartesian product )(交叉聯接),生成虛擬表 VT1
  2. WHERE:對 VT1 應用 WHERE 篩選器。只有使為 TRUE 的行才被插入 VT2 .
  3. GROUP BY:按 GROUP BY 子句中的列列表對 VT2 中的行分組,生成 VT3 .
  4. SELECT:處理 SELECT 列表,產生 VT4 .
  5. ORDER BY:將 VT4 中的行按 ORDER BY 子句中的列列表排序,生成 VT5,並返回調用者.

    • CAST(expr AS type)函數用於將 expr 源值轉換為目標數據類型 type
    • CAST() 函數中的SELECT 語句需要通過 WHERE sc.C = a.C 進行限制,因為已經通過 GROUP BY 語句對表 a 進行了分組,如果不加限制,算出的結果沒有對課程進行分組。
      代碼中的 COUNT( 1 )表示求表 sc 的第一列數量,相當於 COUNT( s )

參考資料:

  • SQL語句操作優先級順序
  • SQL CAST 用法

程序運行結果:
技術分享圖片


19、按各科成績進行排序,並顯示排名

SELECT
    a.s,
    a.sname,
    c.Cname,
    b.score,
    RANK ( ) over ( ORDER BY b.score DESC) AS ‘名次‘
FROM
    student a,
    sc b,
    course c 
WHERE
    a.s = b.S 
    AND b.c = c.C 
    AND b.C = ‘01‘ 

詳解:

RANK() 函數用法:RANK() OVER(order by [目標列名]) as name,根據目標列名所在列進行排序,返回排名。
其他科目程序與上面類似。
SQL 四大排名函數

程序運行結果:
技術分享圖片


部分答案參考自:SQL 經典五十道題

SQL 經典題型解答(4)