[JOIN ๊ฐ๋ ]
์ฌ์ฉ์๊ฐ ์ปฌ๋ผ์ ์กฐํํ ๋ ํ ์ด๋ธ ์์ ์ปฌ๋ผ๋ง ๊ฐ์ ธ์ค๋๊ฒ ์๋, ํ ์ด๋ธ์์ ์ปฌ๋ผ ์ ์ฒด๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
๋นํจ์จ์ ์ด๋ค.. ์ด ๋ฐฉ๋ฒ์ ๋ง๊ธฐ ์ํด ์ ๊ทํ๊ฐ ๋ํ๋ฌ๊ณ ( ํ๋๋ฅผ ๋ ์์ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ธฐ์ )
์ฐ๋ฆฌ๋ ํ ์ด๋ธ์ ์ ๊ทํํด์ ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ๋ก ๋๋๊ฒ ๋๋ค.
์ด๋ ์ฐ๋ฆฐ ๋๋ ์ง ํ ์ด๋ธ์ ์กฐํฉํด์ ๊ฐ์ ธ์์ผ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ JOIN ์ด๋ผ๋ ๊ธฐ์ ์ด ์๊ฒจ๋ฌ๋ค!
[ ORACLE JOIN / ANSI JOIN ]
oracle ์ฉ join ๋ฌธ๋ฒ์ด ์๊ณ , ๊ณตํต ํ์ค ANSI join ๋ฌธ๋ฒ์ด ์๋ค.
// Oracle JOIN
SELECT a.col1, b.col1
FROM table1 a, table2 b
WHERE a.col2 = b.col2;
// ANSI JOIN
SELECT a.col1, b.col1
FROM table a [INNER] JOIN table2 b
ON a.col2 = b.col2;
[์ ํ ํ ์ด๋ธ, ํํ ํ ์ด๋ธ]
๋ ์ค ํ๋ ํ ์ด๋ธ์ ๋จผ์ ์ฝ๊ณ JOIN ์ ์ ํ์ธํ์ฌ ๋๋จธ์ง ํ ์ด๋ธ์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ๋ค.
๋จผ์ ์ฝ๋ ํ ์ด๋ธ์ด ์ ํ ํ ์ด๋ธ์ด๋ค.
์ ํํ ์ด๋ธ์ ์กฐํํ ๋ฐ์ดํฐ๊ฐ ์์ ํ ์ด๋ธ๋ก ์ ํํด์ผ ์๋๋ฉด์์ ์ข๋ค.
[Cartesian Product ์นดํฐ์
๊ณฑ]
JOIN ์์ ์ค์ํ ๋ถ๋ถ : ์กฐ์ธ ์กฐ๊ฑด์ ์ง์ ํด์ฃผ๋ ๋ถ๋ถ !
1) ์กฐ์ธ ์กฐ๊ฑด ์๋ชป ์ค, 2) ์กฐ์ธ ์กฐ๊ฑด์ ์ ์ง ์์
=> ๋ฐ์ดํฐ ์ ๋ถ ๊ฐ์ ธ์ค๋ ํ์์ด ์๊น
์ด ๊ฒฝ์ฐ๋ฅผ ์นดํฐ์ ๊ณฑ์ด๋ผ๊ณ ํ๋ค. ( (ANSI) CROSS JOIN ์ด๋ผ๊ณ ๋ ๋ถ๋ฆ)
* ์๋์ ์ผ๋ก ์นดํฐ์ ๊ณฑ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
1) ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํด์ ์๋ณธ ํ ์ด๋ธ์ ๋ฐ๋ณต ์ฝ๊ธฐ ํผํ๊ธฐ
-> ์ฟผ๋ฆฌ ์ฑ๋ฅ ํ ์คํธ๋ฅผ ์ํ ํ ์คํธ์ฉ ํ ์ด๋ธ ๋ง๋๋ ๊ฒฝ์ฐ (ํ๋ฒ์ ๋๋๋ฉ๋ชจ๋ฆฌ์ ํ ์ด๋ธ ๋ง๋ค ์ ์์)
2) ์ค์๋ก ์กฐ์ธ ์กฐ๊ฑด ์ปฌ๋ผ ์ค ์ผ๋ถ๋ก ๋น ๋จ๋ฆฌ๋ ๊ฒฝ์ฐ
-> ํ๋ฒ์ ๋ง์ ์์ ๋ฐ์ดํฐ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ถ์ถ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ๋ค์ด๋๋ ๊ฒฝ์ฐ
[INNER JOIN ์ด๋ ์กฐ์ธ]
๋ชจ๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅ
[EQUL Join ๋ฑ๊ฐ์กฐ์ธ]
์๋ก ๊ฐ์ ์กฐ๊ฑด์ ๋ฐ์ดํฐ
ORACLE JOIN
SELECT e.empno , e.ename, d.dname
FROM emp e, dept d
WHERE e.deptno = d.deptno;
ANSI JOIN
SELECT e.empno , e.ename, d.dname
FROM emp e JOIN dept d
ON e.deptno = d.deptno;
์ ํ ํ ์ด๋ธ์์ ์กฐ๊ฑด์ ๊ฐ์ ธ์จ ํ ์กฐ์ธ ์กฐ๊ฑด์ ์ ๊ฒ์ฌํด์
๋์ผํ ์กฐ๊ฑด์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ
ํํ ํ ์ด๋ธ์์ ๊บผ๋ด์ค๋ ๋ฐฉ๋ฒ
(ANSI) ์กฐ์ธ์ด ๋์ด๋ ๊ฒฝ์ฐ JOIN ~ ON ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.
*์กฐ์ธ ์์ select ์ปฌ๋ผ ๋์ ํ ์ด๋ธ์ด๋ฆ์ ์ ์ง ์์๋ ์คํ๋์ง๋ง
์์ชฝ ํ ์ด๋ธ์ ๋ชจ๋ ์๋ ์ปฌ๋ผ์ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ์๊ธฐ๋ฏ๋ก
[ ํ ์ด๋ธ๋ช .์ปฌ๋ผ ] ์ผ๋ก ์ฌ์ฉํ๋ ์ต๊ด์ ๊ธฐ๋ฅด์.
*๊ฒ์์กฐ๊ฑด, ์กฐ์ธ ์กฐ๊ฑด ์์ ์ ๊ฒ์ ์กฐ๊ฑด ํ ์กฐ์ธ์ด ์ผ์ด๋๊ธฐ ๋๋ฌธ์
๊ฒ์ ์กฐ๊ฑด์ ์ ์ฌ์ฉํ๋ฉด ์กฐ์ธ ์์ ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
[Non-Equi Join ๋น๋ฑ๊ฐ์กฐ์ธ]
ํฌ๊ฑฐ๋ ์๊ฑฐ๋ ํ๋ ๊ฒฝ์ฐ์ ์กฐ๊ฑด์ ์กฐํํด์ผํ ๊ฒฝ์ฐ
ORACLE JOIN
SELECT c.game, TO_CHAR(c.point,'99.999'), g.name
FROM customer c , gift g
WHERE c.point BETWEEN g.g_start AND g.g_end;
ANSI JOIN
SELECT c.game, TO_CHAR(c.point,'99.999'), g.name
FROM customer c JOIN gift g
ON c.point BETWEEN g.g_start AND g.g_end;
-- BETWEEN ๋ณด๋ค ๋น๊ต์ฐ์ฐ์๊ฐ ๋ ์ฑ๋ฅ์ ์ข๋ค.
[OUTER Join ์์ฐํฐ์กฐ์ธ]
ํ์ชฝ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ชฝ ํ ์ด๋ธ ๋ด์ฉ์ ์ ๋ถ ์ถ๋ ฅํ๋ค.
-> DB ์ฑ๋ฅ์ ๋์ ์ํฅ์ ์ค ์ ์์ ( FULL SCAN )
?) ์ด๋ ์ชฝ์ด ์ฃผ ํ ์ด๋ธ์ด ๋๋๊ฐ
? ) ์ฐธ์กฐ ์์์ ๋ฐ๋ผ LEFT, RIGHT / ์ฃผ ํ ์ด๋ธ ๋ณ๊ฒฝ
// Oracle JOIN
SELECT s.name, p.name
FROM student s, professor p
WHERE s.profno = p.profno(+);
-- ๋ฐ์ดํฐ๊ฐ ์๋ ์ชฝ์ (+) ํ์
// ANSI JOIN
SELECT s.name, p.name
FROM student s LEFT OUTER JOIN professor p
ON s.profno = p.profno;
-- ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ์ชฝ์ ํ์ (LEFT)
// ANSI JOIN
SELECT s.name, p.name
FROM student s FULL OUTER JOIN professor p
ON s.profno = p.profno;
-- ๋๊ฐ์ง OUTER JOIN ๊ฒฐ๊ณผ ํ๋ฒ์ ์ถ๋ ฅ
* (ANSI) WHERE, ON ์๋ฏธ
- WHERE ์ : ๊ธฐ์ค ํ ์ด๋ธ์ ์งํฉ์ ์
- ON ์ : ๊ธฐ์ค ์งํฉ ์ค์ ์์ฐํฐ ์กฐ์ธ ๋์์ด ๋๋ ์งํฉ (๊ฒฐ๊ณผ์ํฅ์์)
1) WHERE ์กฐ๊ฑด์ ๋ง๋ ์งํฉ ์ถ์ถ
2) ON ์ ์ ๊ธฐ์ ๋ ์กฐ๊ฑด๋ง ์กฐ์ธ
[SELF Join ์
ํ ์กฐ์ธ]
ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ๋ช 2๊ฐ๋ก ์ฌ์ฉํด์ ํธ์ถ (2๊ฐ์ ํ ์ด๋ธ๋ก ๋ง๋ฌ)
// Oracle JOIN
SELECT e1.ename, e2.ename
FROM emp e1, emp e2
WHERE e1.mgr = e2.empno;
// ANSI JOIN
SELECT e1.ename, e2.ename
FROM emp e1 JOIN emp e2
ON e1.mgr = e2.empno;
-- ๊ฐ์ ํ
์ด๋ธ์ ๋ณ๋ช
๋ง ๋ค๋ฅด๊ฒ