07 mysql 多表查詢 連線查詢

2021-09-02 22:07:07 字數 3864 閱讀 3980

每個資料庫中可以存放多張表,真正的應用中經常需要從多個資料表中讀取資料

笛卡爾乘積

多表進行連線查詢時沒有任何條件,最終的結果是多表結果數量乘積的現象被稱為笛卡爾積

例如

select e.employeename,d.departmentname from department as d,employee as e;
注:在多表聯合查詢時,要記得加上連線條件 ,通常會給表取別名,通過別名來判斷字段屬於哪個表,有較強的可讀性。

sql92語法2023年制定的規則

select e.employeename ,d.departmentname from department as d,employee as e 

where e.departmentnumber=d.departmentnumber;

sql99 語法 建議使用2023年制定的規則

select e.employeename ,d.departmentname from department as d,employee as e

where e.departmentnumber=d.departmentnumber;

join關鍵字可以連線多個表,on關鍵字後面加上連線條件join按照功能大致分為如下三類:

內連線

inner join(內連線,或等值連線):獲取兩個表中字段匹配關係的記錄。

內連線查詢出的資料是兩張表的交集,inner可省略

如:

-- 查詢每個員工所在的部門名稱,顯示員工姓名和對應的部門名稱

select

e.employeename,

d.departmentname

from

department as d

join employee as e

on d.departmentnumber = e.departmentnumber;

-- 查詢每個員工所在的部門名稱,顯示員工姓名,工作和對應的部門名稱

select

e.employeename,

e.job,

d.departmentname

from

department as d

inner join employee e

on d.departmentnumber = e.departmentnumber;

-- 查詢每個員工所在的部門名稱,顯示用工姓名和對應的部門名稱:

select

e.employeename,d.departmentname

from

department as d

join employee as e

on d.departmentnumber=e.departmentnumber;

-- 找出員工所對應的工資等級,顯示員工姓名、工資、工資等級:

select

e.employeename,

e.salary,

s.grade

from

employee as e

join salarygrade s

on e.salary between s.lowsalary

and s.highsalary;

左外連線left outer join:獲取左表所有記錄,即使右表沒有對應匹配的記錄。

左外連線如上圖中a部分+c部分的內容,即包含左邊表的全部行(不管右邊的表中是否存在與它匹配的行),和右邊表中全部匹配的行  ,outer可省略

示例:

-- 找出每乙個員工對應的部門名稱,要求顯示所有員工,要求顯示所有的部門

select

e.employeename,

d.departmentname

from

department d

left outer join employee e

on e.departmentnumber = d.departmentnumber;

說明:部門表的內容有的跟員工表沒聯絡,為了顯示出部門表所有資訊,需要使用左連線 

右外連線

right outer join:與 left join相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄,

右外連線如上圖中b部分+c部分的內容,即包含右邊表的全部行(不管左邊的表中是否存在與它匹配的行),和左邊表中全部匹配的行。outer可省略

-- 找出每乙個員工對應的部門名稱,要求部門名稱全部顯示:

select

e.employeename,

d.departmentname`

from

employee e

right join department d

on e.departmentnumber = d.departmentnumber;

注:右外連線都可改寫成左外連線,左外連線都可改寫成右外連線

自連線

兩張一樣的表連線查詢叫自連線,自連線也可以左連線或者右連線

例如: 查詢員工的名稱和員工對應的領導名稱

select

e1.employeename,

e2.employeename as leader

from

employee e1

join employee e2

on e1.manager = e2.employeenumber;

上面的自連線查詢有問題,king的領導為null,上面的詢句查不出來,需要用到下面的左連線查詢 

-- 找出每乙個員工對應的領導名,要求顯示所有員工

select

e1.employeename ,e2.employeename ledaer

from

employee e1

left join employee e2

on e1.manager=e2.employeenumber;

示例:

-- 找出每乙個員工對應的部門名稱,以及該員工對應的工資等級,要求顯示員工姓名、部門名稱、員工工資,工資等級

select

e.employeename,

d.departmentname,

e.salary,

s.grade

from

employee e

join department d

on e.departmentnumber = d.departmentnumber

join salarygrade s

on e.salary between s.lowsalary

and s.highsalary;

說明:當多餘兩個表聯合查詢時,先將前兩個表查出的內容當作新錶,再和第三個表聯合查詢

MySQL 連線查詢(多表查詢)

mysql 連線查詢 多表查詢 連線就是指兩個或2個以上的表 資料來源 連線起來成為乙個資料來源 實際上,兩個表的完全的連線是這樣的乙個過程 左邊的表的每一行,跟右邊的表的每一行,兩兩互相 橫向對接 後所得到的所有資料行的結果。注意 連線之後,並非形成了乙個新的資料表,而只是一種 記憶體形態 fro...

mysql多表連線查詢

查詢姓名 部門名 地點 select emp.ename dept.dname,dept.loc from emp,dept where emp.deptno emp.deptno 簡化select ename dname,loc,emp.deptno from emp,dept where emp...

多表查詢(連線查詢)

多表查詢 資料 是多個表,這時注意一定要書寫連線條件。當n個表連線,至少需要n 1個連線條件。注意 1 如何判斷兩個表之間有公共列?型別一致 寬度一致。列名不能作為判斷標準,列名不同也能是公共列 如 emp的empno和emp的mgr 2 如何避免二義性問題?給每個屬性加歸屬。3 注意使用表別名。表...