본문 바로가기
🔅코딩테스트 공부🔅/❗SQL

[프로그래머스] SQL LEVEL1 문제 풀이 모음 (MySQL)

by 윤무무 2023. 4. 16.

1. 모든 레코드 조회하기

SELECT *
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

- SELECT에서 모든 컬럼을 출력하기 위해선 * 을 이용한다.

- ORDER BY에서 오름차순은 ASC, 내림차순은 DESC

- 기본값이 오름차순이기 때문에 굳이 ASC를 작성해줄 필요가 없다.

 

2. 역순 정렬하기

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC;

- NAME, DATETIME의 컬럼만 원하기 때문에 SELECT로 선택해준다.

- 역순으로 보여달라 했기 때문에 내림차순인 DESE 를 작성해준다.

 

3. 아픈 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = "Sick"
ORDER BY ANIMAL_ID;

- 아픈 동물의 아이디와 이름을 출력해야 하기 때문에 WHERE절에 INTAKE_CONDITION =  'Sick'의 조건을 작성한다.

- 결과를 아이디 순으로 조회해야 하기 때문에 ORDER BY를 작성해준다.

 

4. 어린 동물 찾기

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID;

- 어린 동물 중 젊은 동물은 INTAKE_CONDITION이 Aged가 아닌 동물이다.

- 따라서 WHERE절에 <> 나 != 를 작성해준다.

 

5. 이름이 없는 동물의 아이디

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID

- NULL은 IS NULL, IS NOT NULL을 이용해야 한다. (=, != 사용 불가)

- 문제에서 이름이 없는 채로(= NULL)들어온 동물을 출력해달라 했으니 IS NULL을 작성한다.

 

6. 동물의 아이디와 이름

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID;

 

7. 여러 기준으로 정렬하기

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC;

- NAME이 같은 동물 중에서는 보호를 나중에 시작한 동물을 보여줘야 한다.

- 따라서 ORDER BY 에 NAME을 먼저 작성해주고, DATETIME 을 내림차순으로 정렬한다.

 

8. 상위 N개 레코드

SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1;

- MY SQL에서 상위 N개의 레코드를 출력하기 위해서는 LIMIT를 이용하면 된다.

- (참고) 앞에 N개를 건너 뛴 후 상위 N개만 가져오고 싶으면 LIMIT 건너뛸 개수, 가져올 개수

 

9. 이름이 있는 동물의 아이디

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID;

- 5번의 이름이 없는 동물의 아이디와 비슷한 문제다.

- '이름이 있는 아이디'를 출력해야 하기 때문에 IS NOT NULL 을 작성해준다.

- (참고) NULL은 IS NULL, IS NOT NULL을 이용해야 한다. (=, != 사용 불가)

 

10. 최댓값 구하기

SELECT MAX(DATETIME)
FROM ANIMAL_INS;
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1;

- 가장 최근에 들어온 동물을 출력하면 되기 때문에 MAX를 이용해주면 된다.

- 컬럼 이름은 일치하지 않아도 된다는 조건이 있어서 AS는 사용하지 않아도 괜찮다.

- 아래는 LIMIT를 이용한 풀이

 

11. 강원도에 위치한 생산공장 목록 출력하기

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE "강원도%"
ORDER BY FACTORY_ID

- WHERE 절의 LIKE에서 %는 문자의 개수 상관 X, _ 는 _의 개수대로 문자가 있어야 한다.

- 이 문제에서는 강원도가 포함되어 있는 것만 원했기 때문에 %를 이용하면 된다.

 

12. 경기도에 위치한 생산공장 목록 출력하기

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN,"N")
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기도%"
ORDER BY WAREHOUSE_ID

- IFNULL(A,B) 는 A가 NULL일 경우 B를 채워서 출력하는 함수다.

- FREEZER_YN이 NULL일 경우 "N"을 채워야 하기 때문에 위와 같이 작성한다.

 

13. 나이 정보가 없는 회원 수 구하기

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE IS NULL
SELECT SUM(AGE IS NULL) AS USERS
FROM USER_INFO

- 위는 AGE가 NULL인 경우 COUNT 해주는 풀이

- 아래는 SUM을 이용한 풀이이다.

- AGE IS NULL을 할 경우 NULL은 1, NOT NULL은 0이므로 SUM을 통해 COUNT와 동일한 결과를 출력할 수 있다.

 

14. 조건에 맞는 회원 수 구하기

SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE LEFT(JOINED,4) = 2021 AND AGE BETWEEN 20 AND 29
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE YEAR(JOINED) = 2021 AND AGE BETWEEN 20 AND 29
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE JOINED LIKE '2021%' AND AGE BETWEEN 20 AND 29

- A 이상 B 이하인 경우를 찾고 싶으면 BETWEEN A AND B 를 해주면 된다.

- MY SQL의 경우 BETWEEN 작은 수 AND 큰 수 순서를 지켜야 한다.

- 1. LEFT(JOINED,4) 는 왼쪽 4개를 가져와서 비교

- 2. YEAR(JOINED)는 JOINED 에서 YEAR 정보만 가져와서 비교

- 3. JOINED LIKE '2021%'는 JOINED 중 2021로 시작하는 것만 가져오는 것

- 위 3개 중 편한 걸 선택해서 풀면 된다.

 

15. 가장 비싼 상품 구하기

SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT

- MAX(PRICE)를 통해 가장 비싼 값을 가져온다.

- 컬럼 명이 MAX(PRICE)라고 되어 있으니 AS로 변경해준다.

 

16. 12세 이하인 여자 환자 목록 출력하기

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

- IFNULL(A,B) 는 A가 NULL일 경우 B를 채워서 출력하는 함수다.

- TLNO가 NULL일 경우 NONE으로 출력하며, AS를 이용해 TLNO라는 이름으로 다시 변경해준다.

 

17. 흉부외과 또는 일반외과 의사 목록 출력하기

SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD,'%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD = 'CS' OR MCDP_CD = 'GS'
ORDER BY HIRE_YMD DESC, DR_NAME;

- HIRE_YMD를 그냥 출력하면 시간까지 같이 출력된다. 따라서 DATE_FORMAT를 이용해 포맷을 변경해야 한다.

- %Y 년도 4자리, %y 년도 4자리

- %M 월 영문, %m 월 숫자

- %D 일 영문, %d 일 숫자

- 다라서 format의 구조를 '%Y-%m-%d'로 작성해줘야한다.

 

18. 인기있는 아이스크림

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID;

 

19. 과일로 만든 아이스크림 고르기 

SELECT FIRST_HALF.FLAVOR
FROM FIRST_HALF JOIN ICECREAM_INFO
ON FIRST_HALF.FLAVOR = ICECREAM_INFO.FLAVOR
WHERE TOTAL_ORDER > 3000 AND INGREDIENT_TYPE = "FRUIT_BASED"
ORDER BY TOTAL_ORDER DESC;

- JOIN을 이용한 문제

 

20. 조건에 맞는 도시리스트 출력하기

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

- 2021년인 조건을 구하려면 LEFT, YEAR, LIKE 모두 사용 가능하다. (14번 참고)

- DATE_FORMAT은 17번 참고

 

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

SELECT ROUND(AVG(DAILY_FEE)) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = "SUV";

- 평균은 AVG를 이용하면 된다.

- 소수 첫 번째 자리에서 반올림을 해야하므로 ROUND를 이용한다

- ROUND(숫자, 반올림할 자릿수)

- TRUNCATE(숫자, 버릴 자릿수)

 

22. 자동차 대여 기록에서 장기/단기 대여 구분하기 

SELECT
 HISTORY_ID,
 CAR_ID,
 DATE_FORMAT(START_DATE,'%Y-%m-%d') AS START_DATE,
 DATE_FORMAT(END_DATE,'%Y-%m-%d') AS END_DATE,
 CASE WHEN DATEDIFF(END_DATE,START_DATE) < 29 THEN '단기 대여'
 ELSE '장기 대여'
 END AS RENT_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE LIKE '2022-09%'
ORDER BY HISTORY_ID DESC;

- 일반 프로그래밍에서 IF, ELIF문을 MySQL에서는 CASE WHEN를 이용한다.

- DATEDIFF는 두 START와 END의 차이를 보여준다.

- CASE WHEN THEN / ELSE / END

 

23. 특정 옵션이 포함된 자동차 리스트 구하기

SELECT *
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE '%네비게이션%'
ORDER BY CAR_ID DESC;

- WHERE 절의 LIKE에서 %는 문자의 개수 상관 X, _ 는 _의 개수대로 문자가 있어야 한다.

- 문장 속에 네비게이션이 포함되는 경우를 원하기 때문에 양 쪽에 %를 붙여준다.

 

24. 조건에 부하하는 중고거래 댓글 조회하기 ✨

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

- JOIN을 이용한 문제

댓글