子查询(嵌套查询)——MySQL
文章目錄
- 子查詢(嵌套查詢)
- 標準子查詢
- 列子查詢(多行子查詢)
- 行子查詢
- select后面的子查詢
- from后面的子查詢
- exists后面(相關子查詢)
子查詢(嵌套查詢)
出現在其他語句中的select語句被稱為子查詢
按位置分類:
- select后面
- from后面
- where或having后面
- exists后面
按結果級的行數不同分類:
- 標量子查詢 (結果集有一行一列)
- 列子查詢 (結果集只有一列多行)
- 行子查詢 (結果集只有一行多列)
- 表子查詢 (結果集一般為多行多列)
where或having后面
標量子查詢
列子查詢
行子查詢
特點:
子查詢根據查詢結果的行數不同分為以下兩類:單行子查詢和多行子查詢
單行子查詢
結果集只有一行
一般搭配單行操作符使用:> < = <> >= <=
非法使用子查詢的情況:
多行子查詢
結果集有多行
一般搭配多行操作符使用:any、all、in、not in
in:屬于子查詢結果中的任意一個就行
any和all:往往可以用其他查詢代替
標準子查詢
誰的工資比abel高?
1查詢Abel的工資
SELECT salary
FROM employees
WHERE last_name = 'Abel'
2查詢員工的信息,滿足 salary>1結果
SELECT *
FROM employees
WHERE salary>(
SELECT salary
FROM employees
WHERE last_name = 'Abel'
);
把1的結果放在2的小括號內,括號內就是子查詢。
自查行中用到分組函數。
2. 返回公司工資最少的員工的last_name,job_id和salary
查詢公司的 最低工資
SELECT MIN(salary)
FROM employees
查詢last_name,job_id和salary,要求 salary=1
SELECT last_name,job_id,salary
FROM employees
WHERE salary=
(
SELECT MIN(salary)
FROM employees
);
一個查詢里面可以放兩個子查詢。
3. 返回job_id與141號員工相同,salary比143號員工多的員工 姓名,job_id 和工資
SELECT last_name,job_id,salary
FROM employees
WHERE job_id =
(
SELECT job_id
FROM employees
WHERE employee_id = 141
) 查詢141號員工的job_id
AND salary>
(
SELECT salary
FROM employees
WHERE employee_id = 143
);查詢143號員工的salary
查詢最低工資大于50號部門最低工資的部門id和其最低工資
查詢50號部門的最低工資
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
查詢每個部門的最低工資
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
在②基礎上篩選,滿足min(salary)>①
SELECT MIN(salary),department_id
FROM employees
GROUP BY department_id
HAVING MIN(salary)>
(
SELECT MIN(salary)
FROM employees
WHERE department_id = 50
);
列子查詢(多行子查詢)
-
返回多行
-
使用多行比較操作符
操作符含義 in/out in 等于列表中的任意一個 not in 不在指定的集合范圍內 any/some 和子查詢返回的某個值比較,有任意一個滿足即可 all 和子查詢返回的所有值比較,必須全部滿足
分解為以下兩步:
①. 查詢 "銷售部" 和 "市場部" 的部門ID select id from dept where name = '銷售部' or name = '市場部';②. 根據部門ID, 查詢員工信息 select * from emp where dept_id in (select id from dept where name = '銷售部' or name = '市場部');分解為以下兩步:
返回location_id是1400或1700的部門中的所有員工姓名
查詢location_id是1400或1700的部門編號
SELECT distinct department_id
FROM departments
WHERE location_id IN(1400,1700)
查詢員工姓名,要求部門號是①列表中的某一個
SELECT last_name
FROM employees
WHERE department_id in
(
SELECT DISTINCT department_id
FROM departments
WHERE location_id IN(1400,1700)
);
返回其它工種中比job_id為‘IT_PROG’工種任一工資低的員工的員工號、姓名、job_id 以及salary
查詢job_id為‘IT_PROG’部門任一工資
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
查詢員工號、姓名、job_id 以及salary,salary<(①)的任意一個
SELECT last_name,employee_id,job_id,salary
FROM employees
WHERE salary < ANY
(
SELECT DISTINCT salary
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id <> 'IT_PROG';
或(< any等價于< min)
SELECT last_name,employee_id,job_id,salary
FROM employees
WHERE salary <
(
SELECT min(salary)
FROM employees
WHERE job_id = 'IT_PROG'
) AND job_id<>'IT_PROG';
行子查詢
子查詢返回的結果是一行(可以是多列),這種子查詢稱為行子查詢。
常用的操作符:= 、<> 、IN 、NOT IN
A. 查詢與 “張無忌” 的薪資及直屬領導相同的員工信息 ;
這個需求同樣可以拆解為兩步進行:
查詢員工編號最小并且工資最高的員工信息
查詢最小的員工編號
SELECT MIN(employee_id)
FROM employees
查詢最高工資
SELECT MAX(salary)
FROM employees
查詢員工信息
SELECT *
FROM employees
WHERE employee_id=
(
SELECT MIN(employee_id)
FROM employees
)
AND salary=
(
SELECT MAX(salary)
FROM employees
);
常規查詢分為以上三步,行查詢可轉化為:
SELECT * FROM employees
WHERE (employee_id,salary)=
(
SELECT MIN(employee_id),MAX(salary)
FROM employees
);
select后面的子查詢
- 僅僅支持標量子查詢
SELECT
(
SELECT department_name,e.department_id
FROM departments d
INNER JOIN employees e
ON d.department_id=e.department_id
WHERE e.employee_id=102
) as 部門名;
from后面的子查詢
- 將子查詢結果充當一張表,要求必須起別名
查詢每個部門的平均工資
SELECT AVG(salary),department_id
FROM employees
GROUP BY department_id
然后再
SELECT * FROM job_grades;
顯示查詢結果
連接①的結果集和job_grades表,篩選條件平均工資 between lowest_sal and highest_sal
SELECT ag_dep.*,g.'grade_level'
FROM
(
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id
) as ag_dep
INNER JOIN job_grades g
ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
exists后面(相關子查詢)
語法:
exists(完整的查詢語句)
結果:1或0
SELECT EXISTS(SELECT employee_id FROM employees);
結果為0。只關心他括號里的子查詢有沒有,有就為1
- 用in
SELECT department_name
FROM departments d
WHERE d.'department_id' IN
(
SELECT department_id
FROM employees
); - 用exists
SELECT department_name
FROM departments d
WHERE EXISTS
(
SELECT *
FROM employees e
WHERE d.'department_id'=e.'department_id'
);
總結
以上是生活随笔為你收集整理的子查询(嵌套查询)——MySQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: smarty手册
- 下一篇: 尚硅谷视频分享_硅谷的女儿分享了她的“书