๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค MySQL ๋ฌธ์ œํ’€๊ธฐ(LEVEL 3,4)

BLOยท2022๋…„ 8์›” 31์ผ
1
post-thumbnail

MySQL ์‹ฌํ™”๋ฌธ์ œ ํ’€์–ด๋ณด๊ธฐ๐Ÿ”

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๋งํฌ๐Ÿ‘€ https://school.programmers.co.kr/learn/challenges

์ฐธ๊ณ ) ์‹ฌํ™”๋ฌธ์ œ๋Š” ํ•˜๋‚˜ ํ‘ธ๋Š”๋ฐ ๊ธฐ๋ณธ ํ•œ์‹œ๊ฐ„ ๊ฑธ๋ ธ๋‹ต๋‹ˆ๋‹ค?

๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์ง€์ €๋ถ„ํ•œ ๊ณผ์ •์€ ๋ชจ๋‘ ์ƒ๋žตํ•œ ํด-๋ฆฐํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‹ˆ ์™œ ๋‚˜๋Š” ์•ˆ๋ผ ํ•˜๋ฉด์„œ SQL์— ์ขŒ์ ˆํ•˜์ง€ ๋ง๊ณ 
๋‹ค๊ฐ™์ด ํ™”์ดํŒ…๐Ÿ”ฅ

์ €๋„ ์ชผ๋ ™์ด์ง€๋งŒ ์—ด์‹ฌํžˆ ํ’€์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.
์•„ ์‘์• ์—์š”.

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV3 ๋ฌธ์ œ ไธญ

๐Ÿ“ŒORDER BY์™€ LIMIT์œผ๋กœ ์ƒ์œ„ n๊ฐœ ์กฐํšŒํ•˜๊ธฐ


SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
    LEFT JOIN ANIMAL_OUTS O
    ON I.ANIMAL_ID = O.ANIMAL_ID -- ์ž…์–‘์„ ๊ฐ€์ง€ ๋ชปํ•œ ๋™๋ฌผ ๊ตฌํ•˜๊ธฐ
WHERE O.DATETIME IS NULL 
ORDER BY I.DATETIME -- ๋ณดํ˜ธ ์‹œ์ž‘์ผ ์ˆœ์œผ๋กœ ์ •๋ ฌ
LIMIT 3;

์ผ๋‹จ ์ด ๋ฌธ์ œ๋Š” ์ž…์–‘์„ ๊ฐ€์ง€ ๋ชปํ•œ ๋™๋ฌผ ์ค‘
๋ณดํ˜ธ๋ฅผ ์˜ค๋ž˜ ํ•œ 3๋งˆ๋ฆฌ์˜ ๋™๋ฌผ์„ ๊ตฌํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ์งœ์•ผ ํ•œ๋‹ค.

๋จผ์ € ์ž…์–‘์„ ๊ฐ€์ง€ ๋ชปํ•œ ๋™๋ฌผ์„ ์กฐํšŒํ•˜๋ ค๋ฉด

  • INํ…Œ์ด๋ธ”(๋ณดํ˜ธ ๋™๋ฌผ)์—๋Š” ์žˆ๋Š”๋ฐ OUT(์ž…์–‘๋œ ๋™๋ฌผ)ํ…Œ์ด๋ธ”์—๋Š” ์—†๋Š” ๋™๋ฌผ
  • ์ฆ‰ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ INํ…Œ์ด๋ธ”์— OUTํ…Œ์ด๋ธ”์„ LEFT JOIN ํ•ด์„œ
  • OUTํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ์ด NULL ๊ฐ’์ธ ๋™๋ฌผ์„ ๊ตฌํ•˜๋ฉด ๋œ๋‹ค.

์ด ๋•Œ ๋‚˜๋Š” DATETIME์„ ๊ธฐ์ค€์œผ๋กœ OUTํ…Œ์ด๋ธ”์— ์žˆ๋‹ค ์—†๋‹ค๋ฅผ ํŒ๋‹จํ–ˆ๋Š”๋ฐ,
OUTํ…Œ์ด๋ธ”์˜ ANIMAL_ID ๋“ฑ๋„ ์—†๊ธฐ์— ์•„๋ฌด๊ฑฐ๋‚˜ ์จ๋„ ๋ฌด๋ฐฉํ•œ ๋“ฏ ํ•˜๋‹ค.
๋‹จ, NULL๊ฐ’์ด ์žˆ๋Š” NAME ์ปฌ๋Ÿผ์€ ๊ฒฐ๊ณผ๊ฐ’์ด ๋‹ค๋ฅด๊ฒŒ ๋‚˜์˜ค๋”๋ผ...

