数据库之子查询

概念

把一个查询结果做为另外一个查询的基础。sql

子查询出现的位置

  • where  以后
  • having  以后 把结果做为组数据过滤的条件
  • from  以后 把查询结果做为一个表

 where 以后  做为条件

select distinct manager_id from s_emp;

 

查询结果应该是8个,可是由于有一个null,因此有9个,可是不影响下面的运算。好比:spa

select id, first_name from s_emp where id in(1,2,3,NULL);

 

null对其查询没有影响。若是有人的员工id出如今上面的查询结果里面,则该人是领导。blog

select id, first_name from s_emp where id in(select distinct manager_id from s_emp);

 

in找到一个,就能判定该字段在里面。那么要找出全部普通员工就不能用“not  in”。(由于有null,它不受控制会影响查询)内存

select id, first_name from s_emp where id not in(select distinct manager_id from s_emp where manager_id is not null);

having以后  把结果做为组数据过滤的条件

演示:按照部门号分组,求每一个部门的平均工资,要求显示平均工资大于42部门的平均工资

select avg(salary) from s_emp where dept_id=42;

 

select dept_id, avg(salary) from s_emp group by dept_id having avg(salary)>(select avg(salary) from s_emp where dept_id=42);

子查询出如今from以后

任何一个核发的select语句,均可以当作一张内存表。class

演示:  

select id, first_name name, salary from s_emp;

  。。。。。。基础

select id,first_name name,salary from s_emp;  能够当作一张有两个字段的内存表select

 

select name, salary from(select id, first_name name, salary from s_emp) where salary>1000;

演示:按照部门号分组,求每一个部门的平均工资,要求显示平均工资大于42部门的平均工资(结合子查询在from以后和where以后)

select dept_id, avg(salary) asal from s_emp group by dept_id;

select dept_id,avg(salary) asal from s_emp  group by dept_id  放在from后面做为一张有两个字段:dept_id  asal  的内存表使用。im

   

select * from (select dept_id, avg(salary) asal from s_emp group by dept_id) where asal>(select avg(salary) from s_emp where dept_id=42);

  

相关文章
相关标签/搜索