2011-05-03 117 views
24

我不明白左外連接,右外連接的概念,或者爲什麼我們需要使用連接!這個問題我掙扎,我從工作表是在這裏:Link何時使用左外連接?

問題3(B)

在SQL解決下面的查詢構造一個命令,解釋它爲什麼聘請 (外部)連接方法。 [5分] 「查找每個工作人員的名字和他/她的依賴配偶,如果有」

問題3(C) -

在SQL構造一個命令來解決以下查詢,使用(i)連接方法,和(ii)子查詢方法。 [10 Marks] 「查找工作超過20小時的工作人員在 計算機化項目上的身份名稱」

任何人都可以請簡單解釋一下嗎?

+1

它的「如果有」...左外部連接與左連接(在mysql中)相同,並且您使用它們返回行,即使它們不一定與另一個表中的行匹配。 – Diego 2011-05-03 19:41:23

+0

此外,您需要使用連接,因爲非常簡單,它就是數據庫查詢的工作方式。這就像問我們爲什麼需要用肺呼吸。連接是對關係數據庫進行查詢的機制。連接並不是一個複雜的概念,如果您遇到問題,我建議您在關係數據庫上進行額外的開始閱讀。如果你真的是科克大學的學生,那麼你應該可以訪問這個資源:http://proquest.safaribooksonline.com/?xmlId=1-56592-744-3&uiCode=CORK – 2011-05-03 19:55:46

回答

67

連接用於將兩個相關的表結合在一起。

在你的榜樣,你可以結合Employee表和Department表,就像這樣:

SELECT FNAME, LNAME, DNAME 
FROM 
EMPLOYEE INNER JOIN DEPARTMENT ON EMPLOYEE.DNO=DEPARTMENT.DNUMBER 

這將導致類似的記錄:

FNAME LNAME DNAME 
----- ----- ----- 
John Smith Research 
John Doe  Administration 

我用上面的INNER JOININNER JOIN小號組合兩個表,以便只顯示記錄與兩個表中的比賽,他們是在這種情況下加入,在部門號(場DNO的員工,DNUMBER在Department表)。

LEFT JOIN s允許您在第一個表中有記錄時組合兩個表,但可能不包含記錄在第二個表中。例如,假設你希望所有員工的名單,加上任何家屬:

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_last, DEPENDENT.LNAME as dependent_last 
FROM 
EMPLOYEE INNER JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN 

這裏的問題是,如果員工有依賴性,那麼他們的戰績將不會出現根本就是 - 因爲在DEPENDENT表中沒有匹配的記錄。

所以,你用離開加入這使所有數據上「左」(即第一個表),並在「正確」的任何匹配的提取數據(第二個表):

SELECT EMPLOYEE.FNAME as employee_first, EMPLOYEE.LNAME as employee_last, DEPENDENT.FNAME as dependent_first, DEPENDENT.LNAME as dependent_last 
FROM 
EMPLOYEE LEFT JOIN DEPENDENT ON EMPLOYEE.SSN=DEPENDENT.ESSN 

現在我們得到全部的員工記錄。如果給定員工沒有匹配的依賴關係,則dependent_firstdependent_last字段將爲空。

+3

+1以獲得徹底的答案! – Diego 2011-05-03 20:17:56

+0

是的,我意識到,就像我完成我的答案一樣,它基本上是一項家庭作業(我忽略了底部的問題,只關注第一部分加上鍊接的文檔)。我添加了「標記爲家庭作業」的句子,但後來看到有人打了我一拳,所以我刪除了該行。 :) – 2011-05-04 04:18:06

+0

這不是作業。非常感謝答案,非常有幫助:)。 – 2011-05-04 09:10:48

2

當您需要全部來自其中一個連接表的結果時,您是否使用外部連接,而不管其他表中是否存在匹配的行。

+4

