Oracle 多表查詢總結
笛卡爾集現象:
笛卡爾集會在下面條件下產生:
– 省略連接條件
– 連接條件無效
– 所有表中的所有行互相連接
為了避免笛卡爾集, 可以在where加入有效的連接條件。
Oracle 連接:
使用連接在多個表中查詢數據。
- 在where子句中寫入連接條件。
- 在表中有相同列時,在列名之前加上表名前綴。
如下沒有連接條件,產生笛卡爾集現象。
select employees.employee_id,departments.department_id from employees,departments;
如下加了連接條件,沒有產生笛卡爾集現象。
select employees.employee_id,departments.department_id from employees,departments where employees.employee_id = departments.department_id;
等值連接:
主鍵:唯一,非空
外鍵
select employees.employee_id, employees.last_name, employees.department_id, departments.department_id, departments.location_id from employees, departments where employees.department_id = departments.department_id;
區分重復的列名:
- 使用表名前綴在多個表中區分相同的列。
- 在不同表中具有相同列名的列可以用表的別名加以區分。
表的別名:
- 使用別名可以簡化查詢。
- 使用表名前綴可以提高執行效率。
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個連接條件。 例如:連接三個表,至少需要兩個連接條件。
非等值連接:
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;
外連接:
(1)使用外連接可以查詢不滿足連接條件的數據。
(2)外連接的符號是 (+)。
select e.last_name, e.department_id, d.department_name from employees e, departments d where e.department_id(+) = d.department_id;
右外連接:
select employees.employee_id, departments.department_id from employees, departments where employees.employee_id(+)=departments.department_id;
左外連接:
select employees.employee_id, departments.department_id from employees, departments where employees.employee_id=departments.department_id(+) ;
內連接和外連接(1):
(1)內連接: 合并具有同一列的兩個以上的表的行, 結果集中不包含一個表與另一個表不匹配的行
(2)外連接: 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行 ,這種連接稱為左(或右) 外連接。沒有匹配的行時, 結果表中相應的列為空(NULL). 外連接的where子句條件類似于內部連接, 但連接條件中沒有匹配行的表的列后面要加外連接運算符, 即用圓括號括起來的加號(+).
select worker.last_name || ' works for ' || manager.last_name from employees worker, employees manager where worker.manager_id = manager.employee_id;
叉集:
(1)使用CROSS JOIN 子句使連接的表產生叉集。
(2)叉集和笛卡爾集是相同的。
select last_name, department_name from employees cross join departments ;
自然連接:
- natural join 子句,會以兩個表中具有相同名字的列為條件創建等值連接。
- 在表中查詢滿足等值條件的數據。
- 如果只是列名相同而數據類型不同,則會產生錯誤。
注意:返回的是,兩個表中具有相同名字的列的“且,交集”,而非“或,并集”。即:比如employees類和departments類都有department_id和manager_id,返回二者都相同的結果。
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;
內連接和外連接(2):
? 在SQL里面: 在1999中,內連接只返回滿足連接條件的數據。
? 兩個表在連接過程中除了返回滿足連接條件的行以外還返回左(或右)表中不滿足條件的行,這種連接稱為左(或右) 外連接。
? 兩個表在連接過程中除了返回滿足連接條件的行以外還返回兩個表中不滿足條件的行 ,這種連接稱為‘滿外連接’。
—sql 1999語法
左外連接:
select e.last_name, e.department_id, d.department_name from employees e left join departments d on (e.department_id = d.department_id) ;
右外連接:
select e.last_name, e.department_id, d.department_name from employees e right join departments d on (e.department_id = d.department_id) ;
滿外連接:
select e.last_name, e.department_id, d.department_name from employees e full join departments d on (e.department_id = d.department_id);
Oracle 的多表查詢就到這里,使用等值和不等值連接在SELECT 語句中查詢多個表中的數據,使用自連接,使用外連接查詢不滿足連接條件的數據。