數據庫系統原理 數據查詢之嵌套查詢

嵌套查詢

  • 一個SELECT-FROM-WHERE語句稱爲一個查詢塊
  • 將一個查詢塊嵌套在另一個查詢塊的WHERE字句或HAVING短語的條件中的查詢叫做嵌套查詢。
  • Order by不能出現在嵌套塊中。
  • 上層查詢塊稱外層或父查詢,下層稱內層或子查詢。
  • SQL允許多層嵌套。

按相關性(嵌套查詢的求解過程)劃分嵌套查詢:

不相關子查詢
子查詢的查詢條件不依賴於父查詢。故有裏向外逐層處理。

相關子查詢
子查詢的查詢條件依賴於父查詢。

  • 取外層查詢中表的第一個元素,根據與內層查詢相關的屬性值處理內層查詢,若Where子句返回真,則此元組放入結果表中。
  • 從外層表中取下一個元組,重複直至檢查完畢。

按謂詞劃分嵌套查詢:

1、帶In謂詞的子查詢
In謂詞即集合的所屬關係。

查詢與“劉晨”在同一個系學習的學生
SELECT Sno,sname,sdept
From Student
Where Sdept In
	  (Select Sdept
	   From Student
	   Where Student.Sname='劉晨')
//爲不相關查詢
查詢選修了課程名爲信息系統的學生學號和姓名。
兩種方法:
一、嵌套查詢
Select Sno,Sname
From Student
Where Sno in
	(Select sno
	From SC
	Where cno In
		(Select Cno
		From Course
		Where Cname='信息系統'))

二、連接查詢
Select Student.Sno,Sname
From Student,SC,Course
Where Student.Sno=SC.Sno AND
	  SC.Cno=Course.Cno	 And
	  Course.Cname='信息系統'

2、帶有比較運算符的子查詢
當確切知道內層查詢返回值爲單值時,可用比較運算符

找出每個學生超過他選修課程平均成績的課程號
Select Sno,Cno
From SC x
Where Grade>=(Select AVG(Grade)
			  From SC y
			  Where x.Sno=y.Sno)

3、帶有ANY或ALL謂詞的子查詢
ANY:查詢結果彙總任意一個值
ALL:查詢結果彙總全部值
EXIST:查詢結果是否爲空,空返回false,不空返回true。
在這裏插入圖片描述

查詢非計算機科學系中比計算機科學系任意一個學生年齡小的學生姓名和年齡。
Select Sname,sage
From Student
Where Sage<ANY(SELECT Sage
			   From Student
			   Where Sdept='CS')
	  AND Sdept<>'CS'
//<>爲不等於
//如查詢非計算機科學系中比計算機科學系所以一個學生年齡小的學生姓名和年齡,則將ANY改爲ALL

4、帶EXISTS謂詞的子查詢
由EXISTS引出的子查詢,目標列通常爲*,因爲其只返回真值或假值,給出列名無意義。

查詢沒有選修1號課程的學生姓名。
Select Sname
From Student
Where Not EXISTS
	  (SELECT *
	   FROM SC
	   WHERE SC.Sno=Student.Sno AND Cno='1')


EXISTS/NOT EXISTS可實現全程量詞(難點),例子如下:

查詢選修了所有課程的學生姓名
Select Sname
From Student
Where NOT EXISTS /位置2/
	  (SELECT *
	   FROM Course
	   WHERE NOT EXISTS /位置1/ 
			(SELECT *
			 FROM SC
			 WHERE Student.Sno=SC.Sno AND
				   SC.Cno=Course.Cno))
理解:若一個學生選修了所有課程,則位置1始終爲false,則位置2爲true,該學生信息進入結果表
	  若一個學生漏選了某個課程,則位置1有一次爲true,則位置21之間的Select有一個值,則位置2爲false,信息不能進入結果表。
	  否定的否定即肯定!

EXISTS/NOT EXISTS實現邏輯蘊涵(難點
SQL中沒有蘊含邏輯運算,已知蘊含謂詞表達式:
在這裏插入圖片描述

查詢至少選修了學生200215122選修的全部課程的學生。!!!!!!!!重要!我不會!
SELECT *
From Student S1
Where NOT EXISTS /位置2/
		(SELECT *
		 FROM SC S2
		 WHERE S2.Sno='200215122' AND
			NOT EXISTS /位置1/
			(
				SELECT *
				FROM SC S3
				WHERE S1.Sno=S3.Sno AND
					  S2.Cno=s3.Cno
			))
理解同上:若一個學生選修了200215122的所有課程,則位置1始終爲false,則位置2爲true,該學生信息進入結果表
	  	 若一個學生漏選了200215122的某個課程,則位置1有一次爲true,則位置21之間的Select有一個值,則位置2爲false,信息不能進入結果表。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章