mysql基礎_子查詢
一、概述
1. 含義
- 出現在其他語句中的select語句,稱爲子查詢或內查詢
- 外部的查詢語句,稱爲主查詢或外查詢
2. 分類
2.1 按子查詢出現的位置:
- select後面:僅僅支持標量子查詢
- from後面:支持表子查詢
- where或having後面:
- 標量子查詢(單行)
- 列子查詢 (多行)
- 行子查詢
- exists後面(相關子查詢)
- 表子查詢
2.2 按結果集的行列數不同:
- 標量子查詢(結果集只有一行一列)
- 列子查詢(結果集只有一列多行)
- 行子查詢(結果集有一行多列)
- 表子查詢(結果集一般爲多行多列)
3. 特點
- 子查詢放在小括號內
- 子查詢一般放在條件的右側
- 標量子查詢,一般搭配着單行操作符使用 ( > < >= <= = <> )
- 列子查詢,一般搭配着多行操作符使用 (in、any/some、all )
- 子查詢的執行優先於主查詢執行,主查詢的條件用到了子查詢的結果
二、 標量子查詢
- 結果集只有一行一列
1. where後面
例:誰的工資比 Abel 高?
SELECT *
FROM employees
WHERE salary>(
SELECT salary #查詢到的結果只能有一行一列
FROM employees
WHERE last_name = 'Abel'
);
- 子查詢的結果
2. select後面
查詢每個部門的員工個數
SELECT d.*,(
SELECT COUNT(*)
FROM employees e
WHERE e.department_id = d.`department_id`
) 個數
FROM departments d;
- 查詢的結果
三、列子查詢 (多行子查詢)
- 子查詢返回 一列多行
- 多行比較操作符
操作符 | 含義 |
---|---|
IN / NOT IN | 等於列表中的任意一個 |
ANY / SOME | 和子查詢返回的某一個值比較 |
ALL | 和子查詢返回的所有值比較 |
- 一般 ANY/SOME/ALL 都可以使用其他方式代替,比如 a > all (10,20,30) 可以換成 a> max(10,20,30)
1. where後面
例:返回location_id是1400或1700的部門中的所有員工姓名 和部門編號
SELECT last_name ,department_id
FROM employees
WHERE department_id IN (
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
子查詢結果
查詢結果
四、 行子查詢
- 結果集有一行多列
例:查詢員工編號最小並且工資最高的員工信息
SELECT *
FROM employees
WHERE (employee_id,salary)=(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
#等價於下面
SELECT *
FROM employees
WHERE employee_id=(
SELECT MIN(employee_id)
FROM employees
)AND salary=(
SELECT MAX(salary)
FROM employees
);
子查詢結果
查詢結果
五、表子查詢
- 跟在 from 後面
- 將查詢的結果充當一個數據源 的表 ,這個表必須起別名。
例: 查詢每個部門的平均工資的工資等級
SELECT j.* , department_id ,avg_salary
FROM (
SELECT AVG(salary) avg_salary,department_id
FROM employees e
GROUP BY department_id
) ag_dep # 表必須起別名
JOIN job_grades j
ON ag_dep.avg_salary BETWEEN lowest_sal AND highest_sal;
子查詢結果
查詢結果
六、 相關子查詢 exists
- exists 判斷查詢結果是否 存在 ,查詢結果是否爲空
- 可以使用 IN 代替
存在
SELECT EXISTS(
SELECT *
FROM employees
) result
不存在
SELECT EXISTS(
SELECT *
FROM employees
WHERE last_name = '111'
) result
案例:
查詢所有有員工的部門名
# 使用 EXISTS
SELECT department_name
FROM departments d
WHERE EXISTS(
SELECT *
FROM employees e
WHERE d.department_id = e.department_id
);
# 使用 IN
SELECT department_name
FROM departments
WHERE department_id IN (
SELECT DISTINCT department_id
FROM employees
)