SQL 子查詢

此頁沒有內(nèi)容條目
內(nèi)容

SQL 子查詢

子查詢是一個 SELECT 語句,它嵌套在一個 SELECT、SELECT...INTO 語句INSERT...INTO 語句、DELETE 語句、或 UPDATE 語句或嵌套在另一子查詢中。

語法

可用三種語法來創(chuàng)建子查詢:

comparison [ANY | ALL | SOME] (sqlstatement)

expression [NOT] IN (sqlstatement)

[NOT] EXISTS (sqlstatement)

子查詢可分為以下幾個部分:

部分

說明

comparison

一個表達式及一個比較運算符,將表達式與子查詢的結(jié)果作比較。

expression

用以搜尋子查詢結(jié)果集的表達式。

sqlstatement

SELECT 語句,遵從與其他 SELECT 語句相同的格式及規(guī)則。它必須括在括號之中。

 

說明

可以拿子查詢代替表達式 用于SELECT 語句字段表或 WHEREHAVING 子句。在子查詢之中,在 WHERE 或 HAVING 子句的表達式中,用于計算的特定值是由 SELECT 語句提供的。

使用 ANY 或 SOME 謂詞,它們是同義字,來檢索主查詢中的記錄,這些記錄要滿足在子查詢中檢索的任何記錄的比較條件。下列示例將返回全部單價比任何以 25% 或更高的折扣賣出的產(chǎn)品高的產(chǎn)品:

SELECT * FROM Products

WHERE UnitPrice > ANY

(SELECT UnitPrice FROM OrderDetails

WHERE Discount >= .25);

使用 ALL 謂詞只檢索主查詢中的這些記錄,它們滿足在子查詢中檢索的所有記錄的比較條件。如果將前一個示例中的 ANY 改為 ALL,查詢只會返回單價比全部以 25% 或更高的折扣賣出的產(chǎn)品高的產(chǎn)品。這是更多的限制。

用 IN 謂詞,只能在主查詢檢索那些記錄,在子查詢中的某些記錄也包含和它們相同的值。下列示例返回有 25% 或更高的折扣的所有產(chǎn)品:

SELECT * FROM Products

WHERE ProductID IN

(SELECT ProductID FROM OrderDetails

WHERE Discount >= .25);

相反,可用 NOT IN 在主查詢中檢索那樣的記錄,在子查詢中沒有包含與它們的值相同的記錄。

在 true/false 比較中使用 EXISTS 謂詞(與可選的 NOT 保留字一道)來決定子查詢是否會返回任何記錄。

還可用子查詢中的表名別名來查詢子查詢外的 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 中的)在交叉表查詢中是不允許的。

請參閱

ALL、DISTINCT、DISTINCTROW、TOP 謂詞(Microsoft Jet SQL)

SELECT 語句 (Microsoft Jet SQL)

DELETE 語句 (Microsoft Jet SQL)

SELECT INTO 語句 (Microsoft Jet SQL)

HAVING 子句 (Microsoft Jet SQL)

UNION 運算 (Microsoft Jet SQL)

INNER JOIN 運算 (Microsoft Jet SQL)

UPDATE 語句 (Microsoft Jet SQL)

INSERT INTO 語句 (Microsoft Jet SQL)

WHERE 子句 (Microsoft Jet SQL)

LEFT JOIN, RIGHT JOIN 運算 (Microsoft Jet SQL)

 

 

示例

SQL 子查詢示例