1. SELECT - [강원도에 위치한 생산공장 목록 출력하기] _ LEVEL 1
다음은 식품공장의 정보를 담은 FOOD_FACTORY 테이블입니다.
FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.
[ 정답 쿼리 ]
SELECT factory_id, factory_name, address
FROM food_factory
WHERE address LIKE '강원도%'
ORDER BY factory_id;
2. SUM, MAX, MIN - [잡은 물고기 중 가장 큰 물고기의 길이 구하기] _ LEVEL 1
낚시앱에서 사용하는 FISH_INFO 테이블은 잡은 물고기들의 정보를 담고 있습니다.
FISH_INFO 테이블에서 잡은 물고기 중 가장 큰 물고기의 길이를 'cm' 를 붙여 출력하는 SQL 문을 작성해주세요.
이 때 컬럼명은 'MAX_LENGTH' 로 지정해주세요.
[ 정답 쿼리 ]
SELECT CONCAT(MAX(length),'cm') AS max_length
FROM fish_info;
3. GROUP BY - [진료과별 총 예약 횟수 출력하기] _ LEVEL 2
다음은 종합병원의 진료 예약정보를 담은 APPOINTMENT 테이블 입니다.
APPOINTMENT 테이블에서 2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성해주세요.
이때, 컬럼명은 '진료과 코드', '5월예약건수'로 지정해주시고 결과는 진료과별 예약한 환자 수를 기준으로 오름차순 정렬하고, 예약한 환자 수가 같다면 진료과 코드를 기준으로 오름차순 정렬해주세요.
[ 정답 쿼리 ]
SELECT
mcdp_cd AS `진료과코드`
, COUNT(*) AS `5월예약건수`
FROM appointment
WHERE apnt_ymd LIKE '2022-05%'
GROUP BY mcdp_cd
ORDER BY 2,1;
[ 풀이 ]
- WHERE apnt_ymd LIKE '2022-05%' 조건으로 5월에 예약한 환자를 필터링
- 진료과 코드 별로 환자 수 조회 → GROUP BY mcdp_cd 와 COUNT(*) 집계함수 이용
🌟🌟🌟 4. SELECT - [서울에 위치한 식당 목록 출력하기] _ LEVEL 4
다음은 식당의 정보를 담은 REST_INFO 테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다.
REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요.
이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
[ 정답 쿼리 ]
SELECT
I.rest_id
, rest_name
, food_type
, favorites
, address
, ROUND(AVG(review_score),2) AS score
FROM rest_info I
JOIN rest_review R
ON I.rest_id = R.rest_id
WHERE address LIKE '서울%'
GROUP BY I.rest_id
ORDER BY AVG(review_score) DESC, favorites DESC;
[ 풀이 ]
- 해당 문제의 포인트는 “평균점수”로부터 GROUP BY를 캐치해내는 것 & 주소지에서 서울에 위치한 식당들을 필터링하는 것
- 의미상 식당 별 리뷰 평균 점수를 조회해야 하므로, GROUP BY rest_id
- REST_INFO 테이블을 조회 시 address가 서울시 또는 서울특별시 등으로 형식이 통일되지 않았음을 먼저 확인 → WHERE address LIKE '서울%'
5. JOIN - [보호소에서 중성화한 동물] _ LEVEL 4
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다.
보호소에서 중성화 수술을 거친 동물 정보를 알아보려 합니다. 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물의 아이디와 생물 종, 이름을 조회하는 아이디 순으로 조회하는 SQL 문을 작성해주세요.
※ 중성화를 거치지 않은 동물은 성별 및 중성화 여부에 Intact, 중성화를 거친 동물은 Spayed 또는 Neutered라고 표시되어있습니다.
[ 정답 쿼리 ]
SELECT INS.animal_id, INS.animal_type, INS.name
FROM animal_ins INS
JOIN animal_outs OUTS
ON INS.animal_id = OUTS.animal_id
WHERE INS.sex_upon_intake LIKE 'Intact%'
AND OUTS.sex_upon_outcome NOT LIKE 'Intact%'
ORDER BY 1;
[ 풀이 ]
- 보호소에 들어올 당시에는 중성화되지 않았지만, 보호소를 나갈 당시에는 중성화된 동물
- ANIMAL_INS 테이블에서는 intact, ANIMAL_OUTS 테이블에서는 그 외로 조회되는 animal_id 찾기
- 두 테이블 모두에서 조회가 되어야 하므로 INNER JOIN
6. String, Date - [자동차 평균 대여 기간 구하기] _ LEVEL 2
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 AVG(DATEDIFF(end_date, start_date) + 1) >= 7
ORDER BY 2 DESC, 1 DESC;
[ 풀이 ]
- 자동차 별(car_id)로 평균 대여 기간을 구해야 하므로 GROUP BY car_id
- 평균 대여 기간이 7일 이상인 자동차들 → WHERE 절이 아닌 HAVING 절의 조건이라는 것을 캐치하기
'SQL' 카테고리의 다른 글
[프로그래머스] 7주차 MySQL 스터디 2 (1) | 2024.06.04 |
---|---|
[프로그래머스] 7주차 MySQL 스터디 1 (1) | 2024.06.04 |
[프로그래머스] 5주차 MySQL 스터디 (0) | 2024.04.29 |
[프로그래머스] 4주차 MySQL 스터디 2 (0) | 2024.04.16 |
[프로그래머스] 4주차 MySQL 스터디 1 (0) | 2024.04.16 |