1. SELECT - [12세 이하인 여자 환자 목록 출력하기] _ LEVEL 1
PATIENT 테이블에서 12세 이하인 여자환자의 환자이름, 환자번호, 성별코드,
나이, 전화번호를 조회하는 SQL문을 작성해주세요. 이때 전화번호가 없는 경우, 'NONE' 으로 출력시켜 주시고 결과는 나이를 기준으로 내림차순 정렬하고, 나이 같다면 환자이름을 기준으로 오름차순 정렬해주세요.
[ 정답 쿼리 ]
SELECT pt_name
, pt_no
, gend_cd
, age
, IFNULL(tlno,'NONE') AS tlno
FROM patient
WHERE age <= 12 AND gend_cd = 'W'
ORDER BY age DESC, pt_name;
[ 풀이 ]
- 12세 이하의 여환이라는 조건은 WHERE절에서 AND로 연결
- 전화번호가 없는 경우, ‘NONE’으로 출력하기 위해 IFNULL()함수 사용
2. SUM, MAX, MIN - [최솟값 구하기] _ LEVEL 2
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. 동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.
[ 정답 쿼리 ]
SELECT MIN(datetime) AS `시간`
FROM animal_ins;
[ 풀이 ]
- 가장 먼저 들어온 날짜 = MIN(날짜)
🌟🌟🌟3. GROUP BY - [대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기] _ LEVEL 3
CAR_RENTAL_COMPANY_CAR 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.
[ 정답 쿼리 ]
WITH ID_over_five_times AS (
SELECT car_id, COUNT(*) AS records
FROM car_rental_company_rental_history
WHERE DATE_FORMAT(start_date,'%Y-%m') IN ('2022-08','2022-09','2022-10')
GROUP BY car_id
HAVING COUNT(*) >= 5
ORDER BY 2 DESC
)
SELECT MONTH(start_date) AS month
, car_id
, COUNT(*) AS records
FROM car_rental_company_rental_history
WHERE car_id IN (SELECT car_id FROM ID_over_five_times)
AND DATE_FORMAT(start_date,'%Y-%m') IN ('2022-08','2022-09','2022-10')
GROUP BY month, car_id
ORDER BY month, car_id DESC;
[ 풀이 ]
- 이 문제의 핵심은 총 대여 횟수가 5회 이상인 차들을 조회하는 서브쿼리 & 출력하고자 하는 결과물 사이에 한단락을 끊고 가는 것!
- car_id를 조회하는 서브쿼리가 따로 필요한 이유 : 대여가 5회 이상인 car_id와, 출력해야 하는 car_id의 GROUP BY 레벨이 다르기 때문
- 전자의 경우 GROUP BY car_id , 후자의 경우 GROUP BY month, car_id
1. 조건에 맞는 car_id를 조회하는 임시테이블 ID_over_five_times
- 문제에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들 이라고 했으므로, WITH 구문을 이용해 조건에 맞는 car_id를 출력하는 임시테이블을 구성
- WHERE 절에서는 row level로 start_date에 관한 조건을 걸고, HAVING 절에서는 group level(여기서는 car_id)로 대여횟수에 관한 조건을 걸어 줌
WITH ID_over_five_times AS (
SELECT car_id, COUNT(*) AS records
FROM car_rental_company_rental_history
WHERE DATE_FORMAT(start_date,'%Y-%m') IN ('2022-08','2022-09','2022-10')
GROUP BY car_id
HAVING COUNT(*) >= 5
ORDER BY 2 DESC
)
2. 1번에서 조회한 car_id로 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS ) 리스트를 출력
- WHERE 절에서 ID_over_five_times 의 car_id를 뽑아내고, 추가로 start_date가 8월~10월인 row들을 필터링
- 월별 자동차ID별로 대여 횟수를 뽑아야 하므로, GROUP BY 절에는 month, car_id
4. IS NULL - [NULL 처리하기] _ LEVEL 2
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.
[ 정답 쿼리 ]
SELECT animal_type
, IFNULL(name,'No name') AS name
, sex_upon_intake
FROM animal_ins;
5. JOIN - [조건에 맞는 도서와 저자 리스트 출력하기] _ LEVEL 2
'경제' 카테고리에 속하는 도서들의 도서 ID( BOOK_ID), 저자명( AUTHOR_NAME), 출판일( PUBLISHED_DATE) 리스트를 출력하는 SQL문을 작성해주세요.
결과는 출판일을 기준으로 오름차순 정렬해주세요.
※ PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.
[ 정답 쿼리 ]
SELECT book_id
, author_name
, DATE_FORMAT(published_date,'%Y-%m-%d') AS published_date
FROM book B
JOIN author A ON B.author_id = A.author_id
WHERE category = '경제'
ORDER BY published_date;
6. String, Date - [조건에 부합하는 중고거래 상태 조회하기] _ LEVEL 2
USED_GOODS_BOARD 테이블에서 2022년 10월 5일에 등록된 중고거래 게시물의 게시글 ID, 작성자 ID, 게시글 제목, 가격, 거래상태를 조회하는 SQL문을 작성해주세요. 거래상태가 SALE 이면 판매중, RESERVED이면 예약중, DONE이면 거래완료 분류하여 출력해주시고, 결과는 게시글 ID를 기준으로 내림차순 정렬해주세요.
[ 정답 쿼리 ]
SELECT board_id, writer_id, title, price
, CASE status
WHEN 'SALE' THEN '판매중'
WHEN 'RESERVED' THEN '예약중'
WHEN 'DONE' THEN '거래완료' END AS status
FROM used_goods_board
WHERE DATE_FORMAT(created_date,'%Y-%m-%d') = '2022-10-05'
ORDER BY board_id DESC;
[ 풀이 ]
- 거래 상태의 조건이 3개 이상이므로 CASE WHEN 문 이용
- WHERE 절에서 오류 방지를 위해 DATE_FORMAT()을 이용해 명확하게 포맷을 맞춘 후 비교
'SQL' 카테고리의 다른 글
[프로그래머스] 4주차 MySQL 스터디 1 (0) | 2024.04.16 |
---|---|
[프로그래머스] 3주차 MySQL 스터디 2 (0) | 2024.04.07 |
[프로그래머스] 2주차 MySQL 스터디 2 (0) | 2024.04.05 |
[프로그래머스] 2주차 MySQL 스터디 1 (0) | 2024.04.04 |
[프로그래머스] 1주차 MySQL 스터디 2 (0) | 2024.04.01 |