子查詢

嵌套查詢下層的程序模塊

子查詢是一種常用計算機語言SELECT-SQL語言中嵌套查詢下層的程序模塊。當一個查詢是另一個查詢的條件時,稱之為子查詢。

定義概念


語言,--語句稱查詢塊。獲查詢答案需步驟操,首必須創建查詢確戶包含據庫值,查詢塊嵌套另查詢塊句短語件查詢塊稱查詢層查詢。層查詢塊曾查詢層查詢。查詢輸傳遞“查詢”“查詢”。查詢值合計算,確輸。
語言允層嵌套查詢,即查詢嵌套查詢。層層嵌套式構造程序"構化"含義。
查詢質完整語句,、...語句、...語句、語句、UPDATE語句或嵌套在另一子查詢中。子查詢的輸出可以包括一個單獨的值(單行子查詢)、幾行值(多行子查詢)、或者多列數據(多列子查詢)。

語法結構


可用四種種語法來創建子查詢:
1.帶有比較運算符的子查詢(sqlstatement)
comparison(>,<,=,!=)
2.帶有ANY(some)或ALL謂詞的子查詢
comparison[ANY|ALL|SOME](sqlstatement)
3.帶有謂詞IN的子查詢
expression[NOT]IN(sqlstatement)
4.帶有EXISTS謂詞的子查詢
[NOT]EXISTS(sqlstatement)

IN子查詢

在嵌套查詢中,子查詢的結構往往是一個集合,所以謂詞IN是嵌套查詢中最經常使用的謂詞。
如查詢與“劉晨”同一個系學習的學生。先要確定劉晨所在系名,在用它來查找所在在這個系中學習的學生。
SELECT學號,姓名,系名
FROM學生表
WHEREIN
(SELECT系名
FROM學生表
WHERE姓名=“劉晨”)
本例中,子查詢的查詢條件不依賴於父查詢,稱為不相關子查詢。
用IN謂詞,只能在主查詢檢索那些記錄,在子查詢中的某些記錄也包含和它們相同的值。相反,可用NOTIN在主查詢中檢索那樣的記錄,在子查詢中沒有包含與它們的值相同的記錄。下列示例返回有比25%更低的折扣的所有產品:
SELECT*FROMProducts
WHEREProductIDNOTIN
(SELECTProductIDFROMOrderDetails
WHEREDiscount>=.25);

比較運算符

帶有比較運算符的子查詢是指父查詢與子查詢之間用比較運算符進行連接。當用戶確切知道內層查詢返回單個值時,可以用>、<、=、>=、<=、!=或<>等比較運算符。
例如上面的那個查詢,由於一個學生只可能在一個系學習,也就是說內查詢的結果是一個只,因此可以用=代替IN:SELECT學號,姓名,系名
FROM學生表
WHERE=
(SELECT系名
FROM學生表
WHERE姓名=“劉晨”)
還可用子查詢中的表名別名來查詢子查詢外的FROM子句的列表。下列示例返回工資等於或高於所有職位相同員工的平均工資的員工姓名。這張員工表的別名為"T1":
SELECTLastName,
FirstName,Title,Salary
FROMEmployeesAST1
WHERESalary>=
(SELECTAvg(Salary)
FROMEmployees
WHERET1.Title=Employees.Title)OrderbyTitle;
上例中AS保留詞可選。如果子查詢的查詢條件依賴於父查詢,這類子查詢稱為相關子查詢,整個查詢語句稱為相關嵌套語句。
某些子查詢在交叉表查詢中是允許的,特別是謂詞(那些在WHERE子句中的)。將子查詢作為輸出(那些列在SELECT中的)在交叉表查詢中是不允許的。

ANY子查詢

子查詢返回單值可以用比較運算符,但返回多值時要用ANY(有的系統用SOME)或ALL謂詞修飾符。而使用ANY或ALL謂詞的時候必須同時使用比較運算符。其語義如下:
>ANY大於子查詢結果中的某個值
>ALL大於子查詢結果中的所有值
>=ANY大於等於子查詢結果中的某個值
>=ALL大於等於子查詢結果中的所有值
<=ANY小於等於子查詢結果中的某個值
<=ALL小於等於子查詢結果中的所有值
=ANY等於子查詢結果中的某個值
=ALL等於子查詢結果中的所有值
!=(或<>)ANY不等於子查詢結果中的某個值
!=(或<>)ALL不等於子查詢結果中的所有值
ANY或SOME謂詞,它們是同義字,來檢索主查詢中的記錄,這些記錄要滿足在子查詢中檢索的任何記錄的比較條件。下列示例將返回全部單價比任何以25%或更高的折扣賣出的產品高的產品:
SELECT*FROMProducts
WHEREUnitPrice>ANY
(SELECTUnitPriceFROMOrderDetails
WHEREDiscount>=.25);
使用ALL謂詞只檢索主查詢中的這些記錄,它們滿足在子查詢中檢索的所有記錄的比較條件。如果將前一個示例中的ANY改為ALL,查詢只會返回單價比全部以25%或更高的折扣賣出的產品高的產品。這是更多的限制。

EXISTS子查詢

在true/false比較中使用EXISTS謂詞(與可選的NOT保留字一道)來決定子查詢是否會返回任何記錄。EXISTS代表存在量詞ヨ,帶有EXISTS謂詞的子查詢不返回任何數據,只產生邏輯真值“true”或邏輯假值"false"。
可以利用EXISTS來判斷x∈S、S⊆R、S=R、S∩R非空等是否成立。

使用規則


使用子查詢的規則:
1)子查詢必須“自身就是一個完整的查詢”。即,它必須至少包括一個SELECT子句和FROM子句。
2)子查詢SELECT語句不能包括在ORDERBY子句中。因為ORDERBY字句只能對最終查詢結果排序,如果顯示的輸出需要按照特定順序顯示,那麼ORDERBY子句應該作為外部查詢的最後一個子句列出。
3)子查詢“必須包括在一組括弧中”,以便將它與外部查詢分開。
4)如果將子查詢放在外部查詢的WHERE或HAVING子句中,那麼該子查詢只能位於比較運算符的“右邊”。
  • 目錄