MySQL練習題及答案

一 題目

一、查詢全部的課程的名稱以及對應的任課老師姓名

二、查詢學生表中男女生各有多少人

三、查詢物理成績等於100的學生的姓名

四、查詢平均成績大於八十分的同窗的姓名和平均成績

五、查詢全部學生的學號,姓名,選課數,總成績

六、 查詢姓李老師的個數

七、 查詢沒有報李平老師課的學生姓名

八、 查詢物理課程比生物課程高的學生的學號

九、 查詢沒有同時選修物理課程和體育課程的學生姓名

十、查詢掛科超過兩門(包括兩門)的學生姓名和班級
、查詢選修了全部課程的學生姓名

十二、查詢李平老師教的課程的全部成績記錄
 
1三、查詢所有學生都選修了的課程號和課程名

1四、查詢每門課程被選修的次數

1五、查詢之選修了一門課程的學生姓名和學號

1六、查詢全部學生考出的成績並按從高到低排序(成績去重)

1七、查詢平均成績大於85的學生姓名和平均成績

1八、查詢生物成績不及格的學生姓名和對應生物分數

1九、查詢在全部選修了李平老師課程的學生中,這些課程(李平老師的課程,不是全部課程)平均成績最高的學生姓名

20、查詢每門課程成績最好的前兩名學生姓名

2一、查詢不一樣課程但成績相同的學號,課程號,成績

2二、查詢沒學過「葉平」老師課程的學生姓名以及選修的課程名稱;

2三、查詢全部選修了學號爲1的同窗選修過的一門或者多門課程的同窗學號和姓名;

2四、任課最多的老師中學生單科成績最高的學生姓名

二 答案

#一、查詢全部的課程的名稱以及對應的任課老師姓名
SELECT
    course.cname,
    teacher.tname
FROM
    course
INNER JOIN teacher ON course.teacher_id = teacher.tid;




#二、查詢學生表中男女生各有多少人
SELECT
    gender 性別,
    count(1) 人數
FROM
    student
GROUP BY
    gender;




#三、查詢物理成績等於100的學生的姓名
SELECT
    student.sname
FROM
    student
WHERE
    sid IN (
        SELECT
            student_id
        FROM
            score
        INNER JOIN course ON score.course_id = course.cid
        WHERE
            course.cname = '物理'
        AND score.num = 100
    );




#四、查詢平均成績大於八十分的同窗的姓名和平均成績
SELECT
    student.sname,
    t1.avg_num
FROM
    student
INNER JOIN (
    SELECT
        student_id,
        avg(num) AS avg_num
    FROM
        score
    GROUP BY
        student_id
    HAVING
        avg(num) > 80
) AS t1 ON student.sid = t1.student_id;




#五、查詢全部學生的學號,姓名,選課數,總成績(注意:對於那些沒有選修任何課程的學生也算在內)
SELECT
    student.sid,
    student.sname,
    t1.course_num,
    t1.total_num
FROM
    student
LEFT JOIN (
    SELECT
        student_id,
        COUNT(course_id) course_num,
        sum(num) total_num
    FROM
        score
    GROUP BY
        student_id
) AS t1 ON student.sid = t1.student_id;




#六、 查詢姓李老師的個數
SELECT
    count(tid)
FROM
    teacher
WHERE
    tname LIKE '李%';




#七、 查詢沒有報李平老師課的學生姓名(找出報名李平老師課程的學生,而後取反就能夠)
SELECT
    student.sname
FROM
    student
WHERE
    sid NOT IN (
        SELECT DISTINCT
            student_id
        FROM
            score
        WHERE
            course_id IN (
                SELECT
                    course.cid
                FROM
                    course
                INNER JOIN teacher ON course.teacher_id = teacher.tid
                WHERE
                    teacher.tname = '李平老師'
            )
    );




#八、 查詢物理課程比生物課程高的學生的學號(分別獲得物理成績表與生物成績表,而後連表便可)
SELECT
    t1.student_id
FROM
    (
        SELECT
            student_id,
            num
        FROM
            score
        WHERE
            course_id = (
                SELECT
                    cid
                FROM
                    course
                WHERE
                    cname = '物理'
            )
    ) AS t1
