mysql子查询

子查询

该文所需要的sql文件,点这里【免下载积分】

嵌套在其他语句内部的select语句称为子查询或内查询,
外面的语句可以是insert、update、delete、select等,一般select作为外面语句较多
外面如果为select语句,则此语句称为外查询或主查询

子查询的分类

按出现位置
  • select后面
    • 仅支持标量子查询
  • from后面
    • 表子查询
  • wherehaving后面
    • 标量只查询
    • 列子查询
    • 行子查询(用的少)
  • exists后面
    • 标量子查询
    • 列子查询
    • 行子查询
    • 表子查询
按结果集的行列数
  • 标量子查询
    • 结果集只有一行一列
  • 列子查询
    • 结果集只有一列多行
  • 行子查询
    • 结果集有一行多列
  • 表子查询
    • 结果集一般为多行多列,没有限制

子查询的特点

  • 子查询放在小括号内

  • 子查询一般放在条件的右侧

  • 标量子查询,一般搭配单行操作符使用

  • 列子查询,一般搭配多行操作符

    • in any/some all
      
  • 子查询先于主查询


实例

标量子查询
  1. 谁的工资高于abel,先试用select找到abel的工资,然后再判断salary情况

    SELECT
    	* 
    FROM
    	employees 
    WHERE
    	salary > (
    	SELECT
    		salary 
    	FROM
    		employees 
    WHERE
    	last_name = 'Abel')
    
  2. 查询最低工资

    SELECT
    	last_name,
    	salary 
    FROM
    	employees 
    WHERE
    	salary = ( SELECT MIN( salary ) FROM employees );
    

    也可以

    SELECT
    	last_name,
    	salary 
    FROM
    	employees 
    ORDER BY
    	salary 
    	LIMIT 1
    
  3. 查询最低工资大于50号部门最低工资的部门id和其最低工资

    • 查询50部门的最低工资
    SELECT
    	MIN( salary ) 
    FROM
    	employees 
    WHERE
    	department_id = 50;
    
    • 查询每个部门的最低工资
    SELECT
    	MIN( salary ),
    	department_id 
    FROM
    	employees 
    GROUP BY
    	department_id
    
    • 筛选
    SELECT
    	MIN( salary ),
    	department_id 
    FROM
    	employees 
    GROUP BY
    	department_id 
    HAVING
    	MIN( salary ) > (
    	SELECT
    		MIN( salary ) 
    	FROM
    		employees 
    	WHERE
    		department_id = 50 
    	)
    
列子查询
操作符含义
IN/NOT IN等于列表中的任意一个
ANY|SOME和子查询返回的某一个值比较
ALL和子查询返回的所有值比较
  1. 查询department_id为1400或1700的部门编号的员工姓名
SELECT
	last_name 
FROM
	employees 
WHERE
	department_id IN (
	SELECT DISTINCT
		department_id 
	FROM
		departments 
	WHERE
		location_id IN ( 1400, 1700 ) 
	)
  1. 返回其它工种中比job_id为‘IT_PROG’部门所有工资都低的员工的员工号、姓名、job_id 以及salary
SELECT
	employee_id,
	last_name,
	job_id 
FROM
	employees 
WHERE
	salary < ANY ( SELECT salary FROM employees WHERE job_id = 'IT_PROG' ) 
	AND job_id <> 'IT_PROG';
行子查询
  1. 查询员工编号最小并且工资最高的员工信息
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)
表子查询
  1. 查询每个部门的员工个数
SELECT
	d.*,
	( SELECT COUNT(*) FROM employees e WHERE e.department_id = d.department_id ) number 
FROM
	departments d
	
SELECT
	department_id,
	COUNT(*) 
FROM
	employees 
GROUP BY
	department_id

b站李玉婷老师的课程笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值