摘要:在本教程中,您將學習如何使用 SQL 子查詢來構建靈活的查詢,以從資料庫中檢索資料。
SQL 子查詢簡介 #
子查詢是巢狀在另一個 查詢 中的 SQL 查詢。包含子查詢的查詢稱為外部查詢。
要編寫子查詢,您需要對 SELECT 語句有深入的瞭解。
SELECT
select_list
FROM
table1
INNER JOIN table2 ON join_condition
WHERE
filter_condition;Code language: SQL (Structured Query Language) (sql)請注意,連線可以是 INNER JOIN、LEFT JOIN、RIGHT JOIN 或 FULL JOIN。
在此語法中:
SELECT子句可以接受單個值,該值可以是列或表示式。FROM和INNER JOIN子句可以接受結果集,例如表。WHERE子句可以接受單個值,該值可以是列或表示式。
根據每個子句接受的資料形式,您可以嵌入適當的子查詢。
SELECT子句中的子查詢可以返回單個值。FROM或INNER JOIN子句中的子查詢可以返回一個結果集。WHERE子句中的子查詢可以返回單個值。
WHERE 子句中的 SQL 子查詢 #
我們將使用 HR 示例資料庫中的 employees 表。

以下語句使用子查詢來查詢薪水最高的員工。
SELECT
first_name,
salary
FROM
employees
WHERE
salary = (
SELECT
MAX(salary)
FROM
employees
);Code language: SQL (Structured Query Language) (sql)輸出
first_name | salary
------------+----------
Steven | 24000.00Code language: SQL (Structured Query Language) (sql)查詢工作原理:
首先,子查詢從 employees 表的 salary 列返回最高薪水。
SELECT
MAX(salary)
FROM
employeesCode language: SQL (Structured Query Language) (sql)其次,外部查詢使用子查詢返回的值,並返回薪水最高的員工。
以下示例使用子查詢來查詢薪水高於平均薪水的員工。
SELECT
first_name,
salary
FROM
employees
WHERE
salary > (
SELECT
AVG(salary)
FROM
employees
)
ORDER BY
salary;Code language: SQL (Structured Query Language) (sql)輸出
first_name | salary
------------+----------
John | 8200.00
Adam | 8200.00
William | 8300.00
Jack | 8400.00
Jonathon | 8600.00
...Code language: SQL (Structured Query Language) (sql)帶 IN 運算子的 SQL 子查詢 #
如果一個值等於值列表中的任何值,IN 運算子將返回 true。您可以使用子查詢為 IN 運算子返回一個值列表。
IN subqueryCode language: SQL (Structured Query Language) (sql)例如,以下查詢使用帶有 IN 運算子的子查詢來查詢所有職位名稱與 Sales 相關的員工。
SELECT
first_name,
last_name
FROM
employees
WHERE
job_id IN (
SELECT
job_id
FROM
jobs
WHERE
job_title LIKE '%Sales%'
);Code language: SQL (Structured Query Language) (sql)輸出
first_name | last_name
------------+------------
John | Russell
Karen | Partners
Jonathon | Taylor
Jack | Livingston
Kimberely | Grant
Charles | JohnsonCode language: SQL (Structured Query Language) (sql)查詢工作原理:
首先,子查詢返回職位名稱中包含單詞 "Sales" 的職位 ID 列表。
SELECT
job_id
FROM
jobs
WHERE
job_title LIKE '%Sales%'Code language: SQL (Structured Query Language) (sql)輸出
job_id
--------
15
16Code language: SQL (Structured Query Language) (sql)其次,外部查詢選擇 job_id 在職位 ID 列表 (15, 16) 中的員工。
SELECT 子句中的子查詢 #
以下示例在 SELECT 子句中使用子查詢來檢索所有員工的名字、薪水和平均薪水。
SELECT
first_name,
salary,
(
SELECT
ROUND(AVG(salary),2) average_salary
FROM
employees
)
FROM
employees
ORDER BY
salary;Code language: SQL (Structured Query Language) (sql) first_name | salary | average_salary
-------------+----------+----------------
Karen | 2500.00 | 8060.00
Guy | 2600.00 | 8060.00
Irene | 2700.00 | 8060.00
Sigal | 2800.00 | 8060.00
Shelli | 2900.00 | 8060.00
...Code language: SQL (Structured Query Language) (sql)FROM 子句中的子查詢 #
以下示例展示瞭如何在 FROM 子句中使用子查詢。
SELECT
ROUND(AVG(department_salary), 0) average_department_salary
FROM
(
SELECT
department_id,
SUM(salary) department_salary
FROM
employees
GROUP BY
department_id
);Code language: SQL (Structured Query Language) (sql)輸出
average_department_salary
---------------------------
29309Code language: SQL (Structured Query Language) (sql)它的工作原理如下:
首先,子查詢返回一個結果集,其中包括每個部門的 department_id 和總薪水。
SELECT
department_id,
SUM(salary) department_salary
FROM
employees
GROUP BY
department_id;Code language: SQL (Structured Query Language) (sql)其次,外部查詢計算所有部門的平均總薪水,並將其四捨五入到沒有小數位。
INNER JOIN 子句中的子查詢 #
以下示例在外部查詢的 INNER JOIN 子句中使用子查詢,以檢索薪水高於公司平均薪水的員工。
SELECT
first_name,
last_name,
salary,
s.avg_salary
FROM
employees e
INNER JOIN (
SELECT
ROUND(AVG(salary), 0) AS avg_salary
FROM
employees
) s ON e.salary > s.avg_salary
ORDER BY
salary;Code language: SQL (Structured Query Language) (sql)輸出
first_name | last_name | salary | avg_salary
------------+------------+----------+------------
John | Chen | 8200.00 | 8060
Adam | Fripp | 8200.00 | 8060
William | Gietz | 8300.00 | 8060
Jack | Livingston | 8400.00 | 8060
Jonathon | Taylor | 8600.00 | 8060
...Code language: SQL (Structured Query Language) (sql)查詢工作原理:
- 首先,子查詢計算公司的平均薪水。
- 其次,外部查詢檢索薪水高於該平均薪水的員工。
摘要 #
- 子查詢是巢狀在外部查詢中的查詢。
- 在查詢的
SELECT、FROM、WHERE和INNER JOIN子句中嵌入適當的子查詢。