์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[KB IT's your life 7๊ธฐ] DB ์„ค๊ณ„๋ถ€ํ„ฐ SQL ์‹ค์Šต๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ๊ณผ ๋ชจ๋ธ๋ง ํ›„๊ธฐ

yeye 2026. 5. 29. 13:14

์•ˆ๋…•ํ•˜์„ธ์š”, KB IT's Your Life 7๊ธฐ ๊ธฐ์ž๋‹จ์ž…๋‹ˆ๋‹ค!

์˜ค๋Š˜ ์ •๋ฆฌํ•  ๋‚ด์šฉ์€ DB ์„ค๊ณ„ ๋ถ€ํ„ฐ SQL ์‹ค์Šต๊นŒ์ง€ ์ž…๋‹ˆ๋‹ค!
์ด๋ฒˆ์— SQLD ์‹œํ—˜์„ ๋ณด๋Š”๋ฐ ์—ฌ๊ธฐ์„œ ๋ฐฐ์šฐ๋Š” ๋‚ด์šฉ๋“ค์ด ๋งŽ์ด ๋„์ถค์ด ๋˜๊ณ  ์žฌ๋ฐŒ์—ˆ์–ด์š”!!
๊ทธ๋Ÿผ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”~


DB ๋ชจ๋ธ๋ง

์†”์งํžˆ ์ฒ˜์Œ์—” ๋ชจ๋ธ๋ง? ์‹ถ์—ˆ์–ด์š”.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์—…์ธ๋ฐ ๊ฐ‘์ž๊ธฐ ์„ค๊ณ„ ์–˜๊ธฐ๊ฐ€ ๋‚˜์˜ค๋‹ˆ๊นŒ์š”..

ํ…Œ์ด๋ธ”์„ ๊ทธ๋ƒฅ ๋ง‰ ๋งŒ๋“ค๋ฉด ๋‚˜์ค‘์— ๋‹ค ๊ฐˆ์•„์—Ž์–ด์•ผ ๋˜๋Š”๋ฐ
๊ทธ๋ž˜์„œ ๋ฏธ๋ฆฌ ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ์ง€๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์ •๋ฆฌํ•ด์•ผํ•ด์š”
์ด ๊ณผ์ •์ด ๋ชจ๋ธ๋ง์ด์—์š”.

๋‹จ๊ณ„๊ฐ€ ์„ธ ๊ฐœ ์žˆ๋Š”๋ฐ์š”,
๊ฐœ๋…์  ๋ชจ๋ธ๋ง์€ ๊ณ ๊ฐ์ด๋ž‘ ๊ฐœ๋ฐœ์ž๊ฐ€ "์ด๋Ÿฐ ๋ฐ์ดํ„ฐ ๋งž์ฃ ?" ํ™•์ธํ•˜๋Š” ๋‹จ๊ณ„,
๋…ผ๋ฆฌ์  ๋ชจ๋ธ๋ง์€ ๊ฐœ๋ฐœ์ž๋“ค๋ผ๋ฆฌ ERD ๊ทธ๋ฆผ ๊ทธ๋ ค๊ฐ€๋ฉฐ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ์žก๋Š” ๋‹จ๊ณ„,
๋ฌผ๋ฆฌ์  ๋ชจ๋ธ๋ง์€ ์‹ค์ œ๋กœ CREATE TABLE ๊ฐ™์€ SQL๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„์˜ˆ์š”.


์™œ ํ…Œ์ด๋ธ”์„ ๊ตณ์ด ๋‘ ๊ฐœ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฑฐ์•ผ?

์ด๊ฒŒ ์˜ค๋Š˜ ์ œ์ผ ์ธ์ƒ ๊นŠ์—ˆ๋˜ ํŒŒํŠธ์˜ˆ์š”.

์‡ผํ•‘๋ชฐ ์˜ˆ์ œ๋กœ ์„ค๋ช…ํ•ด์ฃผ์…จ๋Š”๋ฐ์š”, ๊ณ ๊ฐ ์ •๋ณด๋ž‘ ๊ตฌ๋งค ์ด๋ ฅ์„ ํ•œ ํ…Œ์ด๋ธ”์— ๋‹ค ๋„ฃ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๊ตฌ๋งค ์•ˆ ํ•œ ๊ณ ๊ฐ ํ–‰์€ ์˜ค๋ฅธ์ชฝ์ด ํ……ํ…… ๋น„๊ณ , ๊ฐ™์€ ๊ณ ๊ฐ์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‚ฌ๋ฉด ์ด๋ฆ„ยท์ฃผ์†Œยท์—ฐ๋ฝ์ฒ˜๊ฐ€ ์ค‘๋ณต์œผ๋กœ ๊ณ„์† ์Œ“์—ฌ์š”.
๊ฐ•์‚ฌ๋‹˜์ด ์ค‘๋ณต ๋ฐ์ดํ„ฐ์˜ ์ง„์งœ ๋ฌธ์ œ๋Š” ์ˆ˜์ •์ด๋‚˜ ์‚ญ์ œํ•  ๋•Œ๋ผ๊ณ  ํ•˜์…จ์–ด์š”.
์ฃผ์†Œ ํ•˜๋‚˜ ๋ฐ”๋€Œ๋ฉด ๊ทธ ๊ณ ๊ฐ ํ–‰์„ ์ „๋ถ€ ๋‹ค ์ฐพ์•„์„œ ๊ณ ์ณ์•ผ ๋˜๋‹ˆ๊นŒ์š”.

๊ทธ๋ž˜์„œ ํ…Œ์ด๋ธ”์„ ๋‘ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•ด์š”.
๊ณ ๊ฐ ํ…Œ์ด๋ธ”์—” Primary Key ๋ฐฐ์ • (์ค‘๋ณต ์—†์Œ, NULL ๋ถˆ๊ฐ€),
๊ตฌ๋งค ํ…Œ์ด๋ธ”์—” ๊ณ ๊ฐ ํ…Œ์ด๋ธ”์˜ PK๋ฅผ Foreign Key๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ์กฐ๋กœ์š”.

์ด๋ ‡๊ฒŒ ์—ฐ๊ฒฐํ•˜๋ฉด ๊ตฌ๋งค ํ…Œ์ด๋ธ”์—์„œ "๋ˆ„๊ฐ€ ์ƒ€๋ƒ"๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ฃผ์†Œ ๊ฐ™์€ ์ •๋ณด๋Š” ๊ณ ๊ฐ ํ…Œ์ด๋ธ” ํƒ€๊ณ  ๊ฐ€์„œ ์ฐพ์œผ๋ฉด ๋ผ์š”.

๋ถ€๋ชจ ์—†์œผ๋ฉด ์ž์‹๋„ ์—†๋‹ค๋Š” ๋ง๋„ ์˜ค๋Š˜ ์ฒ˜์Œ์œผ๋กœ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ์–ด์š”.
๊ณ ๊ฐ์ด ์—†์œผ๋ฉด ๊ตฌ๋งค ์ด๋ ฅ๋„ ์—†๋Š” ๊ฑฐ๋‹ˆ๊นŒ, ๊ณ ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์‹œ์Šคํ…œ์ด ์ž๋™์œผ๋กœ ๋ง‰์•„์ค€๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ ์š”.
๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด์„œ์š”!


SQL ์‹ค์Šต โ€” SELECT ํŒŒํ—ค์น˜๊ธฐ

์˜คํ›„์—” ์ง์ ‘ ์ฟผ๋ฆฌ ์งœ๋Š” ์‹ค์Šต์ด์—ˆ์–ด์š”.
์˜ค๋Š˜์˜ ์ฃผ์ธ๊ณต์€ SELECT!

SELECT ์ปฌ๋Ÿผ๋ช…
FROM ํ…Œ์ด๋ธ”๋ช…
WHERE ์กฐ๊ฑด
ORDER BY ์ปฌ๋Ÿผ๋ช… DESC
LIMIT 5;

๊ทธ๋ƒฅ ์™ธ์šฐ๋ฉด ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฐ ์ ˆ์ด ์ฒ˜๋ฆฌ๋˜๋Š” ์ˆœ์„œ๊ฐ€ ๋”ฐ๋กœ ์žˆ์–ด์š”.
FROM โ†’ WHERE โ†’ GROUP BY โ†’ HAVING โ†’ SELECT โ†’ ORDER BY ์ด ์ˆœ์„œ์ธ๋ฐ,
์ด๊ฒŒ ๋‚˜์ค‘์— ๋ณ„์นญ(alias)์„ ์–ด๋””์„œ ์“ธ ์ˆ˜ ์žˆ๋Š”์ง€๋ž‘ ์—ฐ๊ฒฐ๋˜๋Š” ์ค‘์š”ํ•œ ํฌ์ธํŠธ์˜ˆ์š”.

์˜ค๋Š˜ ์‹ค์Šตํ•˜๋ฉด์„œ ์ฃผ์˜์‚ฌํ•ญ์œผ๋กœ ๊ณ„์† ๋‚˜์˜จ ๊ฒŒ NULL์ด์—ˆ์–ด์š”.
NULL์€ ์ผ๋ฐ˜ ๋น„๊ต ์—ฐ์‚ฐ์ž๋กœ ๋น„๊ต๊ฐ€ ์•ˆ ๋ผ์š”!
WHERE price = NULL ์ด๋Ÿฐ ๊ฑฐ ์•ˆ ๋˜๊ณ , ๋ฐ˜๋“œ์‹œ IS NULL / IS NOT NULL์„ ์จ์•ผ ํ•ด์š”.
๊ทธ๋ฆฌ๊ณ  AVG, MIN, MAX ๊ฐ™์€ ์ง‘๊ณ„ํ•จ์ˆ˜๋Š” ์ „๋ถ€ NULL์„ ๋ฌด์‹œํ•˜๊ณ  ๊ณ„์‚ฐํ•œ๋‹ค๋Š” ๊ฒƒ๋„ ๊ธฐ์–ตํ•ด๋‘๊ธฐ!

LIKE ์—ฐ์‚ฐ์ž๋„ ์‹ค์Šตํ–ˆ๋Š”๋ฐ, ์•ž๋’ค๋กœ % ๋ถ™์ด๋ฉด ์†๋„๊ฐ€ ์—„์ฒญ ๋А๋ ค์ง„๋‹ค๊ณ  ํ•ด์š”.

WHERE prod_name LIKE '%์•„์ด์Šค%'  -- ๋ฐ์ดํ„ฐ ๋งŽ์•„์ง€๋ฉด ์ง„์งœ ๋А๋ ค์ง 

๋ฐ์ดํ„ฐ ์ฒœ ๊ฑด๋งŒ ๋„˜์–ด๋„ ์ฒด๊ฐ๋œ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ ์š”. ์‹ค์ „์—์„œ๋Š” Elastic Search ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„์„ ์จ์•ผ ํ•œ๋‹ค๊ณ !


GROUP BY

์‚ฌ์šฉ์ž๋ณ„ ๊ตฌ๋งค ๊ธˆ์•ก, ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„ ์ƒํ’ˆ ์ˆ˜ ์ด๋Ÿฐ ๊ฑฐ๋Š”
๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋“ค์„ ๋ฌถ์–ด์„œ ์ง‘๊ณ„ํ•จ์ˆ˜๋กœ ํ†ต๊ณ„๋ฅผ ๋‚ด๋Š” ๊ฑฐ์˜ˆ์š”.

SELECT user_id, SUM(amount * price) AS ์ด๊ตฌ๋งค์•ก
FROM buy
GROUP BY user_id
ORDER BY SUM(amount * price) DESC
LIMIT 1;

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๊ตฌ๋งค์•ก 1๋“ฑ ๊ณ ๊ฐ์„ ๋ฝ‘์„ ์ˆ˜ ์žˆ์–ด์š”.

์ฃผ์˜ํ•  ์ ์ด ์žˆ๋Š”๋ฐ, GROUP BY ์“ธ ๋•Œ SELECT์ ˆ์—” GROUP BY์— ์ฐธ์—ฌํ•œ ์ปฌ๋Ÿผ์ด๋ž‘ ์ง‘๊ณ„ํ•จ์ˆ˜ ๊ฒฐ๊ณผ๋งŒ ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”.
๋‹ค๋ฅธ ์ผ๋ฐ˜ ์ปฌ๋Ÿผ ๋„ฃ์œผ๋ฉด Only FULL GROUP BY Mode ์—๋Ÿฌ๊ฐ€ ๋œจ๊ฑฐ๋“ ์š”.

๊ทธ๋ฆฌ๊ณ  ORDER BY์—์„œ ๋ณ„์นญ์„ ์“ฐ๋ฉด ๋™์ž‘ ์•ˆ ํ•ด์š”.
๋ณ„์นญ์€ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๊ฐ€ ๋‹ค ๋๋‚˜๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜๊ฐˆ ๋•Œ ์ ์šฉ๋˜๋Š” ๊ฑฐ๋ผ์„œ, ORDER BY ์‹œ์ ์—” ์•„์ง ๊ทธ ์ด๋ฆ„์„ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฑฐ์ฃ .
์ฒ˜์Œ์—” ์ด๊ฒŒ ์™œ ์•ˆ ๋˜์ง€? ์‹ถ์—ˆ๋Š”๋ฐ ์ฒ˜๋ฆฌ ์ˆœ์„œ ์ƒ๊ฐํ•˜๋‹ˆ๊นŒ ๋ฐ”๋กœ ์ดํ•ด๋์–ด์š”

LIMIT

LIMIT 5๋Š” ์•ž์—์„œ 5๊ฐœ, LIMIT 10, 5๋Š” 10๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ 5๊ฐœ.
(์—ฌ๊ธฐ์„œ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘์ด์—์š”!)

ํŽ˜์ด์ง€๋„ค์ด์…˜ ํ•  ๋•Œ ๊ผญ ์“ฐ๋Š” ๊ธฐ๋Šฅ์ธ๋ฐ์š”, ์˜ค๋Š˜ ๊ฐ•์‚ฌ๋‹˜์ด ์ธ์ƒ ๊นŠ์€ ์–˜๊ธฐ๋ฅผ ํ•˜์…จ์–ด์š”.
์ฒœ ๊ฑด์งœ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ๊ฐ€์ ธ์™€์„œ ์•ฑ์—์„œ 10๊ฐœ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐœ๋ฐœ์ž๋ž‘,
DB์—์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ 10๊ฐœ๋งŒ ์š”์ฒญํ•˜๋Š” ๊ฐœ๋ฐœ์ž์˜ ์ฐจ์ด๋ผ๊ณ ์š”.


๋„คํŠธ์›Œํฌ ๋น„์šฉ์ด๋ฉฐ ์ฒ˜๋ฆฌ ์†๋„๋ฉฐ ๋‹น์—ฐํžˆ ํ›„์ž๊ฐ€ ํ›จ์”ฌ ๋‚ซ์ฃ .
๊ทผ๋ฐ ์‹ค์ œ๋กœ ์ „์ž์ฒ˜๋Ÿผ ์งœ๋Š” ์‚ฌ๋žŒ์ด ๊ฝค ์žˆ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ ์š”...
๋‚˜์ค‘์— ์ œ๊ฐ€ ๊ทธ๋Ÿฌ์ง€ ์•Š๋„๋ก ๊ผญ ๊ธฐ์–ตํ•ด์•ผ๊ฒ ์–ด์š”!


SELECT๋กœ ํ…Œ์ด๋ธ”์„ ๋š๋”ฑ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฐ๋‹ค๊ณ ?

๋งˆ์ง€๋ง‰์—” ์‹ ๊ธฐํ•œ ๊ธฐ๋ฒ•๋„ ๋ฐฐ์› ์–ด์š”.
SELECT ๊ฒฐ๊ณผ๋กœ ์•„์˜ˆ ์ƒˆ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๊ฒƒ!

CREATE TABLE members AS (
    SELECT emp_no AS user_id, first_name AS name
    FROM employees.employees
    LIMIT 100
);

๋‹ค๋ฅธ DB์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ 100๊ฐœ ๋ฝ‘์•„์„œ ํ…Œ์ŠคํŠธ์šฉ ํšŒ์› ํ…Œ์ด๋ธ” ๋š๋”ฑ ๋งŒ๋“œ๋Š” ๊ฑฐ์˜ˆ์š”.
ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๊ตฌ์ถ•ํ•  ๋•Œ ์ง„์งœ ํŽธํ•˜๊ฒ ๋‹ค ์‹ถ์—ˆ์–ด์š”.

๊ทผ๋ฐ ์ฃผ์˜ํ•  ๊ฒŒ ์žˆ๋Š”๋ฐ, Primary Key, Foreign Key๋Š” ๋ณต์‚ฌ๊ฐ€ ์•ˆ ๋ผ์š”!
๋‚˜์ค‘์— ALTER๋กœ ๋”ฐ๋กœ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๊ณ ์š”.


์˜ค๋Š˜ ํ•˜๋ฃจ ๋ฐฐ์šด ๋‚ด์šฉ์ด ๋งŽ์•˜๋Š”๋ฐ, ์˜์™ธ๋กœ ๋‹ค ์—ฐ๊ฒฐ๋˜๋Š” ๋А๋‚Œ์ด์–ด์„œ ์ดํ•ดํ•˜๊ธฐ ์ข‹์•˜์–ด์š”.
๋ชจ๋ธ๋ง โ†’ ํ…Œ์ด๋ธ” ๋ถ„๋ฆฌ โ†’ SELECT ์‹ค์Šต โ†’ GROUP BY ํ†ต๊ณ„๊นŒ์ง€ ํ•˜๋‚˜์˜ ํ๋ฆ„์ด์—ˆ๋‹ฌ๊นŒ์š”.

๋‹ค์Œ์—” JOIN์ด๋ž‘ ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ•œ๋‹ค๋Š”๋ฐ,
์˜ค๋Š˜ ์‚ด์ง ๋ง›๋ดค์œผ๋‹ˆ๊นŒ ๊ทธ๋‚˜๋งˆ ๋œ ๋ฌด์„ญ๊ฒ ์ฃ ? (์•„๋งˆ๋„)

๊ทธ๋Ÿผ ์ด๋งŒ ๋๋‚ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค
์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹น ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ ๋ด์š”!


์ด๋ฏธ์ง€๋Š” AI๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค