把一个查询结果做为另外一个查询的基础。sql
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);
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);
任何一个核发的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;
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);