MySQL 練習題 答案


二、操作表

1、自行創建測試數據

2、查詢“生物”課程比“物理”課程成績高的所有學生的學號;
    SELECT * FROM
        (SELECT score.student_id,course.cname,score.num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="生物") AS A
     INNER JOIN 
        (SELECT score.student_id,course.cname,score.num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="物理") AS B
        on A.student_id = B.student_id WHERE A.num > B.num;
        
3、查詢平均成績大於60分的同學的學號和平均成績;
    SELECT B.student_id,student.sname,B.s_num FROM (SELECT student_id,avg(num) AS s_num from score GROUP BY student_id HAVING s_num>60) as B
        LEFT JOIN student on B.student_id = student.sid;  取前三: %ORDER BY s_num desc LIMIT 3;

4、查詢所有同學的學號、姓名、選課數、總成績;
    SELECT score.student_id,student.sname,COUNT(score.course_id) AS courses,SUM(num) as T_Score FROM score 
        LEFT JOIN student on score.student_id=student.sid GROUP BY score.student_id;
        
5、查詢姓“李”的老師的個數;
    SELECT * from teacher WHERE tname like "李%";
    
6、查詢沒學過“李平”老師課的同學的學號、姓名;
    SELECT student.sid,student.sname FROM student WHERE student.sid NOT IN (
        SELECT score.student_id FROM score LEFT JOIN course ON score.course_id = course.cid WHERE score.course_id IN (
            SELECT course.cid FROM course LEFT JOIN teacher ON course.teacher_id = teacher.tid WHERE teacher.tname LIKE "李平%") GROUP BY score.student_id)
    
7、查詢學過“001”並且也學過編號“002”課程的同學的學號、姓名;
    SELECT B.sid,B.sname FROM(
        SELECTstudent.sid,score.course_id,student.sname FROM score
            LEFT JOIN student ON score.student_id = student.sid WHERE score.course_id BETWEEN 1 AND 2) AS B
        GROUP BY B.sid HAVING COUNT(B.course_id)=2;

8、查詢學過“葉平”老師所教的所有課的同學的學號、姓名;
    SELECT student.sid,student.sname FROM score LEFT JOIN student ON score.student_id=student.sid WHERE score.course_id in 
        (SELECT course.cid FROM course LEFT JOIN teacher on course.teacher_id=teacher.tid WHERE tname LIKE "李平%") 
            GROUP BY student.sid HAVING COUNT(student_id)=2;

9、查詢課程編號“002”的成績比課程編號“001”課程低的所有同學的學號、姓名;
    SELECT A.sid,A.sname,A.num as score_2,B.num as score_1 FROM
        (SELECT student.sid,student.sname,score.num FROM score LEFT JOIN student on score.student_id=student.sid WHERE score.course_id=2) AS A
        INNER JOIN
        (SELECT student.sid,student.sname,score.num FROM score LEFT JOIN student on score.student_id=student.sid WHERE score.course_id=1) AS B
            ON A.sid = B.sid WHERE A.num<B.num;
    
10、查詢有課程成績小於60分的同學的學號、姓名;
    SELECT student.sid,student.sname FROM student WHERE sid IN
        (SELECT score.student_id FROM score WHERE score.num<60 GROUP BY student_id);

11、查詢沒有學全所有課的同學的學號、姓名;
    SELECT student.sid,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));
    
12、查詢至少有一門課與學號為“001”的同學所學相同的同學的學號和姓名;
    SELECT student.sid,student.sname FROM student where student.sid in 
        (SELECT score.student_id FROM score WHERE course_id in 
            (SELECT score.course_id FROM score WHERE student_id=1) and student_id !=1 GROUP BY student_id);
    
13、查詢至少學過學號為“001”同學所選課程中任意一門課的其他同學學號和姓名;
    SELECT student.sid,student.sname FROM student where student.sid in 
        (SELECT score.student_id FROM score WHERE course_id in 
            (SELECT score.course_id FROM score WHERE student_id=1) and student_id !=1 GROUP BY student_id 
                having count(1) =(SELECT count(score.course_id) FROM score WHERE student_id=1));

14、查詢和“002”號的同學學習的課程完全相同的其他同學學號和姓名;
        
    SELECT sid AS 學號,sname AS 姓名 FROM student WHERE sid IN(
    SELECT student_id FROM score WHERE student_id IN (
        SELECT student_id FROM score WHERE student_id!=2 GROUP BY student_id 
            HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE student_id=2))
                AND course_id in (SELECT course_id FROM score WHERE student_id=2) 
                    GROUP BY student_id HAVING COUNT(1)=(SELECT COUNT(1) FROM score WHERE student_id=2))

15、刪除學習“葉平”老師課的SC表記錄;
    DELETE FROM score WHERE course_id IN
        (SELECT cid FROM course LEFT JOIN teacher on course.teacher_id=teacher.tid WHERE tname="李平老師")

