1. 없어진 기록 찾기
https://school.programmers.co.kr/learn/courses/30/lessons/59042?language=oracle
SELECT
O.ANIMAL_ID,
O.NAME
FROM ANIMAL_OUTS O
LEFT JOIN ANIMAL_INS I ON O.ANIMAL_ID = I.ANIMAL_ID
WHERE I.ANIMAL_ID IS NULL
ORDER BY O.ANIMAL_ID;
- JOIN의 종류를 잘 선택해야한다
- INNER JOIN : 보호소에 들어와서 입양을 간 동물
- LEFT JOIN: 입양간 동물기준으로 그중 보호소에 있는 동물
- RIGHT JOIN: 보호소에 있는 동물기준으로 입양간 기록이 있는 동물
2. 자동차 대여 기록에서 대여중/대여가능 여부 구분하기
https://school.programmers.co.kr/learn/courses/30/lessons/157340?language=oracle
SELECT
DISTINCT CAR_ID,
CASE
WHEN CAR_ID IN
(SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE 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
ORDER BY CAR_ID DESC;
- 문제의 핵심은 '2022-10-16'이라는 특정 시점에 대여 중인가 아닌가를 판별하는 것
- 자동차가 과거에 대여된 기록이 있거나, 미래에 대여될 예정인지는 중요하지 않다. 오직 10월 16일 하루 동안의 상태만이 판단 기준이 된다.
- 과거에 이미 반납이 완료되었거나, 아직 대여가 시작되지 않은 기록은 이 조건에 해당하지 않아 '대여 가능'으로 분류된다.
3. 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기
SELECT
'/home/grep/src/'||F.BOARD_ID||'/'||F.FILE_ID||F.FILE_NAME||F.FILE_EXT AS "FILE_PATH"
FROM
USED_GOODS_FILE F
JOIN (
SELECT
BOARD_ID
FROM
USED_GOODS_BOARD
WHERE
VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
) B
ON F.BOARD_ID = B.BOARD_ID
ORDER BY FILE_ID DESC;
- 집계 함수를 이용해 계산된 값을 WHERE 절에서 사용하려면, 집계 함수를 서브쿼리로 만들어서 값을 먼저 추출해야 한다. 이렇게 되면 WHERE 절은 서브쿼리가 반환한 단일 값(예: 가장 높은 조회수인 1234)과 각 행의 값을 비교하게 되어 논리적으로 오류 없이 실행된다.
즉, 서브쿼리를 사용하여 '테이블 전체에서 가장 큰 값'을 먼저 찾고, 그 값을 '각 행의 값'과 비교하는 방식으로 문제를 해결한다.
4. 헤비 유저가 소유한 장소
https://school.programmers.co.kr/learn/courses/30/lessons/77487?language=oracle
SELECT *
FROM PLACES
WHERE HOST_ID IN (SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(ID) >= 2)
ORDER BY ID;'코딩 테스트 > 02. SQL' 카테고리의 다른 글
| [프로그래머스]Oracle SQL_2(Lv4) (1) | 2025.09.28 |
|---|---|
| [프로그래머스]Oracle SQL_1(Lv4) (0) | 2025.09.25 |
| [프로그래머스]Oracle SQL_2(Lv3) (0) | 2025.09.20 |
| [프로그래머스] Oracle SQL_1(Lv3) (0) | 2025.09.19 |
| [프로그래머스]Oracle SQL_2(Lv2) (0) | 2025.09.16 |