CS/Database

์—…๋ฌด์— ๋ฐ”๋กœ ์“ฐ๋Š” SQL ํŠœ๋‹ 2 - SQL ํŠœ๋‹ ์‹ค์Šต (1)

์ฃผ๋ฐœ2 2024. 10. 8. 15:57
๋ฐ˜์‘ํ˜•

์ง€๋‚œ ํฌ์ŠคํŒ…์—์„œ SQL ํŠœ๋‹ ์ด๋ก ์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์•˜๋Š”๋ฐ์š”, ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์‹ค์ œ ์—ฌ๋Ÿฌ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฟผ๋ฆฌ์˜ ๋ฌธ์ œ์ ์„ ํŒŒ์•…ํ•˜๊ณ , ํŠœ๋‹ํ•˜์—ฌ ๊ฐœ์„ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

(์‹ค์ œ ํŠœ๋‹ ์ „ SQL ๋ฌธ์„ ํ™•์ธํ•˜์—ฌ ๋ฌด์—‡์ด ๋ฌธ์ œ์ธ์ง€ ํŒŒ์•…ํ•ด๋ณด๊ณ , ์ง์ ‘ ๊ฐœ์„ ํ•ด๋ณด๊ณ  ํŠœ๋‹ ํ›„ SQL ๋ฌธ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.)

 

์•…์„ฑ SQL ํŠœ๋‹์œผ๋กœ ์ดˆ๋ณด์ž ํƒˆ์ถœํ•˜๊ธฐ

์‹ค๋ฌด์ ์ธ SQL ํŠœ๋‹ ์ ˆ์ฐจ ์ดํ•ดํ•˜๊ธฐ

1. SQL ๋ฌธ ์‹คํ–‰ ๊ฒฐ๊ณผ & ํ˜„ํ™ฉ ํŒŒ์•…

  • ๊ฒฐ๊ณผ ๋ฐ ์†Œ์š”์‹œ๊ฐ„ ํ™•์ธ
  • ์กฐ์ธ / ์„œ๋ธŒ์ฟผ๋ฆฌ ๊ตฌ์กฐ
  • ๋™๋“ฑ / ๋ฒ”์œ„ ์กฐ๊ฑด

2. ๊ฐ€์‹œ์ 

  • ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜
  • SELECT ์ ˆ ์ปฌ๋Ÿผ ๋ถ„์„
  • ์กฐ๊ฑด์ ˆ ์ปฌ๋Ÿผ ๋ถ„์„
  • ๊ทธ๋ฃจํ•‘ / ์ •๋ ฌ ์ปฌ๋Ÿผ

3. ๋น„๊ฐ€์‹œ์ 

  • ์‹คํ–‰๊ณ„ํš
  • ์ธ๋ฑ์Šค ํ˜„ํ™ฉ
  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ถ”์ด
  • ์—…๋ฌด์  ํŠน์ง•

4. ํŠœ๋‹ ๋ฐฉํ–ฅ ํŒ๋‹จ & ๊ฐœ์„  / ์ ์šฉ (ํ…Œ์ŠคํŠธ)

 

SQL ๋ฌธ ๋‹จ์ˆœ ์ˆ˜์ •์œผ๋กœ ์ฐฉํ•œ ์ฟผ๋ฆฌ ๋งŒ๋“ค๊ธฐ

์œ„ ๋ฐ์ดํ„ฐ ์„ธํŒ…์€ ์•„๋ž˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ sql ํŒŒ์ผ์„ ํ†ตํ•ด ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/7ieon/SQLtune

 

GitHub - 7ieon/SQLtune

Contribute to 7ieon/SQLtune development by creating an account on GitHub.

github.com

 

ํ…Œ์ด๋ธ” ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜

No ํ…Œ์ด๋ธ” ๋ช… ๋ฐ์ดํ„ฐ ๊ฑด์ˆ˜
1 ๊ธ‰์—ฌ 2,844,047
2 ๋ถ€์„œ 9
3 ๋ถ€์„œ๊ด€๋ฆฌ์ž 24
4 ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ 331,603
5 ์‚ฌ์› 300,024
6 ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก 660,000
7 ์ง๊ธ‰ 443,308

 

 

ํ…Œ์ด๋ธ” ์ธ๋ฑ์Šค ๋ชฉ๋ก

