SQL 문제풀이 복습
문제 링크
1트(7/17)의 풀이와 다른 건 모두 똑같지만
이번에는 cross join이 아니라 그냥 (inner) join을 썼다.
굳이 cross join을 써서 모든 경우의 수를 다 뽑을 필요가 없음.
그리고 join의 조건은
이렇게 3개를 주면 된다.
어렵지는 않지만 join의 조건을 잘 줘야 하는 문제.
SELECT DISTINCT l1.account_id
FROM LogInfo l1
JOIN LogInfo l2
ON l1.account_id = l2.account_id
AND l1.ip_address <> l2.ip_address
AND ( l2.login BETWEEN l1.login AND l1.logout );
문제 링크
기본적인 join 문제.
SELECT firstName,
lastName,
city,
state
FROM Person p
LEFT JOIN Address a
ON p.personId = a.personId;
SELECT product_id
FROM Products
WHERE low_fats = 'Y'
AND recyclable = 'Y';
문제 링크
1트(6/24) 풀이와 달라진 부분
SELECT i.ITEM_ID,
i.ITEM_NAME
FROM ITEM_INFO i
JOIN ITEM_TREE t
ON i.ITEM_ID = t.ITEM_ID
AND t.PARENT_ITEM_ID IS NULL
ORDER BY 1;
SELECT Sum(price) AS "TOTAL_PRICE"
FROM ITEM_INFO
WHERE RARITY = 'LEGEND';
문제 링크
1트(4/8) 때 풀이를 보면 이상한 말을 써 놓았다..ㅎㅎ
join의 조건에 일치하는 데이터만 뽑아올 거기 때문에
사실 left join이 아니라 그냥 join을 쓰는 게 더 깔끔하고,
(left join을 쓰면 경우에 따라서는 reply가 없는 게시물까지 다 나오게 됨)
위 문제에서와 동일하게 where절을 쓸 필요 없이 join 조건에서 다 해결할 수 있다.
한 가지 문제를 풀면서 들었던 의문은
created_date에 그냥 date 함수를 쓰면 적용이 안 되고
꼭 date_format으로 써야만 적용되게 해 놓았다는 점이었는데,
무슨 문제인지 정확히는 모르겠지만 그냥 넘어가기로.
SELECT b.TITLE,
b.BOARD_ID,
r.REPLY_ID,
r.WRITER_ID,
r.CONTENTS,
Date_format(r.CREATED_DATE, '%Y-%m-%d') AS "CREATED_DATE"
FROM USED_GOODS_BOARD b
JOIN USED_GOODS_REPLY r
ON b.BOARD_ID = r.BOARD_ID
AND Date_format(B.CREATED_DATE, '%Y-%m') = '2022-10'
ORDER BY 6,
1;
문제 링크
이건 예전에 풀었다가 링크를 안 남겨둔 건지 찾질 못하겠다.
SELECT BOARD_ID,
WRITER_ID,
TITLE,
PRICE,
CASE
WHEN STATUS = 'SALE' THEN '판매중'
WHEN STATUS = 'RESERVED' THEN '예약중'
WHEN STATUS = 'DONE' THEN '거래완료'
end AS "STATUS"
FROM USED_GOODS_BOARD
WHERE CREATED_DATE = '2022-10-05'
ORDER BY 1 DESC;
문제 링크
join과 서브쿼리, concat이 조합된 좋은 문제였다.
SELECT Concat('/home/grep/src/', f.BOARD_ID, '/', FILE_ID, FILE_NAME, FILE_EXT)
AS
"FILE_PATH"
FROM USED_GOODS_FILE f
JOIN (SELECT BOARD_ID
FROM USED_GOODS_BOARD
WHERE VIEWS = (SELECT Max(VIEWS)
FROM USED_GOODS_BOARD)) a
ON f.BOARD_ID = a.BOARD_ID
ORDER BY f.FILE_ID DESC;