1. 程式人生 > >實驗三MySQL單表及多表查詢

實驗三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