์œˆ๋„ํ•จ์ˆ˜

 

์œˆ๋„ํ•จ์ˆ˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์˜จ๋ผ์ธ์—์„œ ๋ถ„์„ ์ฒ˜๋ฆฌ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‹ค์ฐจ์›์—์„œ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ํ• ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹คํ•˜์—ฌ OLAP(OnLine Analytical Processing)ํ•จ์ˆ˜๋ผ๊ณ ๋„ ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.

 

SELECT ์ปฌ๋Ÿผ, ํ•จ์ˆ˜๋ช…(ํŒŒ๋ผ๋ฏธํ„ฐ) OVER ([PARTITION BY ์ปฌ๋Ÿผ])

[ORDER BY ์ปฌ๋Ÿผ] 

FROM ํ…Œ์ด๋ธ”๋ช…

 

์œˆ๋„ ํ•จ์ˆ˜๋Š” SELECT ๋’ค์— ์‚ฌ์šฉ๋˜๋ฉฐ ์œ„์—์„œ ๋‚˜์˜จ PARTITION BY๋Š” ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•˜๋Š” ์ฟผ๋ฆฌ๋กœ ์„ ํƒํ•ญ๋ชฉ์ž…๋‹ˆ๋‹ค.

 

์œˆ๋„ํ•จ์ˆ˜๋Š” ์ˆœ์œ„ํ•จ์ˆ˜, ํ–‰์ˆœ์„œ ํ•จ์ˆ˜, ๊ทธ๋ฃน๋‚ด ๋น„์œจํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ˆœ์œ„ํ•จ์ˆ˜

์ˆœ์œ„ํ•จ์ˆ˜๋Š” ๋ ˆ์ฝ”๋“œ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

- RANK : ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ˆœ์œ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋™์ผ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋™์ผ ์ˆœ์œ„๋ฅผ ์ค€ ๋’ค ๋‹ค์Œ๊ฐ’์ด ํ›„์ˆœ์œ„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

๋งŒ์•ฝ 4๋ช… ์ค‘ 2๋“ฑ์ด 2๋ช…์ด๋ฉด 1๋“ฑ , 2๋“ฑ, 2๋“ฑ, 4๋“ฑ ์ด๋ ‡๊ฒŒ ์ˆœ์œ„๊ฐ€ ๋งค๊ฒจ์ง‘๋‹ˆ๋‹ค.

 

- DENSE_RANK : ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ˆœ์œ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋™์ผ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๋™์ผ ์ˆœ์œ„๋ฅผ ์ค€ ๋’ค RANK์™€๋Š” ๋‹ฌ๋ฆฌ ๋‹ค์Œ ๊ฐ’์ด ํ›„์ˆœ์œ„๋กœ ๋„˜์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ 4๋ช… ์ค‘ 2๋“ฑ์ด 2๋ช…์ด๋ฉด 1๋“ฑ , 2๋“ฑ, 2๋“ฑ, 3๋“ฑ ์ด๋ ‡๊ฒŒ ์ˆœ์œ„๊ฐ€ ๋งค๊ฒจ์ง‘๋‹ˆ๋‹ค.

 

- ROW_NUMBER : ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•œ ์ˆœ์œ„๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋กœ ๋™์ผ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์กด์žฌํ•ด๋„ ์—ฐ์†๊ฐ’์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.

๋งŒ์•ฝ 4๋ช… ์ค‘ 2๋“ฑ์ด 2๋ช…์ด๋ฉด 1๋“ฑ , 2๋“ฑ, 3๋“ฑ, 4๋“ฑ ์ด๋ ‡๊ฒŒ ์ˆœ์œ„๊ฐ€ ๋งค๊ฒจ์ง‘๋‹ˆ๋‹ค.

 

์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•  SW์—ฐ๋ด‰ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ์—ฐ๋ด‰
๊น€์—์ด 5000
๋ฐ•๋น„ 6000
์ด์”จ 5000
ํ•œ๋”” 4000

 

SELECT ์ด๋ฆ„, ์—ฐ๋ด‰,

          RANK( ) OVER (ORDER BY ์—ฐ๋ด‰ DESC) RANK,

          DENSE_RANK( ) OVER (ORDER BY ์—ฐ๋ด‰ DESC) DENSE_RANK,

          ROW_NUMBER( ) OVER (ORDER BY ์—ฐ๋ด‰ DESC) ROW_NUMBER, 

FROM SW์—ฐ๋ด‰

ORDER BY ์—ฐ๋ด‰ DESC;

 

