二、操作表
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”號課程的平均成績; 1、INSERT 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<60; 30、查詢課程編號為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;
