🚩 프로그래머스(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. 코드 해석