๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค (RDBMS)์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ธ Join
์์) Aํ ์ด๋ธ์ a, b ์ปฌ๋ผ์ ๋์์ผ๋ก SELECT๋ฅผ ์ํํ๋ฉด ๋์คํฌ์์๋
Aํ ์ด๋ธ์ ๋ชจ๋ ์ปฌ๋ผ์ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ฐ์ ธ์จ๋ค. (๋นํจ์จ์ )
์ ๊ทํ : ํ๋๋ก ๋์ด์๋ ๊ฒ์ ์์ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌํ๋ ๊ธฐ์
์ ๊ทํ๋ฅผ ์ํํ๋ฉด ํ๋์ ํ ์ด๋ธ์ด ์ฌ๋ฌ๊ฐ์ ํ ์ด๋ธ๋ก ๋๋์ด์ง๋ค.
์ฌ๋ฌ ํ ์ด๋ธ์ ํฉ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์กฐํฉํด์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด Join ์ด๋ผ๋ ๊ธฐ์ ์ด๋ค!
JOIN (INNER JOIN / OUTER JOIN)
-----------------------
โถOracel JOIN ๋ฌธ๋ฒ
SELECT d.dept_nm, s.s_id, s.s_nm
FROM student s, dept d
WHERE s.D_ID = d.D_ID ;
/*WHERE student.D_ID = dept.D_ID */
-----------------------
โถANSI JOIN ๋ฌธ๋ฒ (์ฌ์ฉ)
SELECT d.dept_nm, s.s_id, s.s_nm
FROM student s
JOIN dept d ON s.D_ID = d.D_ID ;
-----------------------
EMP -> ENPNO, ENAME
DEPT -> DEPTNO, DNAME, LOC
SELECT E.EMPNO, E.ENAME, D.DEPTNO, D.DEPTNO,
D.DNAME, D.LOC
FROM EMP E
INNER JOIN DEPT D ON E.DEPTNO = D.DEPTNO;
-----------------------
INNER JOIN C ON A.d = C.d
-----------------------
SELECT
FORM Z
INNER JOIN Y ON Z.a = Y.a
AND Z.b = Y.b
โถJOIN ์ถ๊ฐํ๊ธฐ
SELECT
FORM Z
INNER JOIN Y ON Z.a = Y.a AND Z.b = Y.b
INNER JOIN X ON Z.d = X.d
โถoracle ๋ฌธ๋ฒ
SELECT
FORM Z,Y,Z
WHERE Z.a = Y.a AND Z.b = Y.b
AND Z.d = X.d
(1) Cartesian Product (์นดํฐ์ ๊ณฑ)
Join ์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ ์กฐ์ธ ์กฐ๊ฑด ์ง์ ๋ถ๋ถ.
์กฐ์ธ ์กฐ๊ฑด์ ์ ์ ์ง ์์ผ๋ฉด ํ ์ด๋ธ์ ๋ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ถ ๊ฐ์ ธ์จ๋ค. ์ด๊ฒ์ ์นดํฐ์ ๊ณฑ์ด๋ผ๊ณ ๋ถ๋ฆ
join์ฟผ๋ฆฌ ์ค์ WHERE์ ์ ๊ธฐ์ ํ๋ join ์กฐ๊ฑด์ด ์๋ชป ๊ธฐ์ ๋์๊ฑฐ๋ ์์ ์์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ํ์์ด๋ค.
์ฌ์ฉํ๋ ์ด์
1 : ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ์ฌ ์๋ณธ ํ ์ด๋ธ์ ๋ฐ๋ณตํด์ ์ฝ๋ ๊ฒ์ ํผํ๊ธฐ ์ํด์
2 : ์ค์๋ก ์กฐ์ธ ์กฐ๊ฑด ์ปฌ๋ผ ์ค ์ผ๋ถ๋ฅผ ๋น ๋จ๋ฆฌ๋ ๊ฒฝ์ฐ
-----------------------
/*์นดํฐ์
๋์ค๋ ๊ฑด ๋ง์์ผํจ*/
-----------------------
EQUL Join (๋ฑ๊ฐ์กฐ์ธ)
์ ํ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์จ ํ ์กฐ์ธ ์กฐ๊ฑด์ ์ ๊ฒ์ฌํด์ ๋์ผํ ์กฐ๊ฑด์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ํํ ํ ์ด๋ธ์์ ๊บผ๋ด์ค๋ ๋ฐฉ๋ฒ
์กฐ๊ฑด์ ์ = ๋ฅผ ์ฌ์ฉํด์ EQUL Join ์ด๋ผ๊ณ ํ๋ค.
"ํ ์ด๋ธ์ด๋ฆ . ์ปฌ๋ผ์ด๋ฆ" ๊ฐ์ ํํ๋ก ์ ์ ๋ ์ปฌ๋ผ์ด๋ฆ์ด ํ๋์ ํ ์ด๋ธ์๋ง ์๋ ๊ฒฝ์ฐ์๋
ํ ์ด๋ธ์ด๋ฆ์ ์๋ตํด๋๋จ
๊ฒ์์กฐ๊ฑด, Join์กฐ๊ฑด => ๊ฒ์ ์กฐ๊ฑด์ ๋จผ์ ๊ฒ์ํ๊ณ ๋ฐ์ดํฐ ๋ฒ์๋ฅผ ์ค์ธ ๋ค์ Join ์กฐ๊ฑด์ ์์ ์ ์ํํ๋ค.
(๊ฒ์์กฐ๊ฑด์ ์ ํ์ฉํ๋ฉด ์์ ์ ์๋๊ฐ ๋นจ๋ผ์ง๋ค !!)
โถ๋ฑ๊ฐ์กฐ์ธ
์์ชฝ ํ
์ด๋ธ ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํด์ผ์ผ ๊ฒฐ๊ณผ๊ฐ ๋์ด
(INNER ์ ์ต์(์๊ฒ) ๋งคํ์ํด ์ฌ๋ฌ๊ฐ ์กฐ๊ฑด๋ ์์ ์ชฝ ๋งคํ์ผ๋ก ์ถ๋ ฅํ๋ค. )
SELECT S.NAME "STU_NAME", P.NAME "PRO_NAME"
FROM STUDENT S, PROFESSOR P
WHERE S.PROFNO= P.PROFNO;
-----------------------
- ๋ฐ์ดํฐ๊ฐ ๋ง -> ์
- ๊ณํ์ค๋ช
F10 COST(๋น์ฉ๊ธฐ๋ฐ) ๋ฎ์ ์๋ก ์ข์
-----------------------
SELECT s.name stu_name
, d.dname
, p.name prof_name
FROM student s
INNER JOIN department d
ON s.deptno1 = d.deptno
INNER JOIN professor p
ON d.deptno = s.deptno1
AND p.profno = s.profno;
SELECT s.name stu_name
,p.name prof_name
FROM student s
INNER JOIN professor p
ON s.profno = p.profno --AND s.deptno = 101
WHERE s.deptno1 = 101;
/* AND ๊ฐ ๋ ํจ์จ์ 101์ธ ์ ๋ค๋ง (๋์๋ง) ์กฐ์ธ์ ๊ฑด๋ค*/
Non-EQUL Join (๋น๋ฑ๊ฐ์กฐ์ธ)
์กฐ๊ฑด์ด ๊ฐ์ง์๊ณ ํฌ๊ฑฐ๋ ์์ ๊ฒฝ์ฐ์ ์กฐ๊ฑด์ ์กฐํํด์ผํ ๊ฒฝ์ฐ
BETWEEN or ๋น๊ต์ฐ์ฐ์ (์ฑ๋ฅ ๋ ์ข์/ ๊ถ์ฅ)
์ฌ์ฉ์2>
=๋ค์ํ ์กฐ๊ฑด ์กฐํ
=์กฐ๊ฑด ์ฌ์ด์ ๊ฑธ๋ฆฌ์ง ์์ผ๋ฉด ์ถ๋ ฅ๋์ง์์
SELECT C.*
FROM CUSTOMER C
INNER JOIN GIFT G
ON C.POINT BETWEEN G.G_START AND G.G_END;
--
SELECT C.GNAME CUST_NAME, G.GNAME GIF_NAME, C.POINT, G.G_START, G.G_END
FROM CUSTOMER C
INNER JOIN GIFT G
ON C.POINT BETWEEN G.G_START AND G.G_END;
=๋น๊ต ์ฐ์ฐ์๊ฐ ์ฑ๋ฅ์ ์ข๋ค.
SELECT C.GNAME CUST_NAME, G.GNAME GIF_NAME, C.POINT, G.G_START, G.G_END
FROM CUSTOMER C
INNER JOIN GIFT G
ON C.POINT >= G.G_START
AND C.POINT <= G.G_END;
์ฌ์ฉ์2>
SELECT S.NAME, O.TOTAL, H.GRADE
FROM STUDENT
INNER JOIN SCORE O
ON S.STUDNO = O.STUDNO
INNER JOIN HAKJUM H --ํ์ ๊ธฐ์คํ
์ด๋ธ
ON O.TOTAL >= H.MIN_POINT
AND O.TOTAL <= H.MAX_POINT
OUTER Join(์์ฐํฐ ์กฐ์ธ)
equi , non-equi ๋ชจ๋ ๋ชจ๋ ํ ์ด๋ธ์ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์๋ง ๊ฒฐ๊ณผ๊ฐ์ ์ถ๋ ฅํ๋ค. (inner join)
ํ์ชฝ ํ ์ด๋ธ์ ์๊ณ ๋ค๋ฅธ ํ์ชฝ์๋ ์๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์๋ ์ชฝ ํ ์ด๋ธ์ ๋ด์ฉ์ ์ ๋ถ ์ถ๋ ฅํ๊ฒ ํ๋ ๋ฐฉ๋ฒ (outer join)
DB์ฑ๋ฅ์ ์์ฃผ ๋์ ์ํฅ์ ์ค ์ ์์ (์ ์คํ ์ฌ์ฉ)
- ์ธ๋ฑ์ค๋ฅผ ์ฐ์ง์๊ณ Full Scan์ ํจ
- ํ๋์์) ์กฐ์ธ์์๊ฐ ๊ณ ์ ๋์ด ์ฌ์ฉ์ ๋ป๋๋ก ๋ณ๊ฒฝํ ์ ์์
Oracle -> Where ์กฐ๊ฑด์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ชฝ์ (+) ํ์ํด์ค๋ค.
ANSI -> ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ์ชฝ์ (+)
LEFT OUTER -> = ๊ธฐํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ผ์ค ํ์
Outer Join ํฉ์ณ์ ์ถ๋ ฅํ๊ธฐ -> UNION ( UNION ALL) ์ฐ์ฐ์ ์ฌ์ฉ
์ฃผ์์ฌํญ
1. Where ์ ์ outer join ๋๋ ์ปฌ๋ผ์ ์ ๋ถ join ์ฐ์ฐ์(+) ๋ฅผ ๋ถ์ฌ์ผํจ -> ํ๋๋ผ๋ ๋น ์ง๋ฉด ์ผ๋ฐ ์กฐ์ธ๊ณผ ๋์ผํ๊ฒ ๋จ
2. Where ์ ์ ์กฐ๊ฑด์ ON์ ๋ก ์์น์ํค๋ ๊ฒฝ์ฐ... !!
์ฌ์ฉ์1>
= ์ฐธ์กฐ ์์์ ๋ฐ๋ผ์ 1) LEFT / RIGHT , 2) ์ฃผํ ์ด๋ธ ๋ณ๊ฒฝ
= ์ด๋ค ์ชฝ์ด ์ฃผํ ์ด๋ธ์ด ๋๋์ง ํ์ ํด์ผํจ
SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S
INNER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
-- 15๋ช
SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S
LEFT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
--20 (์ฃผ) s 1:1 ๋ฐฉ์
์ฌ์ฉ์2>
SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S
RIGHT OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
--22 (์ฃผ)
์ฌ์ฉ์3>
SELECT S.NAME STD_NAME, P.NAME PROF_NAME
FROM STUDENT S
FULL OUTER JOIN PROFESSOR P
ON S.PROFNO = P.PROFNO;
--27 FULL
์ฐธ๊ณ 2 >
= WHERE ์ ๋๋ฌธ์ OUTER ์กฐ์ธ ํจ๊ณผ๊ฐ ์ฌ๋ผ์ง๋ค. (ON ์ผ๋ก ๋ฌถ์ด์ค์ผ๋จ.
SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, D.LOC
FROM EMP E
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
WHERE D.LOC = 'CHICAGO';
--
SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, D.LOC
FROM EMP E
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
AND D.LOC = 'CHICAGO'
WHERE E.JOB = 'CLERK'; --๋ง๋ค๊ณ -> WHERE ์ ์ฒด์์กฐ๊ฑด
--
SELECT E.EMPNO, E.ENAME, E.JOB, D.DNAME, D.LOC
FROM EMP E
LEFT OUTER JOIN DEPT D
ON E.DEPTNO = D.DEPTNO
AND D.LOC = 'CHICAGO'
AND E.JOB = 'CLERK'; --ON ์์ ๋ค์ด๊ฐ๋ฉด JOIN ์์ ์กฐ๊ฑด -> ์กฐ๊ฑด์ ๋ง์ง์์๋ NULL์ ๋ง๋ฌ
SELF Join
์ํ๋ ๋ฐ์ดํฐ๊ฐ ํ๋์ ํ ์ด๋ธ์ ๋ชจ๋ ์๋ ๊ฒฝ์ฐ
๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ํ ์ด๋ธ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณ๋ช ๋ ๊ฐ๋ก ์ฌ์ฉํ์ฌ ํธ์ถํ๋ค. (2๊ฐ์ ํ ์ด๋ธ๋ก ๋ง๋ฌ)
SELF => ์ฌ๊ท
= ๋ง์ง๋ง MGR ์๋ KING ์ ๋์ค์ง์๋๋ค.
SELECT E1.ENAME,E2.ENAME
FROM EMP E1
INNER JOIN EMP E2
ON E1.MGR = E2.EMPNO;
= OUTER JOIN ์ ํ๋ฉด KING ๋ ๋์จ๋ค.
= ์ฃผํ ์ด๋ธ์ด E1 ์ด๋ฏ๋ก LEFT ๋ก ํด์ค๋ค.
SELECT E1.ENAME,E2.ENAME
FROM EMP E1
LEFT OUTER JOIN EMP E2
ON E1.MGR = E2.EMPNO;