*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 ์ปฌ๋ผ) ๊ณผ ๊ฐ์ด ํํํ๋ค.
'ํ๋ก๊ทธ๋๋จธ์ค > SQL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ๋ก๊ทธ๋๋จธ์ค SQL๋ฌธ LV. 3 (1) (0) | 2023.06.29 |
---|---|
ํ๋ก๊ทธ๋๋จธ์ค SQL๋ฌธ LV. 2 (2) (0) | 2023.06.28 |
ํ๋ก๊ทธ๋๋จธ์ค SQL๋ฌธ LV. 2 (1) (0) | 2023.06.28 |
ํ๋ก๊ทธ๋๋จธ์ค SQL๋ฌธ LV. 1 (2) (0) | 2023.06.28 |
ํ๋ก๊ทธ๋๋จธ์ค SQL๋ฌธ LV. 1 (1) (0) | 2023.06.23 |