MySQL |子查询

子查询

子查询指一个查询语句嵌套在另一个查询语句内部的查询。
外查询也叫主查询,内查询也叫子查询。

子查询分类

  1. 按子查询的结果分类
    • 查询结果是一条:单行子查询
    • 查询结果是多条:多行子查询
  2. 按子查询的执行次数分类
    • 子查询只执行一次,执行结果作为主查询的条件执行:不相关子查询
    • 子查询循环执行多次,依赖外部查询,要用到外部表:相关子查询

OR(或) 与 IN效果一样

WHERE A=1 OR A=2

IS EQUAL TO

WHERE A IN (1, 2)

📝推荐IN

题目:查询最低工资大于50号部门最低工资的部门id和其最低工资

SELECT department_id, MIN(salary)
FROM employee
GROUP BY department
HAVING MIN(salary) >  (SELECT MIN(salary)
								FROM employee
								WHERE department_id = 50)

CASE

题目:显示员工的employee_id,last_name和location。其中,若员工department_id与location_id为1800
的department_id相同,则location为’Canada’,其余则为’USA’。

SELECT employee_id, last_name, (CASE department_id
								WHEN (SELECT department_id
										FROM employee
										WHERE location_id=1800), 
								THEN location='Canana'
								ELSE location='USA' END) location
FROM employee

ANY

题目:返回其它job_id中比job_id为‘IT_PROG’部门任一工资低的员工的员工号、姓名、job_id 以及salary

SELECT employee_id, name, job_id, salary
FROM employees
WHERE job_id <> 'IT_PROG'
AND salary < ANY(SELECT salary
				 FROM employees
				 HAVING job_id='IT_PROG');

MIN<=ALL效果一样

查询平均工资最低的部门id

Mysql中,聚合函数不可以嵌套使用。oracle可以。
MIN(AVG(SALARY))在mysql种是❌的。

SELECT department_id
FROM employees
GROUP BY department
HAVING AVG(salary) <=	ALL(SELECT AVG(salary) avg_salary
					FROM employees
					GROUP BY department) 

相关子查询

如果存在,直接返回,不再查找。
如果不存在,继续查找,直至找到或全部查找完。

EXIST:题目字眼“存在
NOT EXIST:题目字眼“不存在

自连接:DISTINCT + 自连接
自连接优于子查询,自连接的处理速度更快!

WITH ROLLUP

SELECT SUM(字段1)  -- 求出每个分组内字段1的总和(分组1、分组2、……)
FROM 表名
GROUP BY 字段1
WITH ROLLUP  -- 求所有分组的字段1的总和(分组1+分组2+……)

WITH ROLLUP是对GROUP BY后的第一个字段进行分组求和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值