1. 程式人生 > >MySQL(九)DQL之子查詢

MySQL(九)DQL之子查詢

data- highest 僅支持 sel clas delet art insert between

一、含義

嵌套在其他語句內部的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之子查詢