一、子查詢是什么
在SQL的世界里,子查詢就像是一個“小助手”,它是一個嵌套在另一個查詢里面的查詢語句。就好比你在做一道復(fù)雜的菜,需要先準(zhǔn)備好一些小配料,子查詢就是那個先做好的小配料,等會兒要用到的時候再拿出來。
二、子查詢的特殊用法
(一)相關(guān)子查詢
想象一下,你有一個員工表,里面記錄了員工的工資和部門信息。現(xiàn)在你想找出每個部門里工資高于該部門平均工資的員工。這時候可以使用相關(guān)子查詢。
SELECT e1.*
FROM employees e1
WHERE e1.salary > (
SELECT AVG(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
這個查詢看起來有點復(fù)雜,但其實很好理解。外層的查詢(e1
)會逐行檢查員工表,而內(nèi)層的子查詢(e2
)會針對每個員工所在的部門計算平均工資。關(guān)鍵在于,子查詢里的WHERE
條件e2.department_id = e1.department_id
,它會根據(jù)外層查詢當(dāng)前處理的員工所在的部門來動態(tài)計算平均工資。這就像是子查詢和外層查詢在“互動”一樣,每次外層查詢換了一個員工,子查詢就重新計算一次對應(yīng)的部門平均工資,然后外層查詢再拿這個結(jié)果來判斷當(dāng)前員工的工資是否高于平均工資。
(二)標(biāo)量子查詢
標(biāo)量子查詢就是一個只給你一個答案,總是返回一個單一的值,通常用在SELECT
子句里,給查詢結(jié)果添加一些額外的信息。
舉一個蠢一點的例子。比如,你想在查詢員工信息的時候,順便知道整個公司員工的平均工資是多少。你可以這樣寫:
SELECT employee_id, first_name, last_name,
(SELECT AVG(salary) FROM employees) AS avg_salary
FROM employees;
這里,子查詢(SELECT AVG(salary) FROM employees)
只計算一次整個公司員工的平均工資,然后把這個值(一個標(biāo)量)附加到每一行員工信息后面。不管員工表里有多少行數(shù)據(jù),這個子查詢都只執(zhí)行一次,因為它只關(guān)心整個表的平均工資這個單一的值。
(三)行子查詢
行子查詢有點像一個比較嚴格的小能手,它會返回一行數(shù)據(jù),通常用在WHERE
子句里,用來比較一行數(shù)據(jù)是否滿足某個條件。舉個例子,你想找出那些工資和傭金比例都和某個特定員工(比如員工ID為100的員工)一樣的其他員工。你可以這樣寫:SELECT *
FROM employees
WHERE (salary, commission_pct) = (
SELECT salary, commission_pct
FROM employees
WHERE employee_id = 100
);
這個查詢里,子查詢(SELECT salary, commission_pct FROM employees WHERE employee_id = 100)
會找出員工ID為100的員工的工資和傭金比例,然后外層查詢會把所有工資和傭金比例與之相同的員工找出來。行子查詢在這里就像是一個嚴格的比較標(biāo)準(zhǔn),它確保了兩個字段(工資和傭金比例)都要完全匹配。
(四)表子查詢
表子查詢就像是一個神奇的“虛擬表”,它可以讓你把子查詢的結(jié)果當(dāng)作一個臨時的表來用,然后在這個“虛擬表”上進行進一步的查詢操作。
比如,你想找出那些部門位置在1700的員工信息和他們對應(yīng)的部門名稱。你可以這樣寫:
SELECT e.employee_id, e.first_name, e.last_name, d.department_name
FROM employees e,
(SELECT department_id, department_name
FROM departments
WHERE location_id = 1700) d
WHERE e.department_id = d.department_id;
這里,子查詢(SELECT department_id, department_name FROM departments WHERE location_id = 1700)
先篩選出部門位置在1700的部門信息,然后把這個結(jié)果當(dāng)作一個“虛擬表”d
,和員工表e
進行連接操作。這樣,你就可以很方便地把符合條件的員工信息和部門名稱一起查出來了。
閱讀原文:原文鏈接
該文章在 2025/8/26 13:09:38 編輯過