16、向SC表中插入一些記錄,這些記錄要求符合以下條件:①沒有上過編號“002”課程的同學學號;②插入“002”號課程的平均成績; 
    1INSERT into score(student_id,course_id,num) 
            SELECT student_id,2,(SELECT AVG(num) FROM score WHERE course_id=2) FROM score WHERE course_id!=2 group by student_id
            
    --2、SELECT AVG(num) FROM score WHERE course_id=2 --
    
17、按平均成績從低到高顯示所有學生的“語文”、“數學”、“英語”三門的課程成績,按如下形式顯示: 學生ID,語文,數學,英語,有效課程數,有效平均分;
    SELECT student_id AS 學生ID,
        (SELECT num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="語文" AND student_id=s1.student_id) AS 語文,
        (SELECT num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="數學" AND student_id=s1.student_id) AS 數學,
        (SELECT num FROM score LEFT JOIN course on score.course_id=course.cid WHERE course.cname="英語" AND student_id=s1.student_id) AS 英語
            FROM score as s1 GROUP BY student_id;
    
18、查詢各科成績最高和最低的分:以如下形式顯示:課程ID,最高分,最低分;
    SELECT score.course_id AS 課程ID,course.cname as 課程名,MAX(num) as 最高分,MIN(num) as 最低分 FROM score 
        LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id;
        

19、按各科平均成績從低到高和及格率的百分數從高到低順序;
    
    平均分:
    SELECT score.course_id AS 課程ID,course.cname as 課程名,AVG(num) AS 平均分 FROM score 
        LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id ORDER BY 平均分 ASC;
    及格率:
    SELECT A.cid,A.cname,ROUND(B.s/A.ss*100,1)+% AS 及格率 FROM
        (SELECT cid,cname,COUNT(course_id) AS ss FROM score LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id) as A
            INNER JOIN
        (SELECT course_id,COUNT(num) as s FROM score WHERE score.num>60 GROUP BY course_id) as B ON A.cid=B.course_id ORDER BY 及格率 DESC;
    整合:
    SELECT x.課程ID,x.課程名,x.平均分,xx.及格率 FROM
    (SELECT score.course_id AS 課程ID,course.cname as 課程名,AVG(num) AS 平均分 FROM score 
            LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id ORDER BY 平均分 ASC) AS x 
    LEFT JOIN
    (SELECT A.cid,A.cname,ROUND(B.s/A.ss*100,1) AS 及格率 FROM
        (SELECT cid,cname,COUNT(course_id) AS ss FROM score LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id) as A
            INNER JOIN
        (SELECT course_id,COUNT(num) as s FROM score WHERE score.num>60 GROUP BY course_id) as B ON A.cid=B.course_id ORDER BY 及格率 DESC) AS xx
ON x.課程ID=xx.cid 
    
    標准:
    SELECT course_id,AVG(num) AS 平均分,ROUND(sum(CASE WHEN num<60 then 0 ELSE 1 END)/sum(1)*100,1) AS 及格率 
        FROM score GROUP BY course_id ORDER BY 平均分 ASC,及格率 DESC;


20、課程平均分從高到低顯示(現實任課老師);
    SELECT course.cname,teacher.tname,xxx.平均分 FROM course
        LEFT JOIN teacher ON course.teacher_id=teacher.tid 
        LEFT JOIN (SELECT course_id,AVG(num) AS 平均分 FROM score GROUP BY course_id) AS xxx ON xxx.course_id=course.cid
        ORDER BY xxx.平均分 DESC

21、查詢各科成績前三名的記錄:(不考慮成績並列情況) 
    SELECT s1.cid AS 課程ID,s1.cname AS 課程,
        (SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 0,1) AS 第一,
        (SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 1,1) AS 第二,
        (SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 2,1) AS 第三
    FROM course AS s1    
        
22、查詢每門課程被選修的學生數;
    SELECT course.cid AS 課程ID,course.cname AS 課程名,COUNT(1) AS 學生數 FROM score 
        LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id; 
23、查詢出只選修了一門課程的全部學生的學號和姓名;
    SELECT student.sid AS 學號,student.sname AS 姓名 FROM student
        WHERE sid IN (SELECT student_id FROM score GROUP BY student_id HAVING count(1)=1)    
        
24、查詢男生、女生的人數;
    SELECT gender AS 性別,COUNT(1) AS 人數 FROM student GROUP BY gender;

25、查詢姓“張”的學生名單;
    SELECT * FROM student WHERE sname LIKE "張%"
    
26、查詢同名同姓學生名單,並統計同名人數;
    SELECT sname As 姓名,COUNT(1) AS 人數 FROM student GROUP BY sname; 

