SQL 經典題型解答(6)
SQL 經典習題解答(6)
23、統計各科成績各分數段人數:課程編號,課程名稱,[100-85],[85-70],[70-60],[0-60]及所占百分比
SELECT t1.*, t2.all_num, CONCAT( ROUND( t1.num / t2.all_num * 100, 2 ), ‘%‘ ) ‘百分比‘ FROM ( SELECT m.C, m.Cname, ( CASE WHEN n.score >= 85 THEN ‘85-100‘ WHEN n.score >= 70 AND n.score < 85 THEN ‘70-85‘ WHEN n.score >= 60 AND n.score < 70 THEN ‘60-70‘ ELSE ‘0-60‘ END ) AS px, count( 1 ) num FROM Course m, sc n WHERE m.C = n.C GROUP BY m.C, m.Cname, px ORDER BY m.C ) t1, ( SELECT m.C, m.Cname, count( 1 ) all_num FROM Course m, sc n WHERE m.C = n.C GROUP BY m.C, m.Cname ORDER BY m.C ) t2 WHERE t1.c = t2.c
詳解:
首先統計各科成績各分數段人數:課程編號,課程名稱,選擇表 sc 和表 course ,通過
CASE ... WHEN ... THEN ... ELSE ... END
語句分出分數段,再查出每一個課程學習的總人數,最後相除即可得到百分比。
CASE ... WHEN ... THEN ... ELSE ... END
用法參考
SQL 字符串拼接
程序運行結果:
24、查詢學生平均成績及其名次
SELECT a.*, b.avgscore, b.mc FROM student a, ( SELECT s, avg( score ) AS avgscore, rank ( ) over ( ORDER BY avg( score ) DESC ) AS mc FROM sc GROUP BY S ) b WHERE a.s = b.s ORDER BY mc
詳解:
首先從表 sc 中查出每個學生的平均成績和根據平均成績進行的排名,再與表 student 連接得到結果
程序運行結果:
25、查詢各科成績前三名的記錄
SELECT a.*, b.c, b.score, b.mc FROM student a, ( SELECT *, row_number ( ) over ( PARTITION BY c ORDER BY score DESC ) AS mc FROM sc ) b WHERE a.s = b.s AND mc BETWEEN 1 AND 3 ORDER BY c, mc
詳解:
首先在表 sc 根據課程成績生成每一門課程的排名記為表 b ,然後與表 student 連接得到結果
程序運行結果:
26、查詢每門課程被選修的學生數
SELECT
c,
count( s ) AS num
FROM
sc
GROUP BY
c
程序運行結果:
27、查詢出只有兩門課程的全部學生的學號和姓名
SELECT
a.s,
a.sname
FROM
student a,
( SELECT s FROM sc GROUP BY s HAVING count( s ) = 2 ) b
WHERE
a.s = b.s
詳解:
在表 sc 中,學號出現的次數即為學生課程數,通過
GROUP BY
和HAVING
函數得出選課數為 2 的學生學號,連接表 student 得出結果
程序運行結果:
28、查詢男生、女生人數
SELECT Ssex,count(s) FROM student WHERE Ssex = ‘男‘
UNION ALL
SELECT Ssex,count(s) FROM student WHERE Ssex = ‘女‘
程序運行結果:
29、查詢名字中含有"風"字的學生信息
SELECT
*
FROM
student
WHERE
Sname LIKE ‘%風%‘
程序運行結果:
30、查詢同名同性學生名單,並統計同名人數
SELECT
Sname,
Ssex,
COUNT( 1 ) num
FROM
student
GROUP BY
Sname,
Ssex
HAVING
count( 1 ) > 1
詳解:
通過
GROUP BY
劃分出同名同性的學生,在通過HAVING
判斷人數是否大於 1
程序運行結果:
31、查詢1990年出生的學生名單(註:Student表中Sage列的類型是datetime)
SELECT
*
FROM
student
WHERE
Sage LIKE ‘1990%‘
程序運行結果:
32、查詢每門課程的平均成績,結果按平均成績降序排列,平均成績相同時,按課程編號
SELECT
c,
avg( score ) AS avgscore
FROM
sc
GROUP BY
c
ORDER BY
avg( score ) DESC,
c
詳解:
ORDER BY
,先根據avg( score )
排序,如果平均成績相同,再根據課程編號升序排列
程序運行結果:
33、查詢平均成績大於等於85的所有學生的學號、姓名和平均成績
SELECT
a.s,
a.sname,
b.avgscore
FROM
student a,
( SELECT s, avg( score ) AS avgscore FROM sc GROUP BY s HAVING avg( score ) >= 85 ) b
WHERE a.s = b.s
程序運行結果:
34、查詢課程名稱為"數學",且分數低於60的學生姓名和分數
SELECT
a.sname,
b.score
FROM
student a,
sc b,
course c
WHERE
a.s = b.s
AND b.c = c.C
AND b.score < 60
AND c.Cname = ‘數學‘
程序運行結果:
SQL 經典題型解答(6)