(์๋ธ์ฟผ๋ฆฌ์ ์์น)
WHERE ์ : NESTED SUBQUERY
FROM ์ : INLINE VIEW
SELECT์ ์ธ : SCALAR SUBQUERY
- ์๋ธ์ฟผ๋ฆฌ๋ฅผ ๋ฌธ๋ฒ์ ์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ SQL๋ฌธ์ด ๊ดํธ๋ก ๋ฌถ์ฌ์ ธ ์์ผ๋ฉด ์๋ธ์ฟผ๋ฆฌ์ด๋ค.
- ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ์ ํฌํจ๋๋ ์ข ์์ ์ธ ๊ด๊ณ์ด๋ค.
- ์๋ธ์ฟผ๋ฆฌ๋ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ง๋ง ๋ฉ์ธ์ฟผ๋ฆฌ๋ ์๋ธ์ฟผ๋ฆฌ์ ์ปฌ๋ผ์ ์ฌ์ฉํ ์ ์๋ค. (JAVA์ ์์๊ณผ ๊ฐ์ ๊ฐ๋ )
- ์๋ธ์ฟผ๋ฆฌ์์๋ ORDER BY ์ฌ์ฉํ์ง ๋ชปํจ.
์๋ธ์ฟผ๋ฆฌ์ ์กฐ์ธ
์๋ธ์ฟผ๋ฆฌ์ ์กฐ์ธ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ ํ ์ด๋ธ ์์น๋ฅผ ๋ฐ๊พธ์ด๋ณด๋ ๊ฒ์ด๋ค.
์กฐ์ธ์ ๋ ๊ฐ์ ํ ์ด๋ธ ์์น๋ฅผ ๋ฐ๊พธ์ด ๋ณด๋๋ผ๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋ฉฐ, ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฝ์ฐ๋ ์ฃผ์ข ์ ๊ด๊ณ์ด๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค. ๋ง์ฝ ์๋ธ์ฟผ๋ฆฌ์์ ๋๊ฐ์ ํ ์ด๋ธ ์์น๋ฅผ ๋ฐ๊พธ์๋๋ฐ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค๋ฉด, ์กฐ์ธ์ผ๋ก ๋ฐ๊ฟ ์ ์๋ค๋ ์๊ธฐ์ด๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์งํฉ์ ๊ฐ๋ ์ ์ฌ์ฉํ ์ ์๋ ์กฐ์ธ์ผ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๊ถ๊ณ ํ๋ค.
์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ(๋ฐํ ๋ฐ์ดํฐ ํํ)
- Single Row(๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ) : ์๋ธ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ๊ฐ ํญ์ 1๊ฑด ์ดํ์ธ ์๋ธ์ฟผ๋ฆฌ. ๋จ์ผํ ๋น๊ต ์ฐ์ฐ์์ ์ฌ์ฉ( =,<,<=,>,>=,<>)
- Multi Row(๋ค์คํ ์๋ธ์ฟผ๋ฆฌ) : ์๋ธ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ๊ฐ ์ฌ๋ฌ๊ฑด์ธ ์๋ธ์ฟผ๋ฆฌ. ๋ค์คํ ๋น๊ต ์ฐ์ฐ์์ ์ฌ์ฉ(IN, ALL, ANY, SOME, EXISTS)
- Multi Column(๋ค์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ) : ์๋ธ์ฟผ๋ฆฌ์ ์คํ๊ฒฐ๊ณผ๋ก ์ฌ๋ฌ ์ปฌ๋ผ์ ๋ฐํ. ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์กฐ๊ฑด์ ์ ์ฌ๋ฌ ์นผ๋ผ์ ๋์์ ๋น๊ตํ ์ ์๋ค.
1) ๋จ์ผํ ์๋ธ์ฟผ๋ฆฌ
์๋ธ์ฟผ๋ฆฌ๊ฐ ๋จ์ผ ํ ๋น๊ต ์ฐ์ฐ์(-,<,<=,>,>=,<>)์ ํจ๊ป ์ฌ์ฉํ ๋๋ ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ ๊ฑด์๊ฐ ๋ฐ๋์ 1๊ฑด ์ดํ์ฌ์ผ ํ๋ค. (2๊ฑด ์ด์ ๋ฐํ์ ์๋ฌ ๋ฐ์)
=> ์๋ธ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ 2๊ฑด ์ด์ ๋ฐํ๋ ์ ์๋ค๋ฉด ๋ฐ๋์ ๋ค์คํ ๋น๊ต์ฐ์ฐ์์ ํจ๊ป ์ฌ์ฉ!
EX) SELECT PLAYER_NAME ์ ์๋ช
, POSITION ํฌ์ง์
, BACK_NO ๋ฐฑ๋๋ฒ
FROM PLAYER_T
WHERE TEAM_ID = (SELECT TEAM_ID
FROM PLAYER_T
WHERE PLAYER_NAME = '์ ๋จ์ผ')
ORDER BY PLAYER_NAME;
-> ๋ง์ฝ '์ ๋จ์ผ' ์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ๋๋ช ์ด์ธ์ด ์กด์ฌํ๋ค๋ฉด ์๋ฌ. (1๊ฑด ์ดํ๋ง ๋์์ผ ํ๋ฏ๋ก)
2) ๋ค์คํ ์๋ธ์ฟผ๋ฆฌ
- ๋ค์คํ ์ฐ์ฐ์ : IN, ALL, ANY, SOME, EXISTS
EX) SELECT PLAYER_NAME ์ ์๋ช
, POSITION ํฌ์ง์
, BACK_NO ๋ฐฑ๋๋ฒ
FROM PLAYER_T
WHERE TEAM_ID IN (SELECT TEAM_ID
FROM PLAYER_T
WHERE PLAYER_NAME = '์ ๋จ์ผ')
ORDER BY PLAYER_NAME;
-> ๋ค์คํ ๋น๊ต ์ฐ์ฐ์๋ฅผ ์ด์ฉํ์ฌ ๋๋ช ์ด์ธ์ ํ์ธํ ์ ์์
3) ๋ค์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
- sql server์์ ์ง์ํ์ง ์๋๋ค.
- EX)
SELECT TEAM_ID ํ์ฝ๋ , PLAYER_NAME ์ ์๋ช
, POSITION ํฌ์ง์
, BACK_NO ๋ฐฑ๋๋ฒ , HEIGHT ํค
FROM PLAYER
WHERE (TEAM_ID, HEIGHT) IN (SELECT TEAM_ID, MIN(HEIGHT)
FROM PLAYER
GROUP BY TEAM_ID)
ORDER BY TEAM_ID, PLAYER_NAME;
์๋ธ์ฟผ๋ฆฌ์ ์ข ๋ฅ(๋์ ๋ฐฉ์)
- Un-Correlated (๋น์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ) : ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์นผ๋ผ์ ๊ฐ์ง๊ณ ์์ง ์์ ํํ. ๋ฉ์ธ์ฟผ๋ฆฌ์ ๊ฐ์ ์ ๊ณตํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ
- Correlated (์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ) : ์๋ธ์ฟผ๋ฆฌ๊ฐ ๋ฉ์ธ์ฟผ๋ฆฌ์ ์นผ๋ผ์ ์ฌ์ฉํ๋ ํํ์ ์๋ธ์ฟผ๋ฆฌ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฉ์ธ์ฟผ๋ฆฌ๊ฐ ๋จผ์ ์ํ๋์ด ์ฝํ์ง ๋ฐ์ดํฐ๋ฅผ ์๋ธ์ฟผ๋ฆฌ์์ ์กฐ๊ฑด์ด ๋ง๋์ง ํ์ธํ๊ณ ์ ์ฌ์ฉ
(๋ฉ์ธ์ฟผ๋ฆฌ์ ํ ์ ๋งํผ ์คํ๋๋ ์ฟผ๋ฆฌ์ด๋ฏ๋ก ์๋์ ์ผ๋ก ์คํ์๋ ๋จ์ด์ง)
์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ
์์ ) SELECT T.TEAM_NAME ํ๋ช
, M.PLAYER_NAME ์ ์๋ช
, M.POSITION ํฌ์ง์
, M.BACK_NO ๋ฐฑ๋๋ฒ , M.HEIGHT ํค
FROM PLAYER M, TEAM T
WHERE M.TEAM_ID = T.TEAM_ID AND M.HEIGHT < (SELECT AVG(S.HEIGHT)
FROM PLAYER S
WHERE S.TEAM_ID =M.TEAM_ID
AND S.HEIGHT IS NOT NULL
GROUP BY S.TEAM_ID)
ORDER BY ์ ์๋ช
;
+) ์ฐ๊ด์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ UPDATE๋ฌธ์ ์์ฑํด ํน์ ์ปฌ๋ผ์ ์ผ๊ด๋ณ๊ฒฝํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฐ๊ด์๋ธ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๊ฐ ๊ณต์งํฉ(์กฐ๊ฑด์ด ๋ง์ง์๋ ๊ฒฝ์ฐ)์ด๋ผ๋ฉด ๊ฒฐ๊ณผ ์นผ๋ผ์ NULL๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ ๋๋ ๋ฆฌ์คํฌ.
EXISTS ์๋ธ์ฟผ๋ฆฌ
- EXISTS ์๋ธ์ฟผ๋ฆฌ๋ ํญ์ ์ฐ๊ด ์๋ธ์ฟผ๋ฆฌ๋ก ์ฌ์ฉ๋๋ค.
- ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฑด์ด ์ฌ๋ฌ๊ฑด์ด๋๋ผ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๋ 1๊ฑด๋ง ์ฐพ์ผ๋ฉด ์ถ๊ฐ์ ์ธ ๊ฒ์์ ์งํํ์ง ์๋๋ค.
(์ด ๋ง์ด ๊ต์ฅํ ํท๊ฐ๋ ธ์๋๋ฐ, ์ ์ฒด ํ ์ด๋ธ์ ๋ํ ๊ฒ์์ ๋ฉ์ถ๋ค๋ ์๊ธฐ๊ฐ ์๋๋ผ ๊ฐ ํ๋น ์กฐ๊ฑด์ ๊ฒ์ฌํ๋ฉด์ ๊ทธ ์กฐ๊ฑด์ ์ผ์นํ๋ ๊ฑด์ด ์ฌ๋ฌ๊ฐ์ผ ๊ฒฝ์ฐ ํ๋๋ง ์ฐพ์ผ๋ฉด ๊ฒ์์ ๋ฉ์ถ๋ค๋ ์๋ฆฌ๋ค.)
- ๊ฒฐ๊ณผ๊ฐ ํ๊ฑด์ด๋ผ๋ ์กด์ฌํ๋ฉด TRUE, ์์ผ๋ฉด FALSE ๋ฐํํ๋ค.
์์ ) SELECT STADIUM_ID, STADIUM_NAME
FROM STADIUM
WHERE EXISTS (SELECT 1
FROM SCHEDULE
WHERE SCHE_DATE BETWEEN '20120501' AND '20120521')
-> ์๋ธ์ฟผ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด 1,'X'๊ฐ์ ์ ๋ฌด์ ์ผ๋ก ์๋ฏธ์๋ ์์๊ฐ์ ์ ํ
INLINE VIEW
- FROM ์ ์์ ์ฌ์ฉ๋๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ ํ๋ค.
- ๋์ ๋ทฐ๋ผ๊ณ ๋ ํ๋ค.
- ์งํฉ๊ฐ์ ์กฐ์ธํ์๋ฅผ ์ค์ด๋ ์ฉ๋
- ์ค์ฒฉ๋์ด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ฅ ์์ ์ธ๋ผ์ธ ๋ทฐ๋ถํฐ ์ํ์ด ๋๋ค.
- ์ธ๋ผ์ธ ๋ทฐ์ ์ ์๋ SELECT ์นผ๋ผ์ ๋ฉ์ธ ์ฟผ๋ฆฌ์ ์ฌ์ฉํ ์ ์๋ค.
EX) SELECT EMPNO FROM
(SELECT EMPNO, ENAME FROM EMP ORDER BY MGR)
- ์ธ๋ผ์ธ ๋ทฐ์ ๋ฏธ์ ์๋ ์นผ๋ผ์ ๋ฉ์ธ์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๋ค.
EX) SELECT MGR FROM
(SELECT EMPNO, ENAME FROM EMP ORDER BY MGR)
VIEW
- ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉฐ, ๋จ์ง ๋ทฐ ์ ์๋ง์ ๊ฐ์ง๊ณ ์๋ค.
- ๋ทฐ ์ ์๋ฅผ ์ฐธ์กฐํด์ DBMS ๋ด๋ถ์ ์ผ๋ก ์ง์๋ฅผ ์ฌ์์ฑ
- ORACLE์ ๊ฒฝ์ฐ USERS_VIEWS์์ ํด๋น ๋ทฐ์ ์ฌ์ฉ๋ SQL์ ํ์ธํ ์ ์๋ค.
- ํ ์ด๋ธ ๋ฟ๋ง ์๋๋ผ ์ด๋ฏธ ์กด์ฌํ๋ ๋ทฐ๋ฅผ ์ฐธ์กฐํด์๋ ์์ฑํ ์ ์์
์์)
CREATE VIEW V_PLAYER_TEAM AS
SELECT P.PLAYER_NAME, P.POSITION, P.BACK_NO, P.TEAM_ID, T.TEAM_NAME
FROM PLAYER P, TEAM T
WHERE P.TEAM_ID=T.TEAM_ID;
๋ทฐ์ ์ฅ์
- ๋ ๋ฆฝ์ฑ : ํ ์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ทฐ๋ฅผ ์ฌ์ฉํ๋ ์์ฉํ๋ก๊ทธ๋จ์ ๋ณ๊ฒฝํ์ง ์์๋ ๋จ
- ํธ๋ฆฌ์ฑ : ๋ณต์กํ ์ง์๋ฅผ ๋จ์ํ๊ฒ ์์ฑ
- ๋ณด์์ฑ : ๋ทฐ ์์ฑ์ ์ํ๋ ์ ๋ณด๋ ์จ๊ธฐ๊ณ ์์ฑํ ์ ์์.
์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ
- ํ ํ, ํ ์นผ๋ผ๋ง์ ๋ฐํํ๋ ์๋ธ์ฟผ๋ฆฌ์ด๋ค.
- ์ค์นผ๋ผ ์๋ธ์ฟผ๋ฆฌ๋ ์นผ๋ผ์ ์ธ ์ ์๋ ๋๋ถ๋ถ์ ๊ณณ์์ ์ฌ์ฉํ ์ ์๋ค.
- ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค๋ฉด ๊ฐ๋ฅํ๋ฉด ์กฐ์ธ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ด ์ข์
- ๊ฐ๋ฅํ ์์น : SELECT LIST ํญ๋ชฉ, ํจ์์ ์ธ์, WHERE์ ์ ์กฐ๊ฑด, ORDER BY ์
์์)
'SQLD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ณผ๋ชฉII SQL ๊ธฐ๋ณธ ๋ฐ ํ์ฉ 2์ฅ - 6์ WINDOW FUNCTION (0) | 2021.05.25 |
---|---|
๊ณผ๋ชฉII SQL ๊ธฐ๋ณธ ๋ฐ ํ์ฉ 2์ฅ - 5์ GROUP FUNCTION (0) | 2021.05.25 |
๊ณผ๋ชฉII SQL ๊ธฐ๋ณธ ๋ฐ ํ์ฉ 2์ฅ - 3์ ๊ณ์ธตํ ์ง์์ ์ ํ ์กฐ์ธ (0) | 2021.05.24 |
๊ณผ๋ชฉ II SQL ๊ธฐ๋ณธ ๋ฐ ํ์ฉ 2์ฅ - 2์ ์งํฉ ์ฐ์ฐ์ (0) | 2021.05.24 |
๊ณผ๋ชฉII SQL ๊ธฐ๋ณธ ๋ฐ ํ์ฉ 2์ฅ - 1์ ํ์ค ์กฐ์ธ (0) | 2021.05.24 |