>>>>>>>>>>
練習時間: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語言完成表的創建以及數據的插入。
#創建student
CREATE 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創建course
CREATE 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創建表SC
CREATE 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 sc
SELECT 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`))
方式二:
SELECT cno,cname FROM course WHERE cno IN (
SELECT cno FROM sc GROUP BY cno HAVING COUNT(sno) = (SELECT COUNT(sno) FROM student))
(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`))
(注:個人所寫,並不保證全部正確、寫法最優,如有意見,歡迎指出)
>>>>>>>>>>