1. 程式人生 > >MySQL多表連線查詢

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;