在這裏充分說明:[http ://stackoverflow.com/questions/38549/sql-difference-between-inner-and-outer-join](http://stackoverflow.com/questions/38549/sql-difference-between-inner-and-outer-加入) – 2011-05-03 19:45:01

23

例如(不使用你的例子表:-)

我有一個汽車租賃公司。

Table car 
id: integer primary key autoincrement 
licence_plate: varchar 
purchase_date: date 

Table customer 
id: integer primary key autoincrement 
name: varchar 

Table rental 
id: integer primary key autoincrement 
car_id: integer 
bike_id: integer 
customer_id: integer 
rental_date: date 

簡單吧?我有10輛汽車的記錄,因爲我有10輛汽車。
我一直在經營這個行業10年,所以我有1000個客戶。
而且我每輛汽車租賃汽車約20x = 10年x 10輛汽車x 20 = 2000年租金。

如果我保存一切都在一個大桌我有10x1000x2000 = 20萬條記錄。
如果我將它存儲在3個表中,我有10 + 1000 + 2000 = 3010個記錄。
這是3個數量級,所以這就是爲什麼我使用3個表。

但因爲我用3個表格(以節省空間和時間)我必須使用連接以進行再次獲取數據
(至少如果我想的名字和車牌不是數字)

使用內部連接

客戶345所有出租?

SELECT * FROM customer 
INNER JOIN rental on (rental.customer_id = customer.id) 
INNER JOIN car on (car.id = rental.car_id) 
WHERE customer.id = 345. 

這是一個INNER JOIN,因爲我們只想了解汽車linked to租金實際發生linked to客戶。

請注意,我們也有一個bike_id,鏈接到自行車表,這是非常相似的車表,但不同的。 我們將如何得到所有自行車+汽車租賃客戶345
我們可以嘗試併爲此

SELECT * FROM customer 
INNER JOIN rental on (rental.customer_id = customer.id) 
INNER JOIN car on (car.id = rental.car_id) 
INNER JOIN bike on (bike.id = rental.bike_id) 
WHERE customer.id = 345. 

但是,這會給出一個空集!
這是因爲租賃可以是bike_rental或car_rental,但不能同時租用。
和非工作inner join查詢只會給結果,我們租出去既一輛自行車,在同一個事務汽車租賃所有。
我們正在試圖獲得並使用布爾AND加入布爾OR關係。

使用外連接

爲了解決這個問題,我們需要一個outer join

讓我們以這種方式left join

SELECT * FROM customer 
INNER JOIN rental on (rental.customer_id = customer.id) <<-- link always 
LEFT JOIN car on (car.id = rental.car_id) <<-- link half of the time 
LEFT JOIN bike on (bike.id = rental.bike_id) <<-- link (other) 0.5 of the time. 
WHERE customer.id = 345. 

看它解決它。一個inner joinANDleft joinOR爲以下僞:

if a=1 AND a=2 then {this is always false, no result} 
if a=1 OR a=2 then {this might be true or not} 

如果您創建表和運行,你可以看到結果的查詢。

關於術語

left join相同一個left outer join。 A join沒有額外的前綴是inner join 還有一個full outer join。在25年的編程中,我從來沒有使用過。

爲什麼LEFT JOIN

那麼有涉及到兩個表。在這個例子中,我們聯繫
客戶租賃與inner join,在內部聯接兩個表必須鏈接,以便存在left:customer表和right:rental表沒有區別。

下一個環節是left:rentalright:car之間的left join。在左側,所有的行都必須鏈接,而右側則不需要。這就是爲什麼它是一個left join

+0

不錯:D感謝在'AND'和'OR'關係上的很好的解釋:D它讓我明白不同的那些。在此之前,我不明白爲什麼人們總是使用整個表時,爲什麼使用'LEFT JOIN':D. – hqt 2013-11-03 17:28:52

0

我認爲問題3(b)令人困惑,因爲它的整個前提是錯誤的:您不必使用外部聯接來「解決查詢」例如考慮這個(按照試卷語法的風格可能是明智):

SELECT FNAME, LNAME, DEPENDENT_NAME 
    FROM EMPLOYEE, DEPENDENT 
WHERE SSN = ESSN 
     AND RELATIONSHIP = 'SPOUSE' 
UNION 
SELECT FNAME, LNAME, NULL 
    FROM EMPLOYEE 
EXCEPT 
SELECT FNAME, LNAME, DEPENDENT_NAME 
    FROM EMPLOYEE, DEPENDENT 
WHERE SSN = ESSN 
     AND RELATIONSHIP = 'SPOUSE' 
0

一般: JOIN關節兩個表在一起。 當你想「查找」時使用INNER JOIN,例如查看任何特定列的詳細信息。 當您想要「演示」時使用OUTER JOIN,如列出2個表格的所有信息。