
🚩 프로그래머스(programmers)에서 제공하는 SQL 문제풀기
🚩 JOIN
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131533
2. 코드
SELECT PRODUCT_CODE, SUM(PRICE*SALES_AMOUNT) AS SALES
FROM PRODUCT A
JOIN OFFLINE_SALE B
ON A.PRODUCT_ID=B.PRODUCT_ID
GROUP BY PRODUCT_CODE
ORDER BY SALES DESC, PRODUCT_CODE ASC;
3. 코드 해석
해당 문제는 PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드(PRODUCT_CODE) 별 매출액(판매가PRICE * 판매량SALES_AMOUNT) 합계(SALES)를 출력하기 위해 SELECT~FROM문을 사용한다. 상품코드(PRODUCT_ID)로 내부 조인(INNER JOIN)하고, 상품코드별 매출액의 합계를 구하기 위해 GROUP BY절을 사용한다. 또한 ORDER BY절을 사용하여 매출액(SALES)을 기준으로 내림차순(DESC) 정렬하고, 매출액이 같다면 상품코드(PRODUCT_CODE)를 기준으로 오름차순(ASC) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59044
2. 코드
SELECT I.NAME, I.DATETIME
FROM ANIMAL_INS I
LEFT OUTER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE O.DATETIME IS NULL
ORDER BY I.DATETIME ASC
LIMIT 3;
3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물 이름(NAME)과 보호 시작일(DATETIME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 외부 조인(OUTER JOIN)하고, 아직 입양을 못 간 동물(O.DATETIME IS NULL) 조건을 WHERE 조건절로 추가한다. 또한 가장 오래 보호소에 있었던 동물로 나열하기 위해 ORDER BY절을 사용하여 보호 시작일(I.DATETIME)로 오름차순(ASC) 정렬하고, LIMIT 숫자를 사용하여 동물 3마리만 조회한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59043
2. 코드
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I
JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME ASC;
3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물의 아이디(ANIMAL_ID)와 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 내부 조인(INNER JOIN)하고, 보호 시작일보다 입양일이 더 빠른 동물(I.DATETIME > O.DATETIME) 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 보호 시작일(I.DATETIME)이 빠른 순로 조회하기 위해 오름차순(ASC) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59042
2. 코드
SELECT O.ANIMAL_ID, O.NAME
FROM ANIMAL_INS I
RIGHT OUTER JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID=O.ANIMAL_ID
WHERE I.DATETIME IS NULL
ORDER BY O.ANIMAL_ID ASC;
3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물의 아이디(ANIMAL_ID)와 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 외부 조인(OUTER JOIN)하고, 동물 보호소에 들어온 기록이 없는 동물(I.DATETIME IS NULL) 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 동물의 아이디(ANIMAL_ID)순으로 조회하기 위해 오름차순(ASC) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/59045
2. 코드
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 (SEX_UPON_INTAKE LIKE 'Intact%') AND (SEX_UPON_OUTCOME LIKE 'Spayed%' OR SEX_UPON_OUTCOME LIKE 'Neutered%')
ORDER BY ANIMAL_ID ASC;
3. 코드 해석
해당 문제는 ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블에서 동물의 아이디(ANIMAL_ID)와 생물 종(ANIMAL_TYPE), 이름(NAME)을 조회하기 위해 SELECT~FROM문을 사용한다. 동물의 아이디(ANIMAL_ID)로 내부 조인(INNER JOIN)하고, 보호소에 들어올 당시에는 중성화되지 않았지만(SEX_UPON_INTAKE LIKE 'Intact%'), 보호소를 나갈 당시에는 중성화된 동물(SEX_UPON_OUTCOME LIKE 'Spayed%' OR SEX_UPON_OUTCOME LIKE 'Neutered%') 조건을 WHERE 조건절로 추가한다. 또한 ORDER BY절을 사용하여 동물의 아이디(ANIMAL_ID)순으로 조회하기 위해 오름차순(ASC) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131117
2. 코드
SELECT A.PRODUCT_ID, A.PRODUCT_NAME, SUM(A.PRICE*B.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT A
JOIN FOOD_ORDER B
ON A.PRODUCT_ID=B.PRODUCT_ID
WHERE DATE_FORMAT(PRODUCE_DATE, '%Y-%m')='2022-05'
GROUP BY A.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, PRODUCT_ID ASC;
3. 코드 해석
해당 문제는 FOOD_PRODUCT 테이블과 FOOD_ORDER 테이블에서 식품 ID(PRODUCT_ID), 식품 이름(PRODUCT_NAME), 총매출(TOTAL_SALES)을 조회하기 위해 SELECT~FROM문을 사용한다. 식품 ID(PRODUCT_ID)로 내부 조인(INNER JOIN)하고, 생산일자가 2022년 5월인 식품(DATE_FORMAT(PRODUCE_DATE, '%Y-%m')='2022-05') 조건을 WHERE 조건절로 추가한다. GROUP BY절로 식품 ID(PRODUCT_ID)로 묶어 총매출(SUM(A.PRICE*B.AMOUNT))을 계산한다. 또한 ORDER BY절을 사용하여 총매출(TOTAL_SALES)을 기준으로 내림차순(DESC) 정렬하고, 총매출이 같다면 식품 ID(PRODUCT_ID)를 기준으로 오름차순(ASC) 정렬한다.
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131124
2. 코드
SELECT A.MEMBER_NAME, B.REVIEW_TEXT, DATE_FORMAT(B.REVIEW_DATE, '%Y-%m-%d') AS REVIEW_DATE
FROM MEMBER_PROFILE A
JOIN REST_REVIEW B
ON A.MEMBER_ID=B.MEMBER_ID
WHERE B.MEMBER_ID IN (
SELECT MEMBER_ID FROM REST_REVIEW GROUP BY MEMBER_ID HAVING COUNT(MEMBER_ID) =
(SELECT MAX(C.count) FROM (SELECT COUNT(MEMBER_ID) AS count FROM REST_REVIEW GROUP BY MEMBER_ID) C))
ORDER BY REVIEW_DATE ASC, REVIEW_TEXT ASC;
3. 코드 해석
1. 문제 link https://school.programmers.co.kr/learn/courses/30/lessons/131534
2. 코드
SELECT YEAR(A.SALES_DATE) AS YEAR, MONTH(A.SALES_DATE) AS MONTH, COUNT(DISTINCT(A.USER_ID)) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT(A.USER_ID)) / (SELECT COUNT(*) FROM USER_INFO B WHERE YEAR(JOINED)=2021), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE A
JOIN USER_INFO B
ON A.USER_ID=B.USER_ID
WHERE YEAR(B.JOINED)=2021
GROUP BY YEAR, MONTH
ORDER BY YEAR ASC, MONTH ASC;
3. 코드 해석