SQL

SQL- 문제 풀어보기 SELECT02

woody-j 2024. 1. 14. 00:33

1. 평균 일일 대여 요금 구하기

CAR_RENTAL_COMPANY_CAR
 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요.
이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE로 지정해주세요.

 

자동차들의 평균 일일 대여 요금 : AVG()

소수 첫 번째 자리에서 반올림 : ROUND(_,0)

SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE FROM CAR_RENTAL_COMPANY_CAR WHERE CAR_TYPE='SUV'

2. 조건에 맞는 도서 리스트 출력하기

BOOK 테이블에서  2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.

 

2021년에 출판된 '인문' : WHERE PUBLISHED_DATE LIKE '2021%' AND CATEGORY IN ('인문')

SELECT BOOK_ID, DATE_FORMAT(PUBLISHED_DATE,'%Y-%m-%d') AS PUBLISHED_DATE
FROM BOOK 
WHERE PUBLISHED_DATE LIKE '2021%' AND CATEGORY ='인문'
ORDER BY PUBLISHED_DATE

3. 조건에 부합하는 중고거래 댓글 조회하기

INNER JOIN _ ON _ 사용

USED_GOODS_BOARDUSED_GOODS_REPLY 테이블에서 2022년 10월에 작성된 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일을 조회하는 SQL문을 작성해주세요. 결과는 댓글 작성일을 기준으로 오름차순 정렬해주시고, 댓글 작성일이 같다면 게시글 제목을 기준으로 오름차순 정렬해주세요.

 

(1) USED_GOODS_BOARD USED_GOODS_REPLY 

: FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID = R.BOARD_ID

 

(2) 별칭

FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_REPLY AS R

 

여기서도 별칭을 사용할 수 있다는 것을 알게됐다.

SELECT TITLE,
B.BOARD_ID,
REPLY_ID,
R.WRITER_ID,
R.CONTENTS,
DATE_FORMAT(R.CREATED_DATE,'%Y-%m-%d') AS CREATED_DATE
FROM USED_GOODS_BOARD AS B
INNER JOIN USED_GOODS_REPLY AS R ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE LIKE '2022-10%'
ORDER BY R.CREATED_DATE, TITLE

 

 

4. 오프라인/온라인 판매 데이터 통합하기

UNION ALL :

두 SELECT 문의 결과를 모두 결합. UNION ALL은 중복된 행도 모두 포함합니다. UNION과 달리 중복 제거를 하지 않는다.

ONLINE_SALE 테이블OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요. OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요. 결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.

 

OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시 : NULL USER_ID,

 

SELECT
DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE BETWEEN "2022-03-01" AND "2022-03-31"
UNION ALL
SELECT
DATE_FORMAT(SALES_DATE, "%Y-%m-%d") SALES_DATE,
PRODUCT_ID,
NULL USER_ID,
SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE BETWEEN "2022-03-01" AND "2022-03-31"
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID;

5. 서울에 위치한 식당 목록 출력하기

REST_INFOREST_REVIEW 테이블에서
서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요.
이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.

 

REST_INFO REST_REVIEW :

FROM 
    REST_INFO AS I
INNER JOIN 
    REST_REVIEW AS R ON I.REST_ID = R.REST_ID

 

리뷰 평균점수는 소수점 세 번째 자리에서 반올림:

 ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE

 

분명 표와 동일하게 나왔는데 자꾸 오류가 뜬다.

SELECT I.REST_ID,
I.REST_NAME, 
I.FOOD_TYPE, 
I.FAVORITES, 
I.ADDRESS, 
ROUND(AVG(REVIEW_SCORE),2) AS SCORE
FROM 
REST_INFO AS I
INNER JOIN 
REST_REVIEW AS R ON I.REST_ID = R.REST_ID
WHERE 
I.ADDRESS LIKE ('서울특별시%')
ORDER BY 
SCORE DESC, I.FAVORITES DESC

 

이유는 GROUP BY 누락

GROUP BY 
    I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS

 

왜 적어야하는가?

집계 함수를 사용할 때 여러 행의 데이터를 그룹화하여 집계(예: 합계, 평균, 최대, 최소 등)를 수행하기 위함

 

없으면?

절 없이 집계 함수를 사용하면, 질의 결과는 전체 데이터 세트에 대한 단일 집계 값(예: 모든 식당의 평균 점수)을 반환