프로그래머스 SQL 문제 - SELECT_2

HanEol~·2025년 9월 26일

프로그래머스 고득점 SQL kit

LV2 모음

1. 3월에 태어난 여성 회원 목록 출력하기

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131120

문제

MEMBER_PROFILE 테이블에서 생일이 3월인 여성 회원의 ID, 이름, 성별, 생년월일을 조회하는 SQL문을 작성해주세요. 이때 전화번호가 NULL인 경우는 출력대상에서 제외시켜 주시고, 결과는 회원ID를 기준으로 오름차순 정렬해주세요.

풀이

SELECT MEMBER_ID, MEMBER_NAME, GENDER, 
SUBSTR(DATE_OF_BIRTH, 1, 10) DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE GENDER = 'W' AND MONTH(DATE_OF_BIRTH) = 3 AND TLNO IS NOT NULL
ORDER BY MEMBER_ID 

2. 재구매가 일어난 상품과 회원 리스트 구하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/131536

문제

ONLINE_SALE 테이블에서 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여, 재구매한 회원 ID와 재구매한 상품 ID를 출력하는 SQL문을 작성해주세요. 결과는 회원 ID를 기준으로 오름차순 정렬해주시고 회원 ID가 같다면 상품 ID를 기준으로 내림차순 정렬해주세요.

풀이

SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE 
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
ORDER BY USER_ID, PRODUCT_ID DESC

해설

회원이 재구매한 상품을 확인하는 문제로
재구매를 했다면 user_id, product_id가 같은 것을 확인하기 위해 그룹핑해주고
2개 이상인 부분은 재구매로 판별할 수 있다.

그 후 조건에 맞게 select해주면 된다.

3. 업그레이드 된 아이템 구하기

링크: https://school.programmers.co.kr/learn/courses/30/lessons/273711

문제

아이템의 희귀도가 'RARE'인 아이템들의 모든 다음 업그레이드 아이템의 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY)를 출력하는 SQL 문을 작성해 주세요. 이때 결과는 아이템 ID를 기준으로 내림차순 정렬주세요.

풀이

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO 
WHERE ITEM_ID IN (
    SELECT A.ITEM_ID
    FROM ITEM_TREE A JOIN ITEM_INFO B
    ON A.PARENT_ITEM_ID = B.ITEM_ID AND B.RARITY = 'RARE'
)
ORDER BY ITEM_ID DESC
SELECT C.ITEM_ID,
       C.ITEM_NAME,
       C.RARITY
FROM ITEM_INFO AS P  
JOIN ITEM_TREE AS T
  ON P.ITEM_ID = T.PARENT_ITEM_ID
JOIN ITEM_INFO AS C
  ON T.ITEM_ID = C.ITEM_ID
WHERE P.RARITY = 'RARE'
ORDER BY C.ITEM_ID DESC;

해설

두 풀이 방법이 있다 IN(SUBQUERY) 와 JOIN으로 풀이 방법.

IN 절 -> MAIN 절로 MAIN 절의 크기많은 IN 절을 돌리는 행위 보다는
JOIN이 더 나은 방식인 것 같다.

생각

EXISTS vs IN 연산자 차이

EXISTS : 연관 쿼리로 메인 쿼리 -> EXISTS 쿼리 실행
IN : IN 쿼리 -> 메인 쿼리 실행
EXISTS 쿼리가 일반적으로 SELECT절까지 가지 않기에 IN에 비해 속도나 성능면에서 더 좋다.

4. 조건에 맞는 개발자 찾기

문제

DEVELOPERS 테이블에서 Python이나 C# 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.

결과는 ID를 기준으로 오름차순 정렬해 주세요.

풀이

WITH A AS ( SELECT SUM(CODE) CODE
    FROM SKILLCODES
    WHERE NAME = "Python" or NAME = "C#") 

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS 
WHERE EXISTS (
    SELECT 1
    FROM A
    WHERE CODE & SKILL_CODE
)
ORDER BY 1;

SELECT DISTINCT
    D.ID,
    D.EMAIL,
    D.FIRST_NAME,
    D.LAST_NAME
FROM
    DEVELOPERS AS D 
JOIN
    SKILLCODES AS S 
ON
    D.SKILL_CODE & S.CODE
WHERE
    S.NAME IN ('Python', 'C#')
ORDER BY
    D.ID

해설

EXISTS 와 JOIN으로 푸는 방법 2가지 있다.

profile
기록을 통해 앞으로 나아가자!

0개의 댓글