Oracle數據庫(五)—— 多表查詢


(一)笛卡爾問題

1、笛卡爾積會在下面條件下產生:

  • 省略連接條件
  • 連接條件無效
  • 所有表中的所有行互相連接

2.為了避免笛卡爾積,可以在WHERE加入有效的連接條件

 

 

(二)Oracle連接

1、內連接

合並具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行

(1)等值連接

使用連接在多個表中查詢數據

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column1 = table2.column2;

  • 在 WHERE 子句中寫入連接條件
  • 在表中有相同列時,在列名之前加上表名前綴

兩表連接:查詢出公司員工的 last_name, department_name

 

 三表連接:查詢出公司員工的 last_name, department_name, city

 

(2)非等值連接

查詢員工工資對應的檔次

 

2、外連接

兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱為左(或右) 外連接。沒有匹配的行時, 結果表中相應的列為空(NULL). 外連接的 WHERE 子句條件類似於內部連接, 但連接條件中沒有匹配行的表的列后面要加外連接運算符, 即用圓括號括起來的加號(+).

外連接語法

  • 使用外連接可以查詢不滿足連接條件的數據
  • 外連接的符號是(+)

左外連接

 

右外連接

 

(三)SQL:1999語法連接

使用連接從多個表中查詢數據:

SELECT table1.column, table2.column

FROM table1

[CROSS JOIN table2] |

[NATURAL JOIN table2] |

[JOIN table2 USING (column_name)] |

[JOIN table2 ON(table1.column_name = table2.column_name)] |

[LEFT|RIGHT|FULL OUTER JOIN table2

ON (table1.column_name = table2.column_name)];

1、叉集(了解)

  • 使用CROSS JOIN自居連接的表產生叉集
  • 叉集和笛卡爾集是相同的

 

2、NATURAL JOIN:自然連接

  • 會以兩個表中具有相同名字的列為條件創建等值連接。
  • 在表中查詢滿足等值條件的數據
  • 如果只是列名相同而數據類型不同,則會產生錯誤

 

返回的是,兩個表中具有相同名字的列的“且、交集”,而非“或,並集”。

即:比如employee類和department類都有department_id和manager_id,返回二者都相同的結果。

 

3、使用 USING 子句創建連接、

  • 在NATURAL JOIN 子句創建等值連接時,可以使用 USING 子句指定等值連接中需要用到的列
  • 使用 USING 可以在有多個列滿足條件時進行選擇
  • 不要給選中的列中加上表名前綴或別名
  • JOIN 和 USING 子句經常同時使用

 

4、使用ON 子句創建連接(常用)

  • 自然連接中是以具有相同名字的列為連接條件的。
  • 可以使用 ON 子句指定額外的連接條件。
  • 這個連接條件是與其它條件分開的。
  • ON 子句使語句具有更高的易讀性。

(1)內連接

(2)左外連接

(3)右外連接

(4)滿外連接

 5、自連接

查詢公司中員工‘Chen’的manager的信息

 

 (四)總結


SQL語句的多表查詢方式:

例如:按照department_id查詢employees(員工表)和departments(部門表)
的信息。
方式一(通用型):SELECT ... FROM ... WHERE
SELECT e.last_name,e.department_id,d.department_name
FROM employees e,departments d
where e.department_id = d.department_id

方式二:SELECT ... FROM ... NATURAL JOIN ...
有局限性:會自動連接兩個表中相同的列(可能有多個:department_id和manager_id)
SELECT last_name,department_id,department_name
FROM employees
NATURAL JOIN departments

方式三:SELECT ... JOIN ... USING ...
有局限性:好於方式二,但若多表的連接列列名不同,此法不合適
SELECT last_name,department_id,department_name
FROM employees
JOIN departments
USING(department_id)

方式四:SELECT ... FROM ... JOIN ... ON ...
常用方式,較方式一,更易實現外聯接(左、右、滿)
SELECT last_name,e.department_id,department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id


--內連接
  1)
  --等值連接
  --不等值連接
  2)
  --非自連接
  --自連接

--外連接
  --左外連接、右外連接、滿外連接

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM