![thumbnail](/static/41b6f7a574a2ef72c09977d334b5aee4/b1abc/230215_algorithm-thumbnail.png)
SQL LV.1 String, Date
특정 옵션이 포함된 자동차 리스트 구하기
문제 설명
다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은
CAR_RENTAL_COMPANY_CAR
테이블입니다.CAR_RENTAL_COMPANY_CAR
테이블은 아래와 같은 구조로 되어있으며,CAR_ID
,CAR_TYPE
,DAILY_FEE
,OPTIONS
는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.
Column name Type Nullable CAR_ID INTEGER FALSE CAR_TYPE VARCHAR(255) FALSE DAILY_FEE INTEGER FALSE OPTIONS VARCHAR(255) FALSE 자동차 종류는 ‘세단’, ‘SUV’, ‘승합차’, ‘트럭’, ‘리무진’ 이 있습니다. 자동차 옵션 리스트는 콤마(’,‘)로 구분된 키워드 리스트(옵션 리스트 값 예시: ‘열선시트’, ‘스마트키’, ‘주차감지센서’)로 되어있으며, 키워드 종류는 ‘주차감지센서’, ‘스마트키’, ‘네비게이션’, ‘통풍시트’, ‘열선시트’, ‘후방카메라’, ‘가죽시트’ 가 있습니다.
문제
CAR_RENTAL_COMPANY_CAR
테이블에서 ‘네비게이션’ 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC;
![특정 옵션이 포함된 자동차 리스트 구하기 살행 결과 특정 옵션이 포함된 자동차 리스트 구하기 살행 결과](/static/f56a370d18a7faaa0a230114d84b1d42/fe486/230215_car-list.png)
자동차 대여 기록에서 장기/단기 대여 구분하기
문제 설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블입니다.CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블은 아래와 같은 구조로 되어있으며,HISTORY_ID
,CAR_ID
,START_DATE
,END_DATE
는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
Column name Type Nullable HISTORY_ID INTEGER FALSE CAR_ID INTEGER FALSE START_DATE DATE FALSE END_DATE DATE FALSE
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블에서 대여 시작일이 2022년 9월에 속하는 대여 기록에 대해서 대여 기간이 30일 이상이면 ‘장기 대여’ 그렇지 않으면 ‘단기 대여’ 로 표시하는 컬럼(컬럼명:RENT_TYPE
)을 추가하여 대여기록을 출력하는 SQL문을 작성해주세요. 결과는 대여 기록 ID를 기준으로 내림차순 정렬해주세요.문제
CAR_RENTAL_COMPANY_CAR
테이블에서 ‘네비게이션’ 옵션이 포함된 자동차 리스트를 출력하는 SQL문을 작성해주세요. 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d') START_DATE, DATE_FORMAT(END_DATE, '%Y-%m-%d') END_DATE,
CASE
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '장기 대여'
ELSE '단기 대여'
END AS "RENT_TYPE"
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-09-01' AND '2022-09-30'
ORDER BY HISTORY_ID DESC;
![자동차 대여 기록에서 장기/단기 대여 구분하기 살행 결과 자동차 대여 기록에서 장기/단기 대여 구분하기 살행 결과](/static/e0be6c402a5871e84d6866633d3a998a/fe486/230215_rental-list.png)
SQL LV.1 (추가 24.06.26)
한 해에 잡은 물고기 수 구하기
문제 설명
낚시앱에서 사용하는
FISH_INFO
테이블은 잡은 물고기들의 정보를 담고 있습니다.FISH_INFO
테이블의 구조는 다음과 같으며ID
,FISH_TYPE
,LENGTH
,TIME
은 각각 잡은 물고기의 ID, 물고기의 종류(숫자), 잡은 물고기의 길이(cm), 물고기를 잡은 날짜를 나타냅니다.
Column name Type Nullable ID INTEGER FALSE FISH_TYPE INTEGER FALSE LENGTH FLOAT TRUE TIME DATE FALSE 단, 잡은 물고기의 길이가 10cm 이하일 경우에는
LENGTH
가 NULL 이며,LENGTH
에 NULL 만 있는 경우는 없습니다.문제
FISH_INFO 테이블에서 2021년도에 잡은 물고기 수를 출력하는 SQL 문을 작성해주세요.
이 때 컬럼명은 ‘FISH_COUNT’ 로 지정해주세요.
SELECT COUNT(*) AS FISH_COUNT
FROM FISH_INFO
WHERE YEAR(TIME) = '2021';
![한 해에 잡은 물고기 수 구하기 살행 결과 한 해에 잡은 물고기 수 구하기 살행 결과](/static/bfd95c840411ddbf9eaf90df7b5bceab/fe486/230215_fish-count.png)
SQL LV.2 String, Date
자동차 평균 대여 기간 구하기
문제 설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블입니다.CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블은 아래와 같은 구조로 되어있으며,HISTORY_ID
,CAR_ID
,START_DATE
,END_DATE
는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.
Column name Type Nullable HISTORY_ID INTEGER FALSE CAR_ID INTEGER FALSE START_DATE DATE FALSE END_DATE DATE FALSE 문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY
테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명:AVERAGE_DURATION
) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE) + 1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVERAGE_DURATION >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
![자동차 평균 대여 기간 구하기 살행 결과 자동차 평균 대여 기간 구하기 살행 결과](/static/15686f9dfa54432638a6c3fd55bb0d8a/fe486/230215_avg-car-rental.png)
루시와 엘라 찾기
문제 설명
ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.ANIMAL_INS
테이블 구조는 다음과 같으며,ANIMAL_ID
,ANIMAL_TYPE
,DATETIME
,INTAKE_CONDITION
,NAME
,SEX_UPON_INTAKE
는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALSE ANIMAL_TYPE VARCHAR(N) FALSE DATETIME DATETIME FALSE INTAKE_CONDITION VARCHAR(N) FALSE NAME VARCHAR(N) TRUE SEX_UPON_INTAKE VARCHAR(N) FALSE 동물 보호소에 들어온 동물 중 이름이 Lucy, Ella, Pickle, Rogan, Sabrina, Mitty인 동물의 아이디와 이름, 성별 및 중성화 여부를 조회하는 SQL 문을 작성해주세요.
SELECT ANIMAL_ID, NAME, SEX_UPON_INTAKE
FROM ANIMAL_INS
WHERE NAME IN ('Lucy', 'Ella', 'Pickle', 'Rogan', 'Sabrina', 'Mitty')
ORDER BY ANIMAL_ID;
![루시와 엘라 찾기 살행 결과 루시와 엘라 찾기 살행 결과](/static/0cd9907187dd9235936041120fd0b644/fe486/230215_find-lucy-ella.png)
이름에 el이 들어가는 동물 찾기
문제 설명
ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.ANIMAL_INS
테이블 구조는 다음과 같으며,ANIMAL_ID
,ANIMAL_TYPE
,DATETIME
,INTAKE_CONDITION
,NAME
,SEX_UPON_INTAKE
는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALSE ANIMAL_TYPE VARCHAR(N) FALSE DATETIME DATETIME FALSE INTAKE_CONDITION VARCHAR(N) FALSE NAME VARCHAR(N) TRUE SEX_UPON_INTAKE VARCHAR(N) FALSE 보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 ‘el’이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 “EL”이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE ANIMAL_TYPE = 'Dog' AND NAME LIKE '%EL%'
ORDER BY NAME;
![이름에 el이 들어가는 동물 찾기 살행 결과 이름에 el이 들어가는 동물 찾기 살행 결과](/static/e1501c62055cbe27d15335f8c3135d53/fe486/230215_find-animal.png)
중성화 여부 파악하기
문제 설명
ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.ANIMAL_INS
테이블 구조는 다음과 같으며,ANIMAL_ID
,ANIMAL_TYPE
,DATETIME
,INTAKE_CONDITION
,NAME
,SEX_UPON_INTAKE
는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALSE ANIMAL_TYPE VARCHAR(N) FALSE DATETIME DATETIME FALSE INTAKE_CONDITION VARCHAR(N) FALSE NAME VARCHAR(N) TRUE SEX_UPON_INTAKE VARCHAR(N) FALSE 보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은
SEX_UPON_INTAKE
컬럼에 ‘Neutered’ 또는 ‘Spayed’라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 ‘O’, 아니라면 ‘X’라고 표시해주세요.
SELECT ANIMAL_ID, NAME,
CASE WHEN SEX_UPON_INTAKE LIKE 'Intact%' THEN 'X'
ELSE 'O'
END AS '중성화'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
![중성화 여부 파악하기 살행 결과 중성화 여부 파악하기 살행 결과](/static/ad7f9276c805e341dd1c708a058c9b93/fe486/230215_neutralization.png)
카테고리 별 상품 개수 구하기
문제 설명
다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 정보를 담은
PRODUCT
테이블입니다.PRODUCT
테이블은 아래와 같은 구조로 되어있으며,PRODUCT_ID
,PRODUCT_CODE
,PRICE
는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.
Column name Type Nullable PRODUCT_ID INTEGER FALSE PRODUCT_CODE VARCHAR(8) FALSE PRICE INTEGER FALSE 상품 별로 중복되지 않는 8자리 상품코드 값을 가지며, 앞 2자리는 카테고리 코드를 의미합니다.
문제
PRODUCT
테이블에서 상품 카테고리 코드(PRODUCT_CODE
앞 2자리) 별 상품 개수를 출력하는 SQL문을 작성해주세요. 결과는 상품 카테고리 코드를 기준으로 오름차순 정렬해주세요.
SELECT SUBSTRING(PRODUCT_CODE, 1, 2) AS 'CATEGORY', COUNT(PRODUCT_ID)
FROM PRODUCT
GROUP BY SUBSTRING(PRODUCT_CODE, 1, 2)
ORDER BY CATEGORY;
![카테고리 별 상품 개수 구하기 살행 결과 카테고리 별 상품 개수 구하기 살행 결과](/static/984705557285d890710cfed0aa6e87d9/fe486/230215_category.png)
DATETIME에서 DATE로 형 변환
문제 설명
ANIMAL_INS
테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.ANIMAL_INS
테이블 구조는 다음과 같으며,ANIMAL_ID
,ANIMAL_TYPE
,DATETIME
,INTAKE_CONDITION
,NAME
,SEX_UPON_INTAKE
는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME TYPE NULLABLE ANIMAL_ID VARCHAR(N) FALSE ANIMAL_TYPE VARCHAR(N) FALSE DATETIME DATETIME FALSE INTAKE_CONDITION VARCHAR(N) FALSE NAME VARCHAR(N) TRUE SEX_UPON_INTAKE VARCHAR(N) FALSE
ANIMAL_INS
테이블에 등록된 모든 레코드에 대해, 각 동물의 아이디와 이름, 들어온 날짜1를 조회하는 SQL문을 작성해주세요. 이때 결과는 아이디 순으로 조회해야 합니다.
SELECT ANIMAL_ID, NAME, DATE_FORMAT(DATETIME, '%Y-%m-%d') AS '날짜'
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
![DATETIME에서 DATE로 형 변환 살행 결과 DATETIME에서 DATE로 형 변환 살행 결과](/static/a98f122539683edce828dae08a847686/fe486/230215_datetime-to-date.png)
SQL LV.2 (추가 24.06.26)
연도 별 평균 미세먼지 농도 조회하기
문제 설명
AIR_POLLUTION
테이블은 전국의 월별 미세먼지 정보를 담은 테이블입니다.AIR_POLLUTION
테이블의 구조는 다음과 같으며LOCATION1
,LOCATION2
,YM
,PM_VAL1
,PM_VAL2
은 각각 지역구분1, 지역구분2, 측정일, 미세먼지 오염도, 초미세먼지 오염도를 의미합니다.
Column name Type Nullable LOCATION1 VARCHAR FALSE LOCATION2 VARCHAR FALSE YM DATE FALSE PM_VAL1 NUMBER FALSE PM_VAL2 NUMBER FALSE 문제
AIR_POLLUTION
테이블에서 수원 지역의 연도 별 평균 미세먼지 오염도와 평균 초미세먼지 오염도를 조회하는 SQL문을 작성해주세요. 이때, 평균 미세먼지 오염도와 평균 초미세먼지 오염도의 컬럼명은 각각PM10
,PM2.5
로 해 주시고, 값은 소수 셋째 자리에서 반올림해주세요.결과는 연도를 기준으로 오름차순 정렬해주세요.
SELECT YEAR(YM) AS YEAR, ROUND(AVG(PM_VAL1), 2) AS 'PM10', ROUND(AVG(PM_VAL2), 2) AS 'PM2.5'
FROM AIR_POLLUTION
GROUP BY YEAR, LOCATION2
HAVING LOCATION2 LIKE '수원'
ORDER BY YEAR ASC;
![연도 별 평균 미세먼지 농도 조회하기 살행 결과 연도 별 평균 미세먼지 농도 조회하기 살행 결과](/static/53c7f3d53d49ad89422d193dc0f3dded/fe486/230215_fine-dust-concentration.png)
분기별 분화된 대장균의 개체 수 구하기
문제 설명
대장균들은 일정 주기로 분화하며, 분화를 시작한 개체를 부모 개체, 분화가 되어 나온 개체를 자식 개체라고 합니다. 다음은 실험실에서 배양한 대장균들의 정보를 담은
ECOLI_DATA
테이블입니다.ECOLI_DATA
테이블의 구조는 다음과 같으며,ID
,PARENT_ID
,SIZE_OF_COLONY
,DIFFERENTIATION_DATE
,GENOTYPE
은 각각 대장균 개체의 ID, 부모 개체의 ID, 개체의 크기, 분화되어 나온 날짜, 개체의 형질을 나타냅니다.
Column name Type Nullable ID INTEGER FALSE PARENT_ID INTEGER TRUE SIZE_OF_COLONY INTEGER FALSE DIFFERENTIATION_DATE DATE FALSE GENOTYPE INTEGER FALSE 최초의 대장균 개체의
PARENT_ID
는 NULL 값입니다.문제
각 분기(
QUARTER
)별 분화된 대장균의 개체의 총 수(ECOLI_COUNT
)를 출력하는 SQL 문을 작성해주세요. 이때 각 분기에는 ‘Q’ 를 붙이고 분기에 대해 오름차순으로 정렬해주세요. 대장균 개체가 분화되지 않은 분기는 없습니다.
SELECT CONCAT(QUARTER(DIFFERENTIATION_DATE), 'Q') AS QUARTER ,COUNT(*) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER ASC;
![분기별 분화된 대장균의 개체 수 구하기 살행 결과 분기별 분화된 대장균의 개체 수 구하기 살행 결과](/static/fd4ef280d4dbdd3acb39630c6e422578/fe486/230215_colon-bacillus.png)
References
프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/courses/30/parts/17047