課程 17:子查詢 (Subquery)
本課程深入解析 SQL 子查詢(Subquery)的語法與應用,包含 WHERE、FROM 與 SELECT 子句中的實例與練習,幫助你靈活掌握資料過濾與分析技巧。
一、什麼是子查詢?
- 子查詢(Subquery)是指嵌套在另一個 SQL 語句(SELECT, INSERT, UPDATE, DELETE)內的查詢。
- 它也被稱為內部查詢或嵌套查詢。
- 子查詢在主查詢之前執行,其結果會被主查詢使用。
二、SQL子查詢的用途
- 在
WHERE
子句中:最常見的用法,用於過濾主查詢的結果。 - 在
FROM
子句中:將子查詢的結果視為一個臨時的表格來使用(稱為派生表)。 - 在
SELECT
子句中:通常用於返回單個值(標量子查詢)。
三、SQL子查詢範例 (WHERE 子句)
查詢價格高於平均價格的所有商品:
SELECT *
FROM products
WHERE price > (SELECT AVG(price) FROM products);
這個例子中,(SELECT AVG(price) FROM products)
就是一個子查詢,它先計算出所有商品的平均價格,然後主查詢用這個平均價格作為條件來篩選商品。
四、SQL子查詢與 JOIN 的比較
- 很多時候,子查詢和 JOIN 可以達到相同的目的。
- 選擇哪種方式取決於語句的複雜度、可讀性和性能需求。
- 通常,對於簡單的過濾需求,子查詢可能更直觀;對於需要組合多個表格欄位的情況,JOIN 更為合適。
五、SQL常見錯誤
- 子查詢返回多於一列,但在需要單個值的地方使用(如 WHERE 子句的比較)。
- 子查詢返回多於一行,但在需要單個值的地方使用。
- 子查詢沒有括號。
- 在需要多個值的場合(如 WHERE IN),子查詢返回多於一列。
六、SQL課後小練習
- 假設有一個
employees
表 (id, name, salary, department_id) 和departments
表 (id, name)。請寫出一個查詢,找出薪水高於其所在部門平均薪水的所有員工。
互動練習:子查詢模擬 (WHERE 子句)
商品資料表(products)
id | name | price |
---|---|---|
1 | 筆記本 | 25000 |
2 | 鍵盤 | 1500 |
3 | 滑鼠 | 800 |
4 | 顯示器 | 12000 |
5 | 印表機 | 6000 |