回答
連接用於將兩個相關的表結合在一起。
在你的榜樣,你可以結合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 JOIN
。 INNER 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_first
和dependent_last
字段將爲空。
+1以獲得徹底的答案! – Diego 2011-05-03 20:17:56
是的,我意識到,就像我完成我的答案一樣,它基本上是一項家庭作業(我忽略了底部的問題,只關注第一部分加上鍊接的文檔)。我添加了「標記爲家庭作業」的句子,但後來看到有人打了我一拳,所以我刪除了該行。 :) – 2011-05-04 04:18:06
這不是作業。非常感謝答案,非常有幫助:)。 – 2011-05-04 09:10:48
當您需要全部來自其中一個連接表的結果時,您是否使用外部連接,而不管其他表中是否存在匹配的行。
在這裏充分說明:[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
例如(不使用你的例子表:-)
我有一個汽車租賃公司。
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 join
是AND
和left join
是OR
爲以下僞:
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:rental
和right:car
之間的left join
。在左側,所有的行都必須鏈接,而右側則不需要。這就是爲什麼它是一個left join
不錯:D感謝在'AND'和'OR'關係上的很好的解釋:D它讓我明白不同的那些。在此之前,我不明白爲什麼人們總是使用整個表時,爲什麼使用'LEFT JOIN':D. – hqt 2013-11-03 17:28:52
我認爲問題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'
一般: JOIN關節兩個表在一起。 當你想「查找」時使用INNER JOIN,例如查看任何特定列的詳細信息。 當您想要「演示」時使用OUTER JOIN,如列出2個表格的所有信息。
- 1. 左外連接 - SQL2005
- 2. Linq左外連接
- 3. 使用WHERE子句的左外連接
- 4. Oracle:使用構造的左外連接
- 5. 使用LINQ執行左外連接
- 6. 左連接與內部連接使用子串/左功能時
- 7. 我們如何區別左外連接和左連接
- 8. 左連接與全外連接組合
- 9. SQL左外連接與n:m連接表
- 10. 使用軌中連接表的模型進行左外連接
- 11. 連接三個表並使用左外連接
- 12. EF - WithOptional - 左外連接?
- 13. 左外連接錯誤
- 14. HANA左外連接語法
- 15. 與左外連接匹配
- 16. Linq左外部連接C#
- 17. 的Django 1.7左外連接
- 18. Mysql左外連接限制?
- 19. 在左外連接表
- 20. 左外連接錯誤
- 21. 左外連接問題
- 22. 左外連接在SQL Server
- 23. MySQL的左外連接
- 24. NHibernate的左外連接
- 25. OpenJPA左外連接條件
- 26. pyspark左外連接多列
- 27. Oracle SQL左外部連接
- 28. Oracle和左外部連接
- 29. 左外連接實體/ Linq
- 30. Subsonic3 LINQ左外連接
它的「如果有」...左外部連接與左連接(在mysql中)相同,並且您使用它們返回行,即使它們不一定與另一個表中的行匹配。 – Diego 2011-05-03 19:41:23
此外,您需要使用連接,因爲非常簡單,它就是數據庫查詢的工作方式。這就像問我們爲什麼需要用肺呼吸。連接是對關係數據庫進行查詢的機制。連接並不是一個複雜的概念,如果您遇到問題,我建議您在關係數據庫上進行額外的開始閱讀。如果你真的是科克大學的學生,那麼你應該可以訪問這個資源:http://proquest.safaribooksonline.com/?xmlId=1-56592-744-3&uiCode=CORK – 2011-05-03 19:55:46