同事问我MySQL子查询为什么失败,我告诉他子查询结果当成派生表千万记得加别名...

前文铺垫一些基础知识,老鸟直接拉到文末看原因!

什么是子查询

  1. 一个查询的结果做为另一个查询的条件
  2. 有查询的嵌套,内部的查询称为子查询
  3. 子查询要使用括号

子查询的结果是一个值的时候

示例:SELECT 查询字段 FROM 表 WHERE 字段=(子查询);

案例:查询工资最高的员工是谁?

-- 查询员工工资的最大值
select max(salary) from emp;

-- 查询领最多工资的员工信息
select * from emp where salary = (select max(salary) from emp);

这个案例中select max(salary) from emp; 就是子查询的语句,它查到的最高工资作为select * from emp where salary = (select max(salary) from emp);的查询条件。

子查询结果是多行单列的时候

  • 子查询结果是单例多行,结果集类似于一个数组,父查询使用 IN 运算符
  • 示例:SELECT 查询字段 FROM 表 WHERE 字段 IN (子查询)

案例:查询工资大于5000的员工,对应的部门名称

-- 查询大于5000的员工所在的部门id
select dept_id from emp where salary > 5000;

-- 根据部门id查询部门名字
select name from dept where dept_id in (select dept_id from emp where salary > 5000);

这个案例中select dept_id from emp where salary > 5000;是自查询语句,查询结果是多个值(多行单列),因此使用子查询时要用in关键字。查询结果作为select name from dept where dept_id in (select dept_id from emp where salary > 5000);的查询条件。

子查询的结果是多行多列

  • 子查询结果只要是多列,肯定在 FROM 后面作为表
  • SELECT 查询字段 FROM (子查询) 表别名 WHERE 条件
  • 子查询作为表需要取别名,否则这张表没有名称则无法访问表中的字段 (这个相当重要,不加的话sql是运行不了的)

案例:查询出2023年以后入职的员工信息,包括部门名称

-- 在员工表中查询2023-1-1以后入职的员工
select * from emp wherec join_date >= '2023-1-1';

-- 查询所有的部门信息,与上面的虚拟表中的信息组合,找出所有部门id等于的dept_id
select * from dept d, (select * from emp wherec join_date >= '2023-1-1') e where d.dept_id = e.dept_id;

上述例子中select * from emp wherec join_date >= ‘2023-1-1’;的查询结果被当作派生表,用到了select * from dept d, (select * from emp wherec join_date >= ‘2023-1-1’) e where d.dept_id = e.dept_id;这个语句中。此时可以看到我为select * from emp wherec join_date >= ‘2023-1-1’;取了一个别名为e,这个时候sql就不会报错。

你可能感兴趣的:(MySQL,mysql,sql,数据库,java)