Computer Science ๐Ÿ“š/SQLD

[SQLD] 2๊ณผ๋ชฉ - 2์žฅ. SQL ํ™œ์šฉ

leejaejae 2024. 11. 18. 18:34

์ œ 1์ ˆ ์„œ๋ธŒ์ฟผ๋ฆฌ 

1. ์„œ๋ธŒ์ฟผ๋ฆฌ

  • ํ•˜๋‚˜์˜ SQL๋ฌธ ์•ˆ์˜ SQL ๋ฌธ
  • ๋‹จ์ผํ–‰ ๋˜๋Š” ๋ณต์ˆ˜ํ–‰ ๋น„๊ต ์—ฐ์‚ฐ์ž์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„  ORDER BY ์‚ฌ์šฉ ๋ถˆ๊ฐ€(๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ๋งจ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์—๋งŒ ์œ„์น˜ ๊ฐ€๋Šฅ)
  • ์„œ๋ธŒ์ฟผ๋ฆฌ๋Š” ๋ฉ”์ธ์ฟผ๋ฆฌ์˜ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ(๋ฉ”์ธ์ฟผ๋ฆฌ์—์„  ์„œ๋ธŒ์ฟผ๋ฆฌ์˜ ์นผ๋Ÿผ ์‚ฌ์šฉ๋ถˆ๊ฐ€)

  • ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ SQL ๋ฌธ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณณ
    • SELECT, FROM, WHERE, HAVING, ORDER BY์ ˆ
    • INSERT ๋ฌธ์˜ VALUES์ ˆ
    • UPDATE๋ฌธ์˜ SET์ ˆ
    • DELECT๋ฌธ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

2. ๋™์ž‘๋ฐฉ์‹์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

  • Un-Correlated(๋น„์—ฐ๊ด€) ์„œ๋ธŒ์ฟผ๋ฆฌ: ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ์ฟผ๋ฆฌ ์นผ๋Ÿผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ํ˜•ํƒœ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ. ๋ฉ”์ธ์ฟผ๋ฆฌ์— ๊ฐ’(์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋œ ๊ฒฐ๊ณผ)์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ ์ฃผ๋กœ ์‚ฌ์šฉ
  • Correlated(์—ฐ๊ด€) ์„œ๋ธŒ์ฟผ๋ฆฌ: ์„œ๋ธŒ์ฟผ๋ฆฌ๊ฐ€ ๋ฉ”์ธ์ฟผ๋ฆฌ ์นผ๋Ÿผ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํ˜•ํƒœ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ”์ธ์ฟผ๋ฆฌ๊ฐ€ ๋จผ์ € ์ˆ˜ํ–‰๋˜์–ด ์–ฝํ˜€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ธŒ์ฟผ๋ฆฌ์—์„œ ์กฐ๊ฑด์ด ๋งž๋Š”์ง€ ํ™•์ธํ•˜๊ณ ์ž ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ

3. ๋ฐ˜ํ™˜๋˜๋Š” ๋ฐ์ดํ„ฐ ํ˜•ํƒœ์— ๋”ฐ๋ฅธ ๋ถ„๋ฅ˜

  • Single Row ์„œ๋ธŒ์ฟผ๋ฆฌ(๋‹จ์ผ ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ): ์„œ๋ธŒ์ฟผ๋ฆฌ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ํ•ญ์ƒ 1๊ฑด ์ดํ•˜์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ. ๋‹จ์ผ ํ–‰ ๋น„๊ต ์—ฐ์‚ฐ์ž(=, <, <=, >, >=, <>)์™€ ํ•จ๊ป˜ ์ด์šฉ
  • Multi Row ์„œ๋ธŒ์ฟผ๋ฆฌ(๋‹ค์ค‘ํ–‰ ์„œ๋ธŒ์ฟผ๋ฆฌ): ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฑด์ธ ์„œ๋ธŒ์ฟผ๋ฆฌ. ๋‹ค์ค‘ ํ–‰ ๋น„๊ต ์—ฐ์‚ฐ์ž(IN, ALL, ANY, SOME, EXISTS)์™€ ํ•จ๊ป˜ ์ด์šฉ
    • IN: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ๊ฐ’์ด ํฌํ•จ๋˜๋Š” ์ง€ ํ™•์ธ
    • ALL: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๊ฐ’์„ ๋งŒ์กฑํ•˜๋Š” ์กฐ๊ฑด
    • ANY: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ์— ์กด์žฌํ•˜๋Š” ์–ด๋Š ํ•˜๋‚˜์˜ ๊ฐ’์ด๋ผ๋„ ๋งŒ์กฑํ•˜๋Š” ์กฐ๊ฑด
    • EXISTS: ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ๋งŒ์กฑํ•˜๋Š” ๊ฐ’์ด ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€ ํ™•์ธ ์กฐ๊ฑด
    • SQL>> โ€œ์„ ์ˆ˜๋“ค ์ค‘์— โ€˜์ •ํ˜„์ˆ˜โ€™๋ผ๋Š” ์„ ์ˆ˜๊ฐ€ ์†Œ์†๋˜์–ด ์žˆ๋Š” ํŒ€ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋ผโ€โ€จ
      SELECT REGION_NAME ์—ฐ๊ณ ์ง€๋ช…, TEAM_NAME ํŒ€๋ช…, E_TEAM_NAME ์˜๋ฌธํŒ€๋ช… โ€จFREOM TEAM โ€จ
      WHERE TEAM_ID IN (SELECT TEAM_ID FROM PLAYER WHERE PLAYER_NAME=โ€˜์ •ํ˜„์ˆ˜โ€™)
      ORDER BY TEAM_NAME;

