์กฐ์ธ (JOIN)
์ฌ๋ฌ ํ
์ด๋ธ์ ์กฐํฉํ์ฌ ์กฐํํ๋ ๋ฐฉ์
ํ ์ด๋ธ์ ๋ณ์นญ
: ํ
์ด๋ธ์ ๋ํ ๋ณ์นญ์ ํ
์ด๋ธ๋ช
๋ค์ ํ ์นธ์ ๋์ฐ๊ณ ์ง์ ํ๋ค.
SELECT *
FROM ํ
์ด๋ธ๋ช
1 ๋ณ์นญ1, ํ
์ด๋ธ๋ช
2 ๋ณ์นญ2, ... ;
SQL
๋ณต์ฌ
โข
๊ธด ์ด๋ฆ์ ํ
์ด๋ธ๋ช
์ ์งง์ ์ด๋ฆ์ ๋ณ์นญ์ผ๋ก ์ง์ ํ์ฌ
์ฝ๋๋ฅผ ๊ฐ๋
์ฑ์ด ๋๊ฒ ์์ฑํด์ฃผ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
โข
ex)
SELECT *
FROM employee emp, department dept;
SQL
๋ณต์ฌ
์กฐ์ธ ์ข ๋ฅ
๋ด๋ถ์กฐ์ธ
โข
๋๋ฑ ์กฐ์ธ
โข
์ธ๋ฏธ ์กฐ์ธ
โข
์ํฐ ์กฐ์ธ
โข
์
ํ ์กฐ์ธ
์ธ๋ถ์กฐ์ธ
โข
(+)
โข
ANSI ์กฐ์ธ
โฆ
LEFT OUTER JOIN
โฆ
RIGTH OUTER JOIN
โฆ
FULL OUTER JOIN
โฆ
CROSS JOIN (์นดํ์์ ์กฐ์ธ)
๋ด๋ถ์กฐ์ธ (INNER JOIN)
โข
๋๋ฑ ์กฐ์ธ
โข
์ธ๋ฏธ ์กฐ์ธ
โข
์ํฐ ์กฐ์ธ
โข
์
ํ ์กฐ์ธ
๋๋ฑ์กฐ์ธ (EQUI JOIN)
: ๋ฑํธ(=) ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ, 2๊ฐ ์ด์์ ํ
์ด๋ธ์ ์ฐ๊ฒฐ์ง์ด ์ถ๋ ฅํ๋ ๋ฐฉ์
SELECT *
FROM A, B
WHERE A.x = B.y;
SQL
๋ณต์ฌ
โข
INNER JOIN
: ์ผ์ชฝ ํ
์ด๋ธ๊ณผ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ์กฐ์ธ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ต์งํฉ์ด ๋๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ์
SELECT *
FROM A INNER JOIN B
ON (A.x = B.y);
SQL
๋ณต์ฌ
์ธ๋ฏธ ์กฐ์ธ (SEMI JOIN)
: ์๋ธ ์ฟผ๋ฆฌ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ง ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ถ์ถํ์ฌ ์ถ๋ ฅํ๋ ๋ฐฉ์
โข
IN ๋๋ EXISTS ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์กฐ์ธ
์ํฐ ์กฐ์ธ (ANTI JOIN)
: ์๋ธ ์ฟผ๋ฆฌ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ง ์ ์ธํ๊ณ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ์ถ์ถํ์ฌ ์ถ๋ ฅํ๋ ๋ฐฉ์
์ ํ ์กฐ์ธ (SELF JOIN)
: ๋์ผํ ํ๋์ ํ
์ด๋ธ์ 2๋ฒ ์ด์ ์กฐํฉํ์ฌ ์ถ๋ ฅํ๋ ๋ฐฉ์
์ธ๋ถ์กฐ์ธ (OUTER JOIN)
LEFT OUTER JOIN
์ผ์ชฝ ํ
์ด๋ธ์ ๋จผ์ ์ฝ์ด๋๋ฆฐ ํ,
์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ํจ๊ป ์กฐํํ๋ ๊ฒ
โข
ANSI
ํ
์ด๋ธ1 A LEFT [OUTER] JOIN ํ
์ด๋ธ2 B ON ์กฐ์ธ์กฐ๊ฑด;
ํ
์ด๋ธ1 A LEFT [OUTER] JOIN ํ
์ด๋ธ2 B USING(๊ณตํต์ปฌ๋ผ);
SQL
๋ณต์ฌ
โข
(+)
FROM ํ
์ด๋ธ1 A, ํ
์ด๋ธ2 B
WHERE A.๊ณตํต์ปฌ๋ผ = B.๊ณตํต์ปฌ๋ผ(+)
SQL
๋ณต์ฌ
RIGHT OUTER JOIN
์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋จผ์ ์ฝ์ด๋๋ฆฐ ํ,
์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ์ผ์ชฝ ํ
์ด๋ธ์ ํจ๊ป ์กฐํํ๋ ๊ฒ
โข
ANSI
ํ
์ด๋ธ1 A RIGHT [OUTER] JOIN ํ
์ด๋ธ2 B ON ์กฐ์ธ์กฐ๊ฑด;
ํ
์ด๋ธ1 A RIGHT [OUTER] JOIN ํ
์ด๋ธ2 B USING(๊ณตํต์ปฌ๋ผ);
SQL
๋ณต์ฌ
โข
(+)
FROM ํ
์ด๋ธ1 A, ํ
์ด๋ธ2 B
WHERE A.๊ณตํต์ปฌ๋ผ(+) = B.๊ณตํต์ปฌ๋ผ
SQL
๋ณต์ฌ
FULL OUTER JOIN
์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ์์ชฝ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํ์ฌ ์กฐํํ๋ ๊ฒ
ํ
์ด๋ธ1 A FULL [OUTER] JOIN ํ
์ด๋ธ2 B ON ์กฐ์ธ์กฐ๊ฑด;
SQL
๋ณต์ฌ
์นดํ์์ ์กฐ์ธ (Catesian; CATASIAN PRODUCT) : CROSS ์กฐ์ธ
: WHERE ์ ์ ์กฐ์ธ ์กฐ๊ฑด์ด ์๋ ์กฐ์ธ
โข
A ํ
์ด๋ธ์ ๋ฐ์ดํฐ ๊ฑด์ : X
โข
B ํ
์ด๋ธ์ ๋ฐ์ดํฐ ๊ฑด์ : Y
โข
๊ฒฐ๊ณผ ๊ฑด์ : X * Y (๋ ํ
์ด๋ธ์ ๊ณฑ)
SELECT *
FROM employees e
,departments d;
SQL
๋ณต์ฌ
โข
ANSI
SELECT *
FROM employees e
CROSS JOIN departments d;
SQL
๋ณต์ฌ
HR, ํ๊ธHR ์คํค๋ง ์ค์ต ์ฝ๋
๋ด๋ถ์กฐ์ธ
โข
๋๋ฑ์กฐ์ธ
SELECT e.employee_id
,e.first_name
,d.department_id
,d.department_name
FROM employees e
,departments d
WHERE e.department_id = d.department_id;
SQL
๋ณต์ฌ
โข
์ธ๋ฏธ์กฐ์ธ
EXISTS ์ฌ์ฉ
SELECT department_id, department_name
FROM departments d
WHERE EXISTS(SELECT *
FROM employees e
WHERE e.department_id = d.department_id
AND e.salary > 3000 )
ORDER BY d.department_name;
SQL
๋ณต์ฌ
IN ์ฌ์ฉ
SELECT department_id, department_name
FROM departments d
WHERE d.department_id IN ( SELECT e.department_id
FROM employees e
WHERE e.salary > 3000 )
ORDER BY d.department_name
SQL
๋ณต์ฌ
โข
์ํฐ์กฐ์ธ
NOT EXISTS ์ฌ์ฉ
SELECT department_id, department_name
FROM departments d
WHERE NOT EXISTS(SELECT *
FROM employees e
WHERE e.department_id = d.department_id
AND e.salary > 3000 )
ORDER BY d.department_name;
SQL
๋ณต์ฌ
NOT IN์ฌ์ฉ
SELECT e.employee_id
,e.first_name
,d.department_id
,d.department_name
FROM employees e
,departments d
WHERE e.department_id = d.department_id
AND e.department_id NOT IN (
SELECT department_id
FROM departments
WHERE manager_id IS NULL
)
;
SQL
๋ณต์ฌ
โข
์
ํ์กฐ์ธ
โฆ
โ์ฌ์๊ณผ ๊ด๋ฆฌ์โ ๋ฅผ ํจ๊ป ์กฐํํ์์ค.
SELECT a.employee_id ์ฌ์๋ฒํธ
,a.first_name ์ฌ์๋ช
,b.employee_id ๊ด๋ฆฌ์๋ฒํธ
,b.first_name ๊ด๋ฆฌ์๋ช
,a.department_id ๋ถ์๋ฒํธ
FROM employees a,
employees b
WHERE a.manager_id = b.employee_id
AND a.department_id = b.department_id
;
SQL
๋ณต์ฌ
์ธ๋ถ์กฐ์ธ
โข
LEFT OUTER JOIN
(+)
: ์กฐ์ธ ์กฐ๊ฑด์์ ๋ฐ์ดํฐ๊ฐ ์๋(NULL) ํ
์ด๋ธ์ ์ปฌ๋ผ์ ๊ธฐํธ๋ฅผ ๋ถ์ฌ์ค๋ค.
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e
,department d
WHERE e.dept_code = d.dept_id(+)
;
SQL
๋ณต์ฌ
ANSI
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e LEFT OUTER JOIN department d -- OUTER ์๋ต๊ฐ๋ฅ
ON e.dept_code = d.dept_id
;
SQL
๋ณต์ฌ
โข
RIGHT OUTER JOIN
(+)
: ์กฐ์ธ ์กฐ๊ฑด์์ ๋ฐ์ดํฐ๊ฐ ์๋(NULL) ํ
์ด๋ธ์ ์ปฌ๋ผ์ ๊ธฐํธ๋ฅผ ๋ถ์ฌ์ค๋ค.
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e
,department d
WHERE e.dept_code(+) = d.dept_id
;
SQL
๋ณต์ฌ
ANSI
SELECT e.emp_id
,e.emp_name
,d.dept_id
,d.dept_title
FROM employee e RIGHT OUTER JOIN department d -- OUTER ์๋ต๊ฐ๋ฅ
ON e.dept_code = d.dept_id
;
SQL
๋ณต์ฌ
์ธ๋ถ์กฐ์ธ ์ ์์ฌํญ
: ๋ ํ
์ด๋ธ์ ์กฐ์ธ ์กฐ๊ฑด์ด ๋๋ ๊ณตํต ์ปฌ๋ผ์ ๋ชจ๋ (+) ๊ธฐํธ๋ฅผ ๋ถ์ฌ์ผํ๋ค.
โข
ex) ๊ณตํต์ปฌ๋ผ : employee_id, department_id
SELECT e.employee_id
,e.first_name
,j.job_id
,j.department_id
FROM employees e
,job_history j
WHERE e.employee_id = j.employee_id(+)
AND e.department_id = j.department_id(+)
;
SQL
๋ณต์ฌ
โข
FULL OUTER JOIN
(+) ๊ธฐํธ๋ก ๊ตฌํ ๋ถ๊ฐ
SELECT *
FROM employee e
,department d
WHERE e.dept_code(+) = d.dept_id(+); -- (+) ๊ธฐํธ๋ก๋ FULL JOIN ๋ถ๊ฐ
SQL
๋ณต์ฌ
ANSI
SELECT e.emp_name
,d.dept_title
FROM employee e
FULL OUTER JOIN department d
ON dept_code = d.dept_id;
SQL
๋ณต์ฌ






