Oracle基礎筆記四

第四章 多表查詢


1.笛卡爾集

笛卡爾集會在下面條件下產生:

省略連接條件

連接條件無效

所有表中的所有行互相連接


爲了避免笛卡爾集, 可以在 WHERE 加入有效的連接條件。


2.Oracle 連接

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

select table1.column,table2.column

from table1,table2

where table1.column = table2.column

在 WHERE 子句中寫入連接條件。

在表中有相同列時,在列名之前加上表名前綴


2.1等值連接:

多個連接條件與 AND 操作符 

區分重複的列名,使用表名前綴在多個表中區分相同的列,在不同表中具有相同列名的列可以用表的別名加以區分。


表的別名:

使用別名可以簡化查詢。

使用表名前綴可以提高執行效率。

SELECT e.employee_id, e.last_name, e.department_id,

       d.department_id, d.location_id

FROM   employees e , departments d

WHERE  e.department_id = d.department_id;


連接多個表:連接 n個表,至少需要 n-1個連接條件。 例如:連接三個表,至少需要兩個連接條件。


2.2非等值連接:

SELECT e.last_name, e.salary, j.grade_level

FROM   employees e, job_grades j

WHERE  e.salary 

       BETWEEN j.lowest_sal AND j.highest_sal;


3.內連接和外連接:

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

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


外連接語法:

使用外連接可以查詢不滿足連接條件的數據。

外連接的符號是 (+)。

SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column(+) = table2.column;//右外連接


SELECT table1.column, table2.column

FROM table1, table2

WHERE table1.column = table2.column(+);//左外連接


自連接:

題目:查詢employees表,返回“Xxx  works for Xxx”

SELECT worker.last_name || ' works for ' 

       || manager.last_name

FROM   employees worker, employees manager

WHERE  worker.manager_id = manager.employee_id ;


4.

叉集(瞭解):

使用CROSS JOIN 子句使連接的表產生叉集。

叉集和笛卡爾集是相同的。 

SELECT last_name, department_name

FROM   employees

CROSS JOIN departments ;


自然連接:

NATURAL JOIN 子句,會以兩個表中具有相同名字的列爲條件創建等值連接。

在表中查詢滿足等值條件的數據。

如果只是列名相同而數據類型不同,則會產生錯誤。

SELECT department_id, department_name,

       location_id, city

FROM   departments

NATURAL JOIN locations ;


使用 USING 子句創建連接:

在NATURAL JOIN 子句創建等值連接時,可以使用 USING 子句指定等值連接中需要用到的列。

使用 USING 可以在有多個列滿足條件時進行選擇。

不要給選中的列中加上表名前綴或別名。

JOIN 和 USING 子句經常同時使用。

SELECT e.employee_id, e.last_name, d.location_id

FROM   employees e JOIN departments d

USING (department_id) ;


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

自然連接中是以具有相同名字的列爲連接條件的。

可以使用 ON 子句指定額外的連接條件。

這個連接條件是與其它條件分開的。

ON 子句使語句具有更高的易讀性。

SELECT e.employee_id, e.last_name, e.department_id, 

       d.department_id, d.location_id

FROM   employees e JOIN departments d

ON     (e.department_id = d.department_id);


使用 ON 子句創建多表連接:

SELECT employee_id, city, department_name

FROM   employees e 

JOIN   departments d

ON     d.department_id = e.department_id 

JOIN   locations l

ON     d.location_id = l.location_id;


補充:


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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章