프로그래머스 SQL 고득점 정답 및 풀이

keymu·2024년 10월 13일
0

SELECT문

1. IF문 활용 문제

MySQL/프로그래머스/3/299307. 대장균의 크기에 따라 분류하기 1

select ID, 
if(size_of_colony<=100, 'LOW', if(size_of_colony<=1000, 'MEDIUM','HIGH')) as SIZE 
from ecoli_data
order by id;

2. JOIN, ROUND함수 활용 문제

MySQL/프로그래머스/4/131118. 서울에 위치한 식당 목록 출력하기

select 
i.rest_id as REST_ID,
i.rest_name as REST_NAME, 
i.food_type as FOOD_TYPE, 
i.favorites as FAVORITES, 
i.address as ADDRESS,
round(avg(r.review_score),2) as SCORE
from rest_info i 
join rest_Review r on i.rest_id = r.rest_id
where i.address like '서울%'
group by i.rest_id, i.rest_name, i.food_type, i.favorites, i.address
order by SCORE desc, i.favorites desc;

3. SELF JOIN 활용 문제

MySQL/프로그래머스/3/299305. 대장균들의 자식의 수 구하기

select e1.ID, count(e2.id) as CHILD_COUNT
from ecoli_data e1
left join ecoli_data e2
on e1.id=e2.parent_id
group by e1.id
order by e1.id;

SELF JOIN 실행 시,

e1.id=e2.parent_id

e2의 parent id를 e1이 id로 쓰도록 LEFT JOIN하는 것이 핵심이다.

4. UNION ALL, DATA_FORMAT을 활용한 문제

MySQL/프로그래머스/4/131537. 오프라인/온라인 판매 데이터 통합하기

select Date_format(sales_date, '%Y-%m-%d') SALES_DATE,
    PRODUCT_ID,
    USER_ID,
    SALES_AMOUNT 
from online_sale
where sales_date between'2022-03-01' and '2022-03-31'

union all

select Date_format(sales_date, '%Y-%m-%d') SALES_DATE,
    PRODUCT_ID,
    NULL as USER_ID,
    SALES_AMOUNT 
from offline_sale
where sales_date between'2022-03-01' and '2022-03-31'

order by sales_date,
product_id, 
user_id;

5. SELF JOIN 문제

MySQL/프로그래머스/4/301650. 특정 세대의 대장균 찾기

SELECT e3.ID
FROM ecoli_data e1
JOIN ecoli_data e2 ON e1.ID = e2.PARENT_ID
JOIN ecoli_data e3 ON e2.ID = e3.PARENT_ID
WHERE e1.PARENT_ID IS NULL
ORDER BY e3.ID;

SELF JOIN 시 Foreign Key로 두고 있는 관계에 유의하여 코드를 작성한다.

e1.ID = e2.PARENT_ID
e2.ID = e3.PARENT_ID

번외

  1. 대장균의 크기에 따라 분류하기 2
  • 순서를 구하는 함수 공부 후 코드 작성 예정
  1. 멸종위기의 대장균 찾기
  • 재귀함수 CTE 공부 후 코드 작성 예정

JOIN문

1. LEFT OUTER JOIN, DATA_FORMAT 활용 문제

MySQL/프로그래머스/2/144854. 조건에 맞는 도서와 저자 리스트 출력하기

select 
BOOK_ID, 
AUTHOR_NAME, 
DATE_FORMAT(published_date, '%Y-%m-%d') as PUBLISHED_DATE
from book b
left join author a on b.author_id=a.author_id
where category='경제'
order by PUBLISHED_DATE;

2. INNER JOIN, SUM 활용 문제

MySQL/프로그래머스/2/131533. 상품 별 오프라인 매출 구하기

select 
PRODUCT_CODE, 
(price*sum(sales_amount)) as SALES
from product p
join offline_sale o on p.product_id=o.product_id
group by o.product_id
order by 2 desc, 1;

3. LEFT OUTER JOIN, NULL 값 처리, limit 활용 문제

MySQL/프로그래머스/3/59044. 오랜 기간 보호한 동물(1)

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 2
limit 3;

4. INNER JOIN 활용 문제

MySQL/프로그래머스/3/59043. 있었는데요 없었습니다

SELECT i.ANIMAL_ID, i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE o.DATETIME < i.DATETIME
ORDER BY i.DATETIME;
  1. LEFT OUTER JOIN, NULL값 처리 활용 문제
    MySQL/프로그래머스/3/59042. 없어진 기록 찾기
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;

수업시간에 배우지 않은 함수들도 활용하는 문제들도 있었고, 예상보다 시간이 오래 걸려 역시 높은 레벨 문제들은 난이도가 있음을 체감했다. 문제를 풀다보니 자연스럽게 복습도 되어 스터디의 의도대로 좋은 공부가 되었다.
모두 화이팅!

profile
Junior Backend Developer

0개의 댓글