[Level 1] - 조건에 부합하는 중고거래 댓글 조회하기
https://school.programmers.co.kr/learn/courses/30/lessons/164673
22년 10월에 작성된 글을 조회하는 것이기 때문에 WHERE 절에 LIKE로 2022년 10월을 넣어주고,
댓글 작성일 기준으로 오름차순, 작성일이 같다면 게시글 제목을 기준으로 오름차순 하라고 했기 때문에
ORDER BY 댓글 작성일, 게시글 제목 으로 정렬 우선순위를 지정해준다.
SELECT USED_GOODS_BOARD.TITLE, USED_GOODS_BOARD.BOARD_ID, REPLY_ID, USED_GOODS_REPLY.WRITER_ID, USED_GOODS_REPLY.CONTENTS, DATE_FORMAT(USED_GOODS_REPLY.CREATED_DATE, '%Y-%m-%d')
FROM USED_GOODS_BOARD
INNER JOIN USED_GOODS_REPLY
ON USED_GOODS_BOARD.BOARD_ID = USED_GOODS_REPLY.BOARD_ID
WHERE USED_GOODS_BOARD.CREATED_DATE LIKE '2022-10-%'
ORDER BY USED_GOODS_REPLY.CREATED_DATE, USED_GOODS_BOARD.TITLE
[Level 3] - 오랜 기간 보호한 동물(1)
https://school.programmers.co.kr/learn/courses/30/lessons/59044
아직 입양을 못 간 동물 중에 가장 오래 보호소에 있었던 동물을 조회하는 것이기 때문에
IN 테이블에는 있지만 OUT 테이블에는 없는 동물들을 먼저 조회해야 한다.
LEFT JOIN으로 IN, OUT 조인해준 다음에
OUT 테이블에 정보가 없는 것을 조회해줘야 하기 때문에 OUT의 입양일이 NULL인 것들을 조회하면 된다.
(ANIMAL_ID 도 상관없음)
3마리만 출력하라고 했기 때문에 마지막으로 LIMIT 3 적어주기
SELECT ANIMAL_INS.NAME, ANIMAL_INS.DATETIME
FROM ANIMAL_INS
LEFT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_OUTS.DATETIME IS NULL
ORDER BY ANIMAL_INS.DATETIME ASC
LIMIT 3;
[Level 4] - 보호소에서 중성화한 동물
https://school.programmers.co.kr/learn/courses/30/lessons/59045
밑에 설명에 보면 중성화를 거치지 않은 동물은 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered로 표시되어 있다고 나와있다.
보호소에 들어올 당시 중성화가 되지 않았지만, 나갈 때는 중성화가 되어있는 동물을 조회하는 것이기 때문에
IN 테이블의 중성화 여부가 Intact로 시작하고, OUT 테이블의 중성화 여부가 Intact가 아니면 된다.
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.ANIMAL_TYPE, ANIMAL_INS.NAME
FROM ANIMAL_INS
LEFT JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.SEX_UPON_INTAKE LIKE 'Intact%'
AND ANIMAL_OUTS.SEX_UPON_OUTCOME NOT LIKE 'Intact%'
[Level 3] - 있었는데요 없었습니다
https://school.programmers.co.kr/learn/courses/30/lessons/59043
보호 시작일보다 입양일이 더 빠른 동물을 조회하는 것이기 때문에
IN 테이블의 DATETIME보다 OUT 테이블의 DATETIME이 더 작은 것을 찾아주면 된다.
SELECT ANIMAL_INS.ANIMAL_ID, ANIMAL_INS.NAME
FROM ANIMAL_INS
INNER JOIN ANIMAL_OUTS
ON ANIMAL_INS.ANIMAL_ID = ANIMAL_OUTS.ANIMAL_ID
WHERE ANIMAL_INS.DATETIME > ANIMAL_OUTS.DATETIME
ORDER BY ANIMAL_INS.DATETIME ASC;
[Level 3] - 없어진 기록 찾기
https://school.programmers.co.kr/learn/courses/30/lessons/59042
입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물들을 조회하려면
OUT 테이블에 데이터는 있는데 IN 테이블에 없는 걸 찾으면 된다.
LEFT JOIN으로 OUT을 먼저 앞에 두고 (그래야 OUT을 기준으로 합쳐짐)
IN 테이블의 DATETIME이 NULL인 것을 뽑으면 된다. (ANIMAL_ID도 됨)
SELECT ANIMAL_OUTS.ANIMAL_ID, ANIMAL_OUTS.NAME
FROM ANIMAL_OUTS
LEFT JOIN ANIMAL_INS
ON ANIMAL_OUTS.ANIMAL_ID = ANIMAL_INS.ANIMAL_ID
WHERE ANIMAL_INS.DATETIME IS NULL
ORDER BY ANIMAL_OUTS.ANIMAL_ID;
[Level 3] - 카테고리 별 도서 판매량 집계하기
https://school.programmers.co.kr/learn/courses/30/lessons/144855
2022년 1월의 카테고리별 도서 판매량을 구하는 것이기 때문에
일단 조건은 2022년 1월이 될 것이고, 거기서 카테고리를 기준으로 그룹을 시켜야 한다.
2022년 1월 도서 판매량의 데이터를 먼저 뽑은 후 카테고리 별로 그룹을 나누는 것이기 때문에
HAVING이 아니라 WHERE로 써야 한다.
SELECT CATEGORY, SUM(BOOK_SALES.SALES) AS TOTAL_SALES
FROM BOOK
LEFT JOIN BOOK_SALES
ON BOOK.BOOK_ID = BOOK_SALES.BOOK_ID
WHERE BOOK_SALES.SALES_DATE LIKE '2022-01%'
GROUP BY BOOK.CATEGORY
ORDER BY BOOK.CATEGORY ASC;
[Level 5] - 상품을 구매한 회원 비율 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/131534
일단 2021년에 가입한 회원들 중 상품을 구매한 회원을 구해야 하기 때문에
JOIN 후 WHERE로 가입일자가 2021로 시작하는 것들을 뽑아주었다.
그리고 그룹을 지어야 하는데 문제에 년, 월 별로 출력하라고 했으니 년, 월로 그룹을 지어야 한다.
원래는 DATA_FORMAT 을 다 적었었는데, 넘 길어져서 AS로 YEAR, MONTH 이렇게 줄여서 했다.
그룹을 지은 후 회원수를 구하기 위해 USER ID를 COUNT 해주었다.
한 명의 회원이 상품을 여러 번 구매했을 수도 있으니 DISTINCT 로 중복을 제거해줘야 한다.
그 다음에 2021년도에 가입한 전체 회원 수에서 위에서 구했던 상품 구매한 회원 수를 나눠야 하는데,
지금까지 했던 쿼리에서는 GROUP BY로 그룹을 지었기 때문에 2021년도에 가입한 전체 회원수를 구할 수 없다.
=> 그래서 서브쿼리를 써야 한다.
SELECT 절에 서브 쿼리로 2021년도에 가입한 전체 회원수를 조회하는 쿼리를 넣고,
위에서 구했던 상품을 구매한 회원수를 나누어 ROUND로 반올림까지 해주면 끝!
SELECT DATE_FORMAT(ONLINE_SALE.SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(ONLINE_SALE.SALES_DATE, '%c') AS MONTH,
COUNT(DISTINCT USER_INFO.USER_ID) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT USER_INFO.USER_ID) /
(SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED LIKE '2021%'), 1)
AS PUCHASED_RATIO
FROM USER_INFO
INNER JOIN ONLINE_SALE
ON USER_INFO.USER_ID = ONLINE_SALE.USER_ID
WHERE USER_INFO.JOINED LIKE '2021%'
GROUP BY YEAR, MONTH
ORDER BY YEAR, DATE_FORMAT(ONLINE_SALE.SALES_DATE, '%m') ASC
'CS > DB' 카테고리의 다른 글
[DB] JMeter 부하 테스트 (1) | 2024.12.02 |
---|---|
[DB] SQL 성능 개선 (0) | 2024.12.02 |
[DB] SQL 문법 (1) | 2024.11.29 |
[DB] 워드프레스 서버 - DB 서버 연동 실습 (1) | 2024.11.28 |
[DB] SQL 연습 (윈도우 MySQL Workbench) (0) | 2024.11.28 |