SQL 經典題型解答(4)
阿新 • • 發佈:2018-09-12
() 分享圖片 特征 交叉 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
語句第一個出現,但是幾乎總是最後被處理。 每個步驟都會產生一個虛擬表,該虛擬表被用作下一個步驟的輸入。這些虛擬表對調用者(客戶端應用程序或者外部查詢)不可用。只是最後一步生成的表才會返回 給調用者
上面代碼的運行順序如下:
- FROM:對
FROM
子句中的前兩個表執行笛卡爾積( Cartesian product )(交叉聯接),生成虛擬表 VT1- WHERE:對 VT1 應用
WHERE
篩選器。只有使為 TRUE 的行才被插入 VT2 .- GROUP BY:按
GROUP BY
子句中的列列表對 VT2 中的行分組,生成 VT3 .- SELECT:處理
SELECT
列表,產生 VT4 .ORDER BY:將 VT4 中的行按
ORDER BY
子句中的列列表排序,生成 VT5,並返回調用者.
CAST(expr AS type)
函數用於將 expr 源值轉換為目標數據類型 typeCAST()
函數中的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)