4. ๊ทธ ๋ฐ–์˜ ์œ„์น˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ

  • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ(Scalar Subquery) โ†’ SELECT ์ ˆ์— ์„œ๋ธŒ์ฟผ๋ฆฌ ์‚ฌ์šฉ
    • ํ•œ ํ–‰, ํ•œ ์นผ๋Ÿผ๋งŒ์„ ๋ฐ˜ํ™˜
    • ๊ฐ’ ํ•˜๋‚˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ, SELECT์ ˆ์— ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ
    • ์Šค์นผ๋ผ ์„œ๋ธŒ์ฟผ๋ฆฌ ๋Œ€์‹  JSON์œผ๋กœ ๋™์ผํ•œ ๊ฒฐ๊ณผ ์ถ”์ถœ ๊ฐ€๋Šฅ
  • ๋ทฐ
    • ๊ฐ€์ƒ์˜ ํ…Œ์ด๋ธ”, FROM์ ˆ์— ์‚ฌ์šฉํ•˜๋Š” ๋ทฐ๋Š” ์ธ๋ผ์ธ ๋ทฐ๋ผ๊ณ  ํ•จ. ์‹ค์ œ ๋ฐ์ดํ„ฐX
    • SQL์ด ์‹คํ–‰๋  ๋•Œ๋งŒ ์ž„์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ๋™์  ๋ทฐ (์ผํšŒ์„ฑ)
    • ์ผ๋ฐ˜ ๋ทฐ๊ฐ€ ์ •์  ๋ทฐ, ์ธ๋ผ์ธ ๋ทฐ๋Š” ๋™์  ๋ทฐ
    • ์žฅ์ 
      • ๋…๋ฆฝ์„ฑ: ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ ์ž๋™ ๋ฐ˜์˜
      • ํŽธ๋ฆฌ์„ฑ: ์ฟผ๋ฆฌ๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ์ž‘์„ฑ ๊ฐ€๋Šฅ
      • ๋ณด์•ˆ์„ฑ: ๋ทฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์นผ๋Ÿผ์„ ์ œ์™ธํ•  ์ˆ˜ ์žˆ์Œ

 

์ œ 2์ ˆ ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž

1. ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ…Œ์ด๋ธ”์—์„œ JOIN์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ์ง‘ํ•ฉ ์—ฐ์‚ฐ์ž๋Š” 2๊ฐœ ์ด์ƒ์˜ ์งˆ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋กœ ๋งŒ๋“ฌ
  • SELECT์ ˆ์˜ ์ปฌ๋Ÿผ ์ˆ˜๊ฐ€ ๋™์ผํ•ด์•ผ ํ•˜๊ณ , ๋™์ผ ์œ„์น˜ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ƒํ˜ธ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ

2. ์ง‘ํ•ฉ์—ฐ์‚ฐ์ž ์ข…๋ฅ˜

  • UNION: ์—ฌ๋Ÿฌ ๊ฐœ์˜ SQL๋ฌธ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ํ•ฉ์ง‘ํ•ฉ. ๋ชจ๋“  ์ค‘๋ณต๋œ ํ–‰์€ ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ๋งŒ๋“ฌ
  • UNION ALL: ์ค‘๋ณต ํ–‰๋„ ๊ทธ๋Œ€๋กœ ๊ฒฐ๊ณผ๋กœ ํ‘œ์‹œ(๋‹จ์ˆœํžˆ ๊ฒฐ๊ณผ๋งŒ ํ•ฉ์ณ๋†“์€ ๊ฒƒ).
  • INTERSECT: ์—ฌ๋Ÿฌ ๊ฐœ์˜ SQL ๋ฌธ์˜ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ๊ต์ง‘ํ•ฉ, ์ค‘๋ณต๋œ ํ–‰์€ ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ๋งŒ๋“ฌ
  • EXCEPT: ์•ž์˜ SQL ๋ฌธ์˜ ๊ฒฐ๊ณผ์—์„œ ๋’ค์˜ SQL๋ฌธ ๊ฒฐ๊ณผ์— ๋Œ€ํ•œ ์ฐจ์ง‘ํ•ฉ. ์ค‘๋ณต๋œ ํ–‰์€ ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ๋งŒ๋“ฌ

 

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

