๊ด€๋ฆฌ ๋ฉ”๋‰ด

bom's happy life

[SQL ์ฝ”ํ…Œ] ์„œ์šธ์— ์œ„์น˜ํ•œ ์‹๋‹น ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ ๋ณธ๋ฌธ

Algorithm๐Ÿ’Œ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[SQL ์ฝ”ํ…Œ] ์„œ์šธ์— ์œ„์น˜ํ•œ ์‹๋‹น ๋ชฉ๋ก ์ถœ๋ ฅํ•˜๊ธฐ

bompeach 2023. 8. 13. 15:34

Q)

REST_INFO์™€ REST_REVIEW ํ…Œ์ด๋ธ”์—์„œ ์„œ์šธ์— ์œ„์น˜ํ•œ ์‹๋‹น๋“ค์˜ `์‹๋‹น ID, ์‹๋‹น ์ด๋ฆ„, ์Œ์‹ ์ข…๋ฅ˜, ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆ˜, ์ฃผ์†Œ, ๋ฆฌ๋ทฐ ํ‰๊ท  ์ ์ˆ˜๋ฅผ ์กฐํšŒ` ํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๋ฆฌ๋ทฐ ํ‰๊ท ์ ์ˆ˜๋Š” ์†Œ์ˆ˜์  ์„ธ ๋ฒˆ์งธ ์ž๋ฆฌ์—์„œ ๋ฐ˜์˜ฌ๋ฆผ ํ•ด์ฃผ์‹œ๊ณ  ๊ฒฐ๊ณผ๋Š” ํ‰๊ท ์ ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์‹œ๊ณ , ํ‰๊ท ์ ์ˆ˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ฆ๊ฒจ์ฐพ๊ธฐ์ˆ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

 

 

A1) INNER JOIN์‚ฌ์šฉ

-- MYSQL
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, ROUND(AVG(REVIEW_SCORE),2) AS SCORE
FROM REST_INFO I
INNER JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '์„œ์šธ%'
GROUP BY 1,2,3,4,5
ORDER BY SCORE DESC, I.FAVORITES DESC
-- ์œ„์˜ ์ฟผ๋ฆฌ๋ฌธ ์„ค๋ช…

-- REST_INFO ํ…Œ์ด๋ธ”๊ณผ REST_REVIEW ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•˜์—ฌ
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS,
       ROUND(AVG(REVIEW_SCORE), 2) AS SCORE
-- REST_INFO ํ…Œ์ด๋ธ”์—์„œ ์Œ์‹์  ID, ์ด๋ฆ„, ์Œ์‹ ์ข…๋ฅ˜, ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜, ์ฃผ์†Œ๋ฅผ ์„ ํƒํ•˜๊ณ ,
-- ๋ฆฌ๋ทฐ ์ ์ˆ˜์˜ ํ‰๊ท ์„ ์†Œ์ˆ˜์  ๋‘˜์งธ ์ž๋ฆฌ๊นŒ์ง€ ๊ณ„์‚ฐํ•˜์—ฌ SCORE๋กœ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

FROM REST_INFO I
-- REST_INFO ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

INNER JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
-- REST_INFO ํ…Œ์ด๋ธ”์˜ REST_ID์™€ REST_REVIEW ํ…Œ์ด๋ธ”์˜ REST_ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ INNER JOIN์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
-- ์ด๋ฅผ ํ†ตํ•ด ๋‘ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

WHERE I.ADDRESS LIKE '์„œ์šธ%'
-- ์Œ์‹์ ์˜ ์ฃผ์†Œ๊ฐ€ '์„œ์šธ'๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋Œ€ํ•ด์„œ๋งŒ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

GROUP BY 1, 2, 3, 4, 5
-- ์Œ์‹์  ID, ์ด๋ฆ„, ์Œ์‹ ์ข…๋ฅ˜, ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜, ์ฃผ์†Œ์— ๋Œ€ํ•ด ๊ทธ๋ฃนํ™”ํ•ฉ๋‹ˆ๋‹ค.
-- ์ด๋Š” ์ค‘๋ณต๋œ ์ •๋ณด๋ฅผ ํ•˜๋‚˜์˜ ํ–‰์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

ORDER BY SCORE DESC, I.FAVORITES DESC
-- SCORE๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋˜, ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜๋ฅผ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
-- ๊ฒฐ๊ณผ๋Š” ํ‰๊ท  ๋ฆฌ๋ทฐ ์ ์ˆ˜๊ฐ€ ๋†’์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋˜๋ฉฐ, ํ‰๊ท  ์ ์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ ์ฆ๊ฒจ์ฐพ๊ธฐ ์ˆ˜๊ฐ€ ๋งŽ์€ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

 

 

 

A2) LEFT JOIN ์‚ฌ์šฉ

์ฃผ์˜ํ•  ๋ถ€๋ถ„ 

1. ์„œ์šธ๋กœ ‘์‹œ์ž‘‘ํ•˜๋Š” ์ฃผ์†Œ (LIKE “์„œ์šธ%”)

2. ๋ฆฌ๋ทฐ๊ฐ€ ์—†์œผ๋ฉด ์กฐํšŒํ•˜๋ฉด ์•ˆ๋œ๋‹ค. (REST_REVIEW ํ…Œ์ด๋ธ”์„ ๊ธฐ์ค€์œผ๋กœ LEFT JOIN)

3. ์ •๋ ฌ ์กฐ๊ฑด ์ž˜ ๋ณด๊ธฐ

-- MYSQL
SELECT RI.REST_ID, RI.REST_NAME, RI.FOOD_TYPE, RI.FAVORITES, RI.ADDRESS, ROUND(AVG(RR.REVIEW_SCORE), 2) AS SCORE
FROM REST_REVIEW RR
LEFT JOIN REST_INFO RI
ON RR.REST_ID = RI.REST_ID
GROUP BY RR.REST_ID
HAVING RI.ADDRESS LIKE "์„œ์šธ%"
ORDER BY SCORE DESC, RI.FAVORITES DESC