์ด๋ฆ„ ์—ฐ๋ด‰ RANK DENSE_RANK ROW_NUMBER
๋ฐ•๋น„ 6000 1 1 1
๊น€์—์ด 5000 2 2 2
์ด์”จ 5000 2 2 3
ํ•œ๋”” 4000 4 3 4

 

ํ–‰์ˆœ์„œ ํ•จ์ˆ˜

ํ–‰์ˆœ์„œ ํ•จ์ˆ˜๋Š” ๋ ˆ์ฝ”๋“œ ๋‚ด์—์„œ ๊ฐ€์žฅ ๋จผ์ €๋‚˜์˜ค๊ฑฐ๋‚˜ ๊ฐ€์žฅ ๋’ค์— ๋‚˜์˜ค๋Š” ๊ฐ’ ๋˜๋Š” ์ดํ›„์— ๋‚˜์˜ฌ ๊ฐ’๊ณผ ์ด์ „์— ๋‚˜์˜จ ๊ฐ’ ๋“ฑ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

- FIRST_VALUE : ์œˆ๋„์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

 

- LAST_VALUE : ์œˆ๋„์—์„œ ๊ฐ€์žฅ ๋‚˜์ค‘์— ๋‚˜์˜ค๋Š” ๊ฐ’์„ ์ฐพ์Šต๋‹ˆ๋‹ค.

 

- LAG : ์œˆ๋„์—์„œ ์ด์ „์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

- LEAD : ์œˆ๋„์—์„œ ์ดํ›„์˜ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•  SW์—ฐ๋ด‰ ํ…Œ์ด๋ธ”์€ ์•„๊นŒ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ์—ฐ๋ด‰
๊น€์—์ด 5000
๋ฐ•๋น„ 6000
์ด์”จ 5000
ํ•œ๋”” 4000

 

SELECT ์ด๋ฆ„, ์—ฐ๋ด‰,

          FIRST_VALUE(์ด๋ฆ„) OVER (ORDER BY ์—ฐ๋ด‰ DESC) FIRST_VALUE,

          LAST_VALUE(์ด๋ฆ„) OVER (ORDER BY ์—ฐ๋ด‰ DESC) LAST_VALUE,

          LAG(์ด๋ฆ„) OVER (ORDER BY ์—ฐ๋ด‰ DESC) LAG,

          LEAD(์ด๋ฆ„) OVER (ORDER BY ์—ฐ๋ด‰ DESC) LEAD, 

FROM SW์—ฐ๋ด‰

ORDER BY ์—ฐ๋ด‰ DESC;

 

์ด๋ฆ„ ์—ฐ๋ด‰ FIRST_VALUE LAST_VALUE LAG LEAD
๋ฐ•๋น„ 6000 ๋ฐ•๋น„ ํ•œ๋””   ๊น€์—์ด
๊น€์—์ด 5000 ๋ฐ•๋น„ ํ•œ๋”” ๋ฐ•๋น„ ์ด์”จ
์ด์”จ 5000 ๋ฐ•๋น„ ํ•œ๋”” ๊น€์—์ด ํ•œ๋””
ํ•œ๋”” 4000 ๋ฐ•๋น„ ํ•œ๋”” ํ•œ๋””  

 

๊ทธ๋ฃน ๋‚ด ๋น„์œจ ํ•จ์ˆ˜

๊ทธ๋ฃน ๋‚ด ๋น„์œจ ํ•จ์ˆ˜๋Š” ๋ฐฑ๋ถ„์œจ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋“ฑ ํ†ต๊ณ„๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

- RATIO_TO_REPORT : ์ฃผ์–ด์ง„ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜์—ฌ ํ–‰ ๊ฐ’์˜ ์ƒ๋Œ€์ ์ธ ๋น„์œจ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ด๋ฉฐ ์ดํ•ฉ์€ 1์ด ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ํ–‰์˜ ๊ฒฐ๊ณผ ๊ฐ’์€ 0์—์„œ 1์‚ฌ์ด์˜ ๊ฐ’์ด ๋ฉ๋‹ˆ๋‹ค.

 

- PERCENT_RANK : ์ฃผ์–ด์ง„ ๊ฒฐ๊ณผ ๊ฐ’์—์„œ ๊ฐ€์žฅ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ฐ’์„ 0, ๊ฐ€์žฅ ๋Šฆ๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฐ’์„ 1๋กœํ•˜์—ฌ ํ–‰์˜ ์ˆœ์„œ๋ฅผ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋„ ๊ฒฐ๊ณผ ๊ฐ’์ด 0์—์„œ 1์‚ฌ์ด๊ฐ€ ๋‚˜์˜ต๋‹ˆ๋‹ค.

 

