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

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

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

 

*Oracle ๊ธฐ์ค€,  ์ •๋‹ต๋ฅ  ๋†’์€ ์ˆœ์œผ๋กœ 14๋ฌธ์ œ ์ค‘ ์ƒ์œ„ 7๋ฌธ์ œ๋งŒ

 

 

1. ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณดํ˜ธํ•œ ๋™๋ฌผ(1) ( https://school.programmers.co.kr/learn/courses/30/lessons/59044 )

์•„์ง ์ž…์–‘์„ ๋ชป ๊ฐ„ ๋™๋ฌผ ์ค‘, ๊ฐ€์žฅ ์˜ค๋ž˜ ๋ณดํ˜ธ์†Œ์— ์žˆ์—ˆ๋˜ ๋™๋ฌผ 3๋งˆ๋ฆฌ์˜ ์ด๋ฆ„๊ณผ ๋ณดํ˜ธ ์‹œ์ž‘์ผ์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ๋ณดํ˜ธ ์‹œ์ž‘์ผ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I 
LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE O.ANIMAL_ID IS NULL
ORDER BY I.DATETIME
FETCH FIRST 3 ROWS ONLY;

- ์œ ๋ช…ํ•œ ROWNUM์„ ์ด์šฉํ•˜๊ฒŒ ๋˜๋ฉด SQL๋ฌธ์˜ ์‹คํ–‰ ์ˆœ์„œ ์ƒ, FROM - WHERE ๊ทธ๋‹ค์Œ์— ORDER BY๊ฐ€ ์‹คํ–‰๋˜๋ฏ€๋กœ ์‹ค์ œ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ์™€ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
- ์„œ๋ธŒ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒ์œ„ N๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์ด FETCH FIRST n ROWS ONLY๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

- ROWNUM์„ ์ด์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

SELECT NAME, DATETIME
FROM (
	SELECT I.NAME, I.DATETIME
    FROM ANIMAL_INS I
    LEFT JOIN ANIMAL_OUTS O
    ON I.ANIMAL_ID = O.ANIMAL_ID
    WHERE O.ANIMAL_ID IS NULL
    ORDER BY I.DATETIME ASC
)
WHERE ROWNUM <=3;

- JOIN์„ ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค. NOT EXISTS() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

SELECT NAME, DATETIME
FROM (
	SELECT ANIMAL_ID, NAME, DATETIME
    FROM ANIMAL_INS
    ORDER BY 3 ASC
) I
WHERE NOT EXISTS(
	SELECT 1
    FROM ANIMAL_OUTS O
    WHERE I.ANIMAL_iD = O.ANIMAL_ID
) AND ROWNUM <=3;

 

2. ์žˆ์—ˆ๋Š”๋ฐ์š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค ( https://school.programmers.co.kr/learn/courses/30/lessons/59043 )

๋ณดํ˜ธ ์‹œ์ž‘์ผ๋ณด๋‹ค ์ž…์–‘์ผ์ด ๋” ๋น ๋ฅธ ๋™๋ฌผ์˜ ์•„์ด๋””์™€ ์ด๋ฆ„์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ด๋•Œ ๊ฒฐ๊ณผ๋Š” ๋ณดํ˜ธ ์‹œ์ž‘์ผ์ด ๋น ๋ฅธ ์ˆœ์œผ๋กœ ์กฐํšŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

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

 

3. ์˜ค๋žœ ๊ธฐ๊ฐ„ ๋ณดํ˜ธํ•œ ๋™๋ฌผ(2) ( https://school.programmers.co.kr/learn/courses/30/lessons/59411 )

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

๋”๋ณด๊ธฐ
SELECT O.ANIMAL_ID, O.NAME
FROM (
	SELECT O.ANIMAL_ID, O.NAME
	FROM ANIMAL_INS I, ANIMAL_OUTS O
	WHERE I.ANIMAL_ID = O.ANIMAL_ID
    ORDER BY O.DATETIME-I.DATETIME DESC
)
WHERE ROWNUM <= 2;

- FETCH ์ ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜์™€ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I, ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY O.DATETIME-I.DATETIME DESC
FETCH FIRST 2 ROWS ONLY;

 

4. ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๋„์„œ ํŒ๋งค๋Ÿ‰ ์ง‘๊ณ„ํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/144855 )

2022๋…„ 1์›”์˜ ์นดํ…Œ๊ณ ๋ฆฌ ๋ณ„ ๋„์„œ ํŒ๋งค๋Ÿ‰์„ ํ•ฉ์‚ฐํ•˜๊ณ , ์นดํ…Œ๊ณ ๋ฆฌ(CATEGORY), ์ด ํŒ๋งค๋Ÿ‰(TOTAL_SALES) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
๊ฒฐ๊ณผ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ช…์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT B.CATEGORY, SUM(S.SALES) AS TOTAL_SALES
FROM BOOK B
JOIN BOOK_SALES S
ON B.BOOK_ID = S.BOOK_ID
WHERE TO_CHAR(S.SALES_DATE, 'YYYY-MM') = '2022-01'
GROUP BY B.CATEGORY
ORDER BY 1 ASC;

 

5. ์กฐ๊ฑด๋ณ„๋กœ ๋ถ„๋ฅ˜ํ•˜์—ฌ ์ฃผ๋ฌธ์ƒํƒœ ์ถœ๋ ฅํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/131113 )

FOOD_ORDER ํ…Œ์ด๋ธ”์—์„œ 5์›” 1์ผ์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ๋ฌธ ID, ์ œํ’ˆ ID, ์ถœ๊ณ ์ผ์ž, ์ถœ๊ณ ์—ฌ๋ถ€๋ฅผ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ถœ๊ณ ์—ฌ๋ถ€๋Š” 5์›” 1์ผ๊นŒ์ง€ ์ถœ๊ณ ์™„๋ฃŒ๋กœ ์ด ํ›„ ๋‚ ์งœ๋Š” ์ถœ๊ณ  ๋Œ€๊ธฐ๋กœ ๋ฏธ์ •์ด๋ฉด ์ถœ๊ณ ๋ฏธ์ •์œผ๋กœ ์ถœ๋ ฅํ•ด์ฃผ์‹œ๊ณ , ๊ฒฐ๊ณผ๋Š” ์ฃผ๋ฌธ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT ORDER_ID, PRODUCT_ID, TO_CHAR(OUT_DATE, 'YYYY-MM-DD'),
CASE
	WHEN OUT_DATE <= TO_DATE('2022-05-01', 'YYYY-MM-DD') THEN '์ถœ๊ณ ์™„๋ฃŒ'
    WHEN OUT_DATE > TO_DATE('2022-05-01', 'YYYY-MM-DD') THEN '์ถœ๊ณ ๋Œ€๊ธฐ'
    ELSE '์ถœ๊ณ ๋ฏธ์ •'
END AS "์ถœ๊ณ ์—ฌ๋ถ€"
FROM FOOD_ORDER
ORDER BY 1 ASC;

 

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

USED_GOODS_BOARD์™€ USED_GOODS_USER ํ…Œ์ด๋ธ”์—์„œ ์™„๋ฃŒ๋œ ์ค‘๊ณ  ๊ฑฐ๋ž˜์˜ ์ด๊ธˆ์•ก์ด 70๋งŒ ์› ์ด์ƒ์ธ ์‚ฌ๋žŒ์˜ ํšŒ์› ID, ๋‹‰๋„ค์ž„, ์ด๊ฑฐ๋ž˜๊ธˆ์•ก์„ ์กฐํšŒํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ์ด๊ฑฐ๋ž˜๊ธˆ์•ก์„ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
-- ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”
SELECT U.USER_ID, U.NICKNAME, B.TOTAL_SALES
FROM USED_GOODS_USER U
JOIN (
    SELECT SUM(PRICE) AS TOTAL_SALES, WRITER_ID
    FROM USED_GOODS_BOARD
    WHERE STATUS = 'DONE'
    GROUP BY WRITER_ID
) B
ON B.WRITER_ID = U.USER_ID
WHERE B.TOTAL_SALES >= 700000
ORDER BY B.TOTAL_SALES;

-- SELECT A.WRITER_ID, A.NICKNAME, A.TOTAL_SALE
-- FROM (
-- 	SELECT B.WRITER_ID, U.NICKNAME, SUM(B.PRICE) AS TOTAL_SALE
-- 	FROM USED_GOODS_BOARD B, USED_GOODS_USER U
-- 	WHERE STATUS = 'DONE' AND B.WRITER_ID = U.USER_ID
-- 	GROUP BY B.WRITER_ID, U.NICKNAME
-- 	ORDER BY 3 ASC
-- ) A
-- WHERE A.TOTAL_SALE >= 700000;

- ์ฃผ์„ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์™€ ์ฃผ์„ ์ฒ˜๋ฆฌ๊ฐ€ ๋œ ์ฝ”๋“œ๋Š” ORDER์ด๋‚˜ JOIN์˜ ์œ„์น˜๋งŒ ๋ฐ”๋€ ์…ˆ์ด๋ฏ€๋กœ ์‚ฌ์‹ค์ƒ ๋˜‘๊ฐ™๋‹ค.

 

7. ๋Œ€์—ฌ ๊ธฐ๋ก์ด ์กด์žฌํ•˜๋Š” ์ž๋™์ฐจ ๋ฆฌ์ŠคํŠธ ๊ตฌํ•˜๊ธฐ ( https://school.programmers.co.kr/learn/courses/30/lessons/157341 )

CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์—์„œ ์ž๋™์ฐจ ์ข…๋ฅ˜๊ฐ€ '์„ธ๋‹จ'์ธ ์ž๋™์ฐจ๋“ค ์ค‘ 10์›”์— ๋Œ€์—ฌ๋ฅผ ์‹œ์ž‘ํ•œ ๊ธฐ๋ก์ด ์žˆ๋Š” ์ž๋™์ฐจ ID ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ์ž๋™์ฐจ ID ๋ฆฌ์ŠคํŠธ๋Š” ์ค‘๋ณต์ด ์—†์–ด์•ผ ํ•˜๋ฉฐ, ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
SELECT DISTINCT C.CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H, CAR_RENTAL_COMPANY_CAR C
WHERE C.CAR_TYPE = '์„ธ๋‹จ' AND TO_CHAR(H.START_DATE, 'YYYYMM') = '202210' AND C.CAR_ID = H.CAR_ID
ORDER BY 1 DESC;