INNER JOIN (
    SELECT
        student_id,
        num
    FROM
        score
    WHERE
        course_id = (
            SELECT
                cid
            FROM
                course
            WHERE
                cname = '生物'
        )
) AS t2 ON t1.student_id = t2.student_id
WHERE
    t1.num > t2.num;




#九、 查詢沒有同時選修物理課程和體育課程的學生姓名(沒有同時選修指的是選修了一門的,思路是獲得物理+體育課程的學生信息表,而後基於學生分組,統計count(課程)=1)
SELECT
    student.sname
FROM
    student
WHERE
    sid IN (
        SELECT
            student_id
        FROM
            score
        WHERE
            course_id IN (
                SELECT
                    cid
                FROM
                    course
                WHERE
                    cname = '物理'
                OR cname = '體育'
            )
        GROUP BY
            student_id
        HAVING
            COUNT(course_id) = 1
    );




#十、查詢掛科超過兩門(包括兩門)的學生姓名和班級(求出<60的表,而後對學生進行分組,統計課程數目>=2)
SELECT
    student.sname,
    class.caption
FROM
    student
INNER JOIN (
    SELECT
        student_id
    FROM
        score
    WHERE
        num < 60
    GROUP BY
        student_id
    HAVING
        count(course_id) >= 2
) AS t1
INNER JOIN class ON student.sid = t1.student_id
AND student.class_id = class.cid;




#十一、查詢選修了全部課程的學生姓名(先從course表統計課程的總數,而後基於score表按照student_id分組,統計課程數據等於課程總數便可)
SELECT
    student.sname
FROM
    student
WHERE
    sid IN (
        SELECT
            student_id
        FROM
            score
        GROUP BY
            student_id
        HAVING
            COUNT(course_id) = (SELECT count(cid) FROM course)
    );




#十二、查詢李平老師教的課程的全部成績記錄
SELECT
    *
FROM
    score
WHERE
    course_id IN (
        SELECT
            cid
        FROM
            course
        INNER JOIN teacher ON course.teacher_id = teacher.tid
        WHERE
            teacher.tname = '李平老師'
    );




#1三、查詢所有學生都選修了的課程號和課程名(取全部學生數,而後基於score表的課程分組,找出count(student_id)等於學生數便可)
SELECT
    cid,
    cname
FROM
    course
WHERE
    cid IN (
        SELECT
            course_id
        FROM
            score
        GROUP BY
            course_id
        HAVING
            COUNT(student_id) = (
                SELECT
                    COUNT(sid)
                FROM
                    student
            )
    );




#1四、查詢每門課程被選修的次數
SELECT
    course_id,
    COUNT(student_id)
FROM
    score
GROUP BY
    course_id;




#1五、查詢之選修了一門課程的學生姓名和學號
SELECT
    sid,
    sname
FROM
    student
WHERE
    sid IN (
        SELECT
            student_id
        FROM
            score
        GROUP BY
            student_id
        HAVING
            COUNT(course_id) = 1
    );




#1六、查詢全部學生考出的成績並按從高到低排序(成績去重)
SELECT DISTINCT
    num
FROM
    score
ORDER BY
    num DESC;




#1七、查詢平均成績大於85的學生姓名和平均成績
SELECT
    sname,
    t1.avg_num
FROM
    student
INNER JOIN (
    SELECT
        student_id,
        avg(num) avg_num
    FROM
        score
    GROUP BY
        student_id
    HAVING
        AVG(num) > 85
) t1 ON student.sid = t1.student_id;




#1八、查詢生物成績不及格的學生姓名和對應生物分數
SELECT
    sname 姓名,
    num 生物成績
FROM
    score
LEFT JOIN course ON score.course_id = course.cid
LEFT JOIN student ON score.student_id = student.sid
WHERE
    course.cname = '生物'
AND score.num < 60;




#1九、查詢在全部選修了李平老師課程的學生中,這些課程(李平老師的課程,不是全部課程)平均成績最高的學生姓名
SELECT
    sname
FROM
    student
WHERE
    sid = (
        SELECT
            student_id
        FROM
            score
        WHERE
            course_id IN (
                SELECT
                    course.cid
                FROM
                    course
                INNER JOIN teacher ON course.teacher_id = teacher.tid
                WHERE
                    teacher.tname = '李平老師'
            )
        GROUP BY
            student_id
        ORDER BY
            AVG(num) DESC
        LIMIT 1
    );