ํ…Œ์ด๋ธ”๋ช… ํ‚ค ์œ ํ˜• ํ‚ค๋ช… ํ‚ค_๊ตฌ์„ฑ์—ด
๊ธ‰์—ฌ PK PRIMARY KEY ์‚ฌ์›๋ฒˆํ˜ธ + ์‹œ์ž‘์ผ์ž
INDEX I_์‚ฌ์šฉ์—ฌ๋ถ€ ์‚ฌ์šฉ์—ฌ๋ถ€
๋ถ€์„œ PK PRIMARY KEY ๋ถ€์„œ๋ฒˆํ˜ธ
UNIQUE INDEX UI_๋ถ€์„œ๋ช… ๋ถ€์„œ๋ช…
๋ถ€์„œ๊ด€๋ฆฌ์ž PK PRIMARY KEY ์‚ฌ์›๋ฒˆํ˜ธ + ๋ถ€์„œ๋ฒˆํ˜ธ
INDEX I_๋ถ€์„œ๋ฒˆํ˜ธ ๋ถ€์„œ๋ฒˆํ˜ธ
๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ PK PRIMARY KEY ์‚ฌ์›๋ฒˆํ˜ธ + ๋ถ€์„œ๋ฒˆํ˜ธ
INDEX I_๋ถ€์„œ๋ฒˆํ˜ธ ๋ถ€์„œ๋ฒˆํ˜ธ
์‚ฌ์› PK PRIMARY KEY ์‚ฌ์›๋ฒˆํ˜ธ
INDEX I_์ž…์‚ฌ์ผ์ž ์ž…์‚ฌ์ผ์ž
INDEX I_์„ฑ๋ณ„_์„ฑ ์„ฑ๋ณ„ + ์„ฑ
์‚ฌ์›์ถœ์ž…๊ธฐ๋ก PK PRIMARY KEY ์ˆœ๋ฒˆ + ์‚ฌ์›๋ฒˆํ˜ธ
INDEX I_์ถœ์ž…๋ฌธ ์ถœ์ž…๋ฌธ
INDEX I_์ง€์—ญ ์ง€์—ญ
INDEX I_์‹œ๊ฐ„ ์ž…์ถœ์ž…์‹œ๊ฐ„
์ง๊ธ‰ PK PRIMARY KEY ์‚ฌ์›๋ฒˆํ˜ธ + ์ง๊ธ‰๋ช… + ์‹œ์ž‘์ผ์ž

 

1. ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋ณ€ํ˜•ํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT * 
FROM ์‚ฌ์› 
WHERE SUBSTRING(์‚ฌ์›๋ฒˆํ˜ธ, 1, 4) = 1100
	AND LENGTH(์‚ฌ์›๋ฒˆํ˜ธ) = 5;

  • type = ALL ์ด๋ฏ€๋กœ ํ’€ ์Šค์บ” ๋ฐฉ์‹์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ…Œ์ด๋ธ”์— ๋ฐ”๋กœ ์ ‘๊ทผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‚ฌ์› ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์•ฝ 30๋งŒ๊ฑด ์ด๋ฏ€๋กœ, ๊ฑฐ์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT *
FROM ์‚ฌ์› 
WHERE ์‚ฌ์›๋ฒˆํ˜ธ BETWEEN 11000 AND 11009

  • ๊ธฐ๋ณธ ํ‚ค (์‚ฌ์›๋ฒˆํ˜ธ)๋ฅผ ๊ฐ€๊ณต ์—†์ด ๋ฒ”์œ„ ๊ฒ€์ƒ‰์„ ํ™œ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ํ‚ค, ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

2. ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT IFNULL(์„ฑ๋ณ„, 'NO DATA') AS ์„ฑ๋ณ„, COUNT(1) ๊ฑด์ˆ˜
FROM ์‚ฌ์›
GROUP BY IFNULL(์„ฑ๋ณ„, 'NO DATA');

  • Extra ํ•ญ๋ชฉ์ด Using temporary ์ด๋ฏ€๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT ์„ฑ๋ณ„, COUNT(1) ๊ฑด์ˆ˜
FROM ์‚ฌ์›
GROUP BY ์„ฑ๋ณ„;

  • Extra ํ•ญ๋ชฉ์— ์ž„์‹œ ํ…Œ์ด๋ธ”(Using temporary) ์—†์ด ์ธ๋ฑ์Šค๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ, ์„ฑ๋ณ„ ์ปฌ๋Ÿผ์—๋Š” NOT NULL์ด๊ณ , NULL ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฐ€์ • ํ•˜์— ํŠœ๋‹ํ•œ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

 

