๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/SQL

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค SQL๋ฌธ LV. 3 (2)

 

*Oracle ๊ธฐ์ค€

 

 

 

8. ์ฆ๊ฒจ์ฐพ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์‹๋‹น ์ •๋ณด ์ถœ๋ ฅํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/131123 )

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

๋”๋ณด๊ธฐ
SELECT F.FOOD_TYPE, R.REST_ID, R.REST_NAME, F.FAVORITES
FROM (
	SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) F, REST_INFO R
WHERE F.FOOD_TYPE = R.FOOD_TYPE AND F.FAVORITES = R.FAVORITES
ORDER BY 1 DESC;

- WHERE ์ ˆ์—์„œ FOOD_TYPE์€ ๋ฌผ๋ก ์ด๊ณ  FAVORITES ์กฐ๊ฑด๋„ ๋„ฃ์–ด์ค˜์•ผ ํ–ˆ๋˜๊ฒŒ ์กฐ๊ธˆ ๊นŒ๋‹ค๋กœ์› ๋‹ค.

 

9. ์—†์–ด์ง„ ๊ธฐ๋ก ์ฐพ๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/59042 )

์ž…์–‘์„ ๊ฐ„ ๊ธฐ๋ก์€ ์žˆ๋Š”๋ฐ, ๋ณดํ˜ธ์†Œ์— ๋“ค์–ด์˜จ ๊ธฐ๋ก์ด ์—†๋Š” ๋™๋ฌผ์˜ ID์™€ ์ด๋ฆ„์„ ID ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY 1 ASC;

- ์ง€๋‚œ ๊ธ€ 3๋‹จ๊ณ„์˜ 1๋ฒˆ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ์ด๋ ‡๊ฒŒ LEFT JOIN์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๊ณผ NOT EXISTS() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS O
WHERE NOT EXISTS (
	SELECT ANIMAL_ID
    FROM ANIMAL_INS I
    WHERE O.ANIMAL_ID = I.ANIMAL_ID
)
ORDER BY 1 ASC;

 

10. ์กฐ๊ฑด์— ๋งž๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/164670 )

USED_GOODS_BOARD์™€ USED_GOODS_USER ํ…Œ์ด๋ธ”์—์„œ ์ค‘๊ณ  ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๋ฌผ์„ 3๊ฑด ์ด์ƒ ๋“ฑ๋กํ•œ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์ž ID, ๋‹‰๋„ค์ž„, ์ „์ฒด์ฃผ์†Œ, ์ „ํ™”๋ฒˆํ˜ธ๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ, ์ „์ฒด ์ฃผ์†Œ๋Š” ์‹œ, ๋„๋กœ๋ช… ์ฃผ์†Œ, ์ƒ์„ธ ์ฃผ์†Œ๊ฐ€ ํ•จ๊ป˜ ์ถœ๋ ฅ๋˜๋„๋ก ํ•ด์ฃผ์‹œ๊ณ , ์ „ํ™”๋ฒˆํ˜ธ์˜ ๊ฒฝ์šฐ xxx-xxxx-xxxx ๊ฐ™์€ ํ˜•ํƒœ๋กœ ํ•˜์ดํ”ˆ ๋ฌธ์ž์—ด(-)์„ ์‚ฝ์ž…ํ•˜์—ฌ ์ถœ๋ ฅํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ํšŒ์› ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

 

SELECT USER_ID, NICKNAME, CITY||' '||STREET_ADDRESS1||' '||STREET_ADDRESS2 AS "์ „์ฒด์ฃผ์†Œ",
    SUBSTR(TLNO, 1, 3)||'-'||SUBSTR(TLNO, 4, 4)||'-'||SUBSTR(TLNO, 8, 4) AS "์ „ํ™”๋ฒˆํ˜ธ"
FROM (
	SELECT WRITER_ID, COUNT(*) AS COUNT
    FROM USED_GOODS_BOARD
    GROUP BY WRITER_ID
) B
JOIN USED_GOODS_USER U
ON B.WRITER_ID = U.USER_ID
WHERE B.COUNT >= 3
ORDER BY 1 DESC;

- DISTINCT, PARTITION BY๋ฅผ ์ด์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

SELECT DISTINCT USER_ID, NICKNAME, CITY||' '||STREET_ADDRESS1||' '||STREET_ADDRESS2 AS "์ „์ฒด์ฃผ์†Œ", 
       SUBSTR(U.TLNO, 1, 3)||'-'||SUBSTR(U.TLNO, 4, 4)||'-'||SUBSTR(U.TLNO, 8) AS "์ „ํ™”๋ฒˆํ˜ธ"
FROM (
    SELECT WRITER_ID, COUNT(*) OVER(PARTITION BY WRITER_ID) AS BOARD
    FROM USED_GOODS_BOARD
) B
JOIN USED_GOODS_USER U
ON B.WRITER_ID = U.USER_ID
WHERE B.BOARD > 2
ORDER BY U.USER_ID DESC;

* GROUP BY์™€ PARTITION BY์˜ ์ฐจ์ด์ 

