[프로그래머스 SQL 고득점 Kit] SELECT 모아보기 - 2편

짱J·2023년 2월 20일
0
post-thumbnail

🌎 2022.02.21 updated

Level 1 문제들은 이전 글에서 확인할 수 있습니다.


Level 2️⃣

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

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

select member_id, member_name, gender, date_format(date_of_birth, '%Y-%m-%d') as date_of_birth
from member_profile
where gender='W' and date_of_birth like '%-03-%' and tlno is not null
order by member_id
  • 전화번호가 NULL이 아닌 경우만 출력하기 위해 tlno is not null 조건을 사용하였다.
  • IS NULL은 입력값을 확인하여 NULL이면 TRUE, NULL이 아니면 FALSE를 리턴한다
  • IS NOT NULL은 IS 반대로 입력값이 NULL이면 FALSE, NULL이 아니면 TRUE를 리턴한다.

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

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

select user_id, product_id
from online_sale
group by user_id, product_id
having count(*) >= 2
order by user_id, product_id desc
  • 동일한 회원이 동일한 상품을 재구매하였으면 user_id와 product_id가 일치하는 튜플이 2개 이상 있을 것이므로, user_id, product_id로 group by를 해주었다.

GROUP BY 절에 대한 자세한 설명은 다음 포스트에서 한다.

  • WHERE - 전체 테이블 자체에 쿼리를 수행하고 싶을 때
  • HAVING - 전체 테이블에서 그룹화 한 뒤 → 해당 그룹에서 조건을 걸고 싶을 때

Level 4️⃣

서울에 위치한 식당 목록 출력하기

-- REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요.
-- 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

select rest_info.rest_id, rest_name, food_type, favorites, address, round(avg(review_score), 2) as score
from rest_info, rest_review
where rest_info.rest_id=rest_review.rest_id
and address like '서울%'
group by rest_info.rest_id, rest_name, food_type, favorites, address
order by score desc, favorites desc
  • 리뷰 평균 점수를 계산하기 위해 rest_review 테이블을 조인해주었다.
  • 소수점 세 번째 자리에서 반올림 한다 → 두 번재 자리까지 출력하라이므로 round의 두 번째 인자가 2가 된다.
  • SELECT 문에 있는 모든 열은 집계 함수가 되거나 GROUP BY 절에 나타나야 한다는 점을 주의하자.

오프라인/온라인 판매 데이터 통합하기

-- ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요.
-- OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요.
-- 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

(select date_format(sales_date, '%Y-%m-%d') as sales_date, product_id, NULL as user_id, sales_amount
from offline_sale
where sales_date like '2022-03%')
union
(select date_format(sales_date, '%Y-%m-%d') as sales_date, product_id, user_id, sales_amount
from online_sale
where sales_date like '2022-03%')
order by sales_date, product_id, user_id
  • SELECT문의 결과로 나온 테이블들을 하나의 테이블로 표현하고 싶을 때 UNION 키워드를 사용할 수 있다.

⚠️ UNION을 사용할 시 주의할 점

  • 하나의 ORDER BY만 사용할 수 있다
  • 각 SELECT의 열 수, 표현식이 같아야 한다
  • 중복값을 나타내고 싶다면 UNION ALL을 사용한다
    • UNION은 UNION DISTINCT와 동일한 작업을 하여 중복되는 레코드를 제거한다
profile
[~2023.04] 블로그 이전했습니다 ㅎㅎ https://leeeeeyeon-dev.tistory.com/

0개의 댓글