Oracl多表查詢

第四章——多表查詢
一、笛卡爾集
注:笛卡爾集會省略連接條件,所有表中的所有行互相連接
例:查詢員工姓名和相對應的部門名稱
select last_name||first_name as 姓名,department_name
from employees ,departments
where employees.department_id = departments.department_id;
–當不寫where語句時,出現的結果是員工數*部門數,寫where語句,也可以說成 Oracle連接

二、表的連接
1.等值連接
注:連接條件使用“=”進行比較,其他的篩選條件和連接條件之間是“and”的關係
例:查詢employees表中,工資高於2000員工的姓名和部門名稱
select e.last_name||first_name,d.department_name as
from employees e ,departments d
where d.department_id = e.department_id and e.salary>2000;
– 只要在SQL中給表起了別名了,那麼在SQL語句的任何地方都不能再使用表名引用其 中的列,建議大家所有的列都要加上表名作爲前綴

2.不等值連接 注:連接條件不用“=”連接
例:查詢employees表中員工的工資以及工資等級
select e.last_name||first_name,e.salary,j.grade_level
from employees e,job_grades j
where e.salary between j.lowest_sal and j.highest_sal
–使用表名前綴在多個表中區分相同的列。
在不同表中具有相同列名的列可以用表的 別名加以區分。
使用別名可以簡化查詢.使用表名前綴可以提高執行效率

3.外連接
注:使用外連接可以查詢不滿足條件的數據,外連接符號是“(+)”寫在連接條件中, 且外連接符號“(+)”永遠是放在連接條件的缺乏表的一端,你要接觸哪個表的所以記 錄,另外一張表就是缺乏表
例:查詢各部門有哪些員 工工作,即使這個部門沒有員工 .(右外連接)
select d.department_name, e.last_name
from employees e, departments d
where e.department_id(+) = d.department_id;

例:查詢employees表員工姓名和部門名稱,即使這個員工沒有部門。(左外連接)
select d.department_name,e.last_name||first_name
from employees e,departments d
where e.department_id=d.department_id(+);

例:查詢emp表員工姓名和部門名稱,即使這個部門沒有員工,即使這個員工沒有部 門。(全外連接)
select d.department_name,e.last_name
from employees e
full outer join departments d on e.department_id=d.department_id;
注:上面這種寫法是SQL1999寫法

例:輸出沒有員工的部門名稱
select d.department_name
from employees e,departments d
where e.department_id(+)=d.department_id and e.last_name is null

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

四、自連接
注:查詢結果和查詢條件都需要從同一張表中查詢出來的這種問題,需要使用到自連接
例:查詢和King同部門的員工的信息,但是不包括King
select e1.* from employees e1, employees e2
where e1.department_id = e2.department_id and e2.last_name = ‘King’ and e1.last_name <> ‘King’;
–自連接的語法比較晦澀,在工作中很少用到。
–一般用子查詢來代替自連接。

五:SQL1999連接語法
1.交叉連接(t1 cross join t2)–就是生成兩個表的笛卡爾集
例:查詢員工姓名和相對應的部門名稱
select e. last_name, d.department_name from employees e cross join departments d;

2.自然連接(t1 natural join t2)
注:NATURAL JOIN 子句,會以兩個表中具有相同名字的列爲條件創建等值連接。
在表中查詢滿足等值條件的數據。 如果只是列名相同而數據類型不同,則會產生錯誤。 返回的是,兩個表中具有相同名字的列的“且、交集”,而非“或,並集”。即:比如 employee類和department類都有department_id和manager_id,返回二者都相同的結果。
例:自然連接,自動查找兩個表的公共字段(狹義的公共字段,列名和數據類型都相 同的那些列)作爲連接條件進行等值連接 select e.last_name,d.department_name from employees e natural join departments d;

3.等值連接(t1 join t2 using(列名))
注:在“NATURAL JOIN”子句創建等值連接時,可以使用“USING”子句指定等值連接中 需要用到的列。使用 USING 可以在有多個列滿足條件時進行選擇。 不要給選中的列中加上表名前綴或別名。 JOIN 和 USING 子句經常同時使用。
例:用戶指定的公共字段列進行等值連接
select e.last_name,d.department_name from employees e join departments d using(department_id);

4.連接條件(t1 join tt2 on (連接條件))
注:自然連接中是已具有相同名字的列爲連接條件的。
可以使用ON字句指定額外的連接條件。
這個連接條件是與其他條件分開的。
ON字句是語句具有更高的易讀性。
例:由用戶指定連接條件進行連接,通常解決兩個表沒有狹義的公共字段或兩個表需 要使用不等值連接的情況
select e.last_name,d.department_name 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;

5.外連接(t1 left/right/full outer join t2 on(連接條件))
注:在SQL:1999中,內連接值返回滿足裏阿杰條件的數據。
兩個表在連接過程中除了返回滿足連接條件的行以外,還返回左或右表中不滿足條件 的行,這種連接成爲左或右外連接。 兩個表在連接過程中除了返回滿足連接條件的行以外,還返回兩個表中不滿足條件的 行,這種連接成爲滿外連接。
例:查詢各部門右哪些員工工作,即使這個部門沒有員工
左外連接寫法:
select d.department_name,e.last_name
from departments d left outer join employees e on (d.department_id = e.department_id);

右外連接寫法:
select d.department_name,e.last_name
from employees e right outer join departments d on(d.department_id = e.department_id);

滿(全)外連接寫法:
例:查詢employees表員工姓名和部門名稱,即使這個部門沒有員工,即使這個員工沒 有部門。(全外連接)
select d.department_name,e.last_name
from employees e full outer join departments d on(d.department_id = e.department_id);

發佈了42 篇原創文章 · 獲贊 703 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章