์กฐ์ธ (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
: ์ผ์ชฝ ํ
์ด๋ธ์ ๋จผ์ ์ฝ์ด๋๋ฆฐ ํ,
์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ํจ๊ป ์กฐํํ๋ ๊ฒ
์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋, ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ NULL ๋ก ์กฐํ๋๋ค.
โข
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
: ์ค๋ฅธ์ชฝ ํ
์ด๋ธ์ ๋จผ์ ์ฝ์ด๋๋ฆฐ ํ,
์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ์ผ์ชฝ ํ
์ด๋ธ์ ํจ๊ป ์กฐํํ๋ ๊ฒ
์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋, ์ผ์ชฝ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ NULL ๋ก ์กฐํ๋๋ค.
โข
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
: ์กฐ์ธ ์กฐ๊ฑด์ ์ผ์นํ๋ ์์ชฝ ํ
์ด๋ธ์ ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํ์ฌ ์กฐํํ๋ ๊ฒ
์กฐ๊ฑด์ ๋ง์กฑํ์ง ์๋, ์์ชฝ์ ๋ฐ์ดํฐ๋ NULL ๋ก ์กฐํ๋๋ค.
ํ
์ด๋ธ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
๋ณต์ฌ