[๋ชฉ์ฐจ]
๐์งํฉ์ฐ์ฐ์์ ์์๊ด๊ณ์ฐ์ฐ์
์งํฉ์ฐ์ฐ์
์ฐจ์งํฉ ๋ค๋ฅด๊ฒ ํํํ๊ธฐ
๊ต์งํฉ ๋ค๋ฅด๊ฒ ํํํ๊ธฐ
์์๊ด๊ณ์ฐ์ฐ์
๐์กฐ์ธ JOIN
โญโญ์กฐ์ธ ์์ฑ๋ฒ
JOIN๊ณผ ALIAS ๋ณ๋ช
๐JOIN์ ์ข ๋ฅ
INNER JOIN๊ณผ NATURAL JOIN ์์
SELF JOIN ์ ํ์กฐ์ธ
๐ ๊ณ์ธตํ ์ง์ (ORACLE๋ง ์ง์ํ๋ค)
๊ฐ์์นผ๋ผ๊ณผ ํจ์
์ ๊ฐ๋ฐฉ๋ฒ
๐ SUB QUERY ์๋ธ์ฟผ๋ฆฌ
๋ฐํ๊ฐ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
๋์๋ฐฉ์, ์ฌ์ฉ์์น์ ๋ฐ๋ฅธ ๋ถ๋ฅ
๐ ๋ทฐ VIEW : ๊ฐ์ํ
์ด๋ธ
๋ทฐ์ ์ฅ์
๋ทฐ ์ฌ์ฉ๋ฐฉ๋ฒ
๐ ์งํฉ์ฐ์ฐ์์ ์์๊ด๊ณ์ฐ์ฐ์
์งํฉ์ฐ์ฐ์
์กฐ์ธ์ ์ฌ์ฉํ์ง ์๊ณ ์ฐ๊ด๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ด๋ค.
์ฌ๋ฌ SELECT๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ์ฐ๊ฒฐํ์ฌ ํ๋๋ก ๊ฒฐํฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
SELECT๋ฌธ์ ์นผ๋ผ์๊ฐ ๋์ผํ๊ณ , ๋ฐ์ดํฐํ์ ์ด ์ํธํธํ๋์ด์ผ ํ๋ค.
์ข ๋ฅ | ์ค๋ช | SQL ๊ธฐ๋ฅ |
UNION | ํฉ์งํฉ. ๋ ์งํฉ์ ๋ชจ๋ ํํํ๋ค. / ์ค๋ณต์ ๊ฑฐO / ์ ๋ ฌO | UNION |
ํฉ์งํฉ. ๋ ์งํฉ์ ๋ชจ๋ ํํํ๋ค. / ์ค๋ณต์ ๊ฑฐX / ์ ๋ ฌX | UNION ALL | |
INTERSECTION | ๊ต์งํฉ. ๋ ์งํฉ์ ๊ณตํต์งํฉ์ ์ถ์ถํ๋ค. / ์ค๋ณต์ ๊ฑฐO | INTERSECT |
DIFERENCE | ์ฐจ์งํฉ. ์ฒซ๋ฒ์งธ ์งํฉ์์ ๋๋ฒ์งธ ์งํฉ๊ณผ์ ๊ณตํต๋ถ๋ถ ์ ์ธ / ์ค๋ณต์ ๊ฑฐO | MINUS (MSSQL์ EXCEPT) |
PRODUCT | ๋ ์งํฉ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ถ์ถํ๋ค. / ์ค๋ณต์ ๊ฑฐO | CROSS JOIN์ผ๋ก ๊ตฌํ๋์๋ค. |
SELECT๋ฌธ
์งํฉ์ฐ์ฐ์
SELECT๋ฌธ
ORDER BY ~ -- ORDER BY๋ ๊ฐ์ฅ ๋ง์ง๋ง์ค์ ํ๋ฒ๋ง ๊ธฐ์ ํ๋ค.
์ฐจ์งํฉ ๋ค๋ฅด๊ฒ ํํํ๊ธฐ
SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 MINUS SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2
= SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 AND ์นผ๋ผ <> ์กฐ๊ฑด2
= SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 AND NOT EXISTS(SELECT 1 FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2)
= SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 AND NOT IN(SELECT ์นผ๋ผ1 FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2)
๊ต์งํฉ ๋ค๋ฅด๊ฒ ํํํ๊ธฐ
SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 INTERSECT SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2
= SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 AND ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2
= SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 AND EXISTS(SELECT 1 FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2)
= SELECT ~ FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด1 AND IN(SELECT ์นผ๋ผ1 FROM ~ WHERE ์นผ๋ผ ์ฐ์ฐ์ ์กฐ๊ฑด2)
์์๊ด๊ณ์ฐ์ฐ์
์ข ๋ฅ | ์ค๋ช | SQL ๊ธฐ๋ฅ |
SELECT | ์ฌ๋ฌ ํ ์ค ์กฐ๊ฑด์ ๋ง๋ ์ํ์ ๋ถ๋ถ์งํฉ ์ถ์ถ | WHERE์ ๋ก ๊ตฌํ๋์๋ค. |
PROJECT | ์ฌ๋ฌ ์ด ์ค ์กฐ๊ฑด์ ๋ง๋ ์์ง์ ๋ถ๋ถ์งํฉ ์ถ์ถ | SELECT์ ๋ก ๊ตฌํ๋์๋ค. |
JOIN | ๋ค๋ฅธ ํ ์ด๋ธ๊ณผ ๊ณตํต์์ฑ์ ์ค์ฌ์ผ๋ก ์๋ก์ด ์งํฉ์ ๋ง๋ ๋ค. | JOIN์ ๋ก ๊ตฌํ๋์๋ค. |
DIVIDE | - | ์ฌ์ฉ๋์ง ์๋๋ค. |
๐ ์กฐ์ธ JOIN
๋๊ฐ ์ด์์ ํ ์ด๋ธ๊ณผ ์ฐ๊ฒฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ธฐ์ํด ์ฌ์ฉํ๋ค.
์ผ๋ฐ์ ์ผ๋ก PRIMARY KEY๋ FOREIGN KEY๋ก ์ฐ๊ฒฐ๋์ด JOIN์ด ์ฑ๋ฆฝํ๋ค.
FROM ์ ์ ์ฌ๋ฌ ํ ์ด๋ธ์ด ๋์ด๋๋ 2๊ฐ์ฉ ๋จผ์ JOIN์ฒ๋ฆฌ๋๋ค.
โญโญ์กฐ์ธ ์์ฑ๋ฒ
JOIN๊ณผ ALIAS ๋ณ๋ช
FROM์ ์์ ํ ์ด๋ธ์ ๋ณ๋ช ์ ๋ถ์ฌ SELECT, WHERE์ ์์ ์ฌ์ฉํ ์ ์๋ค.
๋จ, ๋ณ๋ช ์ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋ณ๋ช ๋ง ์ฌ์ฉํด์ผํ๋ค. (๋ณ๋ช ๊ณผ ํ ์ด๋ธ๋ช ํผํฉํด์ ์ฌ์ฉ X)
ALIAS ๋ณ๋ช ์ด์ฉํ์ฌ JOIN ํํ | ์์ |
SELECT A.์นผ๋ผ๋ช
, B.์นผ๋ผ๋ช
FROM ํ ์ด๋ธ1 A, ํ ์ด๋ธ2 B WHERE A.์นผ๋ผ๋ช = B.์นผ๋ผ๋ช ; |
SELECT PLAYER.NAME, P.NO, T.NAME FROM PLAYER P, TEAM T WHERE P.NO = T.NO; --์ค๋ฅ๋ฐ์ |
๐ JOIN์ ์ข ๋ฅ
INNER JOIN๊ณผ NATURAL JOIN ์์
SELF JOIN ์ ํ์กฐ์ธ
๋์ผ ํ ์ด๋ธ ์ฌ์ด์ ์กฐ์ธ์ ๋งํ๋ค. ํ ์ด๋ธ์ ์นผ๋ผ๋ช ์ด ๋ชจ๋ ๋์ผํ๊ธฐ๋๋ฌธ์ ๋ฐ๋์ ๋ณ๋ช (ALIAS)๋ฅผ ์ฌ์ฉํด์ผํ๋ค.
์์ ๊ณผ ์์ ์ ์ง์ ์์ํ์ ๊ตฌํ ์ ์์ผ๋, ์ฐจ์์ํ์ ํ๋ฒ ๋ ์ ํ์กฐ์ธ์ ์ํํด์ผ ๊ตฌํ ์ ์๋ค.
SELECT ๋ณ๋ช 1.์นผ๋ผ๋ช , ๋ณ๋ช 2.์นผ๋ผ๋ช
FROM ํ ์ด๋ธ๋ช ๋ณ๋ช 1, ํ ์ด๋ธ๋ช ๋ณ๋ช 2
WHERE ๋ณ๋ช 1.์์์นผ๋ผ๋ช = ๋ณ๋ช 2.ํ์์นผ๋ผ๋ช ;
SELECT JU.J_ID ํ์ํ๋ฒ, JU.NAMES ์ด๋ฆ, SE.NAMES ์ ๋ฐฐ์ด๋ฆ
FROM STUDENTS JU, STUDENTS SE
WHERE JU.S_ID = SE.J_ID;
SELECT JU.J_ID ํ๋ฐฐ๋ฒํธ, JU.NAMES ํ๋ฐฐ์ด๋ฆ, SE.NAMES ์ ๋ฐฐ์ด๋ฆ
FROM STUDENTS JU LEFT OUTER JOIN STUDENTS SE
ON JU.S_ID = SE.J_ID
ORDER BY JU.J_ID;
๐ ๊ณ์ธตํ ์ง์ (ORACLE๋ง ์ง์ํ๋ค)
๊ณ์ธตํ ๋ฐ์ดํฐ : ์ํ๊ด๊ณ๊ฐ ๋ช ํํ ๋ฐ์ดํฐ
๊ณ์ธตํ ์ง์ : ๊ณ์ธตํ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ.
๋ฃจํธ๋ ธ๋ | ๊ณ์ธตํ ๋ฐ์ดํฐ์ ์ต์์ ๋ ธ๋๋ฅผ ๋งํ๋ค. ๋ถ๋ชจ๋ฅผ ๊ฐ์ง์ง ์๋๋ค. (์๋ ์ฌ์ง์์ A์ ํด๋น) |
ํ์ ๋ ธ๋ | ๊ฐ์ ๊ณ์ธต์ ์๋ ๋ฐ์ดํฐ๋ค์ ๋งํ๋ค. (์๋ ์ฌ์ง์์ B, C / D, E ๋ผ๋ฆฌ ํ์ ๋ ธ๋์ด๋ค) |
๋ฆฌํ๋ ธ๋ | ๊ณ์ธตํ ๋ฐ์ดํฐ์ ์ตํ์ ๋ ธ๋๋ฅผ ๋งํ๋ค. ์์์ ๊ฐ์ง์ง ์๋๋ค. (์๋ ์ฌ์ง์์ B, D, E์ ํด๋น) |
๊ฐ์์นผ๋ผ๊ณผ ํจ์
๊ฐ์์นผ๋ผ |
LEVEL | ์๋ฐฉํฅ, ์ญ๋ฐฉํฅ ๊ด๊ณ์์ด ๋ฃจํธ๋ฅผ 1๋ก ์ง์ ํ๋ค. ์์์ ๋ฃจํธ๋ก ํ๋ฉด ๋ถ๋ชจ๋ 2๊ฐ ๋๋ค. (์๋ ์ฌ์ง์์ B๊ฐ ๋ฃจํธ์ด๋ฉด A๋ 2) |
CONNECT_BY_ISLEAF | ํด๋น ์นผ๋ผ์ด ๋ฆฌํ๋ ธ๋์ด๋ฉด 1, ์๋๋ฉด 0์ ๋ฐํํ๋ค. | |
ํจ์ | SYS_CONNECT_BY_PATH(์นผ๋ผ๋ช , '๊ตฌ๋ถ์') | ๋ฃจํธ๋ถํฐ ์ ๊ฐํ ๋ฐ์ดํฐ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค. |
CONNECT_BY_ROOT ์นผ๋ผ | ํด๋น ์นผ๋ผ์ ๋ฃจํธ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ค. |
์ ๊ฐ ๋ฐฉ๋ฒ
PRIOR = '์ด์ ์' ๋ผ๋ ๋ป์ ๊ฐ์ง๊ณ ์๋ค. ์์ ํ์ ๊ฐ์ ์ฐธ์กฐํ๋ค.
์๋ฐฉํฅ์ ๊ฐ | ์ญ๋ฐฉํฅ์ ๊ฐ |
๋ถ๋ชจ = PRIOR ์์ | PRIOR ๋ถ๋ชจ = ์์ |
์ด์ ์ ์์๊ฐ ์ค์์ ๋ถ๋ชจ(๊ธฐ์ค๊ฐ)์ ์ฐพ๋๋ค ๋ถ๋ชจ๊ฐ ์์์ ๊ฒฐ์ ํ๋ค |
์ด์ ์ ๋ถ๋ชจ๊ฐ ์ค์์ ์์(๊ธฐ์ค๊ฐ)์ ์ฐพ๋๋ค ์์์ด ๋ถ๋ชจ๋ฅผ ๊ฒฐ์ ํ๋ค |
๊ณ์ธตํ ์ง์ | Oracle | |
๊ตฌ๋ฌธ | SELECT ~ FROM ~ WHERE ~ START WITH ๋ฃจํธ๋ ธ๋ ์ง์ ์กฐ๊ฑด CONNECT BY [NOCYCLE] PRIOR ์ ๊ฐ๋ฐฉํฅ ์กฐ๊ฑด [ORDER SIBILINGS BY ์ปฌ๋ผ๋ช ] - NOCYCLE : ์์ฌ๊ฐ ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌด๋ ๊ฒ ๋ฐฉ์ง - SIBILINGS BY : ํ์ ๋ค ์ ๋ ฌ ๊ธฐ์ค ์ ์ |
|
์์ | SELECT CONNECT_BY_ROOT ์ฌ์ '๋ฃจํธ', SYS_CONNECT_BY_PATH(์ฌ์, '/') '๊ฒฝ๋ก', LEVEL, ์ฌ์, ๊ด๋ฆฌ์ FROM ์ฌ์ํ ์ด๋ธ START WITH ์ฌ์='D' CONNECT BY PRIOR ๊ด๋ฆฌ์ = ์ฌ์; -- D๋ฅผ ๋ฃจํธ๋ก ์ง์ ํ๊ฒ ๋ค. -- ์ฌ์์ด ๊ด๋ฆฌ์๋ฅผ ๊ฒฐ์ ํ๋ค. (์ญ๋ฐฉํฅ์ ๊ฐ) -- D์ ์ฐ๊ฒฐ๋ C๊ฐ LEVEL 2๋ก ์ค๊ฒ๋๋ค -- C์ ์ฐ๊ฒฐ๋ A๊ฐ LEVEL 3๋ก ์ค๊ฒ๋๋ค ๋ฃจํธ ๊ฒฝ๋ก LEVEL ์ฌ์ ๊ด๋ฆฌ์ -------------------------------------- D /D 1 D C D /D/C 2 C A D /D/C/A 3 A |
SELECT CONNECT_BY_ROOT ์ฌ์ '๋ฃจํธ', SYS_CONNECT_BY_PATH(์ฌ์, '/') '๊ฒฝ๋ก', LEVEL, ์ฌ์, ๊ด๋ฆฌ์ FROM ์ฌ์ํ ์ด๋ธ START WITH ๊ด๋ฆฌ์ IS NULL CONNECT BY PRIOR ์ฌ์ = ๊ด๋ฆฌ์; -- A๋ฅผ ๋ฃจํธ๋ก ์ง์ ํ๊ฒ ๋ค. -- ๊ด๋ฆฌ์๊ฐ ์ฌ์์ ๊ฒฐ์ ํ๋ค. (์๋ฐฉํฅ์ ๊ฐ) -- A์ ์ฐ๊ฒฐ๋ B, C๊ฐ LEVEL 2๋ก ์ค๊ฒ๋๋ค -- C์ ์ฐ๊ฒฐ๋ D, E๊ฐ LEVEL 3๋ก ์ค๊ฒ๋๋ค ๋ฃจํธ ๊ฒฝ๋ก LEVEL ์ฌ์ ๊ด๋ฆฌ์ -------------------------------------- A /A 1 A A /A/B 2 B A A /A/C 2 C A A /A/D 3 D C A /A/E 3 E C |
๐๋ฌธ์
START WITH MANAGER_ID IS NULL
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID
๋ค์ ์ค ํ๋ฆฐ ๊ฒ์?
2) CONNECT_BY_ISLEAF ๋ LEAF ๋ฉด 1์ ์๋๋ฉด 0 ์ ๋ฐํํ๋ค
3) ์์์์ ๋ถ๋ชจ๋ก ๊ฐ๋ ์ญ๋ฐฉํฅ์ด๋ค // PRIOR ์ฌ์ = ๊ด๋ฆฌ์ : ๊ด๋ฆฌ์๊ฐ ์ฌ์์ ๊ฒฐ์ ํ๋ค. ์๋ฐฉํฅ์ ๊ฐ์ด๋ค.
4) LEVEL ์ ๊ณ์ธต์ ๊น์ด๋ฅผ ์๋ฏธํ๋ฉฐ KING ์ ์ต์์ ๊ณ์ธต์ด๋ค
๐ SUB QUERY ์๋ธ์ฟผ๋ฆฌ
ํ๋์ SQL๋ฌธ ์์ ํฌํจ๋ ๋ ๋ค๋ฅธ SQL๋ฌธ.
์๋ธ์ฟผ๋ฆฌ๋ ๊ดํธ๋ก ๊ฐ์ธ์ ์ฌ์ฉํ๊ณ , ORDER BY๋ ๋ฉ์ธ์ฟผ๋ฆฌ์์๋ง ์ฌ์ฉํ ์ ์๋ค.
๋ฐํ๊ฐ์ ๋ฐ๋ฅธ ๋ถ๋ฅ
๋์๋ฐฉ์, ์ฌ์ฉ์์น์ ๋ฐ๋ฅธ ๋ถ๋ฅ
๐ ๋ทฐ VIEW : ๊ฐ์ํ ์ด๋ธ
์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง ํ ์ด๋ธ์ ์ญํ ์ ์ํํ ์ ์๋ค.
๋๋ฌธ์ ๊ฐ์ ํ ์ด๋ธ์ด๋ผ๊ณ ๋ ํ๋ค.
๋ทฐ์ ์ฅ์
๋ ๋ฆฝ์ฑ | ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค. |
ํธ๋ฆฌ์ฑ | ๋ณต์กํ ์ง์๋ฅผ ๋ทฐ๋ก ์์ฑํ๋ฉด ๊ด๋ จ ์ง์๋ฅผ ํธ๋ฆฌํ๊ฒ ์์ฑํ ์ ์๋ค. |
๋ณด์์ฑ | ๋ทฐ ์์ฑ ์ ํน์ ์นผ๋ผ(๊ธ์ฌ์ ๋ณด..)์ ๋นผ๊ณ ์์ฑํ์ฌ ์ ๋ณด๋ฅผ ๊ฐ์ถ ์ ์๋ค. |
๋ทฐ ์ฌ์ฉ๋ฐฉ๋ฒ
์์ฑ
CREATE VIEW ๋ทฐ์ด๋ฆ AS SELECT๋ฌธ์ฅ;
์ฌ์ฉ (๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ DBMS๊ฐ ๋ด๋ถ์ ์ผ๋ก SQL๋ฌธ์ ์ฌ์์ฑํ๋ค)
SELECT * FROM ๋ทฐ์ด๋ฆ; = SELECT * FROM (SELECT๋ฌธ์ฅ);
์ญ์
DROP VIEW ๋ทฐ์ด๋ฆ;
๊ณ์ธตํ์ง์ ๊ด๋ จ๋ฌธ์ ์ค๋ต๋ ธํธ
#SQLD #์งํฉ์ฐ์ฐ์ #์์๊ด๊ณ์ฐ์ฐ์ #์กฐ์ธ #JOIN #์กฐ์ธ์์ฑ๋ฒ #JOIN๊ณผ ๋ณ๋ช #INNERJOIN #๋ด๋ถ์กฐ์ธ #NATURALJOIN #์์ฐ์กฐ์ธ #OUTERJOIN #์ธ๋ถ์กฐ์ธ #LEFTJOIN #RIGHTJOIN #FULLJOIN #SELFJOIN #๊ณ์ธตํ์ง์ #๊ณ์ธตํ์ง์์ ๊ฐ๋ฐฉ๋ฒ #์๋ธ์ฟผ๋ฆฌ #SUBQUERY #์๋ธ์ฟผ๋ฆฌ๋ถ๋ฅ #์ค์นผ๋ผ์๋ธ์ฟผ๋ฆฌ #์ธ๋ผ์ธ๋ทฐ #๋ทฐ #VIEW #๊ฐ์ํ ์ด๋ธ