SW์—ฐ๋ด‰ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง€๊ณ  ๊ทธ๋ฃน๋‚ด ๋น„์œจ ํ•จ์ˆ˜๋ฅผ ์•Œ์•„๋ด…์‹œ๋‹ค.

์ด๋ฆ„ ์—ฐ๋ด‰
๊น€์—์ด 5000
๋ฐ•๋น„ 6000
์ด์”จ 5000
ํ•œ๋”” 4000

 

SELECT ์ด๋ฆ„, ์—ฐ๋ด‰,

          RATIO_TO_REPORT( ) OVER (ORDER BY ์—ฐ๋ด‰ DESC) RATIO_TO_REPORT,

          PERCENT_RANK( ) OVER (ORDER BY ์—ฐ๋ด‰ DESC) PERCENT_RANK,

FROM SW์—ฐ๋ด‰

ORDER BY ์—ฐ๋ด‰ DESC;

 

์ด๋ฆ„ ์—ฐ๋ด‰ RATIO_TO_REPORT PERCENT_RANK
๋ฐ•๋น„ 6000 0.3 0
๊น€์—์ด 5000 0.25 0.25
์ด์”จ 5000 0.25 0.25
ํ•œ๋”” 4000 0.2 1

→ ๋ฐ•๋น„์˜ RATIO_TO_REPORT๋Š” ๋ฐ•๋น„์˜ ์—ฐ๋ด‰์ธ 6000์„ ์ด ์—ฐ๋ด‰์ธ 20000์œผ๋กœ ๋‚˜๋ˆˆ ๊ฐ’(6000/20000=0.3)์ด ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  PERCENT_RANK์˜ ๊ฒฝ์šฐ ํ›„์ˆœ์œ„๋กœ ๋„˜์–ด๊ฐ€๋Š” RANK๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ˆœ์„œ๋ณ„ ๋ฐฑ๋ถ„์œ„๋ฅผ ๊ตฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฃนํ•จ์ˆ˜

 

๊ทธ๋ฃนํ•จ์ˆ˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ํ–‰์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปฌ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์ปฌ๋Ÿผ ๊ฐ’์— ๋”ฐ๋ผ์„œ ๊ทธ๋ฃนํ™” ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋ฃนํ•จ์ˆ˜๋Š” ROLLUP, CUBE, GROUPING SETS์ด ์„ธ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋ˆ ์ง‘๋‹ˆ๋‹ค.

 

ROLLUPํ•จ์ˆ˜

ROLLUPํ•จ์ˆ˜๋Š” ์ค‘๊ฐ„ ์ง‘๊ณ„ ๊ฐ’์„ ์‚ฐ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ทธ๋ฃนํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

์ตœ์ข… ๊ฒฐ๊ณผ ๊ฐ’์œผ๋กœ๋Š” ์ง€์ •ํ–ˆ๋˜ ์ปฌ๋Ÿผ์˜ ์ˆ˜๋ณด๋‹ค ํ•˜๋‚˜ ํฐ ๋ ˆ๋ฒจ์˜ ์ค‘๊ฐ„ ์ง‘๊ณ„๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

ROLLUP์€ ์ง€์ •๋œ ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด์„œ ๊ณ„์ธต๋ณ„๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์„œ์— ์˜ํ–ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ROLLUP์˜ ๊ฒฐ๊ณผ๋„ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

SELECT ์ปฌ๋Ÿผ, ๊ทธ๋ฃนํ•จ์ˆ˜

FROM ํ…Œ์ด๋ธ”๋ช…

[WHERE ์กฐ๊ฑด]

GROUP BY ์ปฌ๋Ÿผ ROLLUP ์ปฌ๋Ÿผ

[HAVING ์กฐ๊ฑด]

[ORDER BY ์ปฌ๋Ÿผ];

 

ROLLUP์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ROLLUP์„ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

๋‹ค์Œ์€ ํšŒ์‚ฌ ํ…Œ์ด๋ธ”๋กœ ๋ถ€์„œ๋ณ„๋กœ ์—ฐ๋ด‰์ด ๋‚˜์™€์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์„œ ์ง์œ„ ์—ฐ๋ด‰
IT ๋ถ€์žฅ 4000
IT ๋ถ€์žฅ 4000
IT ์ฐจ์žฅ 3000
IT ๊ณผ์žฅ 2500
๊ธฐํš ๋ถ€์žฅ 3800
๊ธฐํš ์ฐจ์žฅ 2800

