實驗三MySQL單表及多表查詢
tb_student(sid,sname,sage,ssex) 學生表
sid:學號;sname:學生姓名;sage:學生年齡;ssex:學生性別
tb_course(cid,cname,tid) 課程表
cid,課程編號;cname:課程名字;tid:教師編號
tb_sc(sid,cid,score) 成績表
sid:學號;cid,課程編號;score:成績
tb_teacher(tid,tname) 教師表
tid:教師編號; tname:教師名字
tb_student:學生表 | |
sid | 學號 |
sname | 姓名 |
sage | 年齡 |
ssex | 性別 |
tb_course:課程表 | |
cid | 課程編號 |
cname | 課程名 |
tid | 教師編號 |
tc_sc:成績表 | |
sid | 學號 |
cid | 課程編號 |
score | 成績 |
tb_teacher:教師表 | |
tid | 教師編號 |
tname | 教師名字 |
問題:
1、刪除“002”同學的“001”課程的成績
DELETE cid='001' FROM tc_sc WHERE sid='002';
2、檢索“004”課程分數小於60,按分數降序排列的同學學號
SELECT sid='004' FROM tc_sc WHERE score<60 ORDER BY sid DESC;
3、查詢兩門以上不及格課程的同學的學號及其平均成績
SELECT sid,AVG(score) FROM tc_sc WHERE sid in
(SELECT sid FROM tc_sc WHERE score<60 GROUP BY sid HAVING COUNT(sid>=2));
4、查詢沒學過“張三”老師講授的任一門課程的學生姓名
SELECT * FROM tb_student s WHERE sid NOT IN(
SELECT DISTINCT sid FROM tc_sc sc
INNER JOIN tb_course c ON sc.cid =c.cid
INNER JOIN tb_teacher t ON c.tid =t.tid
WHERE t.tname ='張三')
5、檢索至少選修兩門課程的學生學號
SELECT sid FROM tc_sc GROUP BY sid HAVING COUNT(cid)>=2
6、統計每門課程的學生選修人數(超過10人的課程才統計)。要求輸出課程號和選修人數,查詢結果按人數降序排列,若人數相同,按課程號升序排列
SELECT DISTINCT cid,COUNT(sid) FROM tc_sc GROUP BY cid
HAVING COUNT(sid)>10 ORDER BY cid DESC,2 ASC
7、查詢每門功成績最好的前兩名
SELECT s.sid,sname,temp.cid,temp.score FROM tb_student s INNER JOIN
(SELECT tb1.* FROM tc_sc tb1 LEFT JOIN tc_sc tb2 ON tb1.cid =tb2.cid
AND tb1.score =tb2.score
GROUP BY tb1.sid,tb1.cid,tb1.score HAVING COUNT(*)<2
)
temp ON s.sid=temp.sid ORDER BY temp.cid,temp.score DESC
8、查詢不同課程成績相同的學生的學號、課程號、學生成績
SELECT a.* FROM tc_sc a LEFT JOIN tc_sc b
ON a.cid!=b.cid WHERE a.score=b.score;
9、查詢各個課程及相應的選修人數
SELECT cid,COUNT(sid) FROM tc_sc GROUP BY cid ORDER BY cid DESC;
10、查詢選修“張三”老師所授課程的學生中,成績最高的學生姓名及其成績
SELECT s.sid,c.cid,sname,score FROM tb_student s,tc_sc tc,tb_course c,tb_teacher t
WHERE s.sid =tc.sid AND tc.cid =c.cid AND c.tid =t.tid
AND t.tname ='張三'
AND score =(SELECT MAX(score) FROM tc_sc WHERE cid=c.cid);
11、求選了課程的學生人數
SELECT DISTINCT cid,COUNT(sid) FROM tc_sc GROUP BY cid HAVING cid is NOT NULL;
12、查詢課程編號為003且課程成績在80分以上的學生的學號和姓名;
SELECT tc_sc.sid,sname FROM tc_sc,tb_student WHERE tc_sc.cid='003' AND score>80 AND tc_sc.sid=tb_student.sid;
13、查詢不及格的課程,並按課程號從大到小排列
SELECT cid,score FROM tc_sc HAVING score<60 ORDER BY cid DESC;
14、查詢任何一門課程成績在70分以上的姓名、課程名稱和分數;
SELECT tb_student.sname,cid,score FROM tb_student,tc_sc WHERE score>70 AND tb_student.sid =tc_sc.sid
15、查詢所有學生的選課情況;
SELECT tb_student.sid,tb_student.sname,tb_student.sage,tb_student.ssex,tb_course.cname,tc_sc.score
FROM tb_student,tc_sc,tb_course WHERE tb_student.sid =tc_sc.sid AND tb_course.cid=tc_sc.cid
16、查詢課程名稱為“資料庫”,且分數低於60的學生姓名和分數;
SELECT sname,score FROM tb_student,tb_course,tc_sc WHERE tb_course.cid=tc_sc.cid
AND tb_student.sid=tc_sc.sid AND tb_course.cname ='資料庫' AND score<60 GROUP BY sname
17、查詢平均成績大於85的所有學生的學號、姓名和平均成績;
SELECT tb_student.sid,sname,AVG(score) FROM tb_student,tc_sc WHERE tb_student.sid=tc_sc.sid
GROUP BY tb_student.sid HAVING AVG(score)>85 ORDER BY tb_student.sid ASC
18、查詢每門課程的平均成績,結果按平均成績升序排列,平均成績相同時,按課程號降序排列;
SELECT DISTINCT cid,AVG(score) FROM tc_sc GROUP BY cid ORDER BY AVG(score) ASC,2 DESC
19、1981年出生的學生名單(注:tb_student表中Sage列的型別是datetime);
SELECT * FROM tb_student WHERE sage LIKE '1981%' GROUP BY sid
20、查詢同名同性學生名單,並統計同名人數;
SELECT a.*,COUNT(a.sid) FROM tb_student a LEFT JOIN tb_student b
ON a.sname= b.sname WHERE a.sid!=b.sid
21、查詢姓“張”的學生名單;
SELECT * FROM tb_student WHERE sname LIKE '張%'
22、查詢男生、女生人數;
SELECT ssex,COUNT(ssex) FROM tb_student GROUP BY ssex
23、查詢出只選修了一門課程的全部學生的學號和姓名;
SELECT tb_student.sid,sname FROM tb_course,tb_student,tc_sc where tb_course.cid=tc_sc.cid AND
tc_sc.sid=tb_student.sid GROUP BY tb_student.sid HAVING COUNT(tb_student.sid)=1
24、查詢每門課程被選修的學生數;
SELECT cid,COUNT(sid) FROM tc_sc GROUP BY cid
25、查詢各科成績前三名的記錄:(不考慮成績並列情況);
select a.* from tc_sc a where
(select COUNT(*)from tc_sc b where b.score>a.score)<3
26、查詢不同老師所教不同課程平均分從高到低顯示;
SELECT tc_sc.cid,cname,count(tc_sc.cid),score FROM tc_sc,tb_course
WHERE tc_sc.cid=tb_course.cid GROUP BY tc_sc.cid
27、按平均成績從高到低顯示所有學生的“資料庫”、“企業管理”、“英語”三門的課程成績,按如下形式顯示: 學生ID,,資料庫,企業管理,英語,有效課程數,有效平均分;
SELECT s.sid,sname,(SELECT score FROM tc_sc sc1
WHERE sc1.sid =s.sid AND sc1.cid =(SELECT cid FROM tb_course WHERE cname ='資料庫'))資料庫,
(SELECT score FROM tc_sc sc2
WHERE sc2.sid =s.sid AND sc2.cid =(SELECT cid FROM tb_course WHERE cname ='企業管理'))企業管理,
(SELECT score FROM tc_sc sc3
WHERE sc3.sid =s.sid AND sc3.cid =(SELECT cid FROM tb_course WHERE cname ='英語'))英語,
COUNT(*) 課程數,AVG(sc.score) 平均分
FROM tb_student s,tc_sc sc
WHERE s.sid =sc.sid
GROUP BY s.sid;
28、查詢和“1002”號的同學學習的課程完全相同的其他同學學號和姓名;
SELECT sc.sid FROM tc_sc sc,tb_student s
WHERE sc.sid =s.sid AND sc.cid IN(SELECT cid FROM tc_sc WHERE sid =’1002’)
AND sc.cid<>2
GROUP BY sid HAVING COUNT(*) =(SELECT COUNT(*) FROM tc_sc WHERE sid =’1002’);
29、把“SC”表中“張三”老師教的課的成績都更改為此課程的平均成績;
update tc_sc set score=(select avg(score)
from tc_sc,tb_course,tb_teacher where
tb_course.cid=tc_sc.cid and tb_course.tid=tb_teacher.tid
and tb_teacher.tname='張三') GROUP BY sid;
30、查詢至少學過學號為“001”同學所有一門課的其他同學學號和姓名;
SELECT tc_sc.sid,sname FROM tc_sc,tb_student WHERE
tc_sc.sid=tb_student.sid AND
cid IN(SELECT cid FROM tc_sc WHERE sid ='001')
31、查詢至少有一門課與學號為“1001”的同學所學相同的同學的學號和姓名;
SELECT tc_sc.sid,sname FROM tc_sc,tb_student WHERE
tc_sc.sid=tb_student.sid AND
cid IN(SELECT cid FROM tc_sc WHERE sid ='1001')
32、查詢沒有學全所有課的同學的學號、姓名;
SELECT tc_sc.sid,sname FROM tc_sc,tb_student
WHERE tc_sc.sid=tb_student.sid GROUP BY tc_sc.sid HAVING
COUNT(tc_sc.cid)<(SELECT COUNT(cid) FROM tc_sc)
33、查詢所有課程成績小於60分的同學的學號、姓名;
SELECT tc_sc.sid,sname FROM tc_sc,tb_student WHERE
tc_sc.sid = tb_student.sid AND score<60
34、查詢學過“張三”老師所教的所有課的同學的學號、姓名;
SELECT tc_sc.sid,sname FROM tb_course,tc_sc,tb_student,tb_teacher WHERE tb_course.cid =tc_sc.cid AND
tc_sc.sid =tb_student.sid AND tb_teacher.tid =tb_course.tid AND tb_teacher.tname='張三'
35、查詢所有同學的學號、姓名、選課數、總成績;
SELECT tc_sc.sid,sname,COUNT(tc_sc.cid),COUNT(score) FROM tc_sc,tb_student,tb_course
WHERE tc_sc.sid =tb_student.sid AND tc_sc.cid =tb_course.cid GROUP BY tc_sc.sid