對下列關係模式分別用關係代數、和SQL實現下列查詢
理解下面幾句話:
1. SQL語言是具有很堅實數學基礎的語言
2. SQL語言是介於關係代數和關係演算之間的結構化查詢語言
3. 一個查詢只要能用關係代數或關係演算實現,必能用SQL實現
4. 一個查詢即能用關係代數、關係演算、SQL實現
5. 在SQL語言中,能用非EXISTS謂詞實現的查詢,均能用EXISTS謂詞實現,反之不一定。
1. 查詢學生95001的所有信息。
① 關係代數:
②SQL語言:
SELECT * FROM Student
WHERE Sno='95001'
2. 查詢學生95001的姓名和所在系。
① 關係代數:
②SQL語言:
方法一:
SELECT Sname,Sdept FROM Student
WHERE Sno='95001'
方法二:
SELECT Sname,Sdept FROM Student
WHERE EXISTS (
SELECT * FROM Student SX
WHERE Student.Sno=SX.Sno AND SX.Sno='95001'
)
方法三:
SELECT Sname,Sdept FROM Student
WHERE Sno IN (
SELECT Sno FROM Student
WHERE Sno='95001'
)
3. 查詢選修了1號課的學生的學號。
① 關係代數:
②SQL語言:
方法一:
SELECT Sno FROM SC
WHERE Cno='1'
方法二:
SELECT Sno FROM SC
WHERE EXISTS (
SELECT * FROM SC SCX
WHERE SC.Sno=SCX.Sno AND SCX.Cno='1'
)
方法三:
SELECT Sno FROM SC
WHERE Sno IN (
SELECT Sno FROM SC
WHERE Cno='1'
)
4. 查詢選修了1號課的學生的姓名。
① 關係代數:
②SQL語言:
方法一:
SELECT Sname FROM Student,SC
WHERE SC.Sno=Student.Sno AND Cno='1'
方法二:
SELECT Sname FROM Student
WHERE EXISTS (
SELECT * FROM SC
WHERE SC.Sno=Student.Sno AND Cno='1'
)
方法三:
SELECT Sname FROM Student
WHERE Sno IN (
SELECT Sno FROM SC WHERE Cno='1'
)
5. 查詢至少選修了1號課和3號課的學生的學號。
① 關係代數:
或
或:
首先建立一個臨時關係K:
cno |
1 |
3 |
然後求:πSno.Cno(SC)÷K
②SQL語言:
方法一:
SELECT SCX.Sno FROM SC, SC SCX
WHERE SC.Cno='1' AND SCX.Sno=SC.Sno AND SCX.Cno='3'
方法:
SELECT Sno FROM SC
WHERE EXISTS (
SELECT * FROM SC SCX
WHERE SC.Cno='1' AND SCX.Sno=SC.Sno AND SCX.Cno='3'
)
方法二:
SELECT Sno FROM SC
WHERE Cno='1' AND Sno IN (
SELECT Sno FROM SC WHERE Cno='3'
)
6. 查詢至少選修了一門其直接先行課爲5號課的學生學號。
① 關係代數:
②SQL語言:
方法一:
SELECT Sno FROM SC,Course
WHERE SC.Cno=Course.Cno AND Course.Cpno='5'
方法二:
SELECT Sno FROM SC
WHERE EXISTS (
SELECT * FROM Course
WHERE SC.Cno=Course.Cno AND Course.Cpno='5'
)
方法三:
SELECT Sno FROM SC
WHERE Cno IN (
SELECT Cno FROM Course
WHERE Cpno='5'
)
7. 查詢至少選修了一門其直接先行課爲5號課的學生姓名。
① 關係代數:
②SQL語言:
方法一:
SELECT Sname FROM Student,SC,Course
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
AND Course.Cpno='5'
方法二:
SELECT Sname FROM Student
WHERE EXISTS (
SELECT * FROM SC
WHERE Student.Sno=SC.Sno AND EXISTS (
SELECT * FROM Course
WHERE SC.Cno=Course.Cno AND Course.Cpno='5'
)
)
方法三:
SELECT Sname FROM Student
WHERE Sno IN (
SELECT Sno FROM SC
WHERE Cno IN (
SELECT Cno FROM Course
WHERE Cpno='5'
)
)
8. 查詢沒有選修1號課程的學生姓名。
① 關係代數:
②SQL語言:
SELECT Sname FROM Student
WHERE NOT EXISTS (
SELECT * FROM SC
WHERE Student.Sno=SC.Sno AND SC.Cno='1'
)
9. 查詢選修了全部課程的學生的學號和姓名。
① 關係代數:
②SQL語言:
SELECT Sno,Sname FROM Student
WHERE NOT EXISTS (
SELECT * FROM Course
WHERE NOT EXISTS (
SELECT * FROM SC
WHERE Student.Sno=SC.Sno AND SC.Cno=Course.Cno
)
)
10.查詢最少選修了95002學生所選課程的學生學號。
① 關係代數:
②SQL語言:
方法一:
SELECT Sno FROM SC
WHERE NOT EXISTS (
SELECT * FROM Course
WHERE EXISTS (
SELECT * FROM SC SCX
WHERE SCX.Sno='95002' AND SCX.Cno=Course.Cno AND NOT EXISTS (
SELECT * FROM SC SCY
WHERE SCY.Sno=SC.Sno AND SCY.Cno=Course.Cno
)
)
)
方法二:
SELECT Sno FROM SC
WHERE NOT EXISTS (
SELECT * FROM SC SCX
WHERE SCX.Sno='95002' AND NOT EXISTS (
SELECT * FROM SC SCY
WHERE SCY.Sno=SC.Sno AND SCY.Cno=SCX.Cno
)
)
方法三:
SELECT Sno FROM Student
WHERE NOT EXISTS (
SELECT * FROM SC SCX
WHERE SCX.Sno='95002' AND NOT EXISTS (
SELECT * FROM SC SCY
WHERE SCY.Sno=Student.Sno AND SCY.Cno=SCX.Cno
)
)