#20、查詢每門課程成績最好的前兩名學生姓名
#查看每門課程按照分數排序的信息,爲下列查找正確與否提供依據
SELECT
    *
FROM
    score
ORDER BY
    course_id,
    num DESC;




#表1:求出每門課程的課程course_id,與最高分數first_num
SELECT
    course_id,
    max(num) first_num
FROM
    score
GROUP BY
    course_id;




#表2:去掉最高分,再按照課程分組,取得的最高分,就是第二高的分數second_num
SELECT
    score.course_id,
    max(num) second_num
FROM
    score
INNER JOIN (
    SELECT
        course_id,
        max(num) first_num
    FROM
        score
    GROUP BY
        course_id
) AS t ON score.course_id = t.course_id
WHERE
    score.num < t.first_num
GROUP BY
    course_id;




#將表1和表2聯合到一塊兒,獲得一張表t3,包含課程course_id與該們課程的first_num與second_num
SELECT
    t1.course_id,
    t1.first_num,
    t2.second_num
FROM
    (
        SELECT
            course_id,
            max(num) first_num
        FROM
            score
        GROUP BY
            course_id
    ) AS t1
INNER JOIN (
    SELECT
        score.course_id,
        max(num) second_num
    FROM
        score
    INNER JOIN (
        SELECT
            course_id,
            max(num) first_num
        FROM
            score
        GROUP BY
            course_id
    ) AS t ON score.course_id = t.course_id
    WHERE
        score.num < t.first_num
    GROUP BY
        course_id
) AS t2 ON t1.course_id = t2.course_id;




#查詢前兩名的學生(有可能出現並列第一或者並列第二的狀況)
SELECT
    score.student_id,
    t3.course_id,
    t3.first_num,
    t3.second_num
FROM
    score
INNER JOIN (
    SELECT
        t1.course_id,
        t1.first_num,
        t2.second_num
    FROM
        (
            SELECT
                course_id,
                max(num) first_num
            FROM
                score
            GROUP BY
                course_id
        ) AS t1
    INNER JOIN (
        SELECT
            score.course_id,
            max(num) second_num
        FROM
            score
        INNER JOIN (
            SELECT
                course_id,
                max(num) first_num
            FROM
                score
            GROUP BY
                course_id
        ) AS t ON score.course_id = t.course_id
        WHERE
            score.num < t.first_num
        GROUP BY
            course_id
    ) AS t2 ON t1.course_id = t2.course_id
) AS t3 ON score.course_id = t3.course_id
WHERE
    score.num >= t3.second_num
AND score.num <= t3.first_num;




#排序後能夠看的明顯點
SELECT
    score.student_id,
    t3.course_id,
    t3.first_num,
    t3.second_num
FROM
    score
INNER JOIN (
    SELECT
        t1.course_id,
        t1.first_num,
        t2.second_num
    FROM
        (
            SELECT
                course_id,
                max(num) first_num
            FROM
                score
            GROUP BY
                course_id
        ) AS t1
    INNER JOIN (
        SELECT
            score.course_id,
            max(num) second_num
        FROM
            score
        INNER JOIN (
            SELECT
                course_id,
                max(num) first_num
            FROM
                score
            GROUP BY
                course_id
        ) AS t ON score.course_id = t.course_id
        WHERE
            score.num < t.first_num
        GROUP BY
            course_id
    ) AS t2 ON t1.course_id = t2.course_id
) AS t3 ON score.course_id = t3.course_id
WHERE
    score.num >= t3.second_num
AND score.num <= t3.first_num
ORDER BY
    course_id;




#能夠用如下命令驗證上述查詢的正確性
SELECT
    *
FROM
    score
ORDER BY
    course_id,
    num DESC;




-- 2一、查詢不一樣課程但成績相同的學號,課程號,成績
-- 2二、查詢沒學過「葉平」老師課程的學生姓名以及選修的課程名稱;
-- 2三、查詢全部選修了學號爲1的同窗選修過的一門或者多門課程的同窗學號和姓名;
-- 2四、任課最多的老師中學生單科成績最高的學生姓名

更多練習以及參考答案:https://www.cnblogs.com/clschao/articles/9995768.htmlhtml

相關文章
相關標籤/搜索