MySQL(九)DQL之子查詢
一、含義
嵌套在其他語句內部的select語句稱為子查詢或內查詢,外面的語句可以是insert、update、delete、select等,一般select作為外面語句較多,外面如果為select語句,則此語句稱為外查詢或主查詢。
二、分類
2.1、按出現位置
select後面:僅僅支持標量子查詢
from後面: 表子查詢
where或having後面: 標量子查詢、列子查詢、行子查詢
exists後面:標量子查詢、列子查詢、行子查詢、表子查詢
2.2、按結果集的行列
標量子查詢(單行子查詢):結果集為一行一列
列子查詢(多行子查詢):結果集為多行一列
行子查詢:結果集為多行多列
表子查詢:結果集為多行多列
三、示例
3.1、where或having後面
案例1:誰的工資比 Abel 高
SELECT * FROM employees WHERE salary>(SELECT salary FROM employees WHERE last_name = ‘Abel‘);
案例2:查詢最低工資大於50號部門最低工資的部門id和其最低工資
SELECT MIN(salary),department_id FROM employees GROUP BY department_id HAVING MIN(salary)>( SELECT MIN(salary) FROM employees WHERE department_id = 50 );
3.2、select後面
案例:查詢每個部門的員工個數
SELECT d.*,( SELECT COUNT(*) FROM employees e WHERE e.department_id = d.`department_id` ) 個數 FROM departments d;
3.3、from後面
將子查詢結果充當一張表,要求必須起別名
案例:查詢每個部門的平均工資的工資等級
SELECT ag_dep.*,g.`grade_level` FROM ( SELECT AVG(salary) ag,department_id FROM employees GROUP BY department_id ) ag_dep INNER JOIN job_grades g ON ag_dep.ag BETWEEN lowest_sal AND highest_sal;
3.4、exists後面
語法:exists(完整的查詢語句)
結果:1或0
案例1:查詢有員工的部門名
SELECT department_name FROM departments d WHERE EXISTS( SELECT * FROM employees e WHERE d.`department_id`=e.`department_id`);
相當於
SELECT department_name FROM departments d WHERE d.`department_id` IN( SELECT department_id FROM employees )
關註公眾號:Java後端生活,幹貨文章第一時間送達!
MySQL(九)DQL之子查詢