SQL子查詢
阿新 • • 發佈:2022-04-17
-
定義:子查詢指一個查詢語句巢狀在另一個查詢語句內部,在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);