์ด๋ ‡๊ฒŒ ๊ตฌํ•ด์ง„ ์ž…์–‘์„ ๊ฐ€์ง€ ๋ชปํ•œ ๋™๋ฌผ ๋ชฉ๋ก์„

  • ORDER BY๋กœ ๋ณดํ˜ธ ์‹œ์ž‘์ผ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.
  • ์ดํ›„ LIMIT 3์œผ๋กœ ์˜ค๋ž˜ ๋ณดํ˜ธํ•œ ์ˆœ์œผ๋กœ 3๋งˆ๋ฆฌ ๋™๋ฌผ์„ ๊ตฌํ•œ๋‹ค.

+) ์ •๋ ฌ์„ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ํ•˜๋ฉด ํ•˜์œ„ N๊ฐœ๋„ ๋ฝ‘์„ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“Œ์„œ๋ธŒ์ฟผ๋ฆฌ์™€ GROUP BY ์ฐจ์ด?


SELECT ID, NAME, HOST_ID
FROM PLACES P1
WHERE HOST_ID IN (SELECT HOST_ID
                 FROM PLACES P2
                 GROUP BY HOST_ID
                 HAVING COUNT(*) >= 2) 
ORDER BY ID;

์ด ๋ฌธ์ œ๋Š” ์žฅ์†Œ๋ฅผ 2๊ฐœ ์ด์ƒ ์†Œ์œ ํ•œ ํ—ค๋น„์œ ์ €์˜
ํ˜ธ์ŠคํŠธ ์•„์ด๋””์™€ ์žฅ์†Œ ์•„์ด๋””๋ฅผ ์กฐํšŒํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

์ฒ˜์Œ์—๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋„ฃ์ง€ ์•Š๊ณ 
๊ทธ๋ƒฅ ํ˜ธ์ŠคํŠธ ์•„์ด๋””๋กœ GROUP BY ํ•˜๋ฉด ์žฅ์†Œ ์ซ™ ๋‚˜์˜ค์ง€ ์•Š์„๊นŒ?
ํ•˜๋Š” ์•ˆ์ผํ•œ ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋‹ค ^.^

ํ•˜์ง€๋งŒ SQL์€ ์‰ฝ์ง€ ์•Š์ง€...

๊ทธ๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๋ฉด 2๊ฐœ ์ด์ƒ์˜ ๊ณต๊ฐ„์„ ๋“ฑ๋กํ•œ ํ—ค๋น„์œ ์ €์˜
์žฅ์†Œ ์ค‘ ์ƒ์œ„ 1๊ฐœ๋งŒ ์กฐํšŒ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์กฐ๊ฑด์„ ๋‘๊ฐœ๋กœ ๋‚˜๋ˆ ์„œ,

  • ์žฅ์†Œ๋ฅผ ๋‘ ๊ฐœ ์ด์ƒ ๊ฐ€์ง„ ํ˜ธ์ŠคํŠธ์˜ ์•„์ด๋”” ๋ชฉ๋ก์„ ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๊ตฌํ•ด์„œ
  • WHERE์ ˆ์— ๊ฐ€์ ธ์™€์„œ ํ•ด๋‹น ํ˜ธ์ŠคํŠธ์˜ ์žฅ์†Œ๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์™”๋‹ค.

๐Ÿ“ŒDATEDIFFํ•จ์ˆ˜ ํ™œ์šฉํ•˜๊ธฐ


SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
    INNER JOIN ANIMAL_INS I
    ON O.ANIMAL_ID = I.ANIMAL_ID 
  -- IN, OUTํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ DATETIME ๊ฐ„ ์ฐจ๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) DESC 
  -- ๋ณดํ˜ธ๊ธฐ๊ฐ„์ด ๊ธด ์ˆœ์œผ๋กœ ์ •๋ ฌ ํ›„
LIMIT 2; -- ์ƒ์œ„ ๋‘ ๋งˆ๋ฆฌ๋งŒ ์กฐํšŒํ•œ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์ž…์–‘ ๊ฐ„ ๋™๋ฌผ ์ค‘ ๋ณดํ˜ธ๊ธฐ๊ฐ„,
์ฆ‰ ๋ณดํ˜ธ์‹œ์ž‘์ผ๊ณผ ์ž…์–‘์ผ์˜ ์ฐจ์ด๊ฐ€ ๊ฐ€์žฅ ๊ธด ๋‘ ๋งˆ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์ฒซ ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•˜๊ฒŒ,
์ž…์–‘ ๊ฐ„ ๋™๋ฌผ์„ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” OUTํ…Œ์ด๋ธ”๊ณผ INํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜๋ฉด ๋œ๋‹ค.
๊ทธ๋Ÿฌ๋ฉด OUTํ…Œ์ด๋ธ”์— ์—†๋Š”(์ž…์–‘์„ ๊ฐ€์ง€ ๋ชปํ•œ) ๋™๋ฌผ๋“ค์€
INNER JOIN์ด๋ผ๋Š” ์กฐ๊ฑด ๋•Œ๋ฌธ์— ๋ชฉ๋ก์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋œ๋‹ค.

