Oracle-查詢-多表連線查詢
阿新 • • 發佈:2018-12-23
- 左外連線是以join左邊作為主表,右連線以join右邊做為主表
- 外連線查詢出來的結果相當於兩個部分,一個部分是交集部分(相當於利用等值活非等值連線查詢出來的結果),另外一個部分是連線條件主表中有而從表中沒有的部分(這一部分顯示的連線條件為null,這一部分是等值活非等值連線不能滿足的)
sql92
等值連線
SELECT e.last_name,d.department_name,l.city FROM employees e,departments d,locations l WHERE e.department_id = d.department_id AND d.location_id = l.location_id
非等值連線
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 FOR UPDATE;
自連結
SELECT e.employee_id,e.last_name,m.employee_id,m.last_name
FROM employees e,employees m
WHERE e.manager_id = m.employee_id;
左連線
SELECT last_name,e.department_id,department_name FROM employees e,departments d WHERE e.department_id = d.department_id(+)
右外連線
SELECT last_name,e.department_id,department_name
FROM employees e,departments d
WHERE e.department_id(+) = d.department_id
sql99
內連線
與等值連線結果相同
SELECT e.last_name,d.department_name FROM employees e INNER JOIN departments d ON e.department_id = d.department_id -- SELECT e.last_name,d.department_name FROM employees e JOIN departments d ON e.department_id = d.department_id
SELECT e.last_name,d.department_name,l.city
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN locations l ON d.location_id = l.location_id
-- 等價於
SELECT e.last_name,d.department_name,l.city
FROM employees e,departments d,locations l
WHERE e.department_id = d.department_id AND d.location_id = l.location_id
左外連線
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
LEFT OUTER JOIN departments d ON e.department_id = d.department_id
LEFT OUTER JOIN job_grades j ON e.salary BETWEEN j.lowest_sal AND j.highest_sal
WHERE d.department_name LIKE '%S%';
右外連線
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
RIGHT OUTER JOIN departments d ON e.department_id = d.department_id;
全外連線
SELECT e.employee_id,e.last_name,d.department_name
FROM employees e
FULL OUTER JOIN departments d ON e.department_id = d.department_id;
練習
-- 查詢出 last_name 為 'Chen' 的 manager 的資訊. (員工的 manager_id 是某員工的 employee_id)
SELECT e.employee_id, e.email,m.last_name
FROM employees e,employees m
WHERE e.department_id = m.employee_id AND e.last_name = 'Chen';
-- 子查詢
SELECT m.employee_id,m.last_name
FROM employees m
WHERE m.employee_id = (
SELECT e.employee_id
FROM employees e
WHERE e.last_name = 'Chen'
);
-- 左外連線
select last_name, e.department_id, department_name
from employees e, departments d
where e.department_id = d.department_id(+)
-- 右外連線
select last_name, d.department_id, department_name
from employees e, departments d
where e.department_id(+) = d.department_id
-- 1. 顯示所有員工的姓名,部門號和部門名稱。
SELECT e.last_name,d.department_id,d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
--
SELECT e.last_name,department_id,d.department_name
FROM employees e
JOIN departments d USING(department_id);
-- 2. 查詢90號部門員工的job_id和90號部門的location_id
SELECT DISTINCT e.job_id,d.location_id
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
WHERE d.department_id = '90';
-- 3. 選擇所有有獎金的員工的 last_name , department_name , location_id , city
SELECT e.last_name,d.department_name,l.location_id,l.city
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
WHERE e.commission_pct IS NOT NULL;
-- 4. 選擇city在Toronto工作的員工的 last_name , job_id , department_id , department_name
SELECT e.last_name,e.job_id,d.department_id,d.department_name
FROM employees e
JOIN departments d
ON e.department_id = d.department_id
JOIN locations l
ON d.location_id = l.location_id
WHERE l.city = 'Toronto';