https://school.programmers.co.kr/learn/courses/30/parts/17044
REST_INFO
식당 정보 테이블REST_ID
식당 IDREST_NAME
식당 이름FOOD_TYPE
음식 종류, NULLVIEWS
조회수, NULLFAVORITES
즐겨찾기 수, NULLPARKING_LOT
주차장 유무, NULLADDRESS
주소, NULLTEL
전화번호, NULLGROUP BY FOOD_TYPE
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
ORDER BY FOOD_TYPE desc
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
SELECT A.FOOD_TYPE, A.REST_ID, A.REST_NAME, A.FAVORITES
FROM REST_INFO A
WHERE A.FAVORITES = (SELECT MAX(B.FAVORITES)
FROM REST_INFO B
WHERE B.FOOD_TYPE = A.FOOD_TYPE)
ORDER BY FOOD_TYPE desc
USED_GOODS_BOARD
중고 거래 게시판 정보 테이블BOARD_ID
게시글 IDWRITER_ID
작성자 IDTITLE
게시글 제목CONTENTS
게시글 내용PRICE
가격CREATED_DATE
작성일, DATESTATUS
거래상태VIEWS
조회수USED_GOODS_USER
중고 거래 게시판 사용자 정보 테이블USER_ID
회원 IDNICKNAME
닉네임CITY
시STREET_ADDRESS1
도로명 주소STREET_ADDRESS2
상세 주소, NULLTLNO
전화번호WHERE STATUS = 'DONE'
WHERE (SELECT SUM(PRICE) ...) >= 700000
SELECT USER_ID, NICKNAME, SUM(PRICE)
ORDER BY SUM(PRICE)
SELECT USER_ID, NICKNAME, SUM(PRICE) as TOTAL_SALES
FROM USED_GOODS_BOARD A
JOIN USED_GOODS_USER B on A.WRITER_ID = B.USER_ID
WHERE STATUS = 'DONE'
GROUP BY USER_ID
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES
BOOK
: 어느 한 서점에서 판매중인 도서들의 도서 정보 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
BOOK_ID | INTEGER | FALSE | 도서 ID |
CATEGORY | VARCHAR(N) | FALSE | 카테고리 (경제, 인문, 소설, 생활, 기술) |
AUTHOR_ID | INTEGER | FALSE | 저자 ID |
PRICE | INTEGER | FALSE | 판매가 (원) |
PUBLISHED_DATE | DATE | FALSE | 출판일 |
AUTHOR
도서의 저자의 정보 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
AUTHOR_ID | INTEGER | FALSE | 저자 ID |
AUTHOR_NAME | VARCHAR(N) | FALSE | 저자명 |
BOOK_SALES
각 도서의 날짜 별 판매량 정보 테이블
Column name | Type | Nullable | Description |
---|---|---|---|
BOOK_ID | INTEGER | FALSE | 도서 ID |
SALES_DATE | DATE | FALSE | 판매일 |
SALES | INTEGER | FALSE | 판매량 |
SELECT BOOK_ID, count(SALES)
FROM BOOK_SALES
WHERE SALES_DATE like '2022-01%'
GROUP BY BOOK_ID
TOTAL_SALES = 판매량 * 판매가
SELECT PRICE * count(SALES) as TOTAL_SALES
SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, TOTAL_SALES
ORDER BY AUTHOR_ID, CATEGORY desc
SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, TOTAL_SALES
FROM AUTHOR
NATURAL JOIN (SELECT BOOK_ID, CATEGORY, AUTHOR_ID, CNTSALES * price as TOTAL_SALES
FROM BOOK
NATURAL JOIN (SELECT BOOK_ID, SUM(SALES) as CNTSALES
FROM BOOK_SALES
WHERE SALES_DATE like '2022-01%'
GROUP BY BOOK_ID) as SUB) as TOTAL
ORDER BY AUTHOR_ID, CATEGORY desc
SELECT AUTHOR_ID, AUTHOR_NAME, CATEGORY, SUM(SALES * PRICE) as TOTAL_SALES
FROM BOOK_SALES as BS
NATURAL JOIN BOOK as B
NATURAL JOIN AUTHOR as A
WHERE BS.SALES_DATE like '2022-01%'
GROUP BY AUTHOR_ID, CATEGORY
ORDER BY AUTHOR_ID, CATEGORY desc
SELECT CATEGORY, SUM(SALES) as TOTAL_SALES
FROM BOOK as B
NATURAL JOIN BOOK_SALES as BS
WHERE SALES_DATE like '2022-01%'
GROUP BY CATEGORY
ORDER BY CATEGORY
CAR_RENTAL_COMPANY_RENTAL_HISTORY
자동차 대여 기록 정보 테이블HISTORY_ID
자동차 대여 기록 IDCAR_ID
자동차 IDSTART_DATE
대여 시작일, DATEEND_DATE
대여 종료일, DATE대여중
/ 대여 가능
SELECT CAR_ID,
(CASE WHEN CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-10-16' BETWEEN DATE_FORMAT(START_DATE, '%Y-%m-%d') AND DATE_FORMAT(END_DATE, '%Y-%m-%d'))
THEN '대여중'
ELSE '대여 가능'
END) as AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID desc
APPOINTMENT
종합병원의 진료 예약정보 테이블APNT_YMD
진료예약일시, TIMESTAMPAPNT_NO
진료예약번호PT_NO
환자번호MCDP_CD
진료과코드MDDR_ID
의사ID,APNT_CNCL_YN
예약취소여부, NULLAPNT_CNCL_YMD
예약취소날짜, NULL, DATESELECT MCDP_CD, COUNT(*) as 5월예약건수
FROM APPOINTMENT
WHERE APNT_YMD like '2022-05%'
GROUP BY MCDP_CD
ORDER BY 5월예약건수, MCDP_CD
SELECT CAR_TYPE, COUNT(*) as CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS like '%통풍시트%' or OPTIONS like '%열선시트%' or OPTIONS like '%가죽시트%'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE
SELECT MONTH(START_DATE) as MONTH, CAR_ID, COUNT(*) as RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
AND CAR_ID IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATE_FORMAT(START_DATE, '%Y-%m') BETWEEN '2022-08' AND '2022-10'
GROUP BY CAR_ID
HAVING COUNT(*) >= 5)
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH, CAR_ID desc
FIRST_HALF
아이스크림 가게의 상반기 주문 정보 테이블SHIPMENT_ID
출하 번호FLAVOR
아이스크림 맛, pkTOTAL_ORDER
총주문량ICECREAM_INFO
아이스크림 성분 정보 테이블FLAVOR
아이스크림 맛, pk, 외래키INGREDIENT_TYPE
아이스크림의 성분 타입 (sugar_based
, fruit_based
)SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) as TOTAL_ORDER
FROM FIRST_HALF
NATURAL JOIN ICECREAM_INFO
GROUP BY INGREDIENT_TYPE
ORDER BY TOTAL_ORDER
FOOD_PRODUCT
식품 정보 테이블
Column name | Type | Nullable |
---|---|---|
PRODUCT_ID | VARCHAR(10) | FALSE |
PRODUCT_NAME | VARCHAR(50) | FALSE |
PRODUCT_CD | VARCHAR(10) | TRUE |
CATEGORY | VARCHAR(10) | TRUE |
PRICE | NUMBER | TRUE |
SELECT CATEGORY, PRICE as MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY, PRICE) IN (SELECT CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY)
ORDER BY MAX_PRICE desc
ORDER BY ANIMAL_TYPE
// 'C'at > 'D'og
SELECT ANIMAL_TYPE, COUNT(*) as count
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
HAVING ANIMAL_TYPE = 'Cat' or ANIMAL_TYPE = 'Dog'
ORDER BY ANIMAL_TYPE = 'Cat' desc
SELECT A.NAME, COUNT(*) as COUNT
FROM ANIMAL_INS A
WHERE A.NAME IN (SELECT B.NAME
FROM ANIMAL_INS B
WHERE A.ANIMAL_ID != B.ANIMAL_ID)
GROUP BY NAME
ORDER BY NAME
SELECT NAME, COUNT(NAME) as COUNT
//COUNT(*) 하면 오답
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME
USER_INFO
의류 쇼핑몰에 가입한 회원 정보 테이블USER_ID
회원 IDGENDER
성별, NULL, 0남자 1여자AGE
나이, NULLJOINED
가입일, DATEONLINE_SALE
테이블ONLINE_SALE_ID
온라인 상품 판매 IDUSER_ID
회원 IDPRODUCT_ID
상품 IDSALES_AMOUNT
판매량SALES_DATE
판매일SELECT YEAR(SALES_DATE) as YEAR, MONTH(SALES_DATE) as MONTH, GENDER, COUNT(USER_ID) as USERS
FROM USER_INFO
NATURAL JOIN ONLINE_SALE
GROUP BY YEAR, MONTH, GENDER
HAVING GENDER is not null
ORDER BY YEAR, MONTH, GENDER
SELECT YEAR(SALES_DATE) as YEAR, MONTH(SALES_DATE) as MONTH, GENDER, COUNT(distinct USER_ID) as USERS
FROM USER_INFO
NATURAL JOIN ONLINE_SALE
GROUP BY YEAR, MONTH, GENDER
HAVING GENDER is not null //where절이어도 된다!
ORDER BY YEAR, MONTH, GENDER
ANIMAL_OUTS
동물 보호소에서 입양 보낸 동물의 정보 테이블ANIMAL_ID
동물의 아이디ANIMAL_TYPE
생물 종DATETIME
입양일NAME
이름, NULLSEX_UPON_OUTCOME
성별 및 중성화 여부SELECT HOUR(DATETIME) as HOUR, COUNT(*) COUNT
FROM ANIMAL_OUTS
WHERE DATE_FORMAT(DATETIME, '%H:%i') BETWEEN '09:00' AND '19:59'
GROUP BY HOUR
ORDER BY HOUR
//같은 기능
WHERE HOUR(DATETIME) BETWEEN 0 AND 23
WHERE DATE_FORMAT(DATETIME, '%H') BETWEEN '0' AND '23'
SELECT HOUR(DATETIME) as HOUR, count(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) BETWEEN 0 AND 23
GROUP BY HOUR
ORDER BY HOUR
SET @hour := -1;
SELECT (@hour := @hour + 1) as HOUR, (SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23
:=
대입 연산자 / =
비교 연산자GROUP BY
절을 사용할 때, COUNT(*)
의 결과가 0이 되는 경우는 없다.PRODUCT
의류 쇼핑몰에서 판매중인 상품들의 정보 테이블PRODUCT_ID
상품 IDPRODUCT_CODE
상품코드, pk, 8자리 (카테고리코드 2자리 + 6자리)PRICE
판매가SELECT FORMAT(PRICE / 10000, '%F') PRICE_GROUP
FROM PRODUCT
ORDER BY PRICE_GROUP
FLOOR()
ROUND(123.456, 0)
→ 0CEIL()
TRUNCATE(123.456, 0)
→ 0SELECT PRICE_GROUP, COUNT(*) PRODUCTS
FROM (SELECT *, FLOOR(PRICE/10000)*10000 PRICE_GROUP
FROM PRODUCT) as P2
GROUP BY PRICE_GROUP
ORDER BY PRICE