子查詢

子查詢

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

基本介紹

  • 中文名:子查詢
  • 外文名:Sub Query
  • 語言:SELECT-SQL
  • 命令:WHERE子句中
定義概念,語法結構,IN子查詢,比較運算符,ANY子查詢,EXISTS子查詢,使用規則,

定義概念

在SQL語言中,一個SELECT-FROM-WHERE語句稱為一個查詢塊。當獲得一個查詢的答案需要多個步驟的操作,首先必須創建一個查詢來確定用戶不知道但包含在資料庫中的值,將一個查詢塊嵌套在另一個查詢塊的WHERE字句或HAVING短語的條件中查詢塊稱為子查詢或內層查詢。上層的查詢塊曾為父查詢或外層查詢。子查詢的結果作為輸入傳遞迴“父查詢”或“外部查詢”。父查詢將這個值結合到計算中,以便確定最後的輸出。
SQL語言允許多層嵌套查詢,即一個子查詢中還可以嵌套其他子查詢。以層層嵌套的方式來構造程式正是SQL中"結構化"的含義所在。
子查詢是本質上就是一個完整 的SELECT 語句,它可以使一個 SELECT、SELECT...INTO 語句、INSERT...INTO 語句、DELETE 語句、或 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 學生表
WHERE IN
(SELECT 系名
FROM 學生表
WHERE 姓名=“劉晨”)
本例中,子查詢的查詢條件不依賴於父查詢,稱為不相關子查詢。
用 IN 謂詞,只能在主查詢檢索那些記錄,在子查詢中的某些記錄也包含和它們相同的值。相反,可用 NOT IN 在主查詢中檢索那樣的記錄,在子查詢中沒有包含與它們的值相同的記錄。下列示例返回有比 25%更低 的折扣的所有產品:
SELECT * FROM Products
WHERE ProductID NOT IN
(SELECT ProductID FROM OrderDetails
WHERE Discount >= .25);

比較運算符

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

ANY子查詢

子查詢返回單值可以用比較運算符,但返回多值時要用ANY(有的系統用SOME)或ALL謂詞修飾符。而使用ANY或ALL謂詞的時候必須同時使用比較運算符。其語義如下:
>ANY 大於子查詢結果中的某個值
>ALL 大於子查詢結果中的所有值
<ANY 小於子查詢結果中的某個值
<ALL 小於子查詢結果中的所有值
>=ANY 大於等於子查詢結果中的某個值
>=ALL 大於等於子查詢結果中的所有值
<=ANY 小於等於子查詢結果中的某個值
<=ALL 小於等於子查詢結果中的所有值
=ANY 等於子查詢結果中的某個值
=ALL 等於子查詢結果中的所有值
!=(或<>)ANY 不等於子查詢結果中的某個值
!=(或<>)ALL 不等於子查詢結果中的所有值
ANY 或 SOME 謂詞,它們是同義字,來檢索主查詢中的記錄,這些記錄要滿足在子查詢中檢索的任何記錄的比較條件。下列示例將返回全部單價比任何以 25% 或更高的折扣賣出的產品高的產品:
SELECT * FROM Products
WHERE UnitPrice > ANY
(SELECT UnitPrice FROM OrderDetails
WHERE Discount >= .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語句不能包括在ORDER BY子句中。因為ORDER BY字句只能對最終查詢結果排序,如果顯示的輸出需要按照特定順序顯示,那么ORDER BY子句應該作為外部查詢的最後一個子句列出。
3)子查詢“必須包括在一組括弧中”,以便將它與外部查詢分開。
4)如果將子查詢放在外部查詢的WHERE或HAVING子句中,那么該子查詢只能位於比較運算符的“右邊”。

相關詞條

熱門詞條

聯絡我們