3. ํ˜•๋ณ€ํ™˜์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT COUNT(1) FROM ๊ธ‰์—ฌ WHERE ์‚ฌ์šฉ์—ฌ๋ถ€ = 1;

  • filtered ํ•ญ๋ชฉ์ด 10์ด๋ฏ€๋กœ, MySQL ์—”์ง„์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ ์ค‘ 10%๋ฅผ ์ถ”์ถœํ•ด์„œ ์ตœ์ข… ๋ฐ์ดํ„ฐ๋ฅผ ์ถœ๋ ฅํ•จ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • rows์— ํ•ด๋‹นํ•˜๋Š” 2,838,398๊ฑด์˜ ๋ฐ์ดํ„ฐ ์ค‘ 10%์— ํ•ด๋‹นํ•˜๋Š” ์•ฝ 3๋งŒ ๊ฑด์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์ข… ์ถœ๋ ฅ๋˜๋ฆฌ๋ผ๊ณ  ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๋žต 0.3์ดˆ

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT COUNT(1) FROM ๊ธ‰์—ฌ WHERE ์‚ฌ์šฉ์—ฌ๋ถ€ = '1';

  • ์‚ฌ์šฉ์—ฌ๋ถ€ ์—ด์€ ๋ฌธ์žํ˜• char(1) ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์„œ, ์ด์ „ ์ฟผ๋ฆฌ์—์„œ๋Š” ์ˆซ์ž ์œ ํ˜•์œผ๋กœ ์จ์„œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ–ˆ์œผ๋ฏ€๋กœ DBMS ๋‚ด๋ถ€์˜ ๋ฌต์‹œ์  ํ˜•๋ณ€ํ™˜์ด ๋ฐœ์ƒํ–ˆ๊ณ , ๊ทธ ๊ฒฐ๊ณผ ์ธ๋ฑ์Šค๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ณ  ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์Šค์บ”ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋Œ€๋žต 0.02์ดˆ
์˜ค๋ผํด์˜ ๊ฒฝ์šฐ, ํŠน์ • ๋ฒ„์ „ ์ด์ƒ(?) ์—์„œ๋Š” ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ฒŒ ์ž๋™์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์–ด์„œ ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์œผ๋กœ ๊ธฐ์–ต์„ ํ•˜๋Š”๋ฐ, ํ™•์‹คํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

 

4. ๋‹ค์ˆ˜ ์ฟผ๋ฆฌ๋ฅผ UNION ์—ฐ์‚ฐ์ž๋กœ๋งŒ ํ•ฉ์น˜๋Š” ๋‚˜์œ SQL ๋ฌธ

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT 'M' AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'M'
  AND ์„ฑ = 'Baba'

UNION

SELECT 'F' AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'F'
  AND ์„ฑ = 'Baba';

  • id๊ฐ€ 1, 2์ธ ํ–‰์€ ์‚ฌ์› ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด I_์„ฑ๋ณ„_์„ฑ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • id๊ฐ€ 3์ธ ํ–‰์€ id๊ฐ€ 1, 2์ธ ํ–‰์˜ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์„ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ž„์‹œ ํ…Œ์ด๋ธ”(Using temporary)์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ๋‚ด๋ถ€์—์„œ ๊ฐ ๊ฒฐ๊ณผ์˜ UNION ์—ฐ์‚ฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฆฌ๋ผ ์˜ˆ์ธกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT 'M' AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'M'
  AND ์„ฑ = 'Baba'

UNION ALL

SELECT 'F' AS ์„ฑ๋ณ„, ์‚ฌ์›๋ฒˆํ˜ธ
FROM ์‚ฌ์›
WHERE ์„ฑ๋ณ„ = 'F'
  AND ์„ฑ = 'Baba';

  • ๋‹จ์ˆœํžˆ UNION -> UNION ALL ์œผ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
  • ์ฒซ ๋ฒˆ์งธ SELECT์™€ ๋‘ ๋ฒˆ์งธ SELECT์˜ ๊ฒฐ๊ณผ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์ค‘๋ณต ์ œ๊ฑฐํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ํŠœ๋‹ ์ „ ์‹คํ–‰ ๊ณ„ํš๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์„ธ ๋ฒˆ์งธ ์ถ”๊ฐ€ ํ–‰(Using temporary)์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

