關係代數和SQL練習(一)

對下列關係模式分別用關係代數、和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

)

)

 

 

發佈了41 篇原創文章 · 獲贊 53 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章