ON์ ๊ณผ WHERE์ ์ฐจ์ด
์กฐ์ธ๋ฌธ์ ์ฌ์ฉํ ๋ ON์ ์ ์ด์ฉํด์ ํด๋น ์กฐ๊ฑด์ผ๋ก ํ ์ด๋ธ ์กฐ์ธ์ ํ๊ฒ๋ฉ๋๋ค. ๊ทธ๋ฐ๋ฐ JOIN์ ํ๊ธฐ ์ํด ON์ ์ด ์๋ WHERE์ ์ ์ฌ์ฉํ ๋๋ ์์ต๋๋ค. ๊ฐ์ ๋ด์ฉ๊ฐ์ง๋ง ํ์คํ ๋๊ฐ์ง ์ ์ ์ฐจ์ด๋ ์์ต๋๋ค. ์ด๋ฒ ๊ธ์์๋ ON์ ๊ณผ WHERE์ ์ ์ฐจ์ด์ ์ด๋ค ์ํฉ์์ ๊ฐ๊ฐ ์ฌ์ฉํด์ผํ๋์ง ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
SQL๋ฌธ ์์
ON JOIN ์ ์ด ์ถ๊ฐ๋ SQL๋ฌธ์ ์์๋ FROM ์ ๋ค์์ผ๋ก ์งํํฉ๋๋ค. ์ฆ ON์ ์ WHERE์ ๋ณด๋ค ์์์์ผ๋ก ๋ ๋น ๋ฆ ๋๋ค. ๊ทธ๋ผ ์ด๊ฒ ์ค์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
WHERE์ ON์ ์ค์ต
OS : Red Hat Enterprise Linux Server release 6.3
DB : Oracle 12.1.0.2
user : scott
๊ธฐ๋ณธ์ผ๋ก ์ฃผ์ด์ง๋ scott ๊ณ์ ์ ํ ์ด๋ธ์ ๊ฐ๊ณ ์ค์ต์ ์งํํ๊ฒ ์ต๋๋ค.
inner join
๊ธ์ฌ๊ฐ 2000์ด ๋๋ ์ง์๋ค์ ๋ถ์๋ฒํธ, ๋ถ์๋ช , ์ด๋ฆ, ๊ธ์ฌ๋ฅผ ์ถ๋ ฅํ์์ค.
QUERY1
SELECT
d.deptno
,d.dname
,e.ename
,e.sal
FROM dept d,emp e
WHERE d.deptno = e.deptno
AND e.sal > 2000;
QUERY2
SELECT
d.deptno
,d.dname
,e.ename
,e.sal
FROM dept d INNER JOIN emp e
ON d.deptno = e.deptno
WHERE e.sal > 2000;
QUERY3
SELECT
d.deptno
,d.dname
,e.ename
,e.sal
FROM dept d INNER JOIN emp e
ON d.deptno = e.deptno AND e.sal > 2000;
๋์ผํ RESULT
inner join์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฌธ์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ป๊ธฐ์ํด ์์ 3๊ฐ์ง QUERY ์ด๋๊ฒ์ ์ฌ์ฉํ๋ ์ง ์๊ด์ด ์์ต๋๋ค. QUERY1๋ฒ์ ๊ฒฝ์ฐ FROM ์ ์์ Cartesian Product์ ์ํ ์กฐ์ธ์์ WHERE์ ์์ ์กฐ๊ฑด์ ๋น๊ตํ๋ ๊ฒ์ด๊ณ , QUERT2์์๋ deptno์ ๋ํ ์กฐ์ธ ์์ ์ ํ ํ WHERE ์ ์์ sal์ ๋ํ ๋น๊ต๋ฅผ ํ๋ ๊ฒ์ด๊ณ , QUERY3๋ ON์ ์์ ์กฐ์ธํ ๋ ๋ชจ๋ ์กฐ๊ฑด์ ๋น๊ตํ๋๊ฒ์ ๋๋ค.
inner join์ ์กด์ฌํ๋ ๊ฐ์ ๋ํด์๋ง ์ถ๋ ฅํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ ์์น๋ ํ ์ด๋ธ์ ์์์ ๋ฌด๊ดํ๊ฒ ๊ฐ์ ์คํ๊ณํ์ผ๋ก ๊ฐ์ ๊ฐ์ด ์ถ๋ ฅ๋ฉ๋๋ค. ํ์ง๋ง outer join์ ์ฌ์ฉํ๊ฒ๋๋ฉด ์กฐ๊ฑด์ ์์น์ ์์๊ฐ ๋งค์ฐ ์ค์ํด์ง๋๋ค.
outer join
๊ธ์ฌ๊ฐ 2000์ด ๋๋ ์ง์๋ค์ ๋ํด ๊ฐ ๋ถ์๋ณ ๊ธ์ฌ์ ํฉ์ ๊ตฌํ์์ค.
QUERY1
SELECT d.deptno, sum(e.sal)
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno
WHERE e.sal > 2000
GROUP BY d.deptno
ORDER BY d.deptno;
์ผํ๋ณด๋ฉด ์ ๋ต๊ฐ์ง๋ง... SQL QUERY์ ์๋์ ์๋ชป๋ ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์ค๊ณ ์์ต๋๋ค. ๋ญ๊ฐ ๋ฌธ์ ์ธ์ง ํ์ธํ๊ธฐ ์ํด ์กฐ์ธ๋ ํ ์ด๋ธ์ ๊ฒฐ๊ณผ๋ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
SELECT *
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno;
outer join์ ์ฌ์ฉํ๋ ์๋๋ ํน์ ํ ์ด๋ธ์ ๋ชจ๋ ๊ฐ์ด ํฌํจ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ํด์ ์ ๋๋ค. dept ํ ์ด๋ธ์๋ 40๋ฒ ๋ถ์๊ฐ ์กด์ฌํ๋๋ฐ empํ ์ด๋ธ์์ผ๋ก ํ์ฌ 40๋ฒ ๋ถ์์ ์์๋์ด์๋ ์ง์์ด ์์ต๋๋ค. ํ์ง๋ง, ๊ฒฐ๊ณผ๋ก 40๋ฒ๋ถ์๋ ํจ๊ป ํ์๋๋๋กํ๋ ๊ฒ์ด ๋ฌธ์ ์ ๋ชฉ์ ์ ๋๋ค.
QUERY1์ ๊ฒฝ์ฐ, deptno๋ก ์กฐ์ธ์ ํ๊ณ WHERE์ ์์ 2000์ด ์ด๊ณผ๋๋ ์ง์๋ค์ ํํฐ๋งํฉ๋๋ค. ์ด๋ 40๋ฒ ๋ถ์์ ํ์ sal๊ฐ์ด null์ด๊ธฐ ๋๋ฌธ์ ๋น๊ต์กฐ๊ฑด์์ ํด๋น ํ์ ์ง์๋ฒ๋ฆฝ๋๋ค. ๊ทธ๋์ ์ต์ข ์ ์ผ๋ก 40๋ฒ ๋ถ์๊ฐ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๊ฒ๋ฉ๋๋ค.
40๋ฒ ๋ถ์๋ ํจ๊ป ๋ณด์ด๊ธฐ ์ํด ์๋์ SQL QUERY์ฒ๋ผ ์ถ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
QUERY2
SELECT d.deptno, sum(e.sal)
FROM dept d LEFT OUTER JOIN emp e
ON d.deptno = e.deptno AND e.sal > 2000
GROUP BY d.deptno
ORDER BY d.deptno;
QUERY2๋ ON์ ์ ํด๋น 2000 ์ด๊ณผ ์กฐ๊ฑด์ ๋ช ์ํฉ๋๋ค. ์ฆ JOINํ ๋ ํด๋น ์กฐ๊ฑด์ ์ฒ๋ฆฌํ๊ณ outer join์ด๊ธฐ ๋๋ฌธ์ dept์ ์กด์ฌํ๊ณ emp์๋ ์กด์ฌํ์ง ์๋ ๊ฒฐ๊ณผ๋ ํจ๊ป ์ถ๋ ฅํ๊ฒ๋ฉ๋๋ค.
ON์ ๊ณผ WHERE์ ์ ์ฐจ์ด๋ outer join์ ์ฌ์ฉํ์๋ ํ์คํ ํ์ธ์ด ๊ฐ๋ฅํฉ๋๋ค. ON์ ์ ์กฐ๊ฑด์ผ๋ก ์กฐ์ธ๋๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ณ ์กฐ๊ฑด์ ๋น๊ตํ๋ ๋์์ด ๋ฌ๋ผ์ง๋ ํ์คํ ์ฐจ์ด๋ฅผ ์์๋๊ณ QUERY ์์ฑ์ด ํ์ํฉ๋๋ค.
๋๊ธ