songining
article thumbnail

(์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์œ„์น˜)

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 ์ ˆ 

์˜ˆ์‹œ)