MySQL(八)DQL之連接查詢
一、含義
又稱多表查詢,當查詢的字段來自於多個表時,就會用到連接查詢。
二、分類
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之連接查詢