27、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;
    SELECT
        course.cid AS 課程ID,
        course.cname AS 課程名,
        AVG(IF(ISNULL(num),0,score.num)) AS 平均分
    FROM score LEFT JOIN course ON score.course_id = course.cid 
        GROUP BY score.course_id ORDER BY 平均分 ASC,課程ID DESC;
    
28、查詢平均成績大於85的所有學生的學號、姓名和平均成績;
    SELECT student.sid AS 學號,student.sname AS 姓名,AVG(if(isnull(num),0,score.num)) AS 平均分 
    FROM score LEFT JOIN student ON score.student_id=student.sid 
        GROUP BY score.student_id HAVING 平均分>85;
    
29、查詢課程名稱為“數學”,且分數低於60的學生姓名和分數;
    SELECT student.sid AS 學號,student.sname AS 姓名,score.num AS 成績 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<6030、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
    SELECT student.sid AS 學號,student.sname AS 姓名 FROM student WHERE sid IN 
        (SELECT student_id FROM score WHERE score.course_id =3 AND num > 80) 

31、求選了課程的學生人數
    SELECT COUNT(A.student_id) AS 總人數 
        FROM (SELECT student_id FROM score GROUP BY student_id) AS A

    SELECT COUNT(DISTINCT student_id) AS 總人數 FROM score;
    
32、查詢選修“楊艷”老師(這個老師沒有,就以張磊老師舉例)所授課程的學生中,成績最高的學生姓名及其成績;
    SELECT student.sid AS 學號,student.sname AS 姓名,num AS 成績 FROM score 
        LEFT JOIN course ON score.course_id=course.cid
        LEFT JOIN student ON score.student_id=student.sid
        LEFT JOIN teacher ON course.teacher_id=teacher.tid
            WHERE teacher.tname = "張磊老師" ORDER BY num DESC LIMIT 1;
    
33、查詢各個課程及相應的選修人數;
    SELECT course_id AS ID,course.cname AS 課程,count(1) AS 人數 FROM score 
        LEFT JOIN course ON score.course_id=course.cid GROUP BY course_id
34、查詢不同課程但成績相同的學生的學號、課程號、學生成績;
    SELECT DISTINCT s1.student_id,s1.course_id,s1.num FROM score AS s1,score AS s2
        WHERE s1.student_id    != s2.student_id AND s1.course_id!=s2.course_id AND s1.num=s2.num 

35、查詢每門課程成績最好的前兩名;
    SELECT cid AS 課程ID,cname AS 課程,
        (SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 0,1) AS 第一,
        (SELECT num FROM score AS s2 WHERE s2.course_id=s1.cid GROUP BY num ORDER BY num DESC LIMIT 1,1) AS 第二
    FROM course AS s1

36、檢索至少選修兩門課程的學生學號;
    SELECT student_id FROM score GROUP BY student_id HAVING count(course_id)>=2

37、查詢全部學生都選修的課程的課程號和課程名;
    SELECT course.cid AS 課程號,course.cname AS 課程名 FROM score 
        LEFT JOIN course ON score.course_id=course.cid GROUP BY score.course_id
            HAVING COUNT(student_id)=(SELECT COUNT(sid) FROM student)

38、查詢沒學過“李平”老師講授的任一門課程的學生姓名;
    SELECT student.sid,student.sname FROM student
        WHERE student.sid not IN (SELECT student_id FROM score 
            WHERE course_id IN(SELECT cid FROM course 
                LEFT JOIN teacher ON course.teacher_id=teacher.tid 
                    WHERE teacher.tname="李平老師" ) GROUP BY student_id)
        
39、查詢兩門以上不及格課程的同學的學號及其平均成績;
    SELECT score.student_id AS 學號,student.sname AS 姓名,
    (SELECT AVG(if(ISNULL(A.num),0,A.num)) FROM score AS A
        WHERE A.student_id IN (SELECT student_id FROM score WHERE num<60 
            GROUP BY student_id HAVING COUNT(1)>=2)) AS 平均成績 
    FROM score LEFT JOIN student ON score.student_id=student.sid 
        WHERE num<60 GROUP BY student_id HAVING COUNT(1)>2
    
標准:    
    SELECT student_id AS 學號,sname AS 姓名,AVG(num) AS 平均成績 FROM score
    LEFT JOIN student ON score.student_id=student.sid
        WHERE student_id IN (SELECT student_id FROM score 
            WHERE num<60 GROUP BY student_id HAVING COUNT(1)>=2) 
                GROUP BY student_id
        
40、檢索“004”課程分數小於60,按分數降序排列的同學學號;
    SELECT student_id,num FROM score 
        WHERE score.course_id=4 AND num <60 ORDER BY num ASC

41、刪除“002”同學的“001”課程的成績;
    delete from score where student_id=2 and corse_id=1;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM