1. 程式人生 > >MySQL(八)DQL之連接查詢

MySQL(八)DQL之連接查詢

列表 dde 效果 4.3 lock 卡爾 4.4 註意 str

一、含義

又稱多表查詢,當查詢的字段來自於多個表時,就會用到連接查詢。

二、分類

2.1、按年代分類:

sql92標準:僅僅支持內連接

sql99標準【推薦】:支持內連接+外連接(左外和右外)+交叉連接

2.2、按功能分類:

內連接:等值連接、非等值連接、自連接

外連接:左外連接、右外連接、全外連接

交叉連接

三、sql92標準

3.1、等值連接:

① 多表等值連接的結果為多表的交集部分

②n表連接,至少需要n-1個連接條件

③ 多表的順序沒有要求

④一般需要為表起別名

⑤可以搭配前面介紹的所有子句使用,比如排序、分組、篩選

(1)簡單查詢

案例:查詢員工名和對應的部門名

SELECT last_name,department_name FROM employees,departments WHERE employees.`department_id`=departments.`department_id`;

技術分享圖片

(2)為表起別名

①提高語句的簡潔度

②區分多個重名的字段

註意:如果為表起了別名,則查詢的字段就不能使用原來的表名去限定

案例:查詢員工名、工種號、工種名

SELECT e.last_name,e.job_id,j.job_title FROM employees e,jobs j WHERE e.`job_id`=j.`job_id`;

技術分享圖片

(3)兩個表的順序可以調換

(4)可以加篩選

案例:查詢有獎金的員工名、部門名

SELECT last_name,department_name,commission_pct FROM employees e,departments d WHERE e.`department_id`=d.`department_id` AND e.`commission_pct` IS NOT NULL;

技術分享圖片

(5)可以加分組

案例:查詢每個城市的部門個數

SELECT COUNT(*) 個數,city FROM departments d,locations l WHERE d.`location_id`=l.`location_id` GROUP BY city;

技術分享圖片

(6)可以加排序

案例:查詢每個工種的工種名和員工的個數,並且按員工個數降序

SELECT job_title,COUNT(*) FROM employees e,jobs j WHERE e.`job_id`=j.`job_id` GROUP BY job_title ORDER BY COUNT(*) DESC;

技術分享圖片

(7)可以實現三表連接

SELECT last_name,department_name,city FROM employees e,departments d,locations l WHERE e.`department_id`=d.`department_id` AND d.`location_id`=l.`location_id` ORDER BY department_name DESC;

技術分享圖片

3.2、非等值連接

SELECT salary,grade_level FROM employees e,job_grades g WHERE salary BETWEEN g.`lowest_sal` AND g.`highest_sal`;

技術分享圖片

3.3、自連接

案例:查詢員工名和上級的名稱

SELECT e.employee_id,e.last_name,m.employee_id,m.last_name FROM employees e,employees m WHERE e.`manager_id`=m.`employee_id`;

技術分享圖片

四、sql99語法

4.1、語法:

select 查詢列表 from 表1 別名 【連接類型】join 表2 別名 on 連接條件【where 篩選條件】【group by 分組】【having 篩選條件】【order by 排序列表】

4.2、分類:

內連接(★):inner

外連接

左外(★):left 【outer】

右外(★):right 【outer】

全外:full【outer】(mysql不支持)

交叉連接:cross

4.3、內連接

(1)語法:

select 查詢列表 from 表1 別名 inner join 表2 別名 on 連接條件;

(2)分類:

等值、非等值、自連接

(3)特點:

①添加排序、分組、篩選

②inner可以省略

③篩選條件放在where後面,連接條件放在on後面,提高分離性,便於閱讀

④inner join連接和sql92語法中的等值連接效果是一樣的,都是查詢多表的交集

(4)等值連接

案例1.查詢員工名、部門名

技術分享圖片

案例2.查詢名字中包含e的員工名和工種名(添加篩選)

技術分享圖片

案例3.”查詢員工名、部門名、工種名,並按部門名降序(添加三表連接)

技術分享圖片

(5)非等值連接

案例1、查詢員工的工資級別

技術分享圖片

(6)自連接

案例1、查詢員工的名字、上級的名字

技術分享圖片

4.4、外連接

(1)應用場景:用於查詢一個表中有,另一個表沒有的記錄

(2)特點:

1、外連接的查詢結果為主表中的所有記錄,如果從表中有和它匹配的,則顯示匹配的值,如果從表中沒有和它匹配的,則顯示null;外連接查詢結果=內連接結果+主表中有而從表沒有的記錄

2、左外連接,left join左邊的是主表;右外連接,right join右邊的是主表

3、左外和右外交換兩個表的順序,可以實現同樣的效果

4、全外連接=內連接的結果+表1中有但表2沒有的+表2中有但表1沒有的

(3)查詢哪個部門沒有員工

左外

SELECT d.*,e.employee_id FROM departments d LEFT OUTER JOIN employees e ON d.`department_id` = e.`department_id` WHERE e.`employee_id` IS NULL;

右外

SELECT d.*,e.employee_id FROM employees e RIGHT OUTER JOIN departments d ON d.`department_id` = e.`department_id` WHERE e.`employee_id` IS NULL;

4.5、交叉連接

語法:select 查詢列表 from 表1 別名 cross join 表2 別名;

特點:類似於笛卡爾乘積(表1有5條記錄,表2有6條記錄,結果就是30條記錄)

關註公眾號:Java後端生活,幹貨文章第一時間送達!

技術分享圖片

MySQL(八)DQL之連接查詢