working_helen
프로그래머스 코딩테스트 연습 Lv1 본문
프로그래머스 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 |
---|