์ด ํ…Œ์ด๋ธ”์„ ROLLUP์„ ์ด์šฉํ•ด ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

 

SELECT ๋ถ€์„œ, ์ง์œ„, SUM(์—ฐ๋ด‰)

FROM ํšŒ์‚ฌ

GROUP BY ROLLUP(๋ถ€์„œ, ์ง์œ„);

 

๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋ถ€์„œ์™€ ์ง์œ„๊ฐ€ ๊ฐ™์€ ์‚ฌ๋žŒ์˜ ์—ฐ๋ด‰์˜ ํ•ฉ์— ๋Œ€ํ•œ ์ง‘๊ณ„์™€ ๋ถ€์„œ์— ๋Œ€ํ•œ ์—ฐ๋ด‰ํ•ฉ, ์ „์ฒด ์—ฐ๋ด‰์— ๋Œ€ํ•œ ํ•ฉ์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด ๋ถ€์„œ์™€ ์ง์œ„๊ฐ€ ๊ฐ™์€ ์‚ฌ๋žŒ์˜ ์—ฐ๋ด‰์˜ ํ•ฉ์— ๋Œ€ํ•œ ์ง‘๊ณ„์™€ ๋ถ€์„œ์— ๋Œ€ํ•œ ์—ฐ๋ด‰ํ•ฉ, ์ „์ฒด ์—ฐ๋ด‰์— ๋Œ€ํ•œ ํ•ฉ์ด ๋‚˜์˜ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

IT๋ถ€์„œ์˜ ๋ถ€์žฅ ์ง์œ„๋ฅผ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด 2๋ช…์ธ๋ฐ ๋‘˜๋‹ค ๊ฐ๊ฐ ์—ฐ๋ด‰์ด 4000์ด๋ฏ€๋กœ ๋‘๋ฒˆ์งธ ํ–‰์˜ ์—ฐ๋ด‰์˜ ํ•ฉ์ด 8000์ด ๋ฉ๋‹ˆ๋‹ค. ๋ถ€์„œ๋ณ„ ์ง์œ„์— ๋Œ€ํ•œ ์ง‘๊ณ„๊ฐ€ ๋๋‚˜๋ฉด ๋ถ€์„œ์˜ ๋ชจ๋“  ์—ฐ๋ด‰์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ณ , ๊ทธ๋งˆ์ €๋„ ๋๋‚˜๋ฉด ์ดํ•ฉ์„ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๋ถ€์„œ ์ง์œ„ SUM(์—ฐ๋ด‰)
IT ๋ถ€์žฅ 8000
IT ์ฐจ์žฅ 3000
IT ๊ณผ์žฅ 2500
IT   13500
๊ธฐํš ๋ถ€์žฅ 3800
๊ธฐํš ์ฐจ์žฅ 2800
๊ธฐํš   6600
    20100

 

CUBEํ•จ์ˆ˜

CUBEํ•จ์ˆ˜๋Š” ๊ฒฐํ•ฉ์ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ’์— ๋Œ€ํ•œ ๋‹ค์ฐจ์› ์ง‘๊ณ„๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ทธ๋ฃนํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋Š”๋ฐ์—๋Š” ์šฉ์ดํ•˜์ง€๋งŒ ์—ฐ์‚ฐ์ด ๋งŽ์•„ ์‹œ์Šคํ…œ์— ๋ถ€๋‹ด์„ ์ค๋‹ˆ๋‹ค.  

 

SELECT ์ปฌ๋Ÿผ, ๊ทธ๋ฃนํ•จ์ˆ˜

FROM ํ…Œ์ด๋ธ”๋ช…

[WHERE ์กฐ๊ฑด]

GROUP BY ์ปฌ๋Ÿผ CUBE ์ปฌ๋Ÿผ

[HAVING ์กฐ๊ฑด]

[ORDER BY ์ปฌ๋Ÿผ];

 

์˜ˆ์ œ๋ฅผ ํ†ตํ•ด CUBEํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

์•„๊นŒ ์ด์šฉํ–ˆ๋˜ ํšŒ์‚ฌ ํ…Œ์ด๋ธ”๋กœ CUBE์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด ๋ด…์‹œ๋‹ค.

๋ถ€์„œ ์ง์œ„ ์—ฐ๋ด‰
IT ๋ถ€์žฅ 4000
IT ๋ถ€์žฅ 4000
IT ์ฐจ์žฅ 3000
IT ๊ณผ์žฅ 2500
๊ธฐํš ๋ถ€์žฅ 3800
๊ธฐํš ์ฐจ์žฅ 2800

 

