MySQL多表連線查詢
多表查詢:當查詢結果來自多張資料表的時,就需要用到連線查詢。
多表連線查詢:會出現笛卡爾積的現象:a表有m行,b表有n行,查詢結果=m*n行,消除笛卡爾積現象就必須加上關聯條件,關聯條件的個數=n個表-1。
多表連線查詢按照能分類為:
1、內連線:
等值連線:表之間連線條件用 = 連線
非等值連線:表之間連線條件用非等號
自連線:相當於等值連線,只不過是自己連線自己,不像等值連線是兩個不同的表
語法格式:
select
查詢列表
from
表1 別名1,
表2 別名2,
......
where
關聯條件 and
篩選條件(針對表的所有記錄)
group by
分組欄位列表
having(只能配合group by使用)
與分組有關的篩選條件(針對分組後的每組內記錄)
order by
排序
後天的關鍵字查詢條件可根據需求進行選擇,
自連線 eg:
select
e.name,m.salary
from
employees e, employees m #把同一張表當成兩張不同表
where
e.manager_id = m.employee_id
order 不要
m.salary DESC;
2、外連線:
左外連線:查詢結果以左表為主表查詢所有記錄,從表無記錄資料時為null
右外連線:查詢結果以右表為主表查詢所有記錄,從表無記錄資料時為null
全外連線:Mysql不支援
交叉連線:就兩個記錄做笛卡爾積,不加關聯條件
語法格式:
select
查詢列表
from
表1 別名1
【連結型別】 join 表2 別名2
on 關聯條件
【連結型別】 join 表3 別名3
on 關聯條件
where
篩選條件(針對表的所有記錄)
group by
分組欄位列表
having(只能配合group by使用)
與分組有關的篩選條件(針對分組後的每組內記錄)
order by
排序
1)【連結型別】的關鍵字:
內連線:inner (還可以省略)
外連線:
左外連線 left 【outer】 (outer可以省略)
右外連線 right 【outer】
全外連線 full 【outer】(Mysql不支援)
交叉連線 cross 【outer】(不常用)
2)外連線知識點:
1、外連線的查詢結果為主表中有的所有記錄
外表有對應資料,結果記錄上顯示對應資料
外表中沒有對應的資料,結果記錄上填充null
2、外連結與連線的區別:
內連線:當從表沒有記錄的時候,主、從表的記錄都丟掉!
外連線:當從表沒有記錄的時候,會保留主表的記錄,對應從表null
3、左外連線:left join左邊的是主表,
右外連線:right join 右邊的是主表
4、左外連線和右外連線上是互通的,掌握一個就好啦!
內連線 eg:
select
e.name,j.job_title,d.department_name
from
employees e
inner join departments d
on e.department_id = d.department_id
inner join jobs j
on e.job_id=j.job_id
where e.salary >5000
order by d.department_name;
左連線 eg:
SELECT
d.department_id,d.department_name,e.employee_id
FROM
departments d
LEFT JOIN employees e
ON d.department_id = e.department_id
WHERE
e.employee_id IS NULL;