1. 程式人生 > >Oracle-查詢-多表連線查詢

Oracle-查詢-多表連線查詢

  • 左外連線是以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';