SELECT ๋ถ€์„œ, ์ง์œ„, SUM(์—ฐ๋ด‰)

FROM ํšŒ์‚ฌ

GROUP BY CUBE(๋ถ€์„œ, ์ง์œ„);

 

 ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๋ฉด CUBE์˜ ์ปฌ๋Ÿผ์ธ ๋ถ€์„œ์™€ ์ง์œ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜์— ๋Œ€ํ•ด์„œ ์—ฐ๋ด‰์˜ ํ•ฉ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์„œ ์ง์œ„ SUM(์—ฐ๋ด‰)
    20100
  ๋ถ€์žฅ 11800
  ์ฐจ์žฅ 5800
  ๊ณผ์žฅ 2500
IT ๋ถ€์žฅ 8000
IT ์ฐจ์žฅ 3000
IT ๊ณผ์žฅ 2500
IT   13500
๊ธฐํš ๋ถ€์žฅ 3800
๊ธฐํš ์ฐจ์žฅ 2800
๊ธฐํš   6600

 

GROUPING SETSํ•จ์ˆ˜

GROUPING SETSํ•จ์ˆ˜๋Š” ์ง‘๊ณ„ ๋Œ€์ƒ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ฃนํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์ˆœ์„œ๊ฐ€ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ROLLUP๊ณผ CUBE์™€๋Š” ๋‹ฌ๋ฆฌ ์ˆœ์„œ๊ฐ€ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.  

 

SELECT ์ปฌ๋Ÿผ, ๊ทธ๋ฃนํ•จ์ˆ˜

FROM ํ…Œ์ด๋ธ”๋ช…

[WHERE ์กฐ๊ฑด]

GROUP BY ์ปฌ๋Ÿผ GROUPING SETS ์ปฌ๋Ÿผ

[HAVING ์กฐ๊ฑด]

[ORDER BY ์ปฌ๋Ÿผ];

 

 ํšŒ์‚ฌ ํ…Œ์ด๋ธ”๋กœ GROUPING SETS์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ด ๋ด…์‹œ๋‹ค.

๋ถ€์„œ ์ง์œ„ ์—ฐ๋ด‰
IT ๋ถ€์žฅ 4000
IT ๋ถ€์žฅ 4000
IT ์ฐจ์žฅ 3000
IT ๊ณผ์žฅ 2500
๊ธฐํš ๋ถ€์žฅ 3800
๊ธฐํš ์ฐจ์žฅ 2800

 

SELECT ๋ถ€์„œ, ์ง์œ„, SUM(์—ฐ๋ด‰)

FROM ํšŒ์‚ฌ

GROUP BY GROUPING SETS(๋ถ€์„œ, ์ง์œ„)

 

 ๋‹ค์Œ ์ฟผ๋ฆฌ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋กœ ๊ฐ ๋ถ€์„œ๋ณ„ ์—ฐ๋ด‰์˜ ํ•ฉ๊ณผ ์ง์œ„๋ณ„ ์—ฐ๋ด‰์˜ ํ•ฉ์„ ๊ฒฐ๊ณผ๋กœ ์–ป์„์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ€์„œ ์ง์œ„ SUM(์—ฐ๋ด‰)
    20100
  ๋ถ€์žฅ 11800
  ์ฐจ์žฅ 5800
  ๊ณผ์žฅ 2500
IT   13500
๊ธฐํš   6600

 

 

์ง‘๊ณ„ํ•จ์ˆ˜

 

์ง‘๊ณ„ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ํ–‰๋˜๋Š” ์ „์ฒด ํ–‰์œผ๋กœ ๋ถ€ํ„ฐ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

 

์ง‘๊ณ„ํ•จ์ˆ˜๋Š” SELECT๋ฌธ ๋˜๋Š” HAVING์—์„œ ์‚ฌ์šฉ ๋ฉ๋‹ˆ๋‹ค.

 

SELECT๋ฌธ์€ ์ตœ์ข… ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ฌ ์ปฌ๋Ÿผ๊ฐ’์„ ๋‚˜์—ดํ•˜๊ฑฐ๋‚˜ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , HAVING๋ฌธ์€ GROUP BY๋กœ ๊ทธ๋ฃนํ™” ํ•  ๋Œ€์ƒ์˜ ์ปฌ๋Ÿผ์„ ์ค€ ๋’ค ๊ทธ๋ฃนํ™”๋œ ํ›„์˜ ์กฐ๊ฑด์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 

 

