SQL 문제풀이 복습
SELECT COUNT(DISTINCT customer_id) AS "rich_count"
FROM (SELECT customer_id
FROM Store
WHERE amount > 500) result;
문제 링크
1트(7/31)에서는 union을 썼는데
오늘은 join으로 해결했다.
order_type이 2개(0,1)인 경우에는 0만을 출력해야 하므로
해당하는 customer_id만 뽑아서 인라인뷰 a에 저장한 다음,
customer_id와 order_type = 1 기준으로 left join한다.
그런 다음 a.customer_id가 null인 경우만 찾으면 끝.
SELECT o.order_id,
o.customer_id,
o.order_type
FROM Orders o
LEFT JOIN (SELECT customer_id
FROM Orders
GROUP BY 1
HAVING COUNT(DISTINCT order_type) = 2) a
ON o.customer_id = a.customer_id
AND order_type = 1
WHERE a.customer_id IS NULL;
문제 링크
1트(7/29)에서는 window 함수를 써서 풀었구나.
오늘은 ranking을 쓰는 대신 where절 내에 서브쿼리를 한 번 더 써서
max(total_count)와 같은 total_count를 갖는 airport_id를 찾는 방식을 썼다.
union이 들어있기 때문에
서브쿼리로 처리하는 것보다는 cte를 쓰는 게 알아보기 편할 것 같아서
cte를 쓰는 것은 동일하게 했다.
WITH RESULT
AS (SELECT airport_id,
Sum(flights_count) AS "total_count"
FROM (SELECT departure_airport AS "airport_id",
flights_count
FROM Flights
UNION ALL
SELECT arrival_airport,
flights_count
FROM Flights) a
GROUP BY 1)
SELECT airport_id
FROM RESULT
WHERE total_count = (SELECT Max(total_count)
FROM RESULT);
SELECT ANIMAL_ID,
NAME,
SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE name IN ( 'Lucy', 'Ella', 'Pickle', 'Rogan',
'Sabrina', 'Mitty' )
ORDER BY 1;
문제 링크
where절에 and와 or 조건을 넣을 때
논리연산자가 어떻게 작동하는지 주의해서 보고 넣을 것.
and는 앞뒤로 동시에 참이어야 하고
or는 앞뒤 중 하나만 참이어도 됨.
괄호로 잘 묶어줘야 꼬이지 않음.
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 1;
문제 링크
where 절로 조건을 걸고
order by로 정렬까지 마친 다음 limit를 써서 출력 결과를 제한하면 된다.
SELECT i.NAME,
i.DATETIME
FROM ANIMAL_INS i
LEFT JOIN ANIMAL_OUTS o
ON i.ANIMAL_ID = o.ANIMAL_ID
WHERE o.DATETIME IS NULL
ORDER BY DATEDIFF(o.DATETIME, i.DATETIME) DESC,
2 ASC
LIMIT 3;
문제 링크
where절까지 굳이 쓸 필요없이
join 조건으로 넣으면 됨.
SELECT i.ANIMAL_id,
i.NAME
FROM ANIMAL_INS i
JOIN ANIMAL_OUTS o
ON i.ANIMAL_ID = o.ANIMAL_ID
AND o.DATETIME < i.DATETIME
ORDER BY i.DATETIME ASC;
문제 링크
간단한 join 문제.
SELECT o.ANIMAL_ID,
o.NAME
FROM ANIMAL_OUTS o
LEFT JOIN ANIMAL_INS i
ON o.ANIMAL_ID = i.ANIMAL_ID
WHERE i.DATETIME IS NULL
ORDER BY 1;
이걸로 프로그래머스는 끝.
3트를 돌지는 않을 것 같다.
시간을 들이는 것 대비 효율이 별로인 듯해서 leetcode 3트까지만 집중하기로.