1. ๋ฐ์ดํ„ฐ๋ถ„์„ ๊ฐœ์š”

  • ANSI/ISO SQL ํ‘œ์ค€์€ ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ์œ„ํ•ด ๋‹ค์Œ ์„ธ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•จ
  • AGGREGATE FUNTION(์ง‘๊ณ„), GROUP FUNCTION(๊ทธ๋ฃน), WINDOW FUNCTION(์›๋„์šฐ)
  • NULL ๋นผ๊ณ  ์ง‘๊ณ„, ๊ฒฐ๊ณผ๊ฐ’ ์—†๋Š” ํ–‰ ์ถœ๋ ฅ ์•ˆ ํ•จ

2. ROLLUP ํ•จ์ˆ˜

  • ROLLUP์— ์ง€์ •๋œ Grouping Columns์˜ List๋Š” Subtotal์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • Grouping Columns์˜ ์ˆ˜๋ฅผ N์ด๋ผ๊ณ  ํ–ˆ์„ ๋•Œ N+1 Level์˜ Subtotal์ด ์ƒ์„ฑ
  • GROUP BY๋กœ ๋ฌถ์€ ์นผ๋Ÿผ์˜ ์†Œ๊ณ„ ๊ณ„์‚ฐ, ๊ณ„์ธต ๊ตฌ์กฐ
  • GROUP BY ์นผ๋Ÿผ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๊ฒฐ๊ณผ ๊ฐ’ ๋ฐ”๋€œ
  • GROUP BY์˜ ํ™•์žฅ๋œ ํ˜•ํƒœ
    • GROUP BY ROLLUP(A): ์ „์ฒด ํ•ฉ๊ณ„, ์นผ๋Ÿผ A ์†Œ๊ณ„
    • GROUP BY ROLLUP(A, B): ์ „์ฒด ํ•ฉ๊ณ„, ์นผ๋Ÿผ A ์†Œ๊ณ„, ์นผ๋Ÿผ (A, B) ์กฐํ•ฉ ์†Œ๊ณ„
    • GROUP BY ROLLUP(A, B, C): ์ „์ฒด ํ•ฉ๊ณ„, ์นผ๋Ÿผ A ์†Œ๊ณ„, ์นผ๋Ÿผ (A, B) ์กฐํ•ฉ ์†Œ๊ณ„, (A, B, C) ์กฐํ•ฉ ์†Œ๊ณ„ 
    • GROUP BY ROLLUP(A, (B, C): ์ „์ฒด ํ•ฉ๊ณ„, ์นผ๋Ÿผ A ์†Œ๊ณ„, (A, (B, C)) ์กฐํ•ฉ ์†Œ๊ณ„
    • GROUP BY A, ROLLUP(B): A๊ทธ๋ฃน๋ณ„ ์ง‘๊ณ„, A๊ทธ๋ฃน ๋‚ด๋ถ€์—์„œ B์นผ๋Ÿผ๋ณ„ ์ง‘๊ณ„
  • SQL>> โ€œ๋ถ€์„œ๋ช…๊ณผ ์—…๋ฌด๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์‚ฌ์›์ˆ˜์™€ ๊ธ‰์—ฌ ํ•ฉ์„ ์ง‘๊ฒŒํ•œ ์ผ๋ฐ˜์ ์ธ GROUP BY SQL ๋ฌธ์žฅ์„ ์ˆ˜ํ–‰โ€
    SELECT DNAME, JOB, COUNT(*) โ€œTotal Emplโ€, SUM(SAL) โ€œTotal Salโ€
    FROM EMP, DEPT
    WHERE DEPT.DEPTNO = EMP.DEPTNO GROUP BY DNAME.JOB;

3. CUBE ํ•จ์ˆ˜

  • ๊ฒฐํ•ฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฐ‘์— ๋Œ€ํ•œ ๋‹ค์ฐจ์› ์ง‘๊ณ„, ์ˆœ์„œ ๋ฌด๊ด€
    • GROUP BY CUBE(A): ์ „์ฒด ํ•ฉ๊ณ„, ์นผ๋Ÿผ A ์†Œ๊ณ„
    • GROUP BY CUBE(B): ์ „์ฒด ํ•ฉ๊ณ„, ์นผ๋Ÿผ A ์†Œ๊ณ„, ์นผ๋Ÿผ B ์†Œ๊ณ„, ์นผ๋Ÿผ (A, B) ์กฐํ•ฉ ์†Œ๊ณ„

4. GROUPING SETS ํ•จ์ˆ˜

  • ํŠน์ • ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์†Œ๊ณ„ ๊ณ„์‚ฐ, GROUP BY ์นผ๋Ÿผ ์ˆœ์„œ์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ๋‚ด๊ฐ€ ๋ณด๊ณ  ์‹ถ์€ ๊ฒƒ๋งŒ ์†Œ๊ณ„๋ฅผ ์ƒ์„ฑ
    • GROUP BY GROUPING SETS(A): ์นผ๋Ÿผ A ์†Œ๊ณ„
    • GROUP BY GROUPING SETS(A, B): ์นผ๋Ÿผ A ์†Œ๊ณ„, ์นผ๋Ÿผ B ์†Œ๊ณ„
    • GROUP BY GROUPING SETS((A, B)): ์นผ๋Ÿผ (A, B) ์†Œ๊ณ„

 

์ œ 4์ ˆ ์›๋„์šฐ ํ•จ์ˆ˜

1. ์œˆ๋„์šฐ ํ•จ์ˆ˜ (WINDOW FUNCTION)

  • ์—ฌ๋Ÿฌ ํ–‰ ๊ฐ„์˜ ๊ด€๊ณ„ ์ •์˜ ํ•จ์ˆ˜, ์ค‘์ฒฉ ๋ถˆ๊ฐ€

2. ์›๋„์šฐ ํ•จ์ˆ˜ ์ข…๋ฅ˜

  • ์ˆœ์œ„ ํ•จ์ˆ˜
    • RANK: ์ค‘๋ณต ์ˆœ์œ„ ํฌํ•จ
    • DENSE_RANK: ์ค‘๋ณต ์ˆœ์œ„ ๋ฌด์‹œ (์ค‘๊ฐ„ ์ˆœ์œ„๋ฅผ ๋น„์šฐ์ง€ ์•Š์Œ)
    • ROW_NUMBER: ๋‹จ์ˆœํžˆ ํ–‰ ๋ฒˆํ˜ธ ํ‘œ์‹œ, ๊ฐ’์— ๋ฌด๊ด€ํ•˜๊ฒŒ ๊ณ ์œ ํ•œ ์ˆœ์œ„ ๋ถ€์—ฌ
      SQL>> โ€œ์‚ฌ์› ๋ฐ์ดํ„ฐ์—์„œ ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์ˆœ์„œ์™€ JOB ๋ณ„๋กœ ๊ธ‰์—ฌ๊ฐ€ ๋†’์€ ์ˆœ์„œ๋ฅผ ๊ฐ™์ด ์ถœ๋ ฅํ•˜๋ผโ€โ€จ
      SELECT JOB, ENAME, SAL, RANK( )โ€จ
      OVER (ORDER BY SAL DESC) ALL_RANK, RANK( )โ€จ
      OVER (PARTITION BY JOB ORDER BY SAL DESC) JOB_RANK FROM EMP;
  • ์œˆ๋„์šฐ ์ผ๋ฐ˜ ์ง‘๊ณ„ ํ•จ์ˆ˜: SUM, MAX, MIN, AVG ๋“ฑ
  • ํ–‰ ์ˆœ์„œ ํ•จ์ˆ˜
    • FIRST_VALUE / LAST_VALUE ํ•จ์ˆ˜: ์ฒซ ๊ฐ’ / ๋ ๊ฐ’
    • LAG / LEAD: ์ด์ „ ๊ฐ’ / ์ดํ›„ ๊ฐ’
    • LEAD(E, A)๋Š” E์—์„œ A๋ฒˆ์งธ ํ–‰์˜ ๊ฐ’์„ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ๋„ ์“ฐ์ž„ (A์˜ ๊ธฐ๋ณธ๊ฐ’์€ 1)
  • ๋น„์œจ ํ•จ์ˆ˜
    • RATIO_TO_REPORT: ์ „์ฒด SUM ๊ฐ’์— ๋Œ€ํ•œ ํ–‰๋ณ„ ๊ฐˆ๋Ÿผ ๊ฐ’์˜ ๋ฐฑ๋ถ„์œจ์„ ์†Œ์ˆ˜์  ๋ฐ˜ํ™˜
    • PERCENT_RANK: ์ œ์ผ ๋จผ์ € ๋‚˜์˜ค๋Š” ๊ฒƒ 0, ์ œ์ผ ๋Šฆ๊ฒŒ ๋‚˜์˜ค๋Š” ๊ฒƒ 1, ํ–‰์˜ ์ˆœ์„œ๋ณ„ ๋ฐฑ๋ถ„์œจ
    • CUME_DIST: ์ „์ฒด ๊ฑด์ˆ˜์—์„œ ํ˜„์žฌ ํ–‰๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฑด์ˆ˜์— ๋Œ€ํ•œ ๋ˆ„์ ๋ฐฑ๋ถ„์œจ
    • NTILE: ์ „์ฒด ๊ฑด์ˆ˜๋ฅผ ARGUMENT ๊ฐ’์œผ๋กœ N ๋“ฑ๋ถ„ํ•œ ๊ฒฐ๊ณผ

3. ๋ฌธ๋ฒ•

  • SELECT ์œˆ๋„์šฐํ•จ์ˆ˜ (A) OVER (PARTITION BY ์นผ๋Ÿผ ORDER BY์นผ๋Ÿผ ์œˆ๋„์ž‰์ ˆ) FROM ํ…Œ์ด๋ธ”๋ช…

 

์ œ 5์ ˆ TOP N ์ฟผ๋ฆฌ

1. TOP N ์ฟผ๋ฆฌ

  • ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์ „์ฒด ๊ฒฐ๊ณผ์—์„œ ํŠน์ • N ๊ฐœ ์ถ”์ถœ
  • ์œˆ๋„์šฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์œ„ N ๊ฐœ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์œผ๋‚˜ ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ ํ‘œํ˜„์ด ๋ถˆ๊ฐ€
  • ์œˆ๋„์šฐ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•„ํ„ฐ๋งํ•ด์•ผ ํ•จ

  • ORDER BY: ๋ฐ์ดํ„ฐ ์ •๋ ฌ
  • LIMIT: ์ •๋ ฌ๋œ ๊ฒฐ๊ณผ์—์„œ ์ƒ์œ„ N๊ฐœ ํ–‰ ์„ ํƒ
  • FETCH: ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์—์„œ ์ƒ์œ„ N๊ฐœ ํ–‰ ์„ ํƒ
  • TOP(n) WITH TIES: ๊ฐ’์ด ๋™์ผํ•œ ๊ฒฝ์šฐ ํ•จ๊ป˜ ์ถœ๋ ฅ

2. Top N ์ฟผ๋ฆฌ ์ข…๋ฅ˜

  • ROWNUM (Oracle)
    • Oracle์—์„œ ์ˆœ์œ„๊ฐ€ ๋†’์€ N๊ฐœ์˜ ๋กœ์šฐ๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ORDER BY ์ ˆ๊ณผ WHERE ์ ˆ์˜ ROWNUM ์กฐ๊ฑด์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ๋‘ ์กฐ๊ฑด์œผ๋กœ๋Š” ์›ํ•˜๋Š” ๊ฒฐ๊ณผ ์–ป์„ ์ˆ˜ ์—†์Œ
    • ์ •๋ ฌ์„ ๋จผ์ € ํ•˜๊ณ  ๋‚˜์„œ ROWNUM ์„ ์ˆ˜ํ–‰
    • ์ถœ๋ ฅ๋œ ๋ฐ์ดํ„ฐ ๊ธฐ์ค€์œผ๋กœ ํ–‰ ๋ฒˆํ˜ธ ๋ถ€์—ฌ
    • ์ ˆ๋Œ€์ ์ธ ํ–‰ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ๊ฐ€์ƒ์˜ ๋ฒˆํ˜ธ์ด๋ฏ€๋กœ ํŠน์ • ํ–‰์„ ์ง€์ •ํ•  ์ˆ˜ ์—†์Œ ( โ€˜=โ€™ ์—ฐ์‚ฐ ๋ถˆ๊ฐ€)
      • ์ถœ๋ ฅ๋˜๋Š” ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ๋ฐ”๋€œ. ์‹ค์ œ๋กœ๋Š” ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฐ€์งœ ์ปฌ๋Ÿผ.
    • ์ฒซ๋ฒˆ์งธ ํ–‰์ด ์ฆ๊ฐ€ํ•œ ์ดํ›„ ํ• ๋‹น๋˜๋ฏ€๋กœ โ€˜>โ€™ ์—ฐ์‚ฐ ์‚ฌ์šฉ ๋ถˆ๊ฐ€ โ†’ 1์„ ํฌํ•จํ•ด์•ผ ํ•จ (> 0 ์€ ๊ฐ€๋Šฅ, โ‰ฅ 1 ๊ฐ€๋Šฅ)
      • ํ•ญ์ƒ < ์กฐ๊ฑด์ด๋‚˜ <= ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • TOP ( )
    • SQL Server๋Š” TOP ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ„๋„ ์ฒ˜๋ฆฌ ์—†์ด ๊ด€๋ จ ORDER BY ์ ˆ์˜ ๋ฐ์ดํ„ฐ ์ •๋ ฌ ํ›„ ์›ํ•˜๋Š” ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋งŒ ์‰ฝ๊ฒŒ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
    • TOP ์ ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋ฐ˜ํ™˜๋˜๋Š” ํ–‰์˜ ์ˆ˜๋ฅผ ์ œํ•œ
    • WITH TIES ์˜ต์…˜์€ ORDER BY ์ ˆ์˜ ์กฐ๊ฑด ๊ธฐ์ค€์œผ๋กœ TOP N ์˜ ๋งˆ์ง€๋ง‰ ํ–‰์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ์ถ”๊ฐ€ ํ–‰์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์„ ๊ฒฝ์šฐ N+ ๋™์ผ ์ •๋ ฌ ์ˆœ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ง€์ •ํ•˜๋Š” ์˜ต์…˜์ž„.

  • FETCH ์ ˆ
    • ์ถœ๋ ฅ๋  ํ–‰์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๋Š” ์ ˆ
    • ๋‹จ์ผ ์ฟผ๋ฆฌ๋กœ๋„ ์ •๋ ฌ ์ˆœ์„œ๋Œ€๋กœ์˜ ์ƒ์œ„ N ๊ฐœ์— ๋Œ€ํ•œ ๊ฐ’์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Œ.
    • ORACLE 12 C ์ด์ƒ๋ถ€ํ„ฐ ์ œ๊ณต, SQL server ์ง€์›
    • ORDER BY ์ ˆ ๋’ค์— ์‚ฌ์šฉ
    • ORDER BY ์ปฌ๋Ÿผ OFFSET N {ROW | ROWS} โ€จ
      FETCH {FIRST | NEXT} N {ROW | ROWS} ONLY 
      • OFFSET : ๊ฑด๋„ˆ๋›ธ ํ–‰์˜ ์ˆ˜ 
      • FIRST : OFFSET ์„ ์“ฐ์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ N ํ–‰ ์ถœ๋ ฅ
      • NEXT : OFFSET ์„ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ ์ œ์™ธํ•œ ํ–‰ ๋‹ค์Œ๋ถ€ํ„ฐ N ํ–‰ ์ถœ๋ ฅ

 

์ œ 6์ ˆ ๊ณ„์ธตํ˜• ์งˆ์˜์™€ ์…€ํ”„ ์กฐ์ธ

1. ๊ณ„์ธตํ˜• ์งˆ์˜

  • ๊ณ„์ธตํ˜• ์งˆ์˜: ๋™์ผ ํ…Œ์ด๋ธ”์— ๊ณ„์ธต์ ์œผ๋กœ ์ƒ/ํ•˜์œ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ๋ฐ์ดํ„ฐ
  • ํ…Œ์ด๋ธ”์— ๊ณ„์ธตํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ
  • ์—”ํ„ฐํ‹ฐ๋ฅผ ์ˆœํ™˜๊ด€๊ณ„ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋กœ ์„ค๊ณ„ํ•  ๊ฒฝ์šฐ ๊ณ„์ธตํ˜• ๋ฐ์ดํ„ฐ ๋ฐœ์ƒ (์กฐ์ง, ์‚ฌ์›, ๋ฉ”๋‰ด ๋“ฑ)

  • Oracle ๊ณ„์ธตํ˜• ์งˆ์˜

  • START WITH: ๋ฐ์ดํ„ฐ ์ „๊ฐœ ์‹œ์ž‘(๋ฐ์ดํ„ฐ ์ „๊ฐœ: ๋ฐ์ดํ„ฐ ์ฐพ์•„๊ฐ€๊ธฐ)
  • CONNECT BY: ์ž์‹ ๋ฐ์ดํ„ฐ ์ง€์ •
  • PRIOR: CONNECT BY ์ ˆ์—์„œ ์‚ฌ์šฉ (SELECT, WHERE์ ˆ์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
    • PRIOR ์ž์‹=๋ถ€๋ชจ: [๋ถ€๋ชจโ†’์ž์‹] ์ˆœ๋ฐฉํ–ฅ ์ „๊ฐœ, ๋ฆฌํ”„(์ตœํ•˜์œ„) = 1
    • PRIOR ๋ถ€๋ชจ=์ž์‹: [์ž์‹โ†’๋ถ€๋ชจ] ์—ญ๋ฐฉํ–ฅ ์ „๊ฐœ, ๋ฃจํŠธ(์ตœ์ƒ์œ„)=1
  • NOCYCLE: ์ด๋ฏธ ๋‚˜ํƒ€๋‚œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚˜๋Š” ๊ฒƒ์„ CYCLE์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์‚ฌ์ดํด์ด ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ๋Š” ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ๋ฐœ์ƒ โ†’
  • NOCYCLE ์ถ”๊ฐ€ โ†’ ์‚ฌ์ดํด ๋ฐœ์ƒ ์ดํ›„ ๋ฐ์ดํ„ฐ ์ „๊ฐœX
  • ORDER SIBLINGS BY: ๋™์ผํ•œ LEVEL์˜ ๋…ธ๋“œ(ํ˜•์ œ ๋…ธ๋“œ) ์‚ฌ์ด์—์„œ ์ •๋ ฌ ์ˆ˜ํ–‰
  • WHERE: ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ „๊ฐœ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ง€์ •๋œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์ถ”์ถœ

  • ๊ณ„์ธตํ˜• ์งˆ์˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์ƒ ์ปฌ๋Ÿผ
    • LEVEL: ์ „๊ฐœ ๊ณผ์ •์—์„œ ๋ฃจํŠธ ๋ฐ์ดํ„ฐ๋ฉด 1, ๊ทธ ํ•˜์œ„ ๋ฐ์ดํ„ฐ๋ฉด 0. ๋ฃจํ”„์—์„œ ๋ฆฌํ”„๋กœ ๋‚ด๋ ค๊ฐˆ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ฆ๊ฐ€
    • CONNECT_BY_ISLEAF: ์ „๊ฐœ ๊ณผ์ •์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฆฌํ”„๋ฐ์ดํ„ฐ๋ฉด 1, ์•„๋‹˜ 0 
    • CONNECT_BY_ISCYCLE: ์ „๊ฐœ ๊ณผ์ •์—์„œ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐ์ƒ ๋ฐ์ดํ„ฐ๋กœ์„œ ์กด์žฌํ•˜๋ฉด(์ž์‹ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด) 1, ์•„๋‹˜ 0, CYCLE ๊ธฐ๋Šฅ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ๋งŒ ํ™•์ธ ๊ฐ€๋Šฅ
  • ๊ณ„์ธตํ˜• ์งˆ์˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜
    • SYS_CONNECT_BY_PATH: ๋ฃจํŠธ ๋ฐ์ดํ„ฐ๋กœ๋ถ€ํ„ฐ ํ˜„์žฌ ์ „๊ฐœํ•  ๋ฐ์ดํ„ฐ๊นŒ์ง€์˜ ๊ฒฝ๋กœ ํ‘œ์‹œโ€จ์‚ฌ์šฉ๋ฒ•: SYS_CONNECT_BY_PATH(์นผ๋Ÿผ, ๊ฒฝ๋กœ๋ถ„๋ฆฌ์ž)
    • CONNET_BY_ROOT: ํ˜„์žฌ ์ „๊ฐœํ•  ๋ฐ์ดํ„ฐ์˜ ๋ฃจํŠธ ๋ฐ์ดํ„ฐ ํ‘œ์‹œ(๋‹จํ•ญ ์—ฐ์‚ฐ์ž์ž„)โ€จ์‚ฌ์šฉ๋ฒ•: CONNET_BY_ROOT ์นผ๋Ÿผ

  • SQL Server ๊ณ„์ธตํ˜• ์งˆ์˜
    • CTF(Common Table Expression)๋กœ ์žฌ๊ท€ ํ˜ธ์ถœํ•ด ์ƒ์œ„์—์„œ ํ•˜์œ„ ๋ฐฉํ–ฅ ์ „๊ฐœ
    • โ€œโ€ ์•ต์ปค ๋ฉค๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ๋ณธ ๊ฒฐ๊ณผ ์ง‘ํ•ฉ์„ ๋งŒ๋“ค๊ณ  ์ดํ›„ ์žฌ๊ท€ ๋ฉค๋ฒ„๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•จ.

2. ์…€ํ”„ ์กฐ์ธ

  • ๋™์ผ ํ…Œ์ด๋ธ” ์‚ฌ์ด์˜ ์กฐ์ธ, ๋ฐ˜๋“œ์‹œ ํ…Œ์ด๋ธ” ๋ณ„์นญ(Alias)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

 

์ œ 7์ ˆ PIVOT์ ˆ๊ณผ UNPIVOT์ ˆ

  • ์นผ๋Ÿผ์„ ๊ธฐ์ค€์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ–‰์œผ๋กœ ๋‚˜๋‰œ ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰๊ณผ ์—ด์„ ์ „ํ™˜ํ•ด ํ…Œ์ด๋ธ”์„ ์žฌ๊ตฌ์„ฑํ•ด ๋ณด๊ธฐ ํŽธํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ

1. PIVOT ์ ˆ

  • ํŠน์ • ํ–‰์˜ ๊ฐ’์„ ์ƒˆ๋กœ์šด ์—ด๋กœ ๋ฐ˜ํ™˜ํ•ด ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์š”์•ฝํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  • ํ–‰์„ ์—ด๋กœ ๋ฐ”๊ฟˆ, ์ง€์ •๋œ ์นผ๋Ÿผ์˜ ๊ฐ ํ–‰ ์†์„ฑ๊ฐ’๋“ค์ด ์ƒˆ๋กœ์šด ์นผ๋Ÿผ์˜ ํ—ค๋”๊ฐ€ ๋˜๊ณ  ์ด์— ๋งž๊ฒŒ ์ „์ฒด ์†์„ฑ๊ฐ’ ์žฌ๋ฐฐ์น˜

2. UNPIVOT ์ ˆ

  • PIVOT๋œ ์š”์•ฝ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์›๋ž˜์˜ ํ–‰ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜, ์ด ๊ณผ์ •์—์„œ ์—ฌ๋Ÿฌ ์—ด์ด ํ•˜๋‚˜์˜ ์—ด๋กœ ํ•ฉ์ณ์ง€๊ณ  ๊ฐ ๊ฐ’์€ ๋ณ„๋„์˜ ํ–‰์œผ๋กœ ํ‘œ์‹œ
  • ์นผ๋Ÿผ ํ—ค๋”๋“ค์ด ํ•œ ์นผ๋Ÿผ์˜ ๊ฐ ํ–‰ ์†์„ฑ๊ฐ’์ด ๋˜๊ณ  ์ด์— ๋งž๊ฒŒ ์ „์ฒด ์†์„ฑ๊ฐ’ ์žฌ๋ฐฐ์น˜

3. ์˜ˆ์‹œ

  • PIVOT ์ ˆ

  • sales_data ํ…Œ์ด๋ธ”์—์„œ ๊ณ ๊ฐ๋ณ„๋กœ Product A, Product B, Product C์˜ ํŒ๋งค๋Ÿ‰์„ ์ง‘๊ณ„
  • ์ง‘๊ณ„๊ณผ์ •์—์„œ SUM ํ•จ์ˆ˜ ์‚ฌ์šฉํ•ด ๊ฐ ์ œํ’ˆ์˜ ์ด ํŒ๋งค๋Ÿ‰ ๊ณ„์‚ฐ, ์ด๋ฅผ ๊ฐ๊ฐ์˜ ์—ด๋กœ ํ‘œ์‹œ
  • UNPIVOT ์ ˆ

  • [Product A], [Product B], [Product C] ์—ด์ด ํ•˜๋‚˜์˜ Product์—ด๋กœ ํ†ตํ•ฉ, ๊ฐ ๊ฐ’์€ Quantity ์—ด์— ์œ„์น˜

 

์ œ 8์ ˆ ์ •๊ทœ ํ‘œํ˜„์‹

1. ๋ฉ”ํƒ€ ๋ฌธ์ž

  • ๋ฌธ์ž ๊ทธ ์ž์‹ ์ด ๊ฐ€์ง„ ์˜๋ฏธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž

2. ๋ฆฌํ„ฐ๋Ÿด ๋ฌธ์ž

  • ๋ฌธ์ž ์ž์ฒด๊ฐ€ ๊ฐ€์ง„ ์˜๋ฏธ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ์ž, ์ •๊ทœํ‘œํ˜„์‹์—์„œ ํŒจํ„ด ๋งค์นญ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ ์ฒ˜๋ฆฌ๋˜๋Š” ์ทจ์†Œ ๋‹จ์œ„

3. Oracle๊ณผ SQL Server์˜ ์ •๊ทœ์‹ ์ง€์› ์ฐจ์ด

  • Oracle

  • SQL Server

  • PATINDEX ํ•จ์ˆ˜: ์ฐพ๊ณ ์ž ํ•˜๋Š” ๋ฌธ์ž์—ด์„ ๊ฒ€์ƒ‰ ํ›„ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜. ์ •๊ทœ์‹์€ ์•„๋‹ˆ์ง€๋งŒ ์œ ์‚ฌํ•œ ํŒจํ„ด ๋ฌธ์ž์—ด ์ง€์›
  • LIKE ์—ฐ์‚ฐ์ž: PATINDEX์˜ ํŒจํ„ด ๋ฌธ์ž์—ด ์ง€์›