๐์ 2์ฅ SQL ํ์ฉ
- ์ 1์ ์๋ธ ์ฟผ๋ฆฌ
- ์ 2์ ์งํฉ ์ฐ์ฐ์
- ์ 3์ ๊ทธ๋ฃน ํจ์
- ์ 4์ ์๋์ฐ ํจ์
- ์ 5์ Top N ์ฟผ๋ฆฌ
- ์ 6์ ๊ณ์ธตํ ์ง์์ ์ ํ ์กฐ์ธ
- ์ 7์ PIVOT ์ ๊ณผ UNPIVOT ์
- ์ 8์ ์ ๊ท ํํ์
- ์ฅ ์์ฝ
- ์ฐ์ต๋ฌธ์
โจ์ 1์ ์๋ธ ์ฟผ๋ฆฌ(Subquery)
์๋ธ์ฟผ๋ฆฌ๋?
์๋ธ ์ฟผ๋ฆฌ ์ข ๋ฅ | ์ค๋ช |
Un-Correlated(๋น์ฐ๊ด) ์๋ธ ์ฟผ๋ฆฌ |
์๋ธ ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ ์ฟผ๋ฆฌ ์นผ๋ผ์ ๊ฐ๊ณ ์์ง ์๋ ํํ์ ์๋ธ ์ฟผ๋ฆฌ๋ค. ๋ฉ์ธ ์ฟผ๋ฆฌ์ ๊ฐ(์๋ธ์ฟผ๋ฆฌ๊ฐ ์คํ๋ ๊ฒฐ๊ณผ)์ ์ ๊ณตํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฃผ๋ก ์ฌ์ฉํ๋ค. |
Correlated(์ฐ๊ด) ์๋ธ ์ฟผ๋ฆฌ |
์๋ธ ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ ์ฟผ๋ฆฌ ์นผ๋ผ์ ๊ฐ๊ณ ์๋ ํํ์ ์๋ธ ์ฟผ๋ฆฌ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์ธ ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์ํ๋ผ ์ฝํ์ง ๋ฐ์ดํฐ๋ฅผ ์๋ธ ์ฟผ๋ฆฌ์์ ์กฐ๊ฑด์ด ๋ง๋์ง ํ์ธํ๊ณ ์ ํ ๋ ์ฃผ๋ก ์ฌ์ฉํ๋ค. |
1. ๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ
์๋ธ ์ปค๋ฆฌ ์ข ๋ฅ | ์ค๋ช |
Single Row ์๋ธ ์ฟผ๋ฆฌ (๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ) |
์๋ธ ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ํญ์ 1๊ฑด ์ดํ์ธ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ๋ ๋จ์ผ ํ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋๋ค. ๋จ์ผ ํ ๋น๊ต ์ฐ์ฐ์์๋ =, <, <=, >, >=, <> ๋ฑ์ด ์๋ค. |
Multi Row ์๋ธ ์ฟผ๋ฆฌ (๋ค์ค ํ ์๋ธ ์ฟผ๋ฆฌ) |
์๋ธ ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ ๊ฑด์ธ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๋ค์ค ํ ์๋ธ ์ฟผ๋ฆฌ๋ ๋ค์คํ ๋น๊ต ์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ๋๋ค. ๋ค์ค ํ ๋น๊ต ์ฐ์ฐ์์๋ IN, ALL, ANY, SOME, EXISTS๊ฐ ์๋ค. |
Multi Column ์๋ธ ์ฟผ๋ฆฌ (๋ค์ค ์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ) |
์๋ธ ์ฟผ๋ฆฌ์ ์คํ ๊ฒฐ๊ณผ๋ก ์ฌ๋ฌ ์นผ๋ผ์ ๋ฐํํ๋ค. ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ ์ฌ๋ฌ ์นผ๋ผ์ ๋์์ ๋น๊ตํ ์ ์๋ค. ์๋ธ ์ฟผ๋ฆฌ์ ๋ฉ์ธ ์ฟผ๋ฆฌ์์ ๋น๊ตํ๊ณ ์ ํ๋ ์นผ๋ผ ๊ฐ์์ ์นผ๋ผ์ ์์น๊ฐ ๋์ผํด์ผ ํ๋ค. |
2. ๋ค์ค ํ ์๋ธ ์ฟผ๋ฆฌ
๋ค์ค ํ ์ฐ์ฐ์ | ์ค๋ช |
IN(์๋ธ ์ฟผ๋ฆฌ) | ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์กด์ฌํ๋ ์์์ ๊ฐ๊ณผ ๋์ผํ ์กฐ๊ฑด์ ์๋ฏธํ๋ค(Multiple OR ์กฐ๊ฑด) |
๋น๊ต์ฐ์ฐ์ ALL(์๋ธ ์ฟผ๋ฆฌ) |
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์กด์ฌํ๋ ๋ชจ๋ ๊ฐ์ ๋ง์กฑํ๋ ์กฐ๊ฑด์ ์๋ฏธํ๋ค. ๋น๊ต ์ฐ์ฐ์๋ก '>'๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฉ์ธ ์ฟผ๋ฆฌ๋ ์๋ธ ์ฟผ๋ฆฌ์ ๋ชจ๋ ๊ฒฐ๊ณผ ๊ฐ์ ๋ง์กฑํด์ผ ํ๋ฏ๋ก, ์๋ธ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์ ์ต๋๊ฐ๋ณด๋ค ํฐ ๋ชจ๋ ๊ฑด์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ค. |
๋น๊ต์ฐ์ฐ์ ANY(์๋ธ ์ฟผ๋ฆฌ) |
์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์กด์ฌํ๋ ์ด๋ ํ๋์ ๊ฐ์ด๋ผ๋ ๋ง์กฑํ๋ ์กฐ๊ฑด์ ์๋ฏธํ๋ค. ๋น๊ต ์ฐ์ฐ์๋ก '>'๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๋ฉ์ธ ์ฟผ๋ฆฌ๋ ์๋ธ ์ฟผ๋ฆฌ์ ๊ฐ๋ค ์ค ์ด๋ค ๊ฐ์ด๋ผ๋ ๋ง์กฑํ๋ฉด ๋๋ฏ๋ก, ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ์ ์ต์๊ฐ๋ณด๋ค ํฐ ๋ชจ๋ ๊ฑด์ด ์กฐ๊ฑด์๋ง์กฑํ๋ค(SOME์ ANY์ ๋์ผํจ) |
EXISTS(์๋ธ ์ฟผ๋ฆฌ) | ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง์กฑํ๋ ๊ฐ์ด ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์กฐ๊ฑด์ ์๋ฏธํ๋ค. ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฑด์ด ์ฌ๋ฌ ๊ฑด์ด๋๋ผ๋ 1๊ฑด๋ง ์ฐพ์ผ๋ฉด ๋์ด์ ๊ฒ์ํ์ง ์๋๋ค. |
3. ๋ค์ค ์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ
๋ค์ค ์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ๋ ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ก ์ฌ๋ฌ ๊ฐ์ ์นผ๋ผ์ด ๋ฐํ๋ผ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด๊ณผ ๋์์ ๋น๊ต๋๋ ๊ฒ์ ์๋ฏธํ๋ค. SQL Server์์๋ ์ง์๋์ง ์๋ ๋ฌธ๋ฒ์ด๋ค.
์์ํ๋ณ ํค๊ฐ ๊ฐ์ฅ ์์ ์ฌ๋๋ค์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ๋ฅผ ๊ฐ๊ณ ๋ค์ค ์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์์๋ณด๋๋ก ํ๋ค. ์์ํ๋ณ ํค๊ฐ ๊ฐ์ฅ ์์ ์ฌ๋๋ค์ ์ ๋ณด๋ GROUP BY๋ฅผ ์ด์ฉํด ์ฐพ์ ์ ์์ผ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด SQL๋ฌธ์ ์์ฑํ ์ ์๋ค.
SELECT TEAM_ID AS ํ์ฝ๋, PLAYER_NAME AS ์ ์๋ช
, POSITION AS ํฌ์ง์
, BACK_NO AS ๋ฐฑ๋๋ฒ, HEIGHT AS ํค
FROM PLAYER
WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT)
FROM PLAYER
GROUP BY TEAM_ID)
ORDER BY TEAM_ID, PLAYER_NAME;
4. ์ฐ๊ด ์๋ธ ์ฟผ๋ฆฌ
์ฐ๊ด ์๋ธ ์ฟผ๋ฆฌ(Correlated Subquery)๋ ์๋ธ ์ฟผ๋ฆฌ ๋ด์ ๋ฉ์ธ ์ฟผ๋ฆฌ ์นผ๋ผ์ด ์ฌ์ฉ๋ ์๋ธ ์ฟผ๋ฆฌ๋ค.
์ ์ ์์ ์ด ์ํ ํ์ ํ๊ท ํค๋ณด๋ค ์์ ์ ์๋ค์ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ SQL ๋ฌธ์ ์ฐ๊ด ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ์์ฑํด ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
SELECT B.TEAM_NAME AS ํ๋ช
, A.PLAYER_NAME AS ์ ์๋ช
, A.POSITION AS ํฌ์ง์
, A.BACK_NO AS ๋ฐฑ๋๋ฒ, A.HEIGHT AS ํค
FROM PLAYER A, TEAM B
WHERE A.HEIGHT < (SELECT AVG(X.HEIGHT)
FROM PLAYER
WHERE X.TEAM_ID = A.TEAM_ID
GROUP BY X.TEAM_ID)
AND B.TEAM_ID = A.TEAM_ID
ORDER BY ์ ์๋ช
;
EXISTS ์๋ธ ์ฟผ๋ฆฌ๋ ํญ์ ์ฐ๊ด ์๋ธ ์ฟผ๋ฆฌ๋ก ์ฌ์ฉ๋๋ค. ๋ํ EXISTS ์๋ธ ์ฟผ๋ฆฌ์ ํน์ง์ ์๋ฌด๋ฆฌ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฑด์ด ์ฌ๋ฌ ๊ฑด์ด๋๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ 1๊ฑด๋ง ์ฐพ์ผ๋ฉด ์ถ๊ฐ์ ์ธ ๊ฒ์์ ์งํํ์ง ์๋๋ค.
๋ค์์ EXISTS ์๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด '20220501'๋ถํฐ '20220502' ์ฌ์ด์ ๊ฒฝ๊ธฐ๊ฐ ์๋ ๊ฒฝ๊ธฐ์ฅ์ ์กฐํํ๋ SQL ๋ฌธ์ด๋ค.
SELECT A.STADIUM_ID AS ID, A.STADIUM_NAME AS ๊ฒฝ๊ธฐ์ฅ๋ช
FROM STADIUM A
WHERE EXISTS (SELECT 1
FROM SCHEDULE X
WHERE X.STADIUM_ID = A.STADIUM_ID
AND X.SCHE_DATE BETWEEN '20220501' AND '20220502');
5. ๊ทธ ๋ฐ์ ์์น์์ ์ฌ์ฉํ๋ ์๋ธ ์ฟผ๋ฆฌ
์ข ๋ฅ | ์ค๋ช |
SELECT ์ - ์ค์นผ๋ผ ์๋ธ ์ฟผ๋ฆฌ(Scallar Subquery) | ํ ํ, ํ ์นผ๋ผ๋ง์ ๋ฐํํ๋ ์๋ธ ์ฟผ๋ฆฌ ** ๋จ์ผ ํ ์๋ธ ์ฟผ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ 2๊ฑด ์ด์ ๋ฐํ๋๋ฉด SQL ๋ฌธ์ ์ค๋ฅ๋ฅผ ๋ฐํํ๋ค. |
FROM ์ - ์ธ๋ผ์ธ ๋ทฐ(Inline View) (์ค์) | ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ธ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ๋ง์น ํ
์ด๋ธ์ฒ๋ผ ์ฌ์ฉํ ์ ์๋ค. ์ธ๋ผ์ธ ๋ทฐ๋ ์ฟผ๋ฆฌ ๋ด์์ ์ฆ์ ์ฒ๋ฆฌ๋๋ค. (๊ฒ์ํ ํ์ด์ง ํ ๋ ์ ์ฉํ๋ค ์์ธํ ์์๋๊ธฐ!) |
HAVING ์ | ์ง๊ณํจ์์ ํจ๊ป ์ฌ์ฉ๋ ๋ ๊ทธ๋ฃนํ ๋ ๊ฒฐ๊ณผ์ ๋ํด ๋ถ๊ฐ์ ์ธ ์กฐ๊ฑด์ ์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. |
6. ๋ทฐ(View)
ํ ์ด๋ธ์ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๋ ๋ฐ๋ฉด, ๋ทฐ(View)๋ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์์ง ์๋ค. ๋ทฐ๋ ๋จ์ง ๋ทฐ ์ ์(View Definition)๋ง์ ๊ฐ๊ณ ์๋ค. ์ง์์์ ๋ทฐ๊ฐ ์ฌ์ฉ๋๋ฉด ๋ทฐ ์ ์๋ฅผ ์ฐธ์กฐํด์ DBMS ๋ด๋ถ์ ์ผ๋ก ์ง์๋ฅผ ์ฌ์์ฑ(Rewrite)ํด ์ง์๋ฅผ ์์ ํ๋ค.
๋ทฐ์ ์ฅ์ | ์ค๋ช |
๋ ๋ฆฝ์ฑ | ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋ผ๋ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค. |
ํธ๋ฆฌ์ฑ | ๋ณต์กํ ์ง์๋ฅผ ๋ทฐ๋ก ์์ฑํจ์ผ๋ก์จ ๊ด๋ จ ์ง์๋ฅผ ๋จ์ํ๊ฒ ์์ฑํ ์ ์๋ค. ๋ํ ํด๋น ํํ์ SQL๋ฌธ์ ์์ฃผ ์ฌ์ฉํ ๋ ๋ทฐ๋ฅผ ์ด์ฉํ๋ฉด ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค. |
๋ณด์์ฑ | ์ง์์ ๊ธ์ฌ์ ๋ณด์ ๊ฐ์ด ์จ๊ธฐ๊ณ ์ถ์ ์ ๋ณด๊ฐ ์กด์ฌํ๋ค๋ฉด, ๋ทฐ๋ฅผ ์์ฑํ ๋ ํด๋น ์นผ๋ผ์ ๋นผ๊ณ ์์ฑํจ์ผ๋ก์จ ์ฌ์ฉ์์๊ฒ ์ ๋ณด๋ฅผ ๊ฐ์ถ ์ ์๋ค. |
๋ทฐ๋ ๋ค์๊ณผ ๊ฐ์ด CREATE VIEW ๋ฌธ์ผ๋ก ์์ฑํ ์ ์๋ค.
CREATE VIEW V_PLAYER_TEAM AS
SELECT A.PLAYER_NAME, A.POSITION, A.BACK_NO
, B.TEAM_ID, B.TEAM_NAME
FROM PLAYER A, TEAM B
WHERE B.TEAM_ID = A.TEAM_ID;
ํด๋น ๋ทฐ๋ ์ ์ ์ ๋ณด์ ํด๋น ์ ์๊ฐ ์ํ ํ๋ช ์ ํจ๊ป ์ถ์ถํ๋ ๊ฒ์ด๋ค. ๋ทฐ์ ๋ช ์นญ์ 'V_PLAYER_TEAM'์ด๋ค.๋ทฐ๋ ํ ์ด๋ธ๋ฟ๋ง ์๋๋ผ ์ด๋ฏธ ์กด์ฌํ๋ ๋ทฐ๋ฅผ ์ฐธ์กฐํด์๋ ์์ฑํ ์ ์๋ค.
CREATE VIEW V_PLAYER_TEAM_FILTER AS
SELECT PLAYER_NAME, POSITION, BACK_NO, TEAM_NAME
FROM V_PLAYER_TEAM
WHERE POSITION IN ('GK', 'MF');
V_PLAYER_TEAM_FILTER ๋ทฐ๋ ์ด๋ฏธ ์์์ ์์ฑํ๋ V_PLAYER_TEAM ๋ทฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ์์ฑ๋ ๋ทฐ๋ค.
V_PLAYER_TEAM_FILTER ๋ทฐ๋ ์ ์ ํฌ์ง์ ์ด ๊ณจํคํผ(GK), ๋ฏธ๋ํ๋(MF)์ธ ์ ์๋ง์ ์ถ์ถํ๊ณ ์ ํ๋ ๋ทฐ๋ค(๋ทฐ๋ฅผ ํฌํจํ๋ ๋ทฐ๋ฅผ ์๋ชป ์์ฑํ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ์์ ๋ฌธ์ ๋ฅผ ์ ๋ฐํ ์ ์์ผ๋ฏ๋ก, ๋ทฐ์ SQL์ ์ํ์๋ฆฌ๋ฅผ ์ ์ดํดํ๊ณ ์ฌ์ฉํด์ผํ๋ค.)
-- ์ฌ์ฉ๋ฒ
SELECT PLAYER_NAME, POSITION, BACK_NO, TEAM_ID, TEAM_NAME
FROM V_PLAYER_TEAM
WHERE PLAYER_NAME LIKE 'ํฉ%';
-- ๋ทฐ ์ ๊ฑฐํ๊ธฐ
DROP VIEW V_PLAYER_TEAM;
โจ์ 2์ ์งํฉ ์ฐ์ฐ์
์งํฉ ์ฐ์ฐ์์ ์ข ๋ฅ
์งํฉ ์ฐ์ฐ์ | ์ฐ์ฐ์์ ์๋ฏธ |
UNION | (ํฉ์งํฉ)์ฌ๋ฌ ๊ฐ์ SQL๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ํ ํฉ์งํฉ์ผ๋ก ๊ฒฐ๊ณผ์์ ๋ชจ๋ ์ค๋ณต๋ ํ์ ํ๋์ ํ์ผ๋ก ๋ง๋ ๋ค. |
UNION ALL | (ํฉ์งํฉ)์ฌ๋ฌ ๊ฐ์ SQL๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ํ ํฉ์งํฉ์ผ๋ก ์ค๋ณต๋ ํ๋ ๊ทธ๋๋ก ๊ฒฐ๊ณผ๋ก ํ์๋๋ค. ์ฆ, ๋จ์ํ ๊ฒฐ๊ณผ๋ง ํฉ์ณ๋์ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ฌ๋ฌ ์ง์ ๊ฒฐ๊ณผ๊ฐ ์ํธ ๋ฐฐํ์ ์ธ(Exclusive)์ผ๋ ๋ง์ด ์ฌ์ฉํ๋ค. ๊ฐ๋ณ SQL๋ฌธ์ ๊ฒฐ๊ณผ๊ฐ ์๋ก ์ค๋ณต๋์ง ์๋ ๊ฒฝ์ฐ, UNION๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์ผํ๋ค. (๊ฒฐ๊ณผ์ ์ ๋ ฌ ์์์๋ ์ฐจ์ด๊ฐ ์์ ์ ์์) |
INTERSECT | (๊ต์งํฉ)์ฌ๋ฌ ๊ฐ์ SQL๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ํ ๊ต์งํฉ์ด๋ค. ์ค๋ณต๋ ํ์ ํ๋์ ํ์ผ๋ก ๋ง๋ ๋ค. |
EXCEPT | (์ฐจ์งํฉ)์์ SQL๋ฌธ์ ๊ฒฐ๊ณผ์์ ๋ค์ SQL๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ํ ์ฐจ์งํฉ์ด๋ค. ์ค๋ณต๋ ํ์ ํ๋์ ํ์ผ๋ก ๋ง๋ ๋ค. (์ผ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ MINUS๋ฅผ ์ฌ์ฉํจ) |
์งํฉ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํด ๋ง๋ค์ด์ง๋ SQL ๋ฌธ์ ํํ๋ ์๋์ ๊ฐ๋ค.
SELECT ์นผ๋ผ๋ช
1, ์นผ๋ผ๋ช
2, ...
FROM ํ
์ด๋ธ๋ช
1
[ WHERE ์กฐ๊ฑด์ ]
[ GROUP BY ์นผ๋ผ or ํํ์ ]
[ HAVING ๊ทธ๋ฃน์กฐ๊ฑด์ ]
์งํฉ์ฐ์ฐ์ -- ( UNION/UNION ALL/INTERSECT/MINUS or EXCEPT )
SELECT ์นผ๋ผ๋ช
1, ์นผ๋ผ๋ช
2, ...
FROM ํ
์ด๋ธ๋ช
2
[ WHERE ์กฐ๊ฑด์ ]
[ GROUP BY ์นผ๋ผ or ํํ์ ]
[ HAVING ๊ทธ๋ฃน์กฐ๊ฑด์ ]
[ ORDER BY ์นผ๋ผ or ํํ์ [ ASC or DESC ] ];
โจ์ 3์ ๊ทธ๋ฃน ํจ์
1. ๋ฐ์ดํฐ ๋ถ์ ๊ฐ์
ANSI/ISO SQL ํ์ค ํจ์ | ํจ์ ์ข ๋ฅ |
AGGREGATE FUNCTION | COUNT, SUM, AVG,MAX,MIN ์ธ ๊ฐ์ข ์ง๊ณ ํจ์๋ค |
GROUP FUNCTION | ROLLUP, CUBE, GROUPING SETS |
WINDOW FUNCTION | RANK(์์) function, AGGREGATE(์ง๊ณ) function, ํ ์์ ๊ด๋ จ ํจ์ |
2. ROLLUP ํจ์
์๊ทธ๋ฃน ๊ฐ์ ์๊ณ๋ฅผ ๊ณ์ฐํ๋ ROLLUP ํจ์
-- ์์ฑ๋ฒ ์์
SELECT B.DNAME,A.JOB, COUNT(*) AS EMP_CNT, SUM(A.SAL) AS SAL_SUM
FROM EMP B, DEPT A
WHERE B.DEPTNO = A.DEPTNO
GROUP BY ROLLUP (B.DNAME, A.JOB);
3. CUBE ํจ์
GROUP BY ํญ๋ชฉ ๊ฐ ๋ค์ฐจ์์ ์ธ ์๊ณ๋ฅผ ๊ณ์ฐํ ์ ์๋ CUBE ํจ์
CUBE๋ ๊ฒฐํฉ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฐ์ ๋ํด ๋ค์ฐจ์์ ์ธ ์ง๊ณ๋ฅผ ์์ฑํ๊ฒ ๋๋ฏ๋ก ROLLUP์ ๋นํด ๋ค์ํ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ์ฅ์ ์ด ์๋ ๋ฐ๋ฉด,
์์คํ ์ ๋ถํ๋ฅผ ๋ง์ด ์ฃผ๋ ๋จ์ ์ด ์๋ค.
-- ์์ฑ๋ฒ ์์
SELECT B.DNAME,A.JOB, COUNT(*) AS EMP_CNT, SUM(A.SAL) AS SAL_SUM
FROM EMP B, DEPT A
WHERE B.DEPTNO = A.DEPTNO
GROUP BY CUBE (B.DNAME, A.JOB);
4. GROUPING SETS ํจ์
์ํ๋ ๋ถ๋ถ์ ์๊ณ๋ง ์์ฝ๊ฒ ์ถ์ถํ์ฌ ๊ณ์ฐํ ์ ์๋ GROUPING SETS ํจ์
-- ์์ฑ๋ฒ ์์ Oracle
SELECT CASE GROUPING (B.DNAME)
WHEN 1 THEN 'All Departments'
ELSE B.DNAME END AS DNAME
,CASE GROUPING (A.JOB)
WHEN 1 THEN 'ALL Jobs'
ELSE A.JOB END AS JOB
,COUNT (*) AS EMP_CNT, SUM (A.SAL) AS SAL_SUM
FROM EMP A, DEPT B
WHERE B.DEPTNO = A.DEPTNO
GROUP BY GROUPING SETS (B.DNAME, A.JOB)
ORDER BY B.DNAME, A.JOB;
โจ์ 4์ ์๋์ฐ ํจ์
1. ์๋์ฐ ํจ์ ๊ฐ์
์๋์ฐ ํจ์ ์ข ๋ฅ | ์ค๋ช | |
์์(RANK) ๊ด๋ จ ํจ์ |
RANK | - ํน์ ํญ๋ชฉ ๋ฐ ํํฐ์
์ ๋ํด์ ์์๋ฅผ ๊ณ์ฐํ๋ค. - ๋์ผํ ์์๋ ๋์ผํ ๊ฐ์ด ๋ถ์ฌ๋๋ค. |
DENSE_RANK | - ๋์ผํ ์์๋ฅผ ํ๋์ ๊ฑด์๋ก ๊ณ์ฐํ๋ค. | |
ROW_NUMBER | - ๋์ผํ ์์์ ๋ํด์ ๊ณ ์ ์ ์์๋ฅผ ๋ถ์ฌํ๋ค. | |
์ง๊ณ(AGGREGATE) ๊ด๋ จ ํจ์ |
SUM | - ํฉ๊ณ๋ฅผ ๊ณ์ฐํ๋ค. |
AVG | - ํ๊ท ์ ๊ณ์ฐํ๋ค. | |
COUNT | - ํ ์๋ฅผ ๊ณ์ฐํ๋ค. | |
MAX, MIN |
- ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ๊ณ์ฐํ๋ค. | |
์์ ๊ด๋ จ ํจ์ |
FIRST_VALUE | - ํํฐ์
์์ ๊ฐ์ฅ ์ฒ์์ ๋์ค๋ ๊ฐ์ ๊ตฌํ๋ค. - MIN ํจ์๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๊ตฌํ ์ ์๋ค. |
LAST_VALUE | - ํํฐ์ ์์ ๊ฐ์ฅ ๋์ค์ ๋์ค๋ ๊ฐ์ ๊ตฌํ๋ค. | |
LAG | - ์ด์ ํ์ ๊ฐ์ง๊ณ ์จ๋ค. | |
LEAD | - ์๋์ฐ์์ ํน์ ์์น์ ํ์ ๊ฐ์ง๊ณ ์จ๋ค. - ๊ธฐ๋ณธ๊ฐ์ 1์ด๋ค. |
|
๋น์จ ๊ด๋ จ ํจ์ |
CUME_DIST | - ํํฐ์
์ ์ฒด ๊ฑด์์์ ํ์ฌ ํ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๊ฑด์์ ๋ํ ๋์ ๋ฐฑ๋ถ์จ์ ์กฐํํ๋ค. - ๋์ ๋ถํฌ์์ ์์น๋ฅผ 0~1์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ค. |
PERCENT_RANK | - ํํฐ์ ์์ ์ ์ผ ๋จผ์ ๋์จ ๊ฒ์ 0์ผ๋ก ์ ์ผ ๋ฆ๊ฒ ๋์จ ๊ฒ์ 1๋ก ํ์ฌ ๊ฐ์ด ์๋ ํ์ ์์๋ณ ๋ฐฑ๋ถ์จ์ ์กฐํํ๋ค. | |
NTILE | ํํฐ์ ๋ณ๋ก ์ ์ฒด ๊ฑด์๋ฅผ ARGUMENT ๊ฐ์ผ๋ก N๋ฑ๋ถํ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํ๋ค. | |
RATIO_TO_REPORT | ํํฐ์ ๋ด์ ์ ์ฒด SUM(์นผ๋ผ)์ ๋ํ ํ ๋ณ ์นผ๋ผ ๊ฐ์ ๋ฐฑ๋ถ์จ์ ์์์ ๊น์ง ์กฐํํ๋ค. | |
ํต๊ณ ๋ถ์ ๊ด๋ จ ํจ์ | CORR, COVAR_POP, COVAR_SAMP, STDDEV, STDDEV_POP, STDDEV_SAMP, VARIANCE, VAR_POP, VAR_SAMP, REGR_(LINEAR REGRESSION), REGR_SLOPE, REGR_INTERCEPT, REGR_COUNT, REGR_R2, REGR_AVGX, REGR_AVGY, REGR_SXX, REGR_SYY, REGR_SXY |
โ ์๋์ฐ ํจ์ ๊ตฌ์กฐ
-- ์๋์ฐ ํจ์์๋ OVER ๋ฌธ๊ตฌ๊ฐ ํค์๋๋ก ํ์ ํฌํจ๋๋ค.
SELECT WINDOW_FUNCTION (ARGUMENTS)
OVER ([PARTITION BY ์นผ๋ผ] [ORDER BY ์ ] [WINDOWING ์ ])
FROM ํ
์ด๋ธ ๋ช
;
โจ์ 5์ Top N ์ฟผ๋ฆฌ
1. ROWNUM ์๋ ์นผ๋ผ
Oracle์ ROWNUM์ ์นผ๋ผ๊ณผ ๋น์ทํ ์ฑ๊ฒฉ์ Pseudo Column์ผ๋ก์ SQL ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ์ ๊ฐ ํ์ ๋ํด ์์๋ก ๋ถ์ฌ๋๋ ์ผ๋ จ๋ฒํธ๋ค. ํ ์ด๋ธ์ด๋ ์งํฉ์์ ์ํ๋ ๋งํผ์ ํ๋ง ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ WHERE ์ ์์ ํ์ ๊ฐ์๋ฅผ ์ ํํ๋ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๋ค. (์ : ๊ฒ์๊ธ)
-- ํ ๊ฑด์ ํ๋ง ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= 1;
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM < 2;
-- ๋ ๊ฑด ์ด์์ N ํ์ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋๋ ์ถ๋ ฅ๋๋ ํ์ ํ๊ณ๋ฅผ ์ง์ ํด์ ์ฌ์ฉํ ์ ์๋ค.
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM <= N;
SELECT PLAYER_NAME FROM PLAYER WHERE ROWNUM < N+1;
[์์ ] ์ฌ์ ํ ์ด๋ธ์์ ๊ธ์ฌ๊ฐ ๋์ 3๋ช ๋ง ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ถ๋ ฅํ์์ค.
-- [์์ ] Oracle
SELECT ENAME, SAL
FROM (SELECT ENAME, SAL
FROM EMP
ORDER BY SAL DESC)
WHERE ROWNUM <= 3;
-- [์ถ๋ ฅ ํ๋ฉด]
ENAME SAL
----- ----
KING 5000
SCOTT 3000
FORD 3000
2. TOP ์
SQL Server๋ TOP์ ์ ์ฌ์ฉํด ๊ฒฐ๊ณผ ์งํฉ์ผ๋ก ์ถ๋ ฅ๋๋ ํ์ ์๋ฅผ ์ ํํ ์ ์๋ค.
TOP (Expression) [PERCENT] [WITH TIES]
TOP ์ ์ ํํ์ | ์ค๋ช |
Expression | ๋ฐํํ ํ ์๋ฅผ ์ง์ ํ๋ ์ซ์์ด๋ค. |
PERCENT | ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์งํฉ์์ ์ฒ์ Expression%์ ํ๋ง ๋ฐํ๋จ์ ๋ํ๋ธ๋ค. |
WITH TIES | ORDER BY ์ ์ด ์ง์ ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, TOP N(PERCENT)์ ๋ง์ง๋ง ํ๊ณผ ๊ฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์ถ๊ฐ ํ์ด ์ถ๋ ฅ๋๋๋ก ์ง์ ํ ์ ์๋ค.(๋์ผ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ ์ถ์ถํ๋ค.) |
[์์ ] ์ฌ์ ํ ์ด๋ธ์์ ๊ธ์ฌ๊ฐ ๋์ 2๋ช ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ถ๋ ฅํ์์ค.
-- [์์ ] SQL Server
SELECT TOP(2)
ENAME, SAL
FROM EMP
ORDER BY SAL DESC;
-- [์ถ๋ ฅ ํ๋ฉด]
ENAME SAL
----- ----
KING 5000
SCOTT 3000
[์์ ] ์ฌ์ ํ ์ด๋ธ์์ ๊ธ์ฌ๊ฐ ๋์ 2๋ช ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ถ๋ ฅ, ๊ฐ์ ๊ธ์ฌ๋ฅผ ๋ฐ๋ ์ฌ์์ด ์์ผ๋ฉด ๊ฐ์ด ์ถ๋ ฅํ์์ค.
( TOP(2) WITH TIES ์ต์ ์ ๋์ผ ์์น์ ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐ๋ก ๋ ์ถ์ถํ๋ ๊ฒ์ผ๋ก, SCOTT์ FORD์ ๊ธ์ฌ๊ฐ ๊ณต๋ 2์์ด๋ฏ๋ก ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค. )
-- [์์ ] SQL Server
SELECT TOP(2) WITH TIES
ENAME, SAL
FROM EMP
ORDER BY SAL DESC;
-- [์ถ๋ ฅ ํ๋ฉด]
ENAME SAL
----- ----
KING 5000
SCOTT 3000
FORD 3000
3. ROW LIMITING ์
Oracle์ 12.1 ๋ฒ์ , SQL Server๋ 2012 ๋ฒ์ ๋ถํฐ ROW LIMITING ์ ๋ก Top N ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค.
ROW LIMITING ์ ์ ANSI ํ์ค SQL ๋ฌธ๋ฒ์ด๋ค.
์๋๋ ROW LIMITING ์ ์ ๊ตฌ๋ฌธ์ด๋ค. ROW LIMITING ์ ์ ORDER BY ์ ๋ค์์ ๊ธฐ์ ํ๋ฉฐ, ORDER BY ์ ๊ณผ ํจ๊ป ์ํ๋๋ค. ROW์ ROWS๋ ๊ตฌ๋ถํ์ง ์์๋ ๋๋ค.
[OFFSET offset {ROW | ROWS}]
[FETCH {FIRST | NEXT} [{rowcount | percent PERCENT}] {ROW | ROWS} {ONLY | WITH TIES}]
์ข ๋ฅ | ์ค๋ช |
OFFSET offset | ๊ฑด๋๋ธ ํ์ ๊ฐ์๋ฅผ ์ง์ ํ๋ค. |
FETCH | ๋ฐํํ ํ์ ๊ฐ์๋ ๋ฐฑ๋ถ์จ์ ์ง์ ํ๋ค. |
ONLY | ์ง์ ๋ ํ์ ๊ฐ์๋ ๋ฐฑ๋ถ์จ๋งํผ ํ์ ๋ฐํํ๋ค. |
WITH TIES | ๋ง์ง๋ง ํ์ ๋ํ ๋์์๋ฅผ ํฌํจํด์ ๋ฐํํ๋ค. |
[์์ ] ์๋๋ ROW LIMITING ์ ์ ์ฌ์ฉํ Top N ์ฟผ๋ฆฌ๋ค.
-- [์์ ]
SELECT EMPNO, SAL FROM EMP ORDER BY SAL, EMPNO FETCH FIRST 5 ROWS ONLY;
-- [์ถ๋ ฅ ํ๋ฉด]
EMPNO SAL
----- ----
7369 800
7900 950
7876 1100
7654 1250
7521 1250
5 ํ์ด ์ ํ๋์ต๋๋ค.
[์์ ] ์๋์ ๊ฐ์ด OFFSET๋ง ๊ธฐ์ ํ๋ฉด ๊ฑด๋๋ด ํ ์ดํ์ ์ ์ฒด ํ์ด ๋ฐํ๋๋ค.
-- [์์ ]
SELECT EMPNO, SAL FROM EMP ORDER BY SAL, EMPNO OFFSET 5 ROWS;
-- [์ถ๋ ฅ ํ๋ฉด]
EMPNO SAL
----- ----
7934 1300
7844 1500
7499 1600
...
9 ํ์ด ์ ํ๋์ต๋๋ค.
โจ์ 6์ ๊ณ์ธตํ ์ง์์ ์ ํ ์กฐ์ธ(์ค์)
1. ๊ฐ์
ํ ์ด๋ธ์ ๊ณ์ธตํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด์ ๊ณ์ธตํ ์ง์(Hierarchical Query)๋ฅผ ์ฌ์ฉํ๋ค.
๊ณ์ธตํ ๋ฐ์ดํฐ๋ ๋์ผ ํ ์ด๋ธ์ ๊ณ์ธต์ ์ผ๋ก ์์์ ํ์ ๋ฐ์ดํฐ๊ฐ ํฌํจ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค.
์์ ๊ทธ๋ฆผ์ ์ฌ์์ ๋ํ ์ํ ๊ด๊ณ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ํํํ ๊ฒ์ด๋ค.
(2)๊ณ์ธตํ ๊ตฌ์กฐ์์ A์ ํ์ ์ฌ์์ B, C์ด๊ณ B ๋ฐ์๋ ํ์ ์ฌ์์ด ์๊ณ C์ ํ์ ์ฌ์์ D, E๊ฐ ์๋ค.
๊ณ์ธตํ ๊ตฌ์กฐ๋ฅผ ๋ฐ์ดํฐ๋ก ํํํ ๊ฒ์ด (3)์ํ ๋ฐ์ดํฐ๋ค.
์ํ ๊ด๊ณ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์ ํ ์กฐ์ธ์ด๋ ๊ณ์ธตํ ์ง์๋ก ์กฐํํ ์ ์๋ค.
2. ์ ํ ์กฐ์ธ ( ์ค์ ) ๐ก
์ ํ ์กฐ์ธ(Self Join)์ด๋ ๋์ผ ํ ์ด๋ธ ์ฌ์ด์ ์กฐ์ธ์ ๋งํ๋ค. ๋ฐ๋ผ์ FROM ์ ์ ๋์ผ ํ ์ด๋ธ์ด ๋ ๋ฒ ์ด์ ๋ํ๋๋ค. ๋์ผ ํ ์ด๋ธ ์ฌ์ด์ ์กฐ์ธ์ ์ํํ๋ฉด ํ ์ด๋ธ๊ณผ ์นผ๋ผ ์ด๋ฆ์ด ๋ชจ๋ ๋์ผํ๋ฏ๋ก ์๋ณ์ ์ํด ๋ฐ๋์ ํ ์ด๋ธ ๋ณ์นญ(Alias)์ ์ฌ์ฉํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์นผ๋ผ์๋ ๋ชจ๋ ํ ์ด๋ธ ๋ณ์นญ์ ์ฌ์ฉํด์ ์ด๋ ํ ์ด๋ธ์ ์นผ๋ผ์ธ์ง ์๋ณํด์ค์ผ ํ๋ค. ์ด์ธ ์ฌํญ์ ์กฐ์ธ๊ณผ ๋์ผํ๋ค.
-- ์
ํ ์กฐ์ธ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
SELECT A.์นผ๋ผ, B.์นผ๋ผ, ...
FROM EMP A, EMP B
WHERE A.์นผ๋ผ = B.์นผ๋ผ;
-- [์์]
SELECT WORKER.EMPNO AS ์ฌ์๋ฒํธ, WORKER.ENAME AS ์ฌ์๋ช
, MANAGER.ENAME AS ๊ด๋ฆฌ์๋ช
FROM EMP WORKER, EMP MANAGER
WHERE MANAGER.EMPNO = WORKER.MGR;
3. ๊ณ์ธตํ ์ง์
๊ณ์ธตํ ๋ฐ์ดํฐ ์กฐํ๋ DBMS ๋ฒค๋์ ๋ฒ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ง์ํ๋ค.
Oracle ๊ณ์ธตํ ์ง์ ๊ตฌ๋ฌธ
SELECT ...
FROM ํ
์ด๋ธ
WHERE condition
AND condition ...
START WITH condition ...
AND condition ...
CONNECT BY [NOCYCLE] conditon
AND condition ...
[ORDER SIBLINGS BY column, column, ...]
์ข ๋ฅ | ์ค๋ช |
START WITH | ๊ณ์ธต ๊ตฌ์กฐ ์ ๊ฐ์ ์์ ์์น๋ฅผ ์ง์ ํ๋ ๊ตฌ๋ฌธ, ์ฆ ๋ฃจํธ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ค(์ก์ธ์ค) |
CONNECT BY | ๋ค์์ ์ ๊ฐ๋ ์์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ํ๋ ๊ตฌ๋ฌธ, ์์๋ฐ์ดํฐ๋ CONNECT BY ์ ์ ์ฃผ์ด์ง ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.(์กฐ์ธ) |
PRIOR | CONNECT BY์ ์ ์ฌ์ฉ๋๋ฉฐ, ํ์ฌ ์ฝ์ ์นผ๋ผ์ ์ง์ ํ๋ค. (FK) = PRIOR (PK) ํํ๋ฅผ ์ฌ์ฉํ๋ฉด (๋ถ๋ชจ -> ์์) ์๋ฐฉํฅ ์ ๊ฐ๋ฅผ ํ๋ค. (PK) = PRIOR (FK) ํํ๋ฅผ ์ฌ์ฉํ๋ฉด (์์ -> ๋ถ๋ชจ) ์ญ๋ฐฉํฅ ์ ๊ฐ๋ฅผ ํ๋ค. |
NOCYCLE | ๋ฐ์ดํฐ๋ฅผ ์ ๊ฐํ๋ฉด์ ์ด๋ฏธ ๋ํ๋ฌ๋ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์ ๊ฐ ์ค์ ๋ค์ ๋ํ๋๋ค๋ฉด, ์ด๊ฒ์ ๊ฐ๋ฆฌ์ผ ์ฌ์ดํด(Cycle)์ด ๋ฐ์ํ๋ค๊ณ ํ๋ค. ์ฌ์ดํด์ด ๋ฐ์ํ ๋ฐ์ดํฐ๋ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. NOCYCLE์ ์ถ๊ฐํ๋ฉด์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์ฌ์ดํด์ด ๋ฐ์ํ ์ดํ์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฐํ์ง ์๋๋ค. |
ORDER SIBLINGS BY | ํ์ ๋ ธ๋(๋์ผ LEVEL) ์ฌ์ด์์ ์ ๋ ฌ์ ์ํํ๋ค. |
WHERE | ๋ชจ๋ ์ ๊ฐ๋ฅผ ์ํํ ํ์ ์ง์ ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ฐ์ดํฐ๋ง ์ถ์ถํ๋ค(ํํฐ๋ง) |
Oracle์ ๊ณ์ธตํ ์ง์๋ฅผ ์ฌ์ฉํ ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ ์นผ๋ผ(Pseudo Column)์ ์ ๊ณตํ๋ค.
๊ฐ์ ์นผ๋ผ | ์ค๋ช |
LEVEL | ๋ฃจํธ ๋ฐ์ดํฐ์ด๋ฉด 1, ๊ทธ ํ์ ๋ฐ์ดํฐ์ด๋ฉด 2๋ค. ๋ฆฌํ(Leaf) ๋ฐ์ดํฐ๊น์ง 1์ฉ ์ฆ๊ฐํ๋ค. |
CONNECT_BY_ISLEAF | ์ ๊ฐ ๊ณผ์ ์์ ํด๋น ๋ฐ์ดํฐ๊ฐ ๋ฆฌํ ๋ฐ์ดํฐ์ด๋ฉด 1, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ด๋ค. |
CONNECT_BY_ISCYCLE | ์ ๊ฐ ๊ณผ์ ์์ ์์์ ๊ฐ๋๋ฐ, ํด๋น ๋ฐ์ดํฐ๊ฐ ์กฐ์์ผ๋ก์ ์กด์ฌํ๋ฉด 1, ๊ทธ๋ ์ง ์์ผ๋ฉด 0์ด๋ค. ์ฌ๊ธฐ์ ์กฐ์์ด๋ ์์ ์ผ๋ก๋ถํฐ ๋ฃจํธ๊น์ง์ ๊ฒฝ๋ก์ ์กด์ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋งํ๋ค. CYCLE ์ต์ ์ ์ฌ์ฉํ์ ๋๋ง ์ฌ์ฉํ ์ ์๋ค. |
๋ค์์ emp ํ ์ด๋ธ์ ๊ณ์ธตํ ์ง์ ๊ตฌ๋ฌธ์ ์ด์ฉํด์ ์กฐํํ ๊ฒ์ด๋ค. PK์ธ empno ์์ชฝ์ PRIOR ์ฐ์ฐ์๋ฅผ ๊ธฐ์ ํ๋ค. ์ฌ๊ธฐ์๋ ๊ฒฐ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋ค์ฌ์ฐ๊ธฐํ๊ธฐ ์ํด LPAD ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
-- [์์ ]
SELECT LEVEL
,LPAD ('', 4 * (LEVEL - 1)) || ์ฌ์ AS ์ฌ์, ์ง์์์ฌ
,CONNECT_BY_ISLEAF AS ISLEAF
FROM ์ฌ์
START WITH ์ง์์์ฌ IS NULL
CONNECT BY ์ง์์์ฌ = PRIOR ์ฌ์;
CONNECT BY ์ ์ ๊ฐ ํ์ด ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง๋ฅผ Oracle์๊ฒ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๋ค. ํ์ฌ ํ๊ณผ ๋ค๋ฅธ ํ์ PRIOR ํค์๋๋ฅผ ํตํด ๊ตฌ๋ณ๋๋ค.CONNECT BY PRIOR ์ฌ์ = ์ง์์์ฌ; ์ด๋ป์ "๋ฐฉ๊ธ ์ ํ์ ์ฌ์ ๊ฐ์ด ํ์ฌ ํ์ ์ง์์์ฌ ๊ฐ์ธ ํ์ ๋ชจ๋ ์ฐพ์๋ผ" ๋ผ๋ ๋ป์ด๋ค.์ฝ๊ฒ ํ์ดํ์๋ฉด, ๋ฐฉ๊ธ์ ์ ์ดํด๋ณธ ์ฌ์์ด ํ์ฌ ์ฌ์์ ์์ฌ๊ฐ ๋๋ ๋ฐฉ์์ผ๋ก ์ถ๋ ฅํ๋ผ๋ ๊ฒ์ด๋ค. ** CONNECT BY ์ฌ์ = PRIOR ์ง์์์ฌ; (== CONNECT BY PRIOR ์ง์์์ฌ = ์ฌ์;) ์ ๊ฐ์ด PRIOR ํค์๋๋ฅผ "=" ๊ธฐํธ๋ฅผ ์ฌ์ด์ ๋๊ณ ๋ฐ๋ํธ์ผ๋ก ์ฎ๊ธธ ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ๋ Tree๋ฅผ ๊ฑฐ์ฌ๋ฌ ๋ด๋ ค๊ฐ๋ ๊ฒ(์๋ฐฉํฅ ์ ๊ฐ)์ด ์๋๋ผ, ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ ๋ฐฉ์(์ญ๋ฐฉํฅ ์ ๊ฐ)์ผ๋ก ๋ฆฌํด๋๋ค.
์ ๊ทธ๋ฆผ์ LEVEL ์นผ๋ผ์ด ์ฌ์ฉ๋ ์๋ฐฉํฅ ๊ณ์ธตํ ์ง์์ ๋ํ ๋ ผ๋ฆฌ์ ์ธ ์คํ ๋ชจ์ต์ด๋ค. ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์๋ฐฉํฅ ์ ๊ฐ ์, A๋ ๋ฃจํธ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ๋ ๋ฒจ์ด 1์ด๋ค. A์ ํ์ ๋ฐ์ดํฐ์ธ B, C๋ ๋ ๋ฒจ 2 ๐๐ป C์ ํ์ ๋ฐ์ดํฐ์ธ D, E๋ ๋ ๋ฒจ 3 ๐๐ป ๋ฆฌํ ๋ฐ์ดํฐ๋ B, D, E ๊ฐ ๋๋ค.
์ญ๋ฐฉํฅ ๊ณ์ธตํ ์ ๊ฐ ์์๋ D๊ฐ ๋ฃจํธ ๋ฐ์ดํฐ๋ก ๋ ๋ฒจ 1์ด ๋๋ฉฐ, ์์ ๋ ๋ฒจ์ ๋ฐ์ดํฐ๊ฐ ์ญ์์ ๋ ๋ฒจ์ ๊ฐ๋๋ค.
๊ณ์ธตํ ์ง์์์ ์ฌ์ฉ๋๋ ํจ์ | ์ค๋ช |
SYS_CONNECT_BY_PATH | ๋ฃจํธ ๋ฐ์ดํฐ๋ถํฐ ํ์ฌ ์ ๊ฐํ ๋ฐ์ดํฐ๊น์ง์ ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ค. ์ฌ์ฉ๋ฒ : SYS_CONNECT_BY_PATH(์นผ๋ผ, ๊ฒฝ๋ก๋ถ๋ฆฌ์) |
CONNECT_BY_ROOT | ํ์ฌ ์ ๊ฐํ ๋ฐ์ดํฐ์ ๋ฃจํธ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ค. ๋จํญ ์ฐ์ฐ์์ด๋ค. ์ฌ์ฉ๋ฒ : CONNECT_BY_ROOT ์นผ๋ผ |
โจ์ 7์ PIVOT ์ ๊ณผ UNPIVOT ์
1. ๊ฐ์
PIVOT์ ํ์ ์ํจ๋ค๋ ์๋ฏธ๋ฅผ ๊ฐ๊ณ ์๋ค. PIVOT ์ ์ ํ์ ์ด๋ก ํ์ ์ํค๊ณ , UNPIVOT ์ ์ ์ด์ ํ์ผ๋ก ํ์ ์ํจ๋ค.
2. PIVOT ์
PIVOT ์ ์ ํ์ ์ด๋ก ์ ํ ํ๋ค. PIVOT ์ ์ ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ๋ค.
PIVOT [XML]
(aggregate_function (expr) [[AS] alias]
[,aggregate_function (expr) [[AS] alias]]...
FOR {column | (column [, column]...)}
IN ({{{expr | (expr [, expr]...)} [[AS] alias]}...
| subquery
| ANY [, ANY]...
})
)
PIVOT ์ ( ํ -> ์ด ) | |
aggregate_function | ์ง๊ณํ ์ด์ ์ง์ |
FOR | PIVOT ํ ์ด์ ์ง์ ํ๋ค. |
IN | PIVOT ํ ์ด ๊ฐ์ ์ง์ ํ๋ค. |
PIVOT ์ ์ ์ง๊ณํจ์์ FOR์ ์ ์ง์ ๋์ง ์์ ์ด์ ๊ธฐ์ค์ผ๋ก ์ง๊ณ๋๊ธฐ ๋๋ฌธ์ ์ธ๋ผ์ธ ๋ทฐ๋ฅผ ํตํด ์ฌ์ฉํ ์ด์ ์ง์ ํด์ผ ํ๋ค.
[์์ 1]
-- [์์ 1] PIVOT ์ ์ ์ฌ์ฉํ ์ฟผ๋ฆฌ
SELECT *
FROM (SELECT JOB, DEPTNO, SAL FROM EMP)
PIVOT (SUM (SAL) FOR DEPTNO IN (10, 20, 30)
ORDER BY 1;
-- [์ถ๋ ฅ ํ๋ฉด]
JOB 10 20 30
---- --- --- ---
ANALYST 6000
CLERK 1300 1900 950
MANAGER 2450 2975 2850
PRESIDENT 5000
SALESMAN 5600
5 ํ์ด ์ ํ๋์ต๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ ์ธ๋ผ์ธ ๋ทฐ์ yyyyํํ์์ ์ถ๊ฐํ ๊ฒ์ด๋ค. ํ ๊ทธ๋ฃน์ yyyy ํํ์์ด ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
[์์ 2]
-- [์์ 2]
SELECT *
FROM (SELECT TO_CHAR (HIREDATE, 'YYYY') AS YYYY, JOB, DEPTNO, SAL FROM EMP)
PIVOT (SUM (SAL) FOR DEPTNO IN (10, 20, 30))
ORDER BY 1, 2;
-- [์ถ๋ ฅ ํ๋ฉด]
YYYY JOB 10 20 30
---- ---- --- --- ---
1980 CLERK 800
1981 ANALYST 3000
1981 CLERK 950
1981 MANAGER 2450 2975 2850
...
9ํ์ด ์ ํ๋์ต๋๋ค.
๋ค์ ์ฟผ๋ฆฌ๋ ์ง๊ณํจ์์ IN ์ ์ ๋ณ์นญ์ ์ง์ ํ๋ค. ๋ณ์นญ์ ์ง์ ํ๋ฉด ๊ฒฐ๊ณผ ์งํฉ์ ์ด ๋ช ์ด ๋ณ๊ฒฝ๋๋ค.
[์์ 3]
-- [์์ 3]
SELECT *
FROM (SELECT JOB, DEPTNO, SAL FROM EMP)
PIVOT (SUM (SAL) AS SAL FOR DEPTNO IN (10 AS D10, 20 AS D20, 30 AS D30))
ORDER BY 1;
-- [์ถ๋ ฅ ํ๋ฉด]
JOB D10_SAL D20_SAL D30_SAL
---- ------- ------- -------
ANALYST 6000
CLERK 1300 1900 950
MANAGER 2450 2975 2850
PRESIDENT 5000
SALESMAN 5600
5 ํ์ด ์ ํ๋์ต๋๋ค.
SELECT ์ ์ ๋ถ์ฌ๋ ์ด ๋ช ์ ์ง์ ํ๋ฉด ํ์ํ ์ด๋ง ์กฐํํ ์ ์๋ค.
[์์ 4]
-- [์์ 4]
SELECT JOB, D20_SAL
FROM(SELECT JOB, DEPTNO, SAL FROM EMP)
PIVOT(SUM (SAL) AS SAL FOR DEPTNO IN (10 AS D10, 20 AS D20, 30 AS D30))
WHERE D20_SAL > 2500
ORDER BY 1;
-- [์ถ๋ ฅ ํ๋ฉด]
JOB D20_SAL
---- ------
ANALYST 6000
MANAGER 2975
2 ํ์ด ์ ํ๋์ต๋๋ค.
3. UNPIVOT ์
UNPIVOT ์ ์ PIVOT ์ ๊ณผ ๋ฐ๋๋ก ๋์ํ๋ค. ์ด์ด ํ์ผ๋ก ์ ํ๋๋ค. UNPIVOT ์ ์ ๊ตฌ๋ฌธ์ ์๋์ ๊ฐ๋ค.
UNPIVOT [{INCLUDE | EXCLUDE} NULLS]
( {column | (column [, col]...)}
FOR {column | (column [, col]...)}
IN {column | (column [, col]...)} [AS {literal | (literal [, literal]...)}]
[, {column | (column [, col]...)} [AS {literal | (literal [, literal]...)}]]...
)
)
-- ์์ฑ๋ฒ ์์
SELECT *
FROM ( ํผ๋ฒ ๋์ ์ฟผ๋ฆฌ๋ฌธ )
UNPIVOT ( ์ปฌ๋ผ๋ณ์นญ(๊ฐ) FOR ์ปฌ๋ผ๋ณ์นญ(์ด) IN (ํผ๋ฒ์ด๋ช
AS '๋ณ์นญ', ... )
UNPIVOT ์ ( ์ด -> ํ ) | |
UNPIVOT column | UNPIVOT๋ ๊ฐ์ด ๋ค์ด๊ฐ ์ด์ ์ง์ ํ๋ค. |
FOR | UNPIVOT๋ ๊ฐ์ ์ค๋ช ํ ๊ฐ์ด ๋ค์ด๊ฐ ์ด์ ์ง์ ํ๋ค. |
IN | UNPIVOTํ ์ด๊ณผ ์ค๋ช ํ ๊ฐ์ ๋ฆฌํฐ๋ด ๊ฐ์ ์ง์ ํ๋ค. |
โจ์ 8์ ์ ๊ท ํํ์
1. ๊ฐ์
์ ๊ท ํํ์(regular expression)์ ๋ฌธ์์ด์ ๊ท์น์ ํํํ๋ ๊ฒ์ ํจํด์ผ๋ก ์ฃผ๋ก ๋ฌธ์์ด ๊ฒ์๊ณผ ์นํ์ ์ฌ์ฉ๋๋ค.
2. ๊ธฐ๋ณธ๋ฌธ๋ฒ
์ฐ์ฐ์ | ์ค๋ช | |
. | (dot) ๋ชจ๋ ๋ฌธ์์ ์ผ์น(newline ์ ์ธ) | |
| | (or) ๋์ฒด ๋ฌธ์๋ฅผ ๊ตฌ๋ถ | |
\ | (backslash) ๋ค์ ๋ฌธ์๋ฅผ ์ผ๋ฐ ๋ฌธ์๋ก ์ทจ๊ธ | |
^ | (carrot) ๋ฌธ์์ด์ ์์ | |
$ | (dollar) ๋ฌธ์์ด์ ๋ | |
์๋์ฌ(quantifier) ํจํด์ ์ต๋๋ก ์ผ์น์ํค๋ ํ์์ (greedy) ๋ฐฉ์์ผ๋ก ๋์ PERL ์ ๊ท ํํ์ ์ฐ์ฐ์๋ ์๋์ฌ์ ์ ์ฌํ๊ฒ ๋์, ํจํด์ ์ต์๋ก ์ผ์น์ํค๋ ๋นํ์์ (nongreedy) ๋ฐฉ์์ผ๋ก ๋์ |
||
? / ?? | 0ํ ๋๋ 1ํ ์ผ์น | |
* / *? | 0ํ ๋๋ ๊ทธ ์ด์์ ํ์๋ก ์ผ์น | |
+ / +? | 1ํ ๋๋ ๊ทธ ์ด์์ ํ์๋ก ์ผ์น | |
{M} / {M}? | mํ ์ผ์น | |
{m,} / {m,}? | ์ต์ mํ ์ผ์น | |
{,m} / {,m}? | ์ต๋ mํ ์ผ์น | |
{m,n} / {m,n}? | ์ต์ mํ, ์ต๋ nํ ์ผ์น | |
(expr) | ๊ดํธ ์์ ํํ์์ ํ๋์ ๋จ์๋ก ์ทจ๊ธ | |
\n | n๋ฒ์งธ ์๋ธ ํํ์๊ณผ ์ผ์น, n์ 1์์ 9 ์ฌ์ด์ ์ ์ | |
[a-z] | a๋ถํฐ z์ค ํ ๋ฌธ์์ ์ผ์น | |
[^a-z] | a๋ถํฐ z์ ํฌํจ๋์ง ์๋ ๋ฌธ์ |
๋ฌธ์ ๋ฆฌ์คํธ(character list)๋ ๋ฌธ์๋ฅผ ๋๊ดํธ๋ก ๋ฌถ์ ํํ์์ด๋ค.
๋ฌธ์ ๋ฆฌ์คํธ ์ค ํ ๋ฌธ์๋ง ์ผ์นํ๋ฉด ํจํด์ด ์ผ์นํ ๊ฒ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ๋ฌธ์ ๋ฆฌ์คํธ์์ ํ์ดํ(-)์ ๋ฒ์ ์ฐ์ฐ์๋ก ๋์ํ๋ค.
์ฐ์ฐ์ | ์ค๋ช | ๋์ผ |
[[:digit:]] | ์ซ์ | [0-9], \d |
[^[:digit:]] | ์ซ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์ | \D |
[[:lower:]] | ์๋ฌธ์ | [a-z] |
[[:upper:]] | ๋๋ฌธ์ | [A-Z] |
[[:alpha:]] | ์๋ฌธ์ | [a-zA-Z] |
[[:alnum:]] | ์ซ์์ ์๋ฌธ์ | [0-9a-zA-Z] |
[[:alnum:]_] | ์ซ์์ ์๋ฌธ์(underbar ํฌํจ) | \w |
[^[:alnum:]_] | ์ซ์์ ์๋ฌธ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์(underbar ์ ์ธ) | \W |
[[:xdigit:]] | 16์ง์ | [0-9a-fA-F] |
[[:punct:]] | ๊ตฌ๋์ ๊ธฐํธ | [^[:alnum:][:cntrl:]] |
[[:blank:]] | ๊ณต๋ฐฑ ๋ฌธ์ | |
[[:space:]] | ๊ณต๊ฐ ๋ฌธ์ (space, enter, tab) | \s |
[^[:space:]] | ๊ณต๊ฐ ๋ฌธ์๊ฐ ์๋ ๋ชจ๋ ๋ฌธ์ | \S |
3. ์ ๊ท ํํ์ ์กฐ๊ฑด๊ณผ ํจ์
์ข ๋ฅ | ์ค๋ช
|
||
REGEXP_LIKE ์กฐ๊ฑด |
source_char ๊ฐ pattern๊ณผ ์ผ์นํ๋ฉด TRUE, ์ผ์นํ์ง ์์ผ๋ฉด FALSE๋ฅผ ๋ฐํ | [ ์์ฑ๋ฒ ] REGEXP_LIKE (source_char, pattern [, match_param]) |
|
source_char | ๊ฒ์ ๋ฌธ์์ด์ ์ง์ | ||
pattern | ๊ฒ์ ํจํด์ ์ง์ | ||
match_param | ์ผ์น ์ต์ ์ ์ง์ (i: ๋์๋ฌธ์ ๋ฌด์, c: ๋์๋ฌธ์ ๊ตฌ๋ถ, n: dot(.)๋ฅผ ๊ฐํ ๋ฌธ์์ ์ผ์น, m: ๋ค์ค ํ ๋ชจ๋, x: ๊ฒ์ ํจํด์ ๊ณต๋ฐฑ ๋ฌธ์๋ฅผ ๋ฌด์, ๊ธฐ๋ณธ๊ฐ์ c๋ค. icnmx ํ์์ผ๋ก ๋ค์์ ์ต์ ์ ํจ๊ป ์ง์ ํ ์๋ ์๋ค.) | ||
REGEXP_REPLACE |
source_char ์์ ์ผ์นํ pattern์ replace_string์ผ๋ก ๋ณ๊ฒฝํ ๋ฌธ์ ๊ฐ์ ๋ฐํ | [ ์์ฑ๋ฒ ] REGEXP_REPLACE (source_char, pattern [, replace_string [, position [, occurrence [, match_param]]]]) |
|
replace_string | ๋ณ๊ฒฝ ๋ฌธ์์ด์ ์ง์ | ||
positoin | ๊ฒ์ ์์ ์์น๋ฅผ ์ง์ | ||
occurrence | ํจํด ์ผ์น ํ์๋ฅผ ์ง์ | ||
REGEXP_SUBSTR |
source_char์์ ์ผ์นํ pattern์ ๋ฐํ | [ ์์ฑ๋ฒ ] REGEXP_SUBSTR (source_char, pattern [, position [, occurrence [, match_param [, subexpr]]]]) |
|
subexpr | ์๋ธ ํํ์์ ์ง์ ํ๋ค (0์ ์ ์ฒด ํจํด, 1์ด์์ ์๋ธ ํํ์, ๊ธฐ๋ณธ๊ฐ์ 0) | ||
REGEXP_INSTR |
source_char์์ ์ผ์นํ pattern์ ์์ ์์น๋ฅผ ์ ์๋ก ๋ฐํ | [ ์์ฑ๋ฒ ] REGEXP_INSTR (source_char, pattern [, position [, occurrence [, return_opt [, match_param [, subexpr]]]]]) |
|
return_opt | ๋ฐํ ์ต์ ์ ์ง์ ํ๋ค (0์ ์์ ์์น, 1์ ๋ค์ ์์น, ๊ธฐ๋ณธ๊ฐ์ 0) | ||
REGEXP_COUNT |
source_char์์ ์ผ์นํ pattern์ ํ์๋ฅผ ๋ฐํ | [ ์์ฑ๋ฒ ] REGEXO_COUNT (source_char, pattern [, position [, match_param]]) |
โจ์ฅ ์์ฝ
์ 1์ ์๋ธ์ฟผ๋ฆฌ |
์๋ธ ์ฟผ๋ฆฌ๋ ํ๋์ ๋ฉ์ธ ์ฟผ๋ฆฌ ์์ ํฌํจ๋ ์ข ์์ ์ธ SQL ๋ฌธ์ฅ์ ๋งํ๋ ๊ฒ์ผ๋ก, ์์น๋ ๊ธฐ๋ฅ์ ๋ฐ๋ผ NESTED SUBQUERY, INLINE VIEW, SCALAR SUBQUERY๋ก ๊ตฌ๋ถํ ์ ์๋ค. |
์ 2์ ์งํฉ ์ฐ์ฐ์ |
์งํฉ ์ฐ์ฐ์๋ ๊ฒฐ๊ณผ ์งํฉ ๊ฐ์ ์ฐ์ฐ์ ํตํด ๊ฒฐํฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. UNION ์ฐ์ฐ์์ UNION ALL ์ฐ์ฐ์๋ ๊ฐ๋ณ SQL ๋ฌธ์ ๊ฒฐ๊ณผ์ ๋ํด ํฉ์งํฉ ์ฐ์ฐ์, INTERSECT ์ฐ์ฐ์๋ ๊ต์งํฉ ์ฐ์ฐ์, EXCEPT/MINUS ์ฐ์ฐ์๋ ์ฐจ์งํฉ์ ์ํํ๋ค. UNION ALL ์ฐ์ฐ์๋ฅผ ์ ์ธํ ๋ชจ๋ ์งํฉ ์ฐ์ฐ์๋ ์ต์ข ๊ฒฐ๊ณผ์์ ์ค๋ณต๋ ํ์ ์ ์ธํ๊ณ ์ถ๋ ฅํ๋ค. |
์ 3์ ๊ทธ๋ฃน ํจ์ |
๋ฐ์ดํฐ ๋ถ์์ ์ํ GROUP FUNCTION์ผ๋ก๋ ์๊ทธ๋ฃน ๊ฐ์ ์๊ณ๋ฅผ ๊ณ์ฐํ๋ ROLLUP ํจ์, GROUP BY ํญ๋ชฉ๋ค๊ฐ์ ๋ค์ฐจ์์ ์ธ ์๊ณ๋ฅผ ๊ณ์ฐํ ์ ์๋ CUBE ํจ์, ํน์ ํญ๋ชฉ์ ๋ํ ์๊ณ๋ฅผ ๊ณ์ฐํ๋ GROUPING SETS ํจ์๊ฐ ์๋ค. |
์ 4์ ์๋์ฐ ํจ์ |
๋ฐ์ดํฐ ๋ถ์์ ์ํ WINDOW FUNCTION์ ๋ถ๋ถ์ ์ด๋๋ง ํ๊ณผ ํ๊ฐ์ ๊ด๊ณ๋ฅผ ์ฝ๊ฒ ์ ์ํ๊ธฐ ์ํด ๋ง๋ ํจ์๋ค. WINDOW FUNCTION์ ์ด์ฉํ ์์(RANK) ๊ด๋ จ ํจ์๋ RANK, DENSE_RANK, ROW_NUMBER๊ฐ ์์ผ๋ฉฐ, ๊ทธ์ธ ๊ทธ๋ฃน ๋ด ์ง๊ณ(AGGREGATE) ๊ด๋ จ ํจ์, ๊ทธ๋ฃน ๋ด ๋น์จ ๊ด๋ จ ํจ์ ๋ฑ์ด ์๋ค. |
์ 5์ Top N ์ฟผ๋ฆฌ |
Top-N ์ฟผ๋ฆฌ๋ ๋ง ๊ทธ๋๋ก ์์(Top) N๊ฐ์ ํ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ค. Oracle์ ROWNUM ์๋ ์นผ๋ผ, SQL Server๋ TOP ์ ์ ์ฌ์ฉํ ์ ์๋ค. Oracle์ 12.1๋ฒ์ , SQL Server๋ 2012 ๋ฒ์ ๋ถํฐ ROW LIMITING ์ ๋ก Top N ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ค. |
์ 6์ ๊ณ์ธตํ ์ง์์ ์ ํ ์กฐ์ธ |
ํ ์ด๋ธ์ ๊ณ์ธตํ ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๊ธฐ ์ํด์ ๊ณ์ธตํ ์ง์(HIERARCHICAL QUERY)๋ฅผ ์ฌ์ฉํ๋ค. ์ ํ ์กฐ์ธ(SELF JOIN)์ด๋ ๋์ผ ํ ์ด๋ธ ์ฌ์ด์ ์กฐ์ธ์ ๋งํ๋ฉฐ, FROM ์ ์ ๋์ผ ํ ์ด๋ธ์ด ๋ ๋ฒ ์ด์ ๋ํ๋๋ค. |
์ 7์ PIVOT ์ ๊ณผ UNPIVOT ์ |
PIVOT์ ํ์ ์ํจ๋ค๋ ์๋ฏธ๋ค. PIVOT ์ ์ ํ์ ์ด๋ก ํ์ ์ํค๊ณ , UNPIVOT ์ ์ ์ด์ ํ์ผ๋ก ํ์ ์ํจ๋ค. PIVOT์ ์ CASE ํํ์๊ณผ GROUP BY ์ , UNPIVOT ์ ์ ํ ๋ณต์ ๋ฅผ ์ฌ์ฉํด ์ํํ ์๋ ์๋ค. |
์ 8์ ์ ๊ทํํ์ |
์ ๊ท ํํ์(regular expression)์ ๋ฌธ์์ด์ ๊ท์น์ ํํํ๋ ๊ฒ์ ํจํด์ผ๋ก ์ฃผ๋ก ๋ฌธ์์ด ๊ฒ์๊ณผ ์นํ์ ์ฌ์ฉ๋๋ค. REGEXP_LIKE ์กฐ๊ฑด๊ณผ REGEXP_REPLACE ํจ์, REGEXP_SUBSTR ํจ์, REGEXP_INSTR ํจ์, REGEXP_COUNT ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค. |
์ถ์ฒ : SQL ์ ๋ฌธ๊ฐ ๊ฐ์ด๋
'IT์๊ฒฉ์ฆ ๊ณต๋ถ > SQLD ์๊ฒฉ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SQL ์ ๋ฌธ๊ฐ] ๊ณผ๋ชฉII. ์ 3์ฅ ๊ด๋ฆฌ ๊ตฌ๋ฌธ (0) | 2022.04.21 |
---|---|
[SQL ์ ๋ฌธ๊ฐ] ๊ณผ๋ชฉII. ์ 2์ฅ SQL ํ์ฉ - ์ฐ์ต๋ฌธ์ (2) | 2022.04.15 |
[SQL ์ ๋ฌธ๊ฐ] ๊ณผ๋ชฉII. ์ 1์ฅ SQL ๊ธฐ๋ณธ - ์ฐ์ต๋ฌธ์ (1) | 2022.04.14 |
[SQL ์ ๋ฌธ๊ฐ] ๊ณผ๋ชฉII. ์ 1์ฅ SQL ๊ธฐ๋ณธ (0) | 2022.04.13 |
[SQL ์ ๋ฌธ๊ฐ] ๊ณผ๋ชฉI. ์ 2์ฅ ๋ฐ์ดํฐ ๋ชจ๋ธ๊ณผ ์ฑ๋ฅ - ์ฐ์ต๋ฌธ์ (0) | 2022.04.11 |