5. ์ธ๋ฑ์Šค ๊ณ ๋ ค ์—†์ด ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT ์„ฑ, ์„ฑ๋ณ„, COUNT(*) AS ์นด์šดํŠธ
FROM ์‚ฌ์›
GROUP BY ์„ฑ, ์„ฑ๋ณ„;

  • I_์„ฑ๋ณ„_์„ฑ ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๊ณ , ์ž„์‹œ ํ…Œ์ด๋ธ” (Using temporary)์„ ์ƒ์„ฑํ•˜์—ฌ ์„ฑ๊ณผ ์„ฑ๋ณ„์„ ๊ทธ๋ฃจํ•‘ํ•ด ์นด์šดํŠธ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

I_์„ฑ๋ณ„_์„ฑ ์ธ๋ฑ์Šค๋Š” ์„ฑ๋ณ„๊ณผ ์„ฑ ์ˆœ์œผ๋กœ ์ƒ์„ฑ๋œ ์ธ๋ฑ์Šค๋กœ, ์„ฑ๋ณ„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ๋’ค ์„ฑ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT ์„ฑ, ์„ฑ๋ณ„, COUNT(*) AS ์นด์šดํŠธ
FROM ์‚ฌ์›
GROUP BY ์„ฑ๋ณ„, ์„ฑ;

  • ํŠœ๋‹ ํ›„ ์‹คํ–‰ ๊ณ„ํš์—์„œ๋Š” ๋ณ„๋„๋กœ ์ž„์‹œ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. (์ธ๋ฑ์Šค ํ™œ์šฉ, ์„ฑ๋ณ„ -> ์„ฑ)
  • ํŠœ๋‹ ์ „ ์†Œ์š” ์‹œ๊ฐ„(0.3์ดˆ) -> ํŠœ๋‹ ํ›„ ์†Œ์š” ์‹œ๊ฐ„(0.03์ดˆ)

 

6. ๋™๋“ฑ ์กฐ๊ฑด์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT * FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก WHERE ์ถœ์ž…๋ฌธ = 'B';

  • ์ถœ์ž…๋ฌธ B์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ƒ์ˆ˜ ์กฐ๊ฑด์œผ๋กœ ref ํ•ญ๋ชฉ์ด const๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ(660,000) ์ค‘ ์ถœ์ž…๋ฌธ์ด B์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ์•ฝ 50% (300,000)์— ํ•ด๋‹นํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ์œ„ํ•ด ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ๊ณผ์—ฐ ํšจ์œจ์ ์ผ์ง€ ๊ณ ๋ฏผํ•ด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์ธ๋ฑ์Šค ์†์ต๋ถ„๊ธฐ์ )

์นœ์ ˆํ•œ SQL ํŠœ๋‹

 

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT * FROM ์‚ฌ์›์ถœ์ž…๊ธฐ๋ก IGNORE INDEX(I_์ถœ์ž…๋ฌธ) WHERE ์ถœ์ž…๋ฌธ = 'B';

  • ํŠœ๋‹ ํ›„ ์‹คํ–‰ ๊ณ„ํš์€ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”(type: ALL)์œผ๋กœ ์ˆ˜ํ–‰๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฆ‰, ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฑ„ ์•ฝ 66๋งŒ๊ฑด์˜ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์กฐ๊ฑด์ ˆ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๋žœ๋ค ์•ก์„ธ์Šค๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ  ํ•œ ๋ฒˆ์— ๋‹ค์ˆ˜์˜ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋Š” ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ” ๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ์†Œ์š” ์‹œ๊ฐ„์€ 3.5์ดˆ -> 1.2์ดˆ๋กœ ๊ฐ์†Œ

 

7. ์ž‘์€ ํ…Œ์ด๋ธ”์ด ๋จผ์ € ์กฐ์ธ์— ์ฐธ์—ฌํ•˜๋Š”(๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”) ๋‚˜์œ SQL ๋ฌธ

