數據庫之子查詢

概念

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

  

相關文章
相關標籤/搜索