ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블ANIMAL_OUTS
테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블SELECT o.ANIMAL_ID, o.NAME
from ANIMAL_OUTS o
left outer join ANIMAL_INS i
on o.ANIMAL_ID = i.ANIMAL_ID
where i.ANIMAL_ID is null
order by o.ANIMAL_ID;
ANIMAL_INS
테이블에는 있는데, ANIMAL_OUTS
테이블에는 없는 동물SELECT i.NAME, i.DATETIME
from ANIMAL_INS i
left outer join ANIMAL_OUTS o
on i.ANIMAL_ID = o.ANIMAL_ID
where o.ANIMAL_ID is null
order by i.DATETIME
limit 3
아래 문제부터는 LEVEL 4~5 문제이다.
아무래도 하나은행 코테에 SQL이 2문제밖에 안 나오기 때문에 어렵게 출제가 되지 않을까하는 걱정이 있다.
SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') as REVIEW_DATE
from REST_REVIEW r
left outer join MEMBER_PROFILE m
on r.MEMBER_ID = m.MEMBER_ID
where r.MEMBER_ID = (select MEMBER_ID
from REST_REVIEW
group by MEMBER_ID
order by count(MEMBER_ID) desc
limit 1
)
order by r.REVIEW_DATE, REVIEW_TEXT
order by count(MEMBER_ID) desc
를 통해 정렬시켜준다.SELECT F.FLAVOR
from FIRST_HALF F
join (select FLAVOR, sum(TOTAL_ORDER) as sum
from JULY
group by FLAVOR) as J
on F.FLAVOR = J.FLAVOR
group by F.FLAVOR
order by sum(F.TOTAL_ORDER + J.sum) desc
limit 3
sum(F.TOTAL_ORDER + J.sum)
으로 내림차순 정렬하고, 상위 3개를 출력한다.SELECT O.PRODUCT_ID, PRODUCT_NAME, sum(O.AMOUNT * P.PRICE) as TOTAL_SALES
from FOOD_ORDER O
join FOOD_PRODUCT P
on O.PRODUCT_ID = P.PRODUCT_ID
where YEAR(PRODUCE_DATE) = 2022 and MONTH(PRODUCE_DATE) = 05
group by PRODUCT_ID
order by TOTAL_SALES desc, O.PRODUCT_ID
SELECT I.ANIMAL_ID, I.ANIMAL_TYPE, I.NAME
from ANIMAL_INS I
join ANIMAL_OUTS O
on I.ANIMAL_ID = O.ANIMAL_ID
where (I.SEX_UPON_INTAKE like 'Intact%') and
(O.SEX_UPON_OUTCOME like 'Spayed%' or O.SEX_UPON_OUTCOME like 'Neutered%')
order by I.ANIMAL_ID
SELECT YEAR(SALES_DATE) as YEAR, MONTH(SALES_DATE) as MONTH,
count(distinct S.USER_ID) as PUCHASED_USERS,
ROUND(count(distinct S.USER_ID)/(select count(*) from USER_INFO where YEAR(JOINED) = 2021), 1) as PUCHASED_RATIO
from ONLINE_SALE S
join USER_INFO I
on S.USER_ID = I.USER_ID
where YEAR(JOINED) = 2021
group by YEAR(SALES_DATE), MONTH(SALES_DATE)
order by YEAR, MONTH
두 테이블을 조인한다.
2021년에 가입한 전체 회원들 중
-> where YEAR(JOINED) = 2021
상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력
group by YEAR(SALES_DATE), MONTH(SALES_DATE)
: 년, 월별로 출력해야하기 때문에 그룹핑을 한다.count(distinct S.USER_ID) as PUCHASED_USERS
: 해당 년, 월에 한 회원이 여러 번 주문할 수 있기 때문에 distinct
키워드를 사용한다.ROUND(count(distinct S.USER_ID)/(select count(*) from USER_INFO where YEAR(JOINED) = 2021), 1) as PUCHASED_RATIO
order by YEAR, MONTH
[다른 사람의 풀이]
DISTINCT A, B, C
: A만 중복 처리를 하는 게 아니라, A/B/C 모두를 중복 처리한다.SELECT YEAR, MONTH, COUNT(*) AS PUCHASED_USERS,
ROUND((COUNT(*)/ (SELECT COUNT(*)
FROM USER_INFO WHERE YEAR(JOINED) = 2021)), 1) AS PUCHASED_RATIO
FROM (
SELECT DISTINCT YEAR(S.SALES_DATE) AS YEAR, MONTH(S.SALES_DATE) AS MONTH, U.USER_ID
FROM ONLINE_SALE S
JOIN USER_INFO U ON S.USER_ID = U.USER_ID AND YEAR(JOINED) = 2021
) A
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
테이블 3개 조인은 2개 조인과 크게 다르지 않다.
한번 더 JOIN
과 ON
을 작성해주면 된다.
이때 주의할 점은 LEFT JOIN이다.
SELECT *
from CAR_RENTAL_COMPANY_CAR as C
join CAR_RENTAL_COMPANY_RENTAL_HISTORY as H on H.CAR_ID = C.CAR_ID
join CAR_RENTAL_COMPANY_DISCOUNT_PLAN as P on C.CAR_TYPE = P.CAR_TYPE
where (C.CAR_TYPE = '세단' or C.CAR_TYPE = 'SUV')
and (END_DATE < '2022-11-01' or START_DATE > '2022-12-01')
and DURATION_TYPE = '30일 이상'
위와 같은 조건을 가지고, 작성한 쿼리문이다.
하지만 여기서 놓친 게, HISTORY에 존재하지 않는 자동차가 있다는 것이다.
HISTORY에 존재하지 않는 자동차는 END_DATE < '2022-11-01' or START_DATE > '2022-12-01'
조건을 만족할 수 없기 때문에
조건을 만족하지 않는 자동차들을 가져와서, 그 안에 존재하지 않는지를 파악했다.
SELECT C.CAR_ID, C.CAR_TYPE, ROUND(C.DAILY_FEE * 30 * (100- DISCOUNT_RATE) / 100) as FEE
from CAR_RENTAL_COMPANY_CAR as C
join CAR_RENTAL_COMPANY_RENTAL_HISTORY as H on H.CAR_ID = C.CAR_ID
join CAR_RENTAL_COMPANY_DISCOUNT_PLAN as P on C.CAR_TYPE = P.CAR_TYPE
where (C.CAR_TYPE = '세단' or C.CAR_TYPE = 'SUV')
and DURATION_TYPE = '30일 이상'
and C.CAR_ID NOT IN (select CAR_ID
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where END_DATE > '2022-11-01' AND START_DATE < '2022-12-01'
)
group by C.CAR_ID
having FEE >= 500000 and FEE <= 2000000
order by FEE desc, C.CAR_TYPE, C.CAR_ID desc