๋ถ€์„œ ํ…Œ์ด๋ธ”: 9๊ฑด, ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ํ…Œ์ด๋ธ”: 33๋งŒ๊ฑด

 

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT ๋งคํ•‘.์‚ฌ์›๋ฒˆํ˜ธ, ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
FROM ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ๋งคํ•‘
JOIN ๋ถ€์„œ ON ๋งคํ•‘.๋ถ€์„œ๋ฒˆํ˜ธ = ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
WHERE ๋งคํ•‘.์‹œ์ž‘์ผ์ž >= '2002-03-01';

  • ๋“œ๋ผ์ด๋น™ ํ…Œ์ด๋ธ”(๋ถ€์„œ), ๋“œ๋ฆฌ๋ธ ํ…Œ์ด๋ธ”(๋ถ€์„œ์‚ฌ์›_๋งคํ•‘) ์ค‘์ฒฉ ๋ฃจํ”„ ์กฐ์ธ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ํ…Œ์ด๋ธ”์˜ rows ํ•ญ๋ชฉ์˜ 40355 ์ˆ˜์น˜๋Š”, SQL ๋ฌธ์„ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ์กฐ์‚ฌํ•œ ํ–‰์˜ ์˜ˆ์ธก ๊ฑด์ˆ˜๋กœ, ์ธ๋ฑ์Šค ์Šค์บ”์„ ํ•˜๊ณ  ๋žœ๋ค ์•ก์„ธ์Šค๋กœ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ MySQL ์—”์ง„์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋ชจ๋“  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด WHERE ์ ˆ์˜ ํ•„ํ„ฐ ์กฐ๊ฑด (์‹œ์ž‘์ผ์ž >= ...) ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT STRAIGHT_JOIN ๋งคํ•‘.์‚ฌ์›๋ฒˆํ˜ธ, ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
FROM ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ๋งคํ•‘
JOIN ๋ถ€์„œ ON ๋งคํ•‘.๋ถ€์„œ๋ฒˆํ˜ธ = ๋ถ€์„œ.๋ถ€์„œ๋ฒˆํ˜ธ
WHERE ๋งคํ•‘.์‹œ์ž‘์ผ์ž >= '2002-03-01';

  • ์ƒ๋Œ€์ ์œผ๋กœ ๊ทœ๋ชจ๊ฐ€ ํฐ ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ํ…Œ์ด๋ธ”์˜ ๋งคํ•‘.์‹œ์ž‘์ผ์ž >= '2002-03-01' ์กฐ๊ฑด์ ˆ์„ ๋จผ์ € ์ ์šฉํ•œ๋‹ค๋ฉด, ์กฐ์ธํ•  ๋•Œ ๋น„๊ต ๋Œ€์ƒ์ด ์ค„์–ด๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์•ฝ 1300๊ฑด)
  • ๋ถ€์„œ์‚ฌ์›_๋งคํ•‘ ํ…Œ์ด๋ธ”์„ ๋จผ์ € ์ ‘๊ทผ(๋“œ๋ผ์ด๋น™)ํ•˜์—ฌ ํ…Œ์ด๋ธ” ํ’€ ์Šค์บ”์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ถ€์„œ ํ…Œ์ด๋ธ”์—๋Š” PK๋กœ ์ ‘๊ทผํ•˜์—ฌ 1๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ ‘๊ทผํ•˜๋Š” ์‹์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • ๊ณ ๋ คํ•ด์•ผ ํ•  ์ ์€, ์‹œ์ž‘์ผ์ž ์—ด์ด ๋ฒ”์œ„ ์กฐ๊ฑด์œผ๋กœ ์ž‘์„ฑ๋˜๋Š”์ง€, ๊ทธ ๋ฒ”์œ„์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋˜ ์ธ๋ฑ์Šค ์†์ต๋ถ„๊ธฐ์ ์„ ๋„˜๊ธฐ์ง€ ์•Š๋Š” ์ •๋„์˜ ๋น„์œจ์ด๋ผ๋ฉด ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

8. ๋ฉ”์ธ ํ…Œ์ด๋ธ”์— ๊ณ„์† ์˜์กดํ•˜๋Š” ๋‚˜์œ SQL ๋ฌธ

์‚ฌ์› ํ…Œ์ด๋ธ”: 30๋งŒ๊ฑด, ๊ธ‰์—ฌ ํ…Œ์ด๋ธ”: 280๋งŒ๊ฑด

 

