關聯數據庫字典表的多表聯合查詢
inner join…on 自動連接
需要用到表的所有信息時,可以用以下兩種方法
1)??? left join…on… 左連接 (以左為準,右邊沒有NULL代替)
2)??? right join…on… 右連接(以右為準,左邊沒有NULL代替)
3)??? full join …on… 完全外連接?
insert into employee (id,position,xueli,emplyee_name) values(1,1,4,'楊忠宇');?
就是說這個員工? 是高中學歷? 職位是項目經理
?怎樣才能把他的個人信息查找出來的?
?select?? a.emplyee_name,b.item_value,c.item_value
from?? employee?? a?
join?? my_dictionary?? b?? on?? b.item_type = '職位'?? and?? a.position = b.id?
join?? my_dictionary?? c?? on?? c.item_type = '學歷'?? and?? a.xueli=c.id?
where a.id=1;
?
?
如果有的員工沒有學歷 那么就用 left
?
select?? a.emplyee_name,b.item_value,c.item_value
from?? employee?? a?
left outer join?? my_dictionary?? b?? on?? b.item_type = '職位'? and a.position=b.id
left outer join?? my_dictionary?? c?? on?? c.item_type = '學歷'?? and?? a.xueli=c.id
?
?
?
但是目前對 設計數據庫字典表 好處還不是很了解。節省空間嗎?
?
=================================================================
?
只需掌握 ?隱式內連接 ?左外連接 ? 右外連接 ?即可?
?
學習數據庫查詢的時候對多表連接查詢的有些概念還比較模糊。而連接查詢是在數據庫查詢操作的時候肯定要用到的。對于此概念?
我用通俗一些的語言和例子來進行講解。這個例子是我講課的時候經常采用的例子。?
首先我們做兩張表:員工信息表和部門信息表,在此,表的建立只為講述連接的概念,所以字段非常的簡單?
?
EmployeeTB(員工信息表):?
?
employeeid employeename ? ? ? deptid?
0001 ? ? ? ? ?張三 ? ? ? ? ? ? ? 01?
0002 ? ? ? ? ?李四 ? ? ? ? ? ? ? 01?
0003 ? ? ? ? ?王五 ? ? ? ? ? ? ? 02?
0004 ? ? ? ? ?趙六 ? ? ? ? ? ? ? 02?
0005 ? ? ? ? ?鄭七 ? ? ? ? ? ? ?NULL?
?
DeptTB(部門信息表)?
deptid ?deptname?
01 ? ? ?技術部?
02 ? ? ?市場部?
03 ? ? ?工程部?
?
我們現在需要進行連接查詢,連接兩張表檢索數據。分別檢索員工信息表的員工編號、員工姓名和部門信息表中的部門名稱。?
顯然,兩個表的連接條件是 員工表的部門編號=部門表的部門編號?
?
注意:鄭七不屬于任何部門(新來的員工,還沒有分配到任何的部門),而工程部不存在任何的員工(比如是一個新成立的部門,
還沒有員工)?
?
1、內( 自)連接查詢?
我們可以有兩種方式,這兩種是等效的?
一種是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e,DeptTB AS d WHERE e.deptid=d.deptid?
另外一個是:SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e INNER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
?
employeeid employeename deptname?
0001 ?張三 ?技術部?
0002 ?李四 ?技術部?
0003 ?王五 ?市場部?
0004 ?趙六 ?市場部?
?
而“鄭七”和“工程部”的信息是不會檢索出來。因為采用內連接計算的時候必須要保證連接的條件e.deptid=d.deptid匹配,結果才會被檢索出來。當我們連接兩張檢索數據的時候,檢索的方式是首先逐行掃描“員工信息表”中的記錄,然后根據連接條件來決定此記錄是否被檢索。比如對于張三,這條記錄的deptid是01(部門編號),它在部門表中能找到和它匹配的編號01,而編號01的部門名稱(deptname)是“技術部”所以張三這條記錄會被檢索,最終的結果肯定是:?
?
0001 ?張三 ?技術部?
?
同樣,李四、王五、趙六也能。但是鄭七的部門編號是NULL,它在部門信息表中找不到匹配的項(因為部門信息表中不存在部門編號為NULL的部門),所以鄭七不會被檢索。?
同理,沒有任何人員的部門編號為03,所以工程部的記錄也不會被檢索?
?
2、左外聯結?
但是有些情況下,我們需要知道所有員工的信息,即使他不屬于任何部門。這樣我們就可以采用外連接,在這里為左外連接,也就是連接中的左表的表中的記錄,無論能不能在右表中找到匹配的項,都要檢索,如果沒有匹配的項目,那么右表中的字段值為NULL(空),在這里就代表,此員工不屬于任何部門。?
檢索語句為:?
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e LEFT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
?
employeeid employeename deptname?
0001 ?張三 ?技術部?
0002 ?李四 ?技術部?
0003 ?王五 ?市場部?
0004 ?趙六 ?市場部?
0005 ?鄭七 ?NULL?
?
但是在這里,工程部同樣不會被檢索,因為,deptname是在連接的右邊的表中,“工程部”在左表中不存在任何的記錄,所以不會被檢索。這里關注的是“連接中的左邊的表”?
?
?
3、右外連接?
有時,我們需要知道,全部部門的信息,即使它沒有任何的員工。在我們的查詢中部門表在連接的右邊,如果我們想知道右邊表中的所有記錄信息,那么就可以采用右外連接,如果此記錄在左邊的表中找不到匹配項,則相應字段(employeeid,employeename)為NULL?
檢索語句為:?
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e RIGHT OUTER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
?
employeeid employeename deptname?
0001 ?張三 ?技術部?
0002 ?李四 ?技術部?
0003 ?王五 ?市場部?
0004 ?趙六 ?市場部?
NULL ?NULL ?工程部?
?
但在這里,鄭七是不會被檢索了,因為它在右表中找不到匹配項,這里關注的是“連接中的右邊的表”?
?
4、完全外連接?
如果我們想知道所有的記錄呢?無論員工有沒有部門,部門有沒有員工,我們都需要檢索。這里就可以使用完全外連接。關注連接中的兩部分。如果沒有部門,部門為空,沒有員工,員工信息為空。?
檢索語句為:?
SELECT e.employeeid,e.employeename,d.deptname FROM EmployeeTB AS e FULL OUTER JOIN DeptTB AS d ON e.deptid=d.deptid?
檢索的結果都是:?
?
employeeid employeename deptname?
0001 ?張三 ?技術部?
0002 ?李四 ?技術部?
0003 ?王五 ?市場部?
0004 ?趙六 ?市場部?
0005 ?鄭七 ?NULL?
NULL ?NULL ?工程部