SELECT
NAME,
COUNT(NAME) AS COUNT
FROM ANIMAL_INS
WHERE NOT NAME IS NULL
GROUP BY NAME
HAVING COUNT(NAME) > 1
ORDER BY NAME
SELECT - 동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회
WHERE - 이때 결과는 이름이 없는 동물은 집계에서 제외하며,
ORDER BY - 결과는 이름 순으로
SELECT CAR_TYPE, COUNT(CAR_TYPE) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE
OPTIONS LIKE '%통풍시트%'
OR OPTIONS LIKE '%열선시트%'
OR OPTIONS LIKE '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE
FROM - CAR_RENTAL_COMPANY_CAR 테이블에서
WHERE - '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가
SELECT - 자동차 종류 별로 몇 대인지 출력. 이때 자동차 수에 대한 컬럼명은 CARS로 지정
ORDER BY - 결과는 자동차 종류를 기준으로 오름차순 정렬.
SELECT
MCDP_CD AS '진료과 코드',
COUNT(APNT_YMD) AS '5월예약건수'
FROM APPOINTMENT
WHERE DATE_FORMAT(APNT_YMD, '%Y-%m') = '2022-05'
GROUP BY MCDP_CD
ORDER BY COUNT(APNT_YMD), MCDP_CD
FROM - APPOINTMENT 테이블에서
WHERE - 2022년 5월에 예약한
SELECT - 환자 수를 진료과코드 별로 조회. 이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정
ORDER BY - 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬.
SELECT
ANIMAL_TYPE,
COUNT(ANIMAL_TYPE) AS count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
FROM - 동물 보호소에 들어온 동물 중
SELECT, GROUP BY - 고양이와 개가 각각 몇 마리인지 조회
ORDER BY - 이때 고양이를 개보다 먼저 조회해주세요.
고양이를 먼저 조회하려면, 고양이(Cat)가 개(Dog)보다 알파벳 순서가 앞이므로 ANIMAL_TYPE을 기준으로 오름차순 정렬하면 된다.
SELECT
DATE_FORMAT(DATETIME, '%H') AS HOUR,
COUNT(DATE_FORMAT(DATETIME, '%H')) AS COUNT
FROM ANIMAL_OUTS
WHERE
DATE_FORMAT(DATETIME, '%H') >= 9
AND DATE_FORMAT(DATETIME, '%H') <= 19
GROUP BY DATE_FORMAT(DATETIME, '%H')
ORDER BY DATE_FORMAT(DATETIME, '%H')
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
WHERE - 09:00부터 19:59까지,
SELECT - 각 시간대별로 입양이 몇 건이나 발생했는지 조회
ORDER BY - 이때 결과는 시간대 순으로 정렬
문제 예시)에서는 HOUR 값이 9 ~ 19로 되어있어서 한자리 수일 때는 '09'가 아닌 '9'가 되도록 %k로 구현해야 하는가 싶었는데 %H로 구현해도 딱히 상관없었던 모양이다.
FROM - PRODUCT 테이블에서
SELECT - 만원 단위의 가격대 별로 상품 개수를 출력
이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정
가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시.
ORDER BY - 결과는 가격대를 기준으로 오름차순 정렬.
답은 맞았으나 망한 풀이:
SELECT
CASE
WHEN PRICE >= 0 AND PRICE < 10000 THEN 0
WHEN PRICE >= 10000 AND PRICE < 20000 THEN 10000
WHEN PRICE >= 20000 AND PRICE < 30000 THEN 20000
WHEN PRICE >= 30000 AND PRICE < 40000 THEN 30000
WHEN PRICE >= 40000 AND PRICE < 50000 THEN 40000
WHEN PRICE >= 50000 AND PRICE < 60000 THEN 50000
WHEN PRICE >= 60000 AND PRICE < 70000 THEN 60000
WHEN PRICE >= 70000 AND PRICE < 80000 THEN 70000
WHEN PRICE >= 80000 AND PRICE < 90000 THEN 80000
ELSE 90000
END AS PRICE_GROUP,
COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
이걸 TRUNCATE(숫자, 버릴 자리수)를 사용하면 간단히 줄일 수 있다.
버릴자리수가 양수면 소수점이하 n번째 자리수를, 음수면 소수점 이상 n번째 자리수를 의미한다
예) PRICE = 10000원 ~ 19999원 일 때,
TRUNCATE(PRICE, -4) = 1이므로 최소값을 기준으로 그룹핑할 수 있다.
SELECT
TRUNCATE(PRICE, -4) AS PRICE_GROUP,
COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP
SELECT - 상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량(총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정)을
ORDER BY - 총주문량이 작은 순서대로 조회.
SELECT
INGREDIENT_TYPE,
SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF fh
INNER JOIN ICECREAM_INFO ii ON fh.FLAVOR = ii.FLAVOR
GROUP BY INGREDIENT_TYPE
ORDER BY TOTAL_ORDER
각 테이블의 기본키, 참조키가 같다는 조건하에 두 테이블을 JOIN하고
성분타입(INGREDIENT_TYPE)을 기준으로 그룹핑하여
총주문량(TOTAL_ORDER)의 합(SUM())을 각각 계산하고
총주문량(TOTAL_ORDER)을 기준으로 오름차순 정렬한다.
WHERE - 2022년 1월의
GROUP BY, SUM - 카테고리 별 도서 판매량을 합산하고,
SELECT - 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력.
ORDER BY - 결과는 카테고리명을 기준으로 오름차순 정렬해주세요.
SELECT
b.CATEGORY,
SUM(bs.SALES) AS TOTAL_SALES
FROM BOOK_SALES bs
INNER JOIN BOOK b ON b.BOOK_ID = bs.BOOK_ID
WHERE DATE_FORMAT(bs.SALES_DATE, '%Y-%m') = '2022-01'
GROUP BY b.CATEGORY
ORDER BY CATEGORY
FROM - REST_INFO 테이블에서
GROUP BY - 음식종류별로
MAX() - 즐겨찾기수가 가장 많은 식당의
SELECT - 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회
ORDER BY - 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.
INNER JOIN을 사용한 풀이
SELECT r.FOOD_TYPE, REST_ID, REST_NAME, r.FAVORITES
FROM REST_INFO r
INNER JOIN (
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
) f ON r.FAVORITES = f.FAVORITES AND r.FOOD_TYPE = f.FOOD_TYPE
ORDER BY FOOD_TYPE DESC
WHERE ~ IN 연산자를 사용한 풀이.
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
FROM - USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서
WHERE - 완료된 중고 거래의
HAVING - 총금액이 70만 원 이상인 사람의
SELECT - 회원 ID, 닉네임, 총거래금액을 조회.
ORDER BY - 결과는 총거래금액을 기준으로 오름차순 정렬해주세요.
SELECT USER_ID, NICKNAME, b.TOTAL_SALES
FROM USED_GOODS_USER u
INNER JOIN (
SELECT WRITER_ID, SUM(PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD
WHERE STATUS = 'DONE'
GROUP BY WRITER_ID
HAVING SUM(PRICE) >= 700000
) b ON u.USER_ID = b.WRITER_ID
ORDER BY b.TOTAL_SALES
SELECT - 자동차 ID와 AVAILABILITY 리스트를 출력
SELECT MAX(IF(조건)) - 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중', 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가, 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시
FROM - CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
ORDER BY - 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT
CAR_ID,
MAX(IF(
'2022-10-16' BETWEEN START_DATE AND END_DATE,
'대여중',
'대여 가능'
)) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
BETWEEN ~ AND ~ 를 사용해서 2022년 10월 16일이 대여 기간에 포함되어 있다면 '대여중', 아니라면 '대여 가능'으로 값을 넣는다.
그리고 자동차id를 기준으로 여러 텀의 대여 정보가 기록되므로 가장 최신의 텀에 대한 정보만 조회하기위해 GROUP BY 와MAX()를 사용했다
FROM - CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
WHERE - 대여 시작일(START_DATE)을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의
SELECT, GROUP BY - 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요.
ORDER BY - 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요.
HAVING - 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
SELECT
MONTH(START_DATE) AS MONTH,
CAR_ID,
COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
) AND DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH, CAR_ID DESC
문제를 해석하는데 다소 시간이 걸렸던 문제다.
먼저, 2가지 조건을 만족해야 한다. WHERE 1. AND 2.
(조건2가 조건1에 포함되어 있는 게 아닌가? 하고 헷갈렸다.)
CAR_ID IN (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5
)
DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
그리고 월별 자동차 ID 별 총 대여 횟수(RECORDS)를 구하려면
월과 자동차 ID, 이 2가지로 그룹핑하고 COUNT()로 계산한 RECORDS를 조회한다.
RECORDS가 0인 경우는 제외하고
HAVING RECORDS > 0
-- 또는
HAVING RECORDS <> 0
-- 또는
HAVING RECORDS != 0
주어진 조건대로 정렬하고 마친다.
ORDER BY MONTH, CAR_ID DESC
MONTH() 함수
DATE_FORMAT(날짜, '%c')와 동일한 결과를 표시한다.