文章

PostgreSQL - 第 11 天 - 子查詢

課程簡介

子查詢是一種在查詢語句中嵌套其他查詢的方式,可以讓我們進行更複雜的數據查詢。子查詢的結果通常用於限定主查詢的條件或返回計算結果。子查詢通常可以分為標量子查詢、行子查詢和列子查詢等類型。


什麼是子查詢?

子查詢(Subquery)是指在一個 SQL 查詢語句內部,嵌套另一個查詢語句。子查詢可以出現在 SELECTWHEREFROMHAVING 等子句中,並且其結果可以用來進行篩選、計算或分組。

子查詢可以是:

  • 標量子查詢:返回單一值。
  • 行子查詢:返回一行多個列的結果。
  • 列子查詢:返回多行單列的結果。
  • 表子查詢:返回多行多列的結果,通常在 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 的員工。主查詢只返回這些部門。


本日總結

今天我們學習了如何使用子查詢來進行更複雜的數據查詢。子查詢可以嵌套在 SELECTWHEREFROM 和其他子句中,並能讓我們基於一個查詢的結果進行其他查詢。掌握子查詢的使用將使我們能夠處理更多的數據篩選和計算需求。明天我們將學習如何使用 JOIN 來結合多個表格。

本文章以 CC BY 4.0 授權