- partition by๋Š” ๊ทธ๋ฃน๋ณ„๋กœ ํ–‰์„ ํ‘œ์‹œ, partition์€ ์• ์ดˆ์— ๋ถ„ํ• ์ด๋ผ๋Š” ๋œป.
- group by๋Š” ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์€ ํ–‰์„ ํ‘œ์‹œ

- ๋•Œ๋ฌธ์— ์ด ๋ฌธ์ œ์—์„œ partition by๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” distinct๋„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ์›ํ•˜๋Š” ์ถœ๋ ฅ ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

 

11. ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก์—์„œ ๋Œ€์—ฌ์ค‘ / ๋Œ€์—ฌ ๊ฐ€๋Šฅ ์—ฌ๋ถ€ ๊ตฌ๋ถ„ํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/157340 )

CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์—์„œ 2022๋…„ 10์›” 16์ผ์— ๋Œ€์—ฌ ์ค‘์ธ ์ž๋™์ฐจ์ธ ๊ฒฝ์šฐ '๋Œ€์—ฌ์ค‘' ์ด๋ผ๊ณ  ํ‘œ์‹œํ•˜๊ณ , ๋Œ€์—ฌ ์ค‘์ด์ง€ ์•Š์€ ์ž๋™์ฐจ์ธ ๊ฒฝ์šฐ '๋Œ€์—ฌ ๊ฐ€๋Šฅ'์„ ํ‘œ์‹œํ•˜๋Š” ์ปฌ๋Ÿผ(์ปฌ๋Ÿผ๋ช…: AVAILABILITY)์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ž๋™์ฐจ ID์™€ AVAILABILITY ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๋ฐ˜๋‚ฉ ๋‚ ์งœ๊ฐ€ 2022๋…„ 10์›” 16์ผ์ธ ๊ฒฝ์šฐ์—๋„ '๋Œ€์—ฌ์ค‘'์œผ๋กœ ํ‘œ์‹œํ•ด์ฃผ์‹œ๊ณ  ๊ฒฐ๊ณผ๋Š” ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT CAR_ID, 
	CASE WHEN TO_DATE('2022-10-16', 'YYYY-MM-DD') BETWEEN START_DATE AND END_DATE
    	THEN '๋Œ€์—ฌ์ค‘'
    ELSE '๋Œ€์—ฌ ๊ฐ€๋Šฅ'
    END AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY 1 DESC;

- ์ด ํ…Œ์ด๋ธ”์€ RENTALํ•œ HISTORY ํ…Œ์ด๋ธ”์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ GROUP BY๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด CAR_ID๊ฐ€ ๊ณ ์œ ์˜ ๊ฐ’์ด ์•„๋‹ˆ์–ด์„œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ ˆ๋Œ€ ์•ˆ๋‚˜์˜จ๋‹ค.

 

12. ํ—ค๋น„ ์œ ์ €๊ฐ€ ์†Œ์œ ํ•œ ์žฅ์†Œ ( https://school.programmers.co.kr/learn/courses/30/lessons/77487 )

์ด ์„œ๋น„์Šค์—์„œ๋Š” ๊ณต๊ฐ„์„ ๋‘˜ ์ด์ƒ ๋“ฑ๋กํ•œ ์‚ฌ๋žŒ์„ "ํ—ค๋น„ ์œ ์ €"๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ํ—ค๋น„ ์œ ์ €๊ฐ€ ๋“ฑ๋กํ•œ ๊ณต๊ฐ„์˜ ์ •๋ณด๋ฅผ ์•„์ด๋”” ์ˆœ์œผ๋กœ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT ID, NAME, HOST_ID
FROM (
	SELECT ID, NAME, HOST_ID, COUNT(*) OVER(PARTITION BY HOST_ID)AS CNT 
    FROM PLACES
) P
WHERE P.CNT > 1
ORDER BY 1 ASC;

- PARTITION BY๋ฅผ ์“ฐ๋ฉด ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ์ธ๋ผ์ธ ๋ทฐ์—์„œ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ ์ข€ ๋จธ๋ฆฌ๊ฐ€ ๊ผฌ์˜€๋˜ ๊ฒƒ ๊ฐ™๋‹ค. 
- ๊ฐœ์ธ์ ์œผ๋กœ๋„ ํ—ท๊ฐˆ๋ ธ์œผ๋‹ˆ ๋‹ค์‹œ ๋ด๋‘ฌ์•ผ๊ฒ ๋‹ค.

 

13. ์กฐํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ์ค‘๊ณ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œํŒ์˜ ์ฒจ๋ถ€ํŒŒ์ผ ์กฐํšŒํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/164671 )

