程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle表連接——處理連接過程中另外一張表沒有相關數據不顯示問題,oracle相關數據

oracle表連接——處理連接過程中另外一張表沒有相關數據不顯示問題,oracle相關數據

編輯:Oracle教程

oracle表連接——處理連接過程中另外一張表沒有相關數據不顯示問題,oracle相關數據


  一個數據表基本上很難滿足我們的查詢要求,同時,將所有的數據都保存在一個表格中顯然也不是一種好的數據庫設計,為了避免數據的冗余,刪除、更新異常,我們通常需要建立一張外鍵表,通過表連接,來獲取我們自己想要得到的數據,所以在數據查找中,表連接是一個經常使用到的操作,下面我們來看看兩個或者幾個表有哪些方式是可以連接的。

  經常遇到的問題:我們或許在表連接的過程中用於連接的另外一張表數據為空,導致某些數據得不到。我們要怎麼解決呢?????

  我們就先從介紹表連接的方式開始,在介紹的過程中,就會得到解決。


 

假如我們有下面兩張數據表

請看 "Persons" 表:

Id_PLastNameFirstNameAddressCity 1 Adams John Oxford Street London 2 Bush George Fifth Avenue New York 3 Carter Thomas Changan Street Beijing

請注意,"Id_P" 列是 Persons 表中的的主鍵。這意味著沒有兩行能夠擁有相同的 Id_P。即使兩個人的姓名完全相同,Id_P 也可以區分他們。

接下來請看 "Orders" 表:

Id_OOrderNoId_P 1 77895 3 2 44678 3 3 22456 1 4 24562 1 5 34764 65

請注意,"Id_O" 列是 Orders 表中的的主鍵,同時,"Orders" 表中的 "Id_P" 列用於引用 "Persons" 表中的人,而無需使用他們的確切姓名。

請留意,"Id_P" 列把上面的兩個表聯系了起來。


方式1:根據兩個或多個表中的列之間的關系

  我們可以通過引用兩個表的方式,從兩個表中獲取數據:

  誰訂購了產品,並且他們訂購了什麼產品?

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons, Orders
WHERE Persons.Id_P = Orders.Id_P 

 

結果集:

LastNameFirstNameOrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678

 

  這個方式看起來很直觀,也是我們經常比較常用的,但沒辦法解決上面的問題,但是我們可以使用下面的join方式解決。


方式2:join

不同的 SQL JOIN

  除了我們在上面的例子中使用的 INNER JOIN(內連接),我們還可以使用其他幾種連接。

  下面列出了您可以使用的 JOIN 類型,以及它們之間的差異。

  • JOIN: 如果表中有至少一個匹配,則返回行
  • LEFT JOIN: 即使右表中沒有匹配,也從左表返回所有的行
  • RIGHT JOIN: 即使左表中沒有匹配,也從右表返回所有的行
  • FULL JOIN: 只要其中一個表中存在匹配,就返回行

 


 

1)、SQL INNER JOIN 關鍵字

  在表中存在至少一個匹配時,INNER JOIN 關鍵字返回行。

 

 

INNER JOIN 關鍵字語法

 

SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

 

  注釋:INNER JOIN 與 JOIN 是相同的。

內連接(INNER JOIN)實例

  現在,我們希望列出所有人的定購。

  您可以使用下面的 SELECT 語句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
INNER JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

結果集:

LastNameFirstNameOrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678

  INNER JOIN 關鍵字在表中存在至少一個匹配時返回行。如果 "Persons" 中的行在 "Orders" 中沒有匹配,就不會列出這些行。

 


 

2)、SQL LEFT JOIN 關鍵字

  LEFT JOIN 關鍵字會從左表 (table_name1) 那裡返回所有的行,即使在右表 (table_name2) 中沒有匹配的行。(可以解決上面的問題)

LEFT JOIN 關鍵字語法

SELECT column_name(s)
FROM table_name1
LEFT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

  注釋:在某些數據庫中, LEFT JOIN 稱為 LEFT OUTER JOIN。

左連接(LEFT JOIN)實例

  現在,我們希望列出所有的人,以及他們的定購 - 如果有的話。

  您可以使用下面的 SELECT 語句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
LEFT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

 

結果集:

LastNameFirstNameOrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 Bush George  

  LEFT JOIN 關鍵字會從左表 (Persons) 那裡返回所有的行即使在右表 (Orders) 中沒有匹配的行


 

3)、SQL RIGHT JOIN 關鍵字

  RIGHT JOIN 關鍵字會右表 (table_name2) 那裡返回所有的行,即使在左表 (table_name1) 中沒有匹配的行。

RIGHT JOIN 關鍵字語法

SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

 

  注釋:在某些數據庫中, RIGHT JOIN 稱為 RIGHT OUTER JOIN。

右連接(RIGHT JOIN)實例

  現在,我們希望列出所有的定單,以及定購它們的人 - 如果有的話。

  您可以使用下面的 SELECT 語句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
RIGHT JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

結果集:

LastNameFirstNameOrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678     34764

  RIGHT JOIN 關鍵字會從右表 (Orders) 那裡返回所有的行即使在左表 (Persons) 中沒有匹配的行


 

4)、SQL FULL JOIN 關鍵字

只要其中某個表存在匹配,FULL JOIN 關鍵字就會返回行。

FULL JOIN 關鍵字語法

SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2 
ON table_name1.column_name=table_name2.column_name

  注釋:在某些數據庫中, FULL JOIN 稱為 FULL OUTER JOIN。

全連接(FULL JOIN)實例

  現在,我們希望列出所有的人,以及他們的定單,以及所有的定單,以及定購它們的人。

  您可以使用下面的 SELECT 語句:

SELECT Persons.LastName, Persons.FirstName, Orders.OrderNo
FROM Persons
FULL JOIN Orders
ON Persons.Id_P=Orders.Id_P
ORDER BY Persons.LastName

 

結果集:

LastNameFirstNameOrderNo Adams John 22456 Adams John 24562 Carter Thomas 77895 Carter Thomas 44678 Bush George       34764

FULL JOIN 關鍵字會從左表 (Persons) 和右表 (Orders) 那裡返回所有的行。如果 "Persons" 中的行在表 "Orders" 中沒有匹配,或者如果 "Orders" 中的行在表 "Persons" 中沒有匹配,這些行同樣會列出

 

  致謝:感謝您的耐心閱讀!

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved