'경제'카테고리에 속하는 도서들의 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 출판일을 기준으로 오름차순 정렬해주세요.
해결 방식 :
-- LEFT JOIN -- 경제 카테고리에 속하는 도서 >> CATEGORY = '경제' -- 도서 ID(BOOK_ID), 저자명(AUTHOR_NAME), 출판일(PUBLISHED_DATE) -- 결과는 출판일 기준으로 오름차순 정렬 >> PUBLISHED_DATE ASC
결과 : 정답
답안 :
SELECT B.BOOK_ID, A.AUTHOR_NAME, DATE_FORMAT(B.PUBLISHED_DATE, '%Y-%m-%d')
FROM BOOK B LEFT JOIN AUTHOR A ON A.AUTHOR_ID = B.AUTHOR_ID
WHERE B.CATEGORY = '경제'
ORDER BY B.PUBLISHED_DATE ASC
다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.
Column nameTypeNullable
CAR_ID
INTEGER
FALSE
CAR_TYPE
VARCHAR(255)
FALSE
DAILY_FEE
INTEGER
FALSE
OPTIONS
VARCHAR(255)
FALSE
자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(옵션 리스트 값 예시: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.
문제
CAR_RENTAL_COMPANY_CAR 테이블에서 '통풍시트', '열선시트', '가죽시트' 중 하나 이상의 옵션이 포함된 자동차가 자동차 종류 별로 몇 대인지 출력하는 SQL문을 작성해주세요. 이때 자동차 수에 대한 컬럼명은 CARS로 지정하고, 결과는 자동차 종류를 기준으로 오름차순 정렬해주세요.
해결 방식 :
-- 통풍시트, 열선시트, 가죽시트 중 하나 이상 옵션 > IN >> LIKE 변 -- 자통차 종류 별로 몇 대 >> GROUP BY, COUNT -- 자동차 수에 대한 컬럼 CARS -- 종류를 기준으로 오름차순 ASC
결과 : 틀림
답안 :
SELECT CRCC.CAR_TYPE, COUNT(CRCC.CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR AS CRCC
WHERE CRCC.OPTIONS LIKE ('%통풍시트%') OR ('%열선시트%') OR ('%가죽시트%')
GROUP BY 1
ORDER BY 1 ASC
결과 :
해설 :
(like [option]) or ([option]) or ([option]) (like [option]) or (like [option]) or (like [option])
like 함수 적용 범위
다른 풀이법 :
LIKE 활용
SELECT CRCC.CAR_TYPE, COUNT(CRCC.CAR_ID) AS CARS
FROM CAR_RENTAL_COMPANY_CAR AS CRCC
WHERE CRCC.OPTIONS LIKE ('%통풍시트%') OR
CRCC.OPTIONS LIKE ('%열선시트%') OR
CRCC.OPTIONS LIKE ('%가죽시트%')
GROUP BY 1
ORDER BY 1 ASC
INSTR 활용
SELECT CAR_TYPE, COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE
INSTR(OPTIONS, '통풍시트') > 0 OR
INSTR(OPTIONS, '열선시트') > 0 OR
INSTR(OPTIONS, '가죽시트') > 0
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC
REGEXP 활용
SELECT CAR_TYPE, COUNT(*) CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE
OPTIONS REGEXP '통풍시트|열선시트|가죽시트'
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC
SUBWAY_DISTANCE 테이블에서 노선별로 노선, 총 누계 거리, 평균 역 사이 거리를 노선별로 조회하는 SQL문을 작성해주세요.
총 누계거리는 테이블 내 존재하는 역들의 역 사이 거리의 총 합을 뜻합니다. 총 누계 거리와 평균 역 사이 거리의 컬럼명은 각각 TOTAL_DISTANCE, AVERAGE_DISTANCE로 해주시고, 총 누계거리는 소수 둘째자리에서, 평균 역 사이 거리는 소수 셋째 자리에서 반올림 한 뒤 단위(km)를 함께 출력해주세요. 결과는 총 누계 거리를 기준으로 내림차순 정렬해주세요.
해결 방식 :
-- 코드를 작성해주세요 -- select route, sum(d_cumulative), avg(d.between_dist) -- 누계거리 소수 둘째 / 평균 역사 소수 셋째 >> round 함수 -- km 함께 출력 >> concat -- 누계거리 desc
결과 : 틀림
concat 함수를 사용해서 텍스트(Km) 넣어야 함
답안 :
select route, concat(round(sum(d_between_dist),3),"km") as TOTAL_DISTANCE, concat(round(avg(d_between_dist), 4),"km") as AVERAGE_DISTANCE
from subway_distance
group by 1
order by 2 desc
주의할 점 :
정렬 기준
'TOTAL_DISTANCE'를 기준으로 하면 안된다. 해당 칼럼은 concat() 함수로 인해 더이상 숫자가 아니다. 문자열이다. 따라서 이 컬럼을 기준으로 정렬 시 문자열(사전식) 정렬기준에 따라 정렬되는 버그가 발생한다.
반올림 함수 인자 설정
round(숫자, 반올림할 자릿수)
반올림할 자릿수하는 말이 좀 헷갈림의 여지가 있다고 느껴지는데, 예를 들어 '소수 둘째 자리에서 반올림한다'고 가정하면 반올림할 자릿수라는 매개변수에는 1이 들어가야 한다.
SELECT p.product_code, sum(p.price*os.sales_amount) as sales
from product p
inner join offline_sale os on p.product_id = os.product_id
group by 1
order by 2 desc, 1 asc
문제 :
PRODUCT 테이블과 OFFLINE_SALE 테이블에서 상품코드 별 매출액(판매가 * 판매량) 합계를 출력하는 SQL문을 작성해주세요. 결과는 매출액을 기준으로 내림차순 정렬해주시고 매출액이 같다면 상품코드를 기준으로 오름차순 정렬해주세요.
SELECT p.product_code, sum(p.price*os.sales_amount) as sales
from product p
inner join offline_sale os on p.product_id = os.product_id
group by 1
order by 2 desc, 1 asc
CAR_RENTAL_COMPANY_CAR테이블과CAR_RENTAL_COMPANY_RENTAL_HISTORY테이블에서 자동차 종류가 '세단'인 자동차들 중 10월에 대여를 시작한 기록이 있는 자동차 ID 리스트를 출력하는 SQL문을 작성해주세요. 자동차 ID 리스트는 중복이 없어야 하며, 자동차 ID를 기준으로 내림차순 정렬해주세요.
해결 방식 :
-- 자동차 id 리스트(NO중복) >> GROUP BY -- 자동차 종류가 '세단'인 자동차 >> WHERE = '세단' -- 10월에 대여 시작한 기록 >> WHERE MONTH = 10 -- CAR_ID 내림차순
결과 : 정답
답안 :
SELECT CH.CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS CH
LEFT JOIN CAR_RENTAL_COMPANY_CAR AS CC ON CH.CAR_ID = CC.CAR_ID
WHERE MONTH(CH.START_DATE) = 10
AND CC.CAR_TYPE = '세단'
GROUP BY 1
ORDER BY 1 DESC
다른 풀이법 :
1. 세단 찾기
- CAR_TYPE IN ('세단')
- SELECT DISTINCT(CC.CAR_ID)
2. 10월
- DATE_FORMAT(START_DATE, '%Y-%m-%d') like '2022-10%'
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.
문제 해결 방식 :
-- 동물의 생물 종, 이름, 성별 및 중성화 여부 -- ORDER BY 아이디 -- NULL > NO NAME 으로 변경 : ISNULL
사용 함수 : CASE WHEN, ISNULL
결과 : 정답
SELECT ANIMAL_TYPE, CASE WHEN NAME IS NULL THEN 'No name' ELSE NAME END AS NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
다른 풀이 : IFNULL 을 쓰면 더 깔끔함
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') as NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID