一:子查詢
1.介紹
在另一個查詢(外部查詢)中嵌套另一個查詢語句(內部查詢),並使用內部查詢的結果值作為外部查詢條件。
2.子查詢在where中
SELECT customerNumber, checkNumber, amount FROM payments WHERE amount = (SELECT MAX(amount) FROM payments);

除等式運算符之外,還可以使用大於(>
),小於(<
)等的其他比較運算符。
3.具有IN和NOT IN的子查詢
如果子查詢返回多個值,則可以在WHERE
子句中使用IN或NOT IN運算符等其他運算符。

可以使用帶有NOT IN
運算符的子查詢來查找沒有下過任何訂單的客戶:


4.From子句中的子查詢
在FROM子句中使用子查詢時,從子查詢返回的結果集將用作臨時表。 該表稱為派生表或物化子查詢。
以下子查詢將查找訂單表中的最大,最小和平均數:


5.相關子查詢
在前面的例子中,注意到一個子查詢是獨立的。 這意味着您可以將子查詢作為獨立查詢執行。
與獨立子查詢不同,相關子查詢是使用外部查詢中的數據的子查詢。 換句話說,相關的子查詢取決於外部查詢。 對外部查詢中的每一行對相關子查詢進行一次評估。
在以下查詢中,我們查詢選擇購買價格高於每個產品線中的產品的平均購買價格的產品。
6.MySQL子查詢與EXISTS和NOT EXISTS
當子查詢與EXISTS或NOT EXISTS運算符一起使用時,子查詢返回一個布爾值為TRUE
或FALSE
的值。
用法:
在上面的查詢中,如果子查詢(subquery
)有返回任何行,則EXISTS
子查詢返回TRUE
,否則返回FALSE
。
通常在相關子查詢中使用EXISTS
和NOT EXISTS
。
下面我們來看看示例數據庫(yiibaidb)中的orders
和orderDetails
表:
·
以下查詢選擇總額大於60000
的銷售訂單。
或者:
二:派生表
1.介紹
派生表是從SELECT語句返回的虛擬表。派生表類似於臨時表,但是在SELECT
語句中使用派生表比臨時表簡單得多,因為它不需要創建臨時表的步驟。
派生表*和子查詢通常可互換使用。當SELECT
語句的FROM
子句中使用獨立子查詢時,我們將其稱為派生表。
與子查詢不同,派生表必須具有別名,以便稍后在查詢中引用其名稱。 如果派生表沒有別名,MySQL將發出錯誤
2.示例
orders
表和orderdetails
表中獲得2013
年銷售收入最高的前5
名產品。
=》
:
3.更復雜的派生表
假設必須將2013
年的客戶分為3
組:鉑金,白金和白銀。 此外,需要了解每個組中的客戶數量,具體情況如下:
- 訂單總額大於
100000
的為鉑金客戶; - 訂單總額為
10000
至100000
的為黃金客戶 - 訂單總額為小於
10000
的為銀牌客戶
要構建此查詢,首先,您需要使用CASE表達式和GROUP BY子句將每個客戶放入相應的分組中。
=》
三:公共表表達式
1.介紹
公用表表達式是一個命名的臨時結果集,僅在單個SQL語句(例如SELECT,INSERT,UPDATE或DELETE)的執行范圍內存在。
與派生表類似,CTE不作為對象存儲,僅在查詢執行期間持續。 與派生表不同,CTE可以是自引用(遞歸CTE),也可以在同一查詢中多次引用。 此外,與派生表相比,CTE提供了更好的可讀性和性能。
2.語法
CTE的結構包括名稱,可選列列表和定義CTE的查詢。
定義CTE后,可以像SELECT
,INSERT
,UPDATE
,DELETE
或CREATE VIEW
語句中的視圖一樣使用它。
請注意,查詢中的列數必須與column_list
中的列數相同。 如果省略column_list
,CTE將使用定義CTE的查詢的列列表。
3.簡單的CTE
在此示例中,CTE的名稱為customers_in_usa
,定義CTE的查詢返回兩列:customerName
和state
。因此,customers_in_usa
CTE返回位於美國的所有客戶。
在定義美國CTE的客戶之后,我們可在SELECT
語句中引用它。
4.