USED_GOODS_BOARD์™€ USED_GOODS_FILE ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ค‘๊ณ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๋ฌผ์— ๋Œ€ํ•œ ์ฒจ๋ถ€ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ฒจ๋ถ€ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” FILE ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”. ๊ธฐ๋ณธ์ ์ธ ํŒŒ์ผ๊ฒฝ๋กœ๋Š” /home/grep/src/ ์ด๋ฉฐ, ๊ฒŒ์‹œ๊ธ€ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๊ตฌ๋ถ„๋˜๊ณ , ํŒŒ์ผ์ด๋ฆ„์€ ํŒŒ์ผ ID, ํŒŒ์ผ ์ด๋ฆ„, ํŒŒ์ผ ํ™•์žฅ์ž๋กœ ๊ตฌ์„ฑ๋˜๋„๋ก ์ถœ๋ ฅํ•ด์ฃผ์„ธ์š”. ์กฐํšŒ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๊ฒŒ์‹œ๋ฌผ์€ ํ•˜๋‚˜๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
SELECT '/home/grep/src/'||BOARD_ID||'/'||FILE_ID||FILE_NAME||FILE_EXT AS FILE_PATH
FROM USED_GOODS_FILE F
WHERE F.BOARD_ID = (
	SELECT BOARD_ID
    FROM USED_GOODS_BOARD
    ORDER BY VIEWS DESC
    FETCH FIRST 1 ROWS ONLY
)
ORDER BY F.FILE_ID DESC;

- ์•„๋ž˜์ฒ˜๋Ÿผ ์กฐ์ธ์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

SELECT '/home/grep/src/'||B.BOARD_ID||'/'||F.FILE_ID||F.FILE_NAME||F.FILE_EXT AS FILE_PATH
FROM USED_GOODS_BOARD B 
JOIN USED_GOODS_FILE F
ON B.BOARD_ID = F.BOARD_ID
WHERE B.VIEWS = (
    SELECT MAX(VIEWS)
    FROM USED_GOODS_BOARD
)
ORDER BY FILE_ID DESC;

 

14. ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ ๋งŽ์€ ์ž๋™์ฐจ๋“ค์˜ ์›”๋ณ„ ๋Œ€์—ฌ ํšŸ์ˆ˜ ๊ตฌํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/151139 )

CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์—์„œ ๋Œ€์—ฌ ์‹œ์ž‘์ผ์„ ๊ธฐ์ค€์œผ๋กœ 2022๋…„ 8์›”๋ถ€ํ„ฐ 2022๋…„ 10์›”๊นŒ์ง€ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ 5ํšŒ ์ด์ƒ์ธ ์ž๋™์ฐจ๋“ค์— ๋Œ€ํ•ด์„œ ํ•ด๋‹น ๊ธฐ๊ฐ„ ๋™์•ˆ์˜ ์›”๋ณ„ ์ž๋™์ฐจ ID ๋ณ„ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜(์ปฌ๋Ÿผ๋ช…: RECORDS) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ์›”์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ์›”์ด ๊ฐ™๋‹ค๋ฉด ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”. ํŠน์ • ์›”์˜ ์ด ๋Œ€์—ฌ ํšŸ์ˆ˜๊ฐ€ 0์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฒฐ๊ณผ์—์„œ ์ œ์™ธํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT EXTRACT(MONTH FROM R.START_DATE) AS MONTH, R.CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY R
WHERE R.CAR_ID IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN TO_DATE('2022-08-01', 'YYYY-MM-DD') AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
    GROUP BY CAR_ID
    HAVING COUNT(*) >= 5
)
AND R.START_DATE BETWEEN TO_DATE('2022-08-01', 'YYYY-MM-DD') AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
GROUP BY EXTRACT(MONTH FROM R.START_DATE), R.CAR_ID
HAVING COUNT(*) > 0
ORDER BY 1 ASC, 2 DESC;

- 4๋‹จ๊ณ„๋กœ ๊ฐ€๋„ ๋  ๊ฒƒ ๊ฐ™์€ ๋‚œ์ด๋„์™€ ์ฝ”๋“œ์–‘... (๋ญ ๊ทธ๋ž˜์„œ 3๋‹จ๊ณ„ ์ •๋‹ต๋ฅ  ์ตœํ•˜์ธ ๋ฌธ์ œ์ธ ๋“ฏ ...)
- ๋งค์›” ๋Œ€์—ฌํšŸ์ˆ˜๊ฐ€ 5ํšŒ๋ฉด ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์•ˆ์จ๋„ ์ถฉ๋ถ„ํžˆ ๊ฐ€๋Šฅํ–ˆ์„ํ…๋ฐ 8, 9, 10์›” ๋Œ€์—ฌํšŸ์ˆ˜ ๋ชจ๋‘ ํ•ฉ์ณ์„œ 5ํšŒ ์กฐ๊ฑด์ธ๋ฐ ์ •์ž‘ ์ถœ๋ ฅ์€ 8, 9, 10์›” ๋”ฐ๋กœ๋”ฐ๋กœ ํ•ด์•ผํ•˜๋‹ˆ๊นŒ ๊ทธ๊ฒŒ ๋„ˆ๋ฌด ๋ณต์žกํ–ˆ๊ณ  ๊ฒฐ๊ตญ์—” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์“ธ ์ˆ˜ ๋ฐ–์— ์—†์—ˆ๋‹ค

- EXTRACT๋Š” ๋‚ ์งœ์˜ ํ•„์š” ๋ถ€๋ถ„์„ ์ถ”์ถœํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

- EXTRACT('๋‚ ์งœ ์š”์†Œ' FROM ์ปฌ๋Ÿผ) ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•œ๋‹ค.