MySQL子查询详解(3种主流写法语句)

MySQL子查询详解(3种主流写法语句)-mikechen

MySQL子查询定义

MySQL子查询指的是:一个查询语句嵌套在另一个查询语句内部的查询,又叫内部查询。

子查询是指嵌套在其他 SQL 语句,比如: SELECT、INSERT、UPDATE、DELETE 等中的查询语句。

比如:

select emp_name, salary
from employee
where salary > (
          select avg(salary)
          from employee
      );

其中嵌套了一个SELECT查询语句。

 

where型子查询

where型子查询即把内层sql语句查询的结果,作为外层sql查询的条件。

语法格式:

select 列1,列2,...,列n from 表名 where 列i =/in (select 列1,列2,...,列n from 表名 where ...);

示例,查询比“mikechen”的工资高的员工编号:

SELECT * FROM t_salary
WHERE basic_salary > (SELECT basic_salary FROM t_employee INNER JOIN t_salary ON t_employee.eid=t_salary.eid WHERE t_employee.ename='mikechen');

 

from型子查询

from型子查询,即把内层sql语句查询的结果,作为临时表供外层sql语句再次查询。

语法格式:

select 列1,列2,...,列n from (select 列1,列2,...,列n from 表名 where ...) as 表别名 where ....;

示例:

#找出比部门平均工资高的员工编号,基本工资
SELECT t_employee.eid,basic_salary
FROM t_salary INNER JOIN t_employee INNER JOIN (
SELECT emp.dept_id AS did,AVG(s.basic_salary) AS avg_salary
FROM t_employee AS emp,t_salary AS s
WHERE emp.eid = s.eid
GROUP BY emp.dept_id) AS temp
ON t_salary.eid = t_employee.eid AND t_employee.dept_id = temp.did
WHERE t_salary.basic_salary > temp.avg_salary;

 

exists型子查询

exists子查询把外层sql的结果,拿到内层sql去测试,如果内层的sql成立,则该行取出。

语法格式:

select 列1,列2,...,列n from 表名 where exists (select 列1,列2,...,列n from 表名 where ...);

示例:

#exists型
#查询部门信息,该部门必须有员工
SELECT * FROM t_department
WHERE EXISTS (SELECT * FROM t_employee WHERE t_employee.dept_id = t_department.did);

作者简介

陈睿|mikechen,10年+大厂架构经验,BAT资深面试官,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

👇阅读更多mikechen架构文章👇

阿里架构 |双11秒杀 |分布式架构 |负载均衡 |单点登录 |微服务 |云原生 |高并发 |架构师

以上

关注作者「mikechen」公众号,获取更多技术干货!

后台回复架构,即可获取《阿里架构师进阶专题全部合集》,后台回复面试即可获取《史上最全阿里Java面试题总结

评论交流
    说说你的看法