把一個查詢結果做爲另外一個查詢的基礎。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);