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

SQL 經典題型解答(6)

排列 百分比 每一個 學習 cname .html between 分數 arch

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 BYHAVING 函數得出選課數為 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)