HAVING๋ฌธ๊ณผ WHERE๋ฌธ์˜ ์“ฐ์ž„์ƒˆ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ HAVING๋ฌธ์€ ๊ทธ๋ฃนํ™” ๋œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์กฐ๊ฑด์„ ์ง€์ •ํ•˜๋ฉฐ ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

SELECT ์ปฌ๋Ÿผ, ์ง‘๊ณ„ํ•จ์ˆ˜

FROM ํ…Œ์ด๋ธ”๋ช…

[WHERE ์กฐ๊ฑด]

GROUP BY ์ปฌ๋Ÿผ

[HAVING ์กฐ๊ฑด, ์ง‘๊ณ„ํ•จ์ˆ˜]

 

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ง‘๊ณ„ํ•จ์ˆ˜์˜ ์ข…๋ฅ˜์™€ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

์ง‘๊ณ„ํ•จ์ˆ˜์—์„œ ์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•  ํ•™์ƒ ํ…Œ์ด๋ธ”์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ด๋ฆ„ ๊ตญ์–ด ์˜์–ด
๊น€์—์ด 100 80
๋ฐ•๋น„ 50 100
์ด์”จ 70 80
ํ•œ๋”” 90 60

 

- COUNT : ์—ฌ๋Ÿฌ ํ–‰์ด ์žˆ๋Š” ์ค„ ์ˆ˜

SELECT COUNT(*)

FROM ํ•™์ƒ;

→ ํ•™์ƒํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๋ชจ๋“  ํ•™์ƒ์˜ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๋Š” SQL์ฟผ๋ฆฌ๋ฌธ์ด๋‹ค.

COUNT(*)
4

SELECT COUNT(์ด๋ฆ„)

FROM ํ•™์ƒ

WHERE ๊ตญ์–ด >= 90;

→ ํ•™์ƒํ…Œ์ด๋ธ”์— ์žˆ๋Š” ๊ตญ์–ด ์ ์ˆ˜๊ฐ€ 90์  ์ด์ƒ์ธ ํ•™์ƒ์˜ ์ˆซ์ž๋ฅผ ๊ตฌํ•˜๋Š” ์ฟผ๋ฆฌ๋ฌธ์ด๋‹ค.

COUNT(์ด๋ฆ„)
2

 

- SUM : ์—ฌ๋Ÿฌ ํ–‰์ด ์žˆ๋Š” ์„ ํƒ๋œ ์ปฌ๋Ÿผ ๊ฐ„์˜ ํ•ฉ๊ณ„

SELECT SUM(๊ตญ์–ด), SUM(์˜์–ด)

FROM ํ•™์ƒ;

→ ํ•™์ƒํ…Œ์ด๋ธ”์˜ ๊ตญ์–ด ์ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋”ํ•œ ๊ฐ’๊ณผ ์˜์–ด ์ ์ˆ˜๋ฅผ ๋ชจ๋‘ ๋”ํ•œ๊ฐ’์„ ๊ฐ๊ฐ ๊ตฌํ•œ๋‹ค.

SUM(๊ตญ์–ด) SUM(์˜์–ด)
310 320

 

- AVG : ์—ฌ๋Ÿฌ ํ–‰์ด ์žˆ๋Š” ์„ ํƒ๋œ ์ปฌ๋Ÿผ ๊ฐ„์˜ ํ‰๊ท 

SELECT AVG(๊ตญ์–ด), AVG(์˜์–ด)

FROM ํ•™์ƒ;

→ ํ•™์ƒํ…Œ์ด๋ธ”์˜ ๊ตญ์–ด ์ ์ˆ˜์˜ ํ‰๊ท ๊ณผ ์˜์–ด ์ ์ˆ˜์˜ ํ‰๊ท ์„ ๊ฐ๊ฐ ๊ตฌํ•œ๋‹ค.

AVG(๊ตญ์–ด) AVG(์˜์–ด)
77.5 80

 

- MAX : ์—ฌ๋Ÿฌ ํ–‰์ด ์žˆ๋Š” ์„ ํƒ๋œ ์ปฌ๋Ÿผ ์ค‘ ์ตœ๋Œ€๊ฐ’ 

SELECT MAX(๊ตญ์–ด), MAX(์˜์–ด)

FROM ํ•™์ƒ;

→ ํ•™์ƒํ…Œ์ด๋ธ”์˜ ๊ตญ์–ด ์ ์ˆ˜์™€ ์˜์–ด ์ ์ˆ˜์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ฐ๊ฐ ์•Œ๋ ค์ค€๋‹ค.

MAX(๊ตญ์–ด) MAX(์˜์–ด)
100 100

 

