728x90
그룹별 조건에 맞는 식당 목록 출력하기
-- 가장 많이 쓴 리뷰 개수를 쓴 사람의 이름, 리뷰, 날짜 구하기
SELECT M.MEMBER_NAME, R.REVIEW_TEXT, DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d") REVIEW_DATE
FROM MEMBER_PROFILE M INNER JOIN REST_REVIEW R
ON M.MEMBER_ID = R.MEMBER_ID
WHERE R.MEMBER_ID IN
-- 가장 많이 쓴 리뷰 개수를 쓴 사람 구하기
(SELECT MEMBER_ID FROM REST_REVIEW GROUP BY MEMBER_ID HAVING COUNT(*) =
-- 가장 많이 쓴 리뷰 개수 구하기
(SELECT MAX(CNT) FROM
-- 리뷰 개수 구하기
(SELECT COUNT(*) AS CNT FROM REST_REVIEW GROUP BY MEMBER_ID) A
)
)
ORDER BY R.REVIEW_DATE ASC;
1. DATE_FORMAT(R.REVIEW_DATE, "%Y-%m-%d")
2. JOIN 쓴 뒤에는 ON 빼먹지 않기
3. FROM절에 서브쿼리가 있다면 무조건 정의해 줘야 한다 (= A)
5월 식품들의 총 매출 조회하기
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FO.AMOUNT*FP.PRICE AS TOTAL_SALES
FROM FOOD_PRODUCT FP JOIN
(SELECT PRODUCT_ID, SUM(AMOUNT) AS AMOUNT, PRODUCE_DATE
FROM FOOD_ORDER
WHERE LEFT(PRODUCE_DATE, 7) = '2022-05'
GROUP BY PRODUCT_ID) FO
ON FP.PRODUCT_ID = FO.PRODUCT_ID
ORDER BY TOTAL_SALES DESC, PRODUCT_ID;
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, SUM(FO.AMOUNT*FP.PRICE) AS TOTAL_SALES
FROM FOOD_PRODUCT FP JOIN FOOD_ORDER FO
ON FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE LEFT(FO.PRODUCE_DATE, 7) = '2022-05'
GROUP BY PRODUCT_ID
ORDER BY TOTAL_SALES DESC, PRODUCT_ID;
1. HAVING vs WHERE
- HAVING을 쓰게 되면 GROUP BY 된 이후 특정한 필드로 그룹회된 새로운 테이블에 조건을 준다
- WHERE은 우선적으로 모든 필드를 조건에 둘 수 있다 => 이 문제에서는 WHERE로 풀어야 함
- 전체 테이블 자체에서 쿼리를 수행하고 싶다면 WHERE을, 전체 테이블을 그룹화한 뒤 조건을 걸고 싶다면 HAVING 사용
없어진 기록 찾기
-- ANIMALS_OUTS과 ANIMALS_INS에서 같지 않은 컬럼 서브쿼리
-- 동물의 ID와 이름을 ID순으로 조회
SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_INS)
ORDER BY ANIMAL_ID
있었는데요 없었습니다
SELECT I.ANIMAL_ID, I.NAME
FROM ANIMAL_INS I LEFT JOIN ANIMAL_OUTS O
ON I.ANIMAL_ID = O.ANIMAL_ID
WHERE I.DATETIME > O.DATETIME
ORDER BY I.DATETIME
오랜 기간 보호한 동물 (1)
-- 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일
-- 보호 시작일 순으로 조회
-- 아직 입양 못 간 동물(NOT IN) 찾은 뒤 보호 시작일 순으로 정렬해 LIMIT 3
SELECT NAME, DATETIME
FROM ANIMAL_INS
WHERE ANIMAL_ID NOT IN (SELECT ANIMAL_ID FROM ANIMAL_OUTS)
ORDER BY DATETIME
LIMIT 3;
상품별 오프라인 매출 구하기
-- 상품코드별 매출액(판매가 * 판매량) 합계
-- 매출액 내림차순, 상품코드 오름차순
SELECT P.PRODUCT_CODE, SUM(O.SALES_AMOUNT * P.PRICE) AS SALES
FROM PRODUCT P JOIN OFFLINE_SALE O
ON P.PRODUCT_ID = O.PRODUCT_ID
GROUP BY P.PRODUCT_CODE
ORDER BY SALES DESC, P.PRODUCT_CODE ASC;
상품을 구매한 회원 비율 구하기
-- 2021년에 가입한 전체 회원들 중 상품을 구매한 회원 수
-- 상품을 구매한 비율(구매한 수 / 전체 회원수) 소수점 두번째자리에서 반올림
-- 년, 월별로 출력(GROUP BY)
-- 년 기준 오름차순, 월 기준 오름차순(ORDER BY)
SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH,
COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT OS.USER_ID) /
(SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = 2021),1) AS PUCHASED_RATIO
FROM ONLINE_SALE OS LEFT JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID
WHERE YEAR(UI.JOINED) = 2021
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
1. FROM 절에 서브쿼리 쓸 때랑 SELECT 절에 서브쿼리 쓸 곳 구분하기
- SUM과 ID만 구할 때는 굳이 FROM절에 서브쿼리 쓰지 않아도 됨
2. DISTINCT는 COUNT 안에 쓰기
3. COUNT(*) 남발하지 않기 웬만하면 ID로 계산하기
728x90
'프로그래밍 > DB' 카테고리의 다른 글
[SQL][프로그래머스] SUM, MAX, MIN 문제 풀이 (0) | 2022.10.16 |
---|---|
[SQL][프로그래머스] SELECT 문제 풀이 (0) | 2022.10.15 |
[mysql] 데이터 가공(csv, json, import, export) 오류 (0) | 2022.06.15 |
mysql (0) | 2022.03.16 |
mysql - 실습(5-3) (0) | 2022.03.16 |