코딩테스트/SQL
[코딩테스트] 프로그래머스 SQL SELECT 11 ~ 20
[dev] hiro
2024. 11. 4. 18:57
제가 공부한 내용을 정리하는 블로그입니다.
아직 많이 부족하고 배울게 너무나도 많습니다. 틀린내용이 있으면 언제나 가감없이 말씀해주시면 감사하겠습니다😁
Programmers SQL 고득점 Kit(SELECT)입니다.
재구매가 일어난 상품과 회원 리스트 구하기
SELECT
USER_ID,
PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC
- 동일한 회원, 동일한 상품을 조회하기 위해 USER_ID와 PRODUCT_ID를 기준으로 GROUP BY 해줍니다.
(GROUP BY USER_ID, PRODUCT_ID) - 그 중에서 두번 이상의 데이터가 있다는 것은 재구매가 일어났다는 것이니 HAVING을 걸어줍니다.
(HAVING COUNT(*) >= 2) - USER_ID의 오름차순, PRODUCT_ID를 내림차순으로 정렬해줍니다.
(ORDER BY USER_ID ASC, PRODUCT_ID DESC)
모든 레코드 조회하기
SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
- ANIMAL_INS 테이블에서 ANIMAL_ID를 기준으로 오름차순 정렬한
(ORDER BY ANIMAL_ID)
데이터의 모든 레코드를 조회합니다.
(SELECT *)
역순 정렬하기
SELECT
NAME,
DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC
- ANIMAL_INS 테이블에서 ANIMAL_ID를 기준으로 내림차순 정렬한
(ORDER BY ANIMAL_ID DESC)
데이터의 NAME과 DATETIME을 조회합니다.
오프라인/온라인 판매 데이터 통합하기
SELECT
A.SALES_DATE,
A.PRODUCT_ID,
A.USER_ID,
A.SALES_AMOUNT
FROM (
SELECT
TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM ONLINE_SALE
UNION
SELECT
TO_CHAR(SALES_DATE, 'YYYY-MM-DD') AS SALES_DATE,
PRODUCT_ID,
NULL as USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
) A
WHERE A.SALES_DATE like '2022-03%'
ORDER BY
A.SALES_DATE ASC,
A.PRODUCT_ID ASC,
A.USER_ID ASC
- 온라인 데이터 테이블(ONLINE_SALE)과 오프라인 데이터 테이블(OFFLINE_SALE)의 필드를 하나로 합치기 위해 필드를 합쳐주고 UNION 을 이용합니다.
- 오프라인에서 USER_ID가 없을 때에는 NULL처리합니다.
(NULL as USER_ID) - 그 중 판매일이 2022년 03월인 데이터만 출력합니다.
(WHERE A.SALES_DATE like '2022-03%') - 판매일을 기준으로 오름차순, 상품 ID 오름차순, 유저 ID를 오름차순으로 정렬합니다.
(ORDER BY A.SALES_DATE ASC, A.PRODUCT_ID ASC, A.USER_ID ASC)
아픈 동물 찾기
SELECT
ANIMAL_ID,
NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY ANIMAL_ID;
- 보호 시작시 상태가 Sick인 동물을 조회합니다.
(WHERE INTAKE_CONDITION = 'Sick') - ANIMAL_ID를 오름차순으로 정렬합니다.
어린 동물 찾기
SELECT
ANIMAL_ID,
NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY ANIMAL_ID;
- 보호 시작시 상태가 Aged가 아닌 동물을 조회합니다.
(INTAKE_CONDITION != 'Aged') - ANIMAL_ID를 오름차순으로 정렬합니다.
동물의 아이디와 이름
SELECT
ANIMAL_ID,
NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
- 동물의 아이디와 이름을 아이디를 기준으로 오름차순 정렬합니다.
여러 기준으로 정렬하기
SELECT
ANIMAL_ID,
NAME,
DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
- 이름을 기준으로 오름차순, 동물 보호 시작일을 내림차순으로 정렬합니다.
상위 N개 레코드
SELECT
NAME
FROM (
SELECT
NAME
FROM ANIMAL_INS
ORDER BY DATETIME asc
)
WHERE ROWNUM = 1;
- 보호 시작일을 기준으로 오름차순으로 정렬하고 ROWNUM이 1인(가장 먼저 들어온) 데이터를 조회합니다.
(WHERE ROWNUM = 1;)
조건에 맞는 회원수 구하기
SELECT
COUNT(*)
FROM USER_INFO
WHERE TO_CHAR(JOINED, 'YYYY') = '2021' AND AGE BETWEEN 20 AND 29
- 2021년에 가입한 회원과 나이가 20세 이상 29세 이하인 회원을 조회하기 위해 BETWEEN을 사용합니다.
(WHERE TO_CHAR(JOINED, 'YYYY') = '2021' AND AGE BETWEEN 20 AND 29)