- MIN : ์—ฌ๋Ÿฌ ํ–‰์ด ์žˆ๋Š” ์„ ํƒ๋œ ์ปฌ๋Ÿผ ์ค‘ ์ตœ์†Ÿ๊ฐ’

SELECT MIN(๊ตญ์–ด), MIN(์˜์–ด)

FROM ํ•™์ƒ;

→ ํ•™์ƒํ…Œ์ด๋ธ”์˜ ๊ตญ์–ด ์ ์ˆ˜์™€ ์˜์–ด ์ ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ๊ฐ๊ฐ ์•Œ๋ ค์ค€๋‹ค.

MIN(๊ตญ์–ด) MIN(์˜์–ด)
50 60

 

- STDDEV : ์—ฌ๋Ÿฌ ํ–‰์˜ ์„ ํƒ๋œ ์ปฌ๋Ÿผ ๊ฐ„์˜ ํ‘œ์ค€ํŽธ์ฐจ

 

- VARIAN : ์—ฌ๋Ÿฌ ํ–‰์˜ ์„ ํƒ๋œ ์ปฌ๋Ÿผ ๊ฐ„์˜ ๋ถ„์‚ฐ

 

ํ‘œ์ค€ํŽธ์ฐจ์™€ ๋ถ„์‚ฐ์˜ ๊ฒฝ์šฐ๋Š” ์ž์ฃผ ์“ฐ์ด์ง€ ์•Š์œผ๋ฏ€๋กœ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ ๋‹ค๋ฅธ ์ง‘๊ณ„ํ•จ์ˆ˜๋“ค๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํŠธ๋ฆฌ๊ฑฐ

 

ํŠธ๋ฆฌ๊ฑฐ๋Š” ์ง€์ •๋œ ํ…Œ์ด๋ธ”์— ์‚ฝ์ž…, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ž๋™์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

 

ํŠธ๋ฆฌ๊ฑฐ๋Š” ์–ธ์ œ ์‹คํ–‰๋˜๋Š”์ง€์— ๋”ฐ๋ผ ๋‘๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ ๋ฉ๋‹ˆ๋‹ค.

 

๋ฐ์ดํ„ฐ ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธธ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋˜๋Š” ํ–‰ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์žˆ๊ณ , ํ•œ๋ฒˆ ๋งŒ ์‹คํ–‰์ด๋˜๋Š” ๋ฌธ์žฅ ํŠธ๋ฆฌ๊ฑฐ๋กœ ๋‚˜๋ˆ ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋˜ํ•œ ๋‹ค๋ฅธ ์ ˆ์ฐจํ˜• SQL์ธ ํ”„๋กœ์‹œ์ €๋‚˜ ์‚ฌ์šฉ์ž ์ •์˜ํ•จ์ˆ˜์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ์™ธ๋ถ€ ๋ณ€์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ํŠน์ง•์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ ํŠธ๋ฆฌ๊ฑฐ์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ด…์‹œ๋‹ค.

 

 

ํŠธ๋ฆฌ๊ฑฐ์˜ ์„ ์–ธ๋ถ€ (DECLARE)์—์„œ๋Š” ํŠธ๋ฆฌ๊ฑฐ์˜ ์ด๋ฆ„๊ณผ ๋ณ€์ˆ˜, ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋“ฑ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.


CREATE TRIGGER PUT_EMPLOYEE_HIST

 

CREATE TRIGGER์„ ์ด์šฉํ•ด PUT_EMPLOYEE_HIST๋ผ๋Š” ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์ƒ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

 

๋‹ค์Œ์€ ํŠธ๋ฆฌ๊ฑฐ์—์„œ๋งŒ ๋‚˜ํƒ€๋‚˜๋Š” ํŠน์ง•์ธ ์ด๋ฒคํŠธ๋ถ€ (EVENT)์ž…๋‹ˆ๋‹ค.

 

์ด๋ฒคํŠธ๋ถ€์—์„œ๋Š” ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์ „(BEFORE)์— ์‹คํ–‰๋˜๋Š”์ง€ ๋๋‚œ ํ›„(AFTER)์— ์‹คํ–‰๋˜๋Š”์ง€๋ฅผ ์ •ํ•˜๋Š” ํƒ€์ด๋ฐ๊ณผ INSERT, UPDATE, DELETE ์ค‘ ์–ด๋–ค SQL ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚ ์ง€๋ฅผ ๋ช…์‹œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

 

AFTER UPDATE OR DELETE
ON EMPLOYEE
FOR EACH ROW

 

