標籤:teacher family 多表查詢 檢索 習題 sts 練習題 str .com
>>>>>>>>>>
練習時間:2016.12.16
編輯時間:2016-12-20-->22:12:08
題:
涉及:多表查詢、exists、count()、group by、order by
1.1 關係模式
學生student;
SNO:學號;
SNAME:姓名;
AGE:年齡 ;
SEX:性別
課程course:CNO:課程代碼,CNAME:課程名稱,TEACHER:教師
學產生績SC:SNO:學號,CNO:課程代碼,SCORE:成績
1.2 要求一 用SQL語言完成表的建立以及資料的插入。
1.3 要求二 用SQL語言完成如下要求:
(1) 檢索至少選修"程軍"老師所授全部課程的學生姓名(SNAME);
(2) 檢索"李強"同學不學課程的課程號(CNO);
(3) 檢索選修不少於3門課程的學生學號(SNO);
(4) 檢索選修全部課程的學生姓名(SNAME)。
(5) 檢索不學"C語言"的學生資訊
1.4 要求三 請用SQL語言完成如下查詢: (1)查詢“程軍”老師所教授的所有課程; (2)查詢“李強”同學所有課程的成績; (3)查詢課程名為“C語言”的平均成績; (4)查詢選修了所有課程的同學資訊。
1.5 要求四 (1)檢索王老師所授課程的課程號和課程名。 (2)檢索年齡大於23歲的男學生的學號和姓名。 (3)檢索至少選修王老師所授課程中一門課程的女學生姓名。 (4)檢索李同學不學的課程的課程號。 (5)檢索至少選修兩門課程的學生學號。 (6)檢索全部學生都選修的課程的課程號與課程名。 (7)檢索選修課程包含王老師所授課的學生學號。 (8)統計有學生選修的課程門數。 (9)求選修K1課程的學生的平均年齡。 (10)求王老師所授課程的每門課程的學生平均成績。 (11)統計每門課程的學生選修人數(超過2人的課程才統計)。要求輸出課程號和選修人數,查詢結果 按人數降序排列,若人數相同,按課程號升序排列。 (12)檢索學號比李同學大,而年齡比他小的學生姓名。 (13)檢索姓名以李打頭的所有學生的姓名和年齡。 (14)在SC中檢索成績為空白值的學生學號和課程號。 (15)求年齡大於女同學平均年齡的男學生姓名和年齡。 (16)求年齡大於所有女同學年齡的男學生姓名和年齡。>>>>>>>>>>
答:
########
1.2 要求一......用SQL語言完成表的建立以及資料的插入。#建立studentCREATE TABLE student(sno INT(10) COMMENT ‘學號‘,sname VARCHAR(10) COMMENT ‘姓名‘,age INT(3) COMMENT ‘年齡‘,sex VARCHAR(1) COMMENT ‘性別‘) #insert插入student資料INSERT INTO student(sno,sname,age,sex) VALUES(1,‘李強‘,18,‘男‘)INSERT INTO student(sno,sname,age,sex) VALUES(2,‘劉麗‘,188,‘女‘)INSERT INTO student(sno,sname,age,sex) VALUES(3,‘鳳凰‘,19,‘女‘)INSERT INTO student(sno,sname,age,sex) VALUES(4,‘婕拉‘,20,‘女‘)INSERT INTO student(sno,sname,age,sex) VALUES(5,‘張友‘,21,‘男‘)INSERT INTO student(sno,sname,age,sex) VALUES(6,‘孫悟空‘,500,‘男‘) #create建立courseCREATE TABLE course(cno VARCHAR(10) COMMENT ‘課程代碼‘,cname VARCHAR(10) COMMENT ‘課程名稱‘,teacher VARCHAR(10) COMMENT ‘教師‘) #insert插入course資料INSERT INTO course(cno,cname,teacher) VALUES(‘K1‘,‘C語言‘,‘王華‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K2‘,‘C+語言‘,‘薛哥‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K3‘,‘C++語言‘,‘薛哥‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K4‘,‘java語言‘,‘薛哥‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K5‘,‘資料庫原理‘,‘程軍‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K6‘,‘linux語言‘,‘薛哥‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K7‘,‘PHP語言‘,‘薛哥‘)INSERT INTO course(cno,cname,teacher) VALUES(‘K8‘,‘編譯原理‘,‘程軍‘) #create建立表SCCREATE TABLE sc(sno INT(10) COMMENT ‘學號‘,cno VARCHAR(10) COMMENT ‘課程代碼‘,score INT(10) COMMENT ‘成績‘) #insert插入sc資料INSERT INTO sc(sno,cno,score) VALUES(1,‘K1‘,83)INSERT INTO sc(sno,cno,score) VALUES(2,‘K1‘,85)INSERT INTO sc(sno,cno,score) VALUES(5,‘K1‘,92)INSERT INTO sc(sno,cno,score) VALUES(2,‘K5‘,90)INSERT INTO sc(sno,cno,score) VALUES(5,‘K5‘,84)INSERT INTO sc(sno,cno,score) VALUES(5,‘K8‘,80)
########
1.3 要求二.....用SQL語言完成如下要求:(1) 檢索至少選修"程軍"老師所授全部課程的學生姓名(SNAME);#檢索學生姓名SELECT sname FROM student #檢索選修 程軍 課程的 課程代碼SELECT cno FROM course WHERE `teacher`=‘程軍‘#檢索選修課程的代碼的學號SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE `teacher`=‘程軍‘)#結合SELECT sname FROM student WHERE sno IN (SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE `teacher`=‘程軍‘))##以上結果為
錯誤的查詢方法!正確結果如下(運用exists): SELECT * FROM student WHERE NOT EXISTS (SELECT * FROM course WHERE teacher = ‘程軍‘ AND NOT EXISTS(SELECT * FROM sc WHERE sno=student.`sno` AND cno=course.`cno`)) (2) 檢索"李強"同學不學課程的課程號(CNO);SELECT cno FROM course WHERE NOT EXISTS(SELECT * FROM student WHERE sname = ‘李強‘ AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`)) (2.2)查詢所有學生所學的科目編號以及成績
SELECT st.sno,st.sname,cr.cname,sc.`score`,cr.teacher
FROM student st,sc,course cr
WHERE st.sno=sc.`sno` AND cr.cno = sc.`cno`
(2.3)查詢沒有選修程軍老師課程的學生姓名:SELECT * FROM student st WHERE NOT EXISTS(SELECT * FROM course cr WHERE teacher = ‘程軍‘ AND EXISTS(SELECT * FROM sc WHERE sc.`cno`=cr.cno AND sc.`sno`=st.sno))(2.4)找出李強老師學生SELECT * FROM student st,sc,course cr WHERE sname=‘李強‘ AND sc.`sno`=st.`sno` AND sc.`cno`=cr.cno (3) 檢索選修不少於3門課程cno的學生學號(SNO);#檢索學號select sno from scSELECT sno FROM sc GROUP BY sno HAVING COUNT(*) >= 3 (4) 檢索選修全部課程的學生姓名(SNAME)#錯誤寫法:SELECT sname FROM student WHERE sno IN (SELECT sno FROM sc GROUP BY sno HAVING COUNT(*) >= 3)#正確寫法:SELECT sname FROM student WHERE NOT EXISTS (SELECT * FROM course WHERE NOT EXISTS(SELECT * FROM sc WHERE sc.sno=student.`sno` AND sc.cno=course.`cno`)) (5) 檢索不學"C語言"的學生資訊(因所有學生都有學習C語言,所以把C語言改為“編譯原理”)#錯誤寫法:SELECT * FROM student WHERE sno IN (SELECT sno FROM sc WHERE cno IN (SELECT cno FROM course WHERE cname <> ‘C語言‘))#正確寫法:SELECT * FROM student WHERE NOT EXISTS(SELECT * FROM course WHERE cname = ‘編譯原理‘ AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`)) #########
1.4 要求三 請用SQL語言完成如下查詢:(1)查詢“程軍”老師所教授的所有課程;SELECT cname FROM course WHERE teacher = ‘程軍‘ (2)查詢“李強”同學所有課程的成績;SELECT course.cname,sc.score FROM course,sc WHERE EXISTS(SELECT * FROM student WHERE sname = ‘李強‘ AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`)) GROUP BY course.cname (3)查詢課程名為“C語言”的平均成績;#C語言課程標號: select cno from course where cname = ‘C語言‘SELECT AVG(score) FROM sc WHERE cno = (SELECT cno FROM course WHERE cname = ‘C語言‘) (4)查詢選修了所有課程的同學資訊。SELECT * FROM student WHERE NOT EXISTS (SELECT * FROM course WHERE NOT EXISTS(SELECT * FROM sc WHERE sc.sno=student.`sno` AND sc.cno=course.`cno`))
########
1.5 要求四 (1)檢索王華老師所授課程的課程號和課程名。 SELECT cno,cname FROM course WHERE teacher = ‘王華‘ (2)檢索年齡大於23歲的男學生的學號和姓名。 SELECT sno,sname FROM student WHERE age >= 23 AND sex = ‘男‘ (3)檢索至少選修王老師所授課程中一門課程的女學生姓名。 SELECT sname FROM student WHERE EXISTS (SELECT * FROM course WHERE teacher = ‘王華‘ AND EXISTS (SELECT * FROM sc WHERE sno=student.`sno` AND cno=course.`cno`)) AND sex = ‘女‘ (4)檢索李強同學不學的課程的課程號。SELECT cno FROM course WHERE NOT EXISTS(SELECT * FROM student WHERE sname = ‘李強‘ AND EXISTS (SELECT * FROM sc WHERE sno=student.`sno` AND cno=course.`cno`)) (5)檢索至少選修兩門課程的學生學號。SELECT sno FROM sc GROUP BY sno HAVING COUNT(*) >= 2 (6)檢索全部學生都選修的課程的課程號與課程名。SELECT cno,cname FROM course WHERE NOT EXISTS(SELECT * FROM student WHERE NOT EXISTS(SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`)) (7)檢索選修課程包含王華老師所授課的學生學號。SELECT sno FROM student WHERE EXISTS(SELECT * FROM course WHERE teacher = ‘王華‘ AND EXISTS(SELECT * FROM sc WHERE sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`)) (8)統計所有學生選修的課程門數。SELECT sname,sc.`sno`,COUNT(cno) FROM student,sc WHERE sc.`sno`=student.`sno` GROUP BY sno (9)求選修K1課程的學生的平均年齡。SELECT AVG(age) FROM student WHERE EXISTS (SELECT * FROM sc WHERE cno=‘k1‘ AND sc.`sno`=student.`sno`) (10)求王華老師所授課程的每門課程的學生平均成績。 SELECT sno,AVG(score) FROM sc WHERE EXISTS (SELECT * FROM course WHERE teacher=‘程軍‘ AND sc.`cno`=course.`cno` ) GROUP BY cno(11)統計每門課程的學生選修人數(超過2人的課程才統計)。要求輸出課程號和選修人數,查詢結果 按人數降序排列,若人數相同,按課程號升序排列。SELECT COUNT(sno),cno FROM sc GROUP BY cno HAVING COUNT(sno)>=2 ORDER BY COUNT(sno) ASC (12)檢索學號比李強同學大,而年齡比他小的學生姓名。 SELECT sname FROM student WHERE sno>(SELECT sno FROM student WHERE sname=‘李強‘) AND age> (SELECT age FROM student WHERE sname=‘李強‘) (13)檢索姓名以李打頭的所有學生的姓名和年齡。 SELECT sname,age FROM student WHERE sname LIKE ‘%李%‘ (14)在SC中檢索成績為空白值的學生學號和課程號。 SELECT sno,cno FROM student,course WHERE EXISTS (SELECT * FROM sc WHERE score is NULL AND sc.`sno`=student.`sno` AND sc.`cno`=course.`cno`) (15)求年齡大於女同學平均年齡的男學生姓名和年齡。SELECT sname,age FROM student WHERE sex = ‘男‘ AND age >(SELECT AVG(age) FROM student WHERE sex = ‘女‘) (16)求年齡大於所有女同學年齡的男學生姓名和年齡。SELECT sname,age FROM student WHERE age>(SELECT max(age) FROM student WHERE sex=‘女‘) AND sex=‘男‘>>>>>>>>>>>>>>>>>>>> 查詢學號為1的學生 選修了的課程#方式一:SELECT * FROM course WHERE cno = (SELECT cno FROM sc WHERE sno=1)#方式二:SELECT * FROM course WHERE EXISTS (SELECT * FROM student WHERE sno = 1 AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`)) 查詢學號為1的學生 是否選修“程軍”老師的課程SELECT * FROM course WHERE teacher = ‘程軍‘ AND EXISTS (SELECT * FROM student WHERE sno = 1 AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`)) 查詢學號為1的學生 是否選修了“程軍”老師的課程,如果沒有選修,請輸出該同學沒有選修的課程資訊SELECT * FROM course WHERE teacher = ‘程軍‘ AND NOT EXISTS (SELECT * FROM student WHERE sno = 1 AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`)) 查看選修了程軍老師課程的學生姓名資訊:SELECT * FROM student WHERE EXISTS (SELECT * FROM course WHERE teacher = ‘程軍‘ AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))查看沒有全部選修程軍老師課程的學生資訊SELECT * FROM student WHERE EXISTS (SELECT * FROM course WHERE teacher = ‘程軍‘ AND NOT EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))查看沒有選修程軍老師課程的學生姓名資訊:SELECT * FROM student WHERE NOT EXISTS (SELECT * FROM course WHERE teacher = ‘程軍‘ AND EXISTS (SELECT * FROM sc WHERE sc.`sno`=student.sno AND sc.`cno`=course.`cno`))查看選修了程軍老師所有課程的學生姓名資訊:SELECT * FROM student WHERE NOT EXISTS (SELECT * FROM course WHERE teacher=‘程軍‘ AND NOT EXISTS(SELECT cno FROM sc WHERE sc.`sno`=student.`sno` AND course.`cno`=sc.`cno`)) (註:個人所寫,並不保證全部正確、寫法最優,如有意見,歡迎指出)>>>>>>>>>>
mysql練習題-2016.12.16