1. 程式人生 > 其它 >SQL子查詢

SQL子查詢

  • 定義:子查詢指一個查詢語句巢狀在另一個查詢語句內部,在SELECT子句中先計運算元查詢,子查詢的結果作為外層另一個查詢的過濾條件,查詢可以基於一個表或者多個表。 這個特性從MySQL 4.1開始引入。

  • 子查詢作為過濾條件時需要用() 包裹

子查詢的常見分類

  • From型子查詢:將子查詢的結果作為父查詢的表來使用
  • in/not in 型子查詢:子查詢的結果是單列多行,作為where的過濾條件
  • where型子查詢:查詢結果作為過濾條件出現在比較運算子的一端

帶From關鍵詞的子查詢

  • 子查詢是一張多行多列的表,將子查詢作為父查詢的表來巢狀查詢
  • 子查詢語句必須用()包裹且需要有別名
  • 計算出各部門性別為男性的員工人數
select dept_name,count(emp_id) from 
(select dept_name, emp_id,ename,gender from 
dept inner join emp_part
 where id=dept_id and gender='男')b group by dept_name;

帶IN關鍵詞的子查詢

  • 將子查詢作為where語句後的過濾條件,常用於子查詢結果是單列多行的情況
  • 子查詢語句必須用()包裹
  • in/not in
  • 查詢出北京地區所有的員工資訊
SELECT *
FROM emp_part
WHERE  dept_id IN (SELECT id FROM dept WHERE dept_location = '北京')


帶比較運算子的子查詢

  • 將子查詢的結果作為過濾條件,放在比較運算子的一端
  • 常用於子查詢結果為單個結果的情況
  • 子查詢語句必須用()包裹
#查詢出薪資大於公司平均薪資的員工id,姓名及薪資
SELECT emp_id,ename,salary FROM emp_part 
WHERE salary > (SELECT AVG(salary) FROM emp_part);

 

技巧:

先找出最終輸出是什麼,子查詢是什麼,梳理好邏輯;

from使用子查詢則from後面跟的是多行多列的表;

where使用子查詢則where後面跟的是單個結果;

in使用子查詢則in後面跟的是單列多行的表;

 

 

with as (Mysql 不支援該語法)

  • 如果一整句查詢語句中,某個子查詢的結果會被多個父查詢引用,通常建議將共用的子查詢用簡寫表示出來

  • 語法: with [表名] as (select…)

# 查詢出部門平均薪資大於公司平均薪資的部門名稱,部門主管,所在地及部門平均薪資

# 不使用 with ...as
select dept_id,dept_name,dept_manager,dept_location,avg_salary from dept inner join 
(select dept_id,avg(salary) avg_salary from emp_part group by dept_id)b on id=dept_id 
and avg_salary > (select avg(avg_salary) from 
(select dept_id,avg(salary) avg_salary from emp_part group by dept_id)b);

# 使用 with ...as
with dept_avg as
(select dept_id,avg(salary) avg_salary from emp_part group by dept_id)select
dept_id,dept_name,dept_manager,dept_location,avg_salary from dept inner join dept_avg 
on id=dept_id 
and avg_salary > (select avg(avg_salary) from dept_avg);