working_helen

프로그래머스 코딩테스트 연습 Lv1 본문

외부 수업/MySQL 스터디

프로그래머스 코딩테스트 연습 Lv1

HaeWon_Seo 2025. 3. 17. 10:16

프로그래머스 MySQL Lv1


 

ANIMAL_INS  테이블

 

아픈 동물 찾기
: 동물 보호소에 들어온 동물 중 아픈 동물1의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

 

풀이

- ORDER BY에서 숫자를 사용해 정렬에 사용할 칼럼이 무엇인지 지정 가능 

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

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION = 'Sick'
ORDER BY 1

 

 

역순 정렬하기
: 동물 보호소에 들어온 모든 동물의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 ANIMAL_ID 역순으로 보여주세요. SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

풀이

- GROUP BY절이 없을때, ORDER BY는 기존 테이블 기준 모든 열을 사용해 정렬 가능 

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

 

 

어린 동물 찾기
: 동물 보호소에 들어온 동물 중 젊은 동물(INTAKE_CONDITION이 Aged가 아닌 경우)의 아이디와 이름을 조회하는 SQL 문을 작성해주세요. 이때 결과는 아이디 순으로 조회해주세요.

 

풀이 1

- MySQL에선 '<>'과 '!=' 모두 ≠ 의미 

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION <> 'Aged'
ORDER BY 1

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != 'Aged'
ORDER BY 1

 

풀이 2

- 단일행 서브퀴리에도 다중행 비교연산자 사용 가능 

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION NOT IN ('Aged')
ORDER BY 1

 

 

이름이 없는 동물의 아이디
: 동물 보호소에 들어온 동물 중, 이름이 없는 채로 들어온 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.

 

풀이 1

- NULL을 찾을 때는 '= NULL'이 아닌 'IS NULL'로 비교해야함 

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY 1

 

 

최댓값 구하기
: 가장 최근에 들어온 동물은 언제 들어왔는지 조회하는 SQL 문을 작성해주세요.

 

풀이 1

- WHERE 절 서브쿼리 

SELECT DATETIME
FROM ANIMAL_INS
WHERE DATETIME = (SELECT MAX(DATETIME)
                 FROM ANIMAL_INS)

 

풀이 2, 3

- FROM 절 서브쿼리(인라인 뷰) 

- WINDOW function, RANK / ROW_NUMBER 함수 

SELECT DATETIME
FROM (SELECT DATETIME, RANK() OVER(ORDER BY DATETIME DESC) RANKING
	FROM ANIMAL_INS) A
WHERE A.RANKING = 1
SELECT DATETIME
FROM (SELECT DATETIME, ROW_NUMBER() OVER(ORDER BY DATETIME DESC) RANKING
	FROM ANIMAL_INS) A
WHERE A.RANKING = 1

 

풀이 4

- LIMIT :  리턴할 행(row)의 개수를 제한, ORDER BY 이후 적용 

# MySQL
SELECT DATETIME
FROM ANIMAL_INS
ORDER BY DATETIME DESC
LIMIT 1

 

 

 

 

 

 

FOOD_WAREHOUSE 테이블

: WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, TLNO, FREEZER_YN는 창고 ID, 창고 이름, 창고 주소, 전화번호, 냉동시설 여부를 의미합니다.

 

 

경기도에 위치한 식품창고 목록 출력하기
: 경기도에 위치한 창고의 ID, 이름, 주소, 냉동시설 여부를 조회하는 SQL문을 작성해주세요. 이때 냉동시설 여부가 NULL인 경우, 'N'으로 출력시켜 주시고 결과는 창고 ID를 기준으로 오름차순 정렬해주세요.

 

풀이 1

- NVL(대상, 치환값) : 대상이 NULL이 아니면 치환값을 리턴

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, NVL(FREEZER_YN, 'N') AS FREEZER_YN 
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE '경기도%'
ORDER BY 1

 

 

풀이 2

- CASE WHEN ~ ELSE 구문 사용

- REGEXP_SUBSTR : 공백이 아닌 문자부터 시작되는 패턴을, 처음부터, 하나만 찾아서 리턴 

  TRIM : 문자열 앞뒤로 공백 제거

select WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS,
    CASE
        WHEN FREEZER_YN IS NULL THEN 'N'
        ELSE FREEZER_YN
    END AS FREEZER_YN
from FOOD_WAREHOUSE
where TRIM(REGEXP_SUBSTR(ADDRESS, '^\S+', 1, 1)) = '경기도'
order by WAREHOUSE_ID

 

 

 

 

 

 

 

'외부 수업 > MySQL 스터디' 카테고리의 다른 글

프로그래머스 코딩테스트 연습 Lv1  (0) 2025.03.10