mysql基礎_03_子查詢

一、概述

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
)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章