์ฒ˜์Œ์— ํ’€ ๋•Œ๋Š” DATEDIFF ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ์ฟผ๋ฆฌ๋ฅผ
SELECT๋‚˜ FROM์— ์„œ๋ธŒ์ฟผ๋ฆฌ๋กœ ๋„ฃ์–ด๋ณด๋ ค๊ณ  ์• ๋ฅผ ์ผ์œผ๋‚˜...
๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๋ฐ”๋ณด๊ฐ™์€ ์ง“์ด์—ˆ๋‹ค.
ใ…‹ใ…‹

์–ด์ฐจํ”ผ DATEDIFF๋ฅผ ํ‘œ์‹œํ•ด์•ผํ•˜๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๊ณ 
๊ฐ’์„ ๊ตฌํ•ด์„œ ์ •๋ ฌํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ ORDER BY์— ์ง‘๊ณ„ํ•จ์ˆ˜๋กœ ๋„ฃ์—ˆ๋‹ค.
(๋จธ์“ฑ)

์—ฌ๊ธฐ์„œ๋„ ORDER BY์™€ LIMIT ์œผ๋กœ ์ƒ์œ„ ๋‘ ๋งˆ๋ฆฌ๋ฅผ ์กฐํšŒํ–ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค LV4 ๋ฌธ์ œ ไธญ

๐Ÿ“ŒFROM์ ˆ์—์„œ ๋‘ ํ…Œ์ด๋ธ” ์กฐ์ธํ•˜๊ธฐ


SELECT DISTINCT A.CART_ID
FROM (SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME = 'Milk') A
    INNER JOIN -- ๊ต์ง‘ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋„ˆ์กฐ์ธ ์‚ฌ์šฉ
    (SELECT CART_ID, NAME
    FROM CART_PRODUCTS
    WHERE NAME = 'Yogurt') B
    ON A.CART_ID=B.CART_ID
ORDER BY CART_ID

์ด ๋ฌธ์ œ๋Š” ์šฐ์œ ์™€ ์š”๊ฑฐํŠธ๊ฐ€ ํ•จ๊ป˜ ๋“ค์–ด๊ฐ€ ์žˆ๋Š”
์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ์•„์ด๋””๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

๋งŒ๋งŒํ•œ IN() ๊ฐ™์€ ๊ฒƒ๋„ ์จ๋ดค๋Š”๋ฐ ์•ˆ๋˜๊ณ ,
์ „์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ•˜๋‚˜ ๋ง‰๋ง‰ํ–ˆ๋‹ค.

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ƒ๊ฐํ•ด๋ณด๋˜ ์™€์ค‘

  • Milk๋ฅผ ๋‹ด์€ CART_ID๋ฅผ ์กฐํšŒํ•œ ํ…Œ์ด๋ธ”์„ A๋กœ ํ•˜๊ณ 
  • Yogurt๋ฅผ ๋‹ด์€ CART_ID๋ฅผ ์กฐํšŒํ•œ ํ…Œ์ด๋ธ”์„ B๋กœ ํ•ด์„œ
  • ๋‘˜์˜ ๊ต์ง‘ํ•ฉ. ์ฆ‰ ์ด๋„ˆ์กฐ์ธ์œผ๋กœ ์—ฎ์œผ๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค๋ฉด์„œ ํ’€๋ ธ๋‹ค.

๊ทผ๋ฐ ๊ทธ์™€์ค‘์— CART_ID๋Š” ๊ฐ™์€๋ฐ ID๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด์„œ
CART_ID๊ฐ€ ๋‘๊ฐœ์”ฉ ๋“ค์–ด๊ฐ€์žˆ๊ธฐ๋„ ํ•˜๋”๋ผ.
๊ทธ๋ž˜์„œ DISTINCT๋กœ ์ค‘๋ณต๋„ ์ œ๊ฑฐํ•ด์ฃผ์—ˆ๋‹ค. ์‰ฝ์ง€ ์•Š๋„ค...

LEVEL 3,4 ๋„ ์–ด์ฐŒ์ €์ฐŒ ํ’€๊ธด ํ–ˆ์ง€๋งŒ
์ด๋Ÿฐ ๋…ผ๋ฆฌ์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋‚ด๋Š” ๊ฒŒ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ์–ด๋ ต๋‹ค.

๊ทผ๋ฐ ๋ญ ์–ด๋–กํ•ด ํ•ด์•ผ์ง€๐Ÿ˜ฅ

๊ฒฐ๋ก  : ๋‹ค ์šธ์—ˆ๋‹ˆ? ์ด์ œ ํ•  ์ผ์„ ํ•˜์ž.

0๊ฐœ์˜ ๋Œ“๊ธ€