๋‹ค์Œ ์ฝ”๋“œ๋Š” EMPLOYEE์˜ ์ˆ˜์ • ๋ฐ ์‚ญ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ์— PUT_EMPLOYEE_HIST ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์ด๋ฒคํŠธ๋ฅผ ์ง€์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. 

 

 

๋‹ค์Œ์œผ๋กœ๋Š” ์‹œ์ž‘๋ถ€(BEGIN)์™€ ์ข…๋ฃŒ๋ถ€(END)์ž…๋‹ˆ๋‹ค. 

 

๋‹ค๋ฅธ ์ ˆ์ฐจํ˜• SQL๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹œ์ž‘๋ถ€์™€ ์ข…๋ฃŒ๋ถ€๋Š” ๋‹ค์ˆ˜์˜ ์‹คํ–‰์„ ์ œ์–ดํ•˜๋Š” ๊ธฐ๋ณธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์‹œ์ž‘๋ถ€๊ฐ€ ๋‚˜์˜ค๋ฉด ์ข…๋ฃŒ๋ถ€๋กœ ๋งˆ๋ฌด๋ฆฌ ์ง€์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

 

BEGIN์€ ์„ ์–ธ๋ถ€์˜ ๋’ค์— ์˜ค๋ฉฐ ์„ ์–ธ๋ถ€๋ฅผ ์ œ์™ธํ•œ ํ”„๋กœ์‹œ์ €์˜ ๋ชจ๋“  ๊ตฌ์กฐ๋“ค์€ BEGIN๊ณผ END์‚ฌ์ด์— ์ •์˜๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.  

 

 

์ œ์–ด๋ถ€ (CONTROL)๋Š”  ์กฐ๊ฑด๋ฌธ์ธ IF๋ฌธ๊ณผ CASE๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ฌธ์žฅ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

 

 

ํŠธ๋ฆฌ๊ฑฐ์˜ SQL์—์„œ๋Š” SELECT, INSERT, DELETE, UPDATE์™€ ๊ฐ™์€ DML์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๊ฐ€๋” DDL๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ ์ œ์–ด๋ถ€์™€ SQL์„ ๊ฐ™์ด ์‚ฌ์šฉํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. 

 

IF UPDATING
 THEN
    INSERT INTO EMPLOYEE_HIST(EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_STATUS)
    VALUES ( :OLD. EMPLOYEE_ID, :NEW.EMPLOYEE_NAME, "๋ถ€์„œ์ด๋™");

ELSIF DELETING
  THEN
    INSERT INTO EMPLOYEE_HIST(EMPLOYEE_ID, EMPLOYEE_NAME, EMPLOYEE_DEPT)
    VALUES ( :OLD.EMPLOYEE_ID, :OLD.EMPLOYEE_NAME, "ํ‡ด์‚ฌ");
END IF;

 

๋‹ค์Œ ์ฝ”๋“œ๋Š” IF๋ฌธ์„ ์ด์šฉํ•˜์—ฌ UPDATE ๋  ๊ฒฝ์šฐ์™€ DELETE๋  ๊ฒฝ์šฐ SQL ์ด๋ฒคํŠธ๋ฅผ ๋ถ„๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

UPDATE๋Š” EMPLOYEE์—์„œ ๊ฐฑ์‹  ์ „ EMPLOYEE_ID์™€ EMPLOYEE_NAME์„ ๊ทธ๋Œ€๋กœ ์“ฐ๊ณ  EMPLOYEE_STATUS๋ฅผ ๋ถ€์„œ์ด๋™์œผ๋กœ EMPLOYEE_HIST์— ์‚ฝ์ž…ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

DELETE๋Š” EMPLOYEE์—์„œ ๊ฐ’์„ ์‚ญ์ œ ์ „์— EMPLOYEE_ID์™€ EMPLOYEE_NAME๋ฅผ ๊ทธ๋Œ€๋กœ ๋„ฃ๊ณ  EMPLOYEE_DEPT์— ํ‡ด์‚ฌ๋ฅผ ๋กœ EMPLOYEE_HIST๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋™์ž‘์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์˜ˆ์™ธ๋ถ€(EXCEPTION)๋Š” BEGIN~END๋ฌธ ์‚ฌ์ด์˜ SQL๋ฌธ์˜ ์‹คํ–‰์— ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ์ฒ˜๋ฆฌ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

 

์˜ˆ์™ธ๋ถ€๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ƒ๋žตํ•ด๋„ ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค.

 

 

ํŠธ๋ฆฌ๊ฑฐ๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ์‹œ ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ๋ณ„ ๋‹ค๋ฅธ ํ˜ธ์ถœ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

+ Recent posts