PostgreSQL - 第 11 天 - 子查詢
課程簡介
子查詢是一種在查詢語句中嵌套其他查詢的方式,可以讓我們進行更複雜的數據查詢。子查詢的結果通常用於限定主查詢的條件或返回計算結果。子查詢通常可以分為標量子查詢、行子查詢和列子查詢等類型。
什麼是子查詢?
子查詢(Subquery)是指在一個 SQL 查詢語句內部,嵌套另一個查詢語句。子查詢可以出現在 SELECT
、WHERE
、FROM
、HAVING
等子句中,並且其結果可以用來進行篩選、計算或分組。
子查詢可以是:
- 標量子查詢:返回單一值。
- 行子查詢:返回一行多個列的結果。
- 列子查詢:返回多行單列的結果。
- 表子查詢:返回多行多列的結果,通常在
FROM
子句中使用。
子查詢的基本語法
基本的子查詢語法結構是將子查詢語句放在括號中。當使用子查詢時,子查詢的結果通常用來限制主查詢的結果,或者用於計算。
1
SELECT 欄位1, 欄位2 FROM 表名 WHERE 欄位1 = (子查詢);
在 WHERE 子句中使用子查詢
WHERE
子句中的子查詢通常用來過濾資料,根據子查詢的結果來限制主查詢的範圍。
範例 1:標量子查詢
查詢月薪高於「王小明」的所有員工:
1
SELECT 姓名, 月薪 FROM 員工 WHERE 月薪 > (SELECT 月薪 FROM 員工 WHERE 姓名 = '王小明');
這裡的子查詢 (SELECT 月薪 FROM 員工 WHERE 姓名 = '王小明')
返回王小明的月薪,並且主查詢只返回月薪高於這個值的員工。
範例 2:IN 子查詢
查詢所有職位為「工程師」或「資深工程師」的員工:
1
SELECT 姓名, 職位 FROM 員工 WHERE 職位 IN (SELECT 職位 FROM 員工 WHERE 職位 IN ('工程師', '資深工程師'));
這裡的子查詢 (SELECT 職位 FROM 員工 WHERE 職位 IN ('工程師', '資深工程師'))
返回符合條件的職位,主查詢返回符合這些職位的員工。
在 SELECT 子句中使用子查詢
子查詢也可以出現在 SELECT
子句中,用來返回某些計算結果或統計值。
範例 1:計算月薪和總工資的比率
查詢每位員工的月薪和他們的月薪與公司所有員工總月薪的比率:
1
SELECT 姓名, 月薪, 月薪 / (SELECT SUM(月薪) FROM 員工) AS 工資比率 FROM 員工;
這裡的子查詢 (SELECT SUM(月薪) FROM 員工)
計算了所有員工月薪的總和,然後主查詢計算每位員工月薪與總月薪的比率。
在 FROM 子句中使用子查詢
子查詢也可以出現在 FROM
子句中,並且結果可以像一個臨時資料表一樣被使用。
範例:使用子查詢作為臨時表
查詢每個部門的平均月薪:
1
SELECT 部門, AVG(月薪) FROM (SELECT 部門, 月薪 FROM 員工 WHERE 月薪 > 50000) AS 高薪員工 GROUP BY 部門;
這裡的子查詢 (SELECT 部門, 月薪 FROM 員工 WHERE 月薪 > 50000)
返回所有月薪大於 50000 的員工的部門和月薪,並將其作為臨時表 高薪員工
。主查詢再根據這個結果計算每個部門的平均月薪。
使用 EXISTS 子查詢
EXISTS
子查詢用來檢查子查詢是否返回任何結果。當子查詢返回至少一行結果時,EXISTS
返回 TRUE
。
範例:查詢有高於 50000 月薪的員工的部門
1
SELECT 部門 FROM 員工 WHERE EXISTS (SELECT 1 FROM 員工 WHERE 月薪 > 50000 AND 部門 = 員工.部門);
這裡的子查詢檢查每個部門中是否存在月薪大於 50000 的員工。主查詢只返回這些部門。
本日總結
今天我們學習了如何使用子查詢來進行更複雜的數據查詢。子查詢可以嵌套在 SELECT
、WHERE
、FROM
和其他子句中,並能讓我們基於一個查詢的結果進行其他查詢。掌握子查詢的使用將使我們能夠處理更多的數據篩選和計算需求。明天我們將學習如何使用 JOIN
來結合多個表格。