ํŠœ๋‹ ์ „ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„, ์‚ฌ์›.์„ฑ
FROM ์‚ฌ์›
WHERE ์‚ฌ์›๋ฒˆํ˜ธ > 450000
  AND (
    	SELECT MAX(์—ฐ๋ด‰) 
        FROM ๊ธ‰์—ฌ 
        WHERE ์‚ฌ์›๋ฒˆํ˜ธ = ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ
  ) > 100000;

  • 1: ์‚ฌ์› ํ…Œ์ด๋ธ”์˜ PK๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฒ”์œ„ ์Šค์บ”์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • 2: ๊ธ‰์—ฌ ํ…Œ์ด๋ธ”์— ์ ‘๊ทผํ•˜๋Š”๋ฐ, ์™ธ๋ถ€์˜ ์‚ฌ์› ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์กฐ๊ฑด์ ˆ์„ ์ „๋‹ฌ๋ฐ›์•„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ์„œ๋ธŒ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ธ‰์—ฌ ํ…Œ์ด๋ธ”์€ PK๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
๐Ÿ’ก ๋ณดํ†ต ์‹คํ–‰ ๊ณ„ํš์˜ select_type ํ•ญ๋ชฉ์— DEPENDENT๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ์™ธ๋ถ€ ํ…Œ์ด๋ธ”์—์„œ ์กฐ๊ฑด์ ˆ์„ ๋ฐ›์€ ๋’ค ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ ํŠœ๋‹ ๋Œ€์ƒ์œผ๋กœ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๐Ÿ’ก ์„œ๋ธŒ์ฟผ๋ฆฌ vs ์กฐ์ธ
ํ•„์ž ๊ฒฝํ—˜์ƒ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ณด๋‹ค๋Š” ์กฐ์ธ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํŽธ์ด ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ์œ ๋ฆฌํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

 

ํŠœ๋‹ ํ›„ SQL, ์‹คํ–‰ ๊ณ„ํš

SELECT ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ, ์‚ฌ์›.์ด๋ฆ„, ์‚ฌ์›.์„ฑ
FROM ์‚ฌ์› JOIN ๊ธ‰์—ฌ ON ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ = ๊ธ‰์—ฌ.์‚ฌ์›๋ฒˆํ˜ธ
WHERE ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ > 450000
GROUP BY ์‚ฌ์›.์‚ฌ์›๋ฒˆํ˜ธ
HAVING MAX(๊ธ‰์—ฌ.์—ฐ๋ด‰) > 100000;

  • WHERE ์ ˆ์˜ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ GROUP BY, HAVING ์ ˆ์„ ํ†ตํ•ด ํŠœ๋‹ ์ „ ๊ทธ๋ฃน๋ณ„ ์ตœ๋Œ“๊ฐ’์„ ๊ณ„์‚ฐํ•˜๋„๋ก ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ธ‰์—ฌ ํ…Œ์ด๋ธ”์˜ DEPENDENT SUBQUERY ๋ฐฉ์‹์€ ์ œ๊ฑฐ๋˜๊ณ , ๋‹จ์ˆœ ์กฐ์ธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํšจ์œจ ํ–ฅ์ƒ
  • rows๋Š” ์˜ˆ์ธก๊ฐ’์ด๋ฏ€๋กœ ๋‹จ์ˆœํžˆ rows ๋ฐ์ดํ„ฐ๋กœ ํŠœ๋‹ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

 

์—ฌ๋Ÿฌ ์ƒํ™ฉ์— ๋Œ€ํ•ด SQL ํŠœ๋‹์„ ์ง„ํ–‰ํ•ด ๋ณด์•˜๋Š”๋ฐ์š”, ์‹ค์ œ๋กœ ์ผ์„ ํ•˜๋ฉด์„œ ๋น„์Šทํ•œ ์‚ฌ๋ก€๋ฅผ ๊ฒช์—ˆ๋˜ ์ผ€์ด์Šค๋„ ์žˆ์—ˆ๊ณ , ์ด๋ก ์ ์œผ๋กœ๋งŒ ์•Œ๊ณ  ์žˆ์—ˆ๋˜ ๋‚ด์šฉ์ด๋‚˜, ์ „ํ˜€ ๋ชฐ๋ž๋˜ ๋‚ด์šฉ์— ๋Œ€ํ•ด์„œ๋„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ ์กฐ๊ธˆ ๋” ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด(?) ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ํ† ๋Œ€๋กœ ์ธ๋ฑ์Šค ๋ณ€๊ฒฝ, ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๋ณ€๊ฒฝ ๋ฐ SQL ์žฌ์ž‘์„ฑ ๋“ฑ ์ฟผ๋ฆฌ ํŠœ๋‹์„ ์ˆ˜ํ–‰ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•