working_helen
[코테 연습] 프로그래머스 코딩테스트 연습 Lv1 본문
프로그래머스 MySQL Lv1
FOOD_FACTORY 테이블
: FACTORY_ID, FACTORY_NAME, ADDRESS, TLNO는 각각 공장 ID, 공장 이름, 주소, 전화번호를 의미합니다.
강원도에 위치한 생산공장 목록 출력하기
문제 : FOOD_FACTORY 테이블에서 강원도에 위치한 식품공장의 공장 ID, 공장 이름, 주소를 조회하는 SQL문을 작성해주세요. 이때 결과는 공장 ID를 기준으로 오름차순 정렬해주세요.
풀이 1
SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE '강원도%'
ORDER BY FACTORY_ID
- LIKE : 부분적으로 일치하는 문자열을 찾을 때
- _ : 모든 글자, 한 글자
- % : 모든 글자, 여러 글자
풀이 2
SELECT FACTORY_ID,FACTORY_NAME,ADDRESS FROM FOOD_FACTORY
WHERE SUBSTR(ADDRESS,1,INSTR(ADDRESS,' ')-1) = '강원도' -- SUBSTR(문자열, 시작 위치, 끝 위치)
ORDER BY FACTORY_ID
- SUBSTR(대상, m, n) : 대상 문자열의 m위치에서 n개의 문자열 추출
- INSTR(대상, 찾을 문자열, m, n) : 대상 문자열에서 찾을 문자열의 위치를 리턴, m위치에서 시작해서 n번째로 발견된 찾을 문자열의 위치를 리턴
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
ANIMAL_INS 테이블
: ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냄
상위 n개 레코드
: 동물 보호소에 가장 먼저 들어온 동물의 이름을 조회하는 SQL 문을 작성해주세요.
풀이 1
- WHERE 절 서브쿼리
SELECT NAME
FROM ANIMAL_INS
WHERE DATETIME = (
SELECT MIN(DATETIME)
FROM ANIMAL_INS
)
풀이 2, 3
- FROM 절 서브쿼리(인라인 뷰)
- WINDOW function, RANK / ROW_NUMBER 함수
SELECT NAME
FROM (SELECT NAME, DATETIME, RANK() OVER(ORDER BY DATETIME) RANKING
FROM ANIMAL_INS) A
WHERE A.RANKING = 1
SELECT NAME
FROM (SELECT NAME, ROW_NUMBER() OVER(ORDER BY DATETIME) AS rnum
FROM ANIMAL_INS) as T
where T.rnum = 2
풀이 4
- LIMIT : 리턴할 행(row)의 개수를 제한, ORDER BY 이후 적용
# MySQL
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1
여러 기준으로 정렬하기
: 동물 보호소에 들어온 모든 동물의 아이디와 이름, 보호 시작일을 이름 순으로 조회하는 SQL문을 작성해주세요. 단, 이름이 같은 동물 중에서는 보호를 나중에 시작한 동물을 먼저 보여줘야 합니다.
풀이
- ORDER BY에 제시된 col 순서대로 정렬
SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC
이름이 있는 동물의 아이디
: 동물 보호소에 들어온 동물 중, 이름이 있는 동물의 ID를 조회하는 SQL 문을 작성해주세요. 단, ID는 오름차순 정렬되어야 합니다.
풀이 1
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID
풀이 2
- IN 함수 사용 : 동등 비교의 or 연결
SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IN (
SELECT NAME
FROM ANIMAL_INS)
ORDER BY ANIMAL_ID
풀이 3
- EXISTS 함수 사용 : 서브쿼리 필수, 반환하는 행이 있으면 true 없으면 false
SELECT ANIMAL_ID
FROM ANIMAL_INS a
WHERE EXISTS (
SELECT 1
FROM ANIMAL_INS b
WHERE a.NAME = b.NAME
)
ORDER BY ANIMAL_ID;
USER_INFO 테이블
: USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냄
나이 정보가 없는 회원 수 구하기
: USER_INFO 테이블에서 나이 정보가 없는 회원이 몇 명인지 출력하는 SQL문을 작성해주세요. 이때 컬럼명은 USERS로 지정해주세요.
풀이 1
- COUNT(*)는 NULL을 포함해서 모든 행의 개수를 셈
SELECT COUNT(*)
FROM USER_INFO
WHERE AGE IS NULL
풀이 2
- NVL2(대상, 치환값1, 치환값2) : 대상이 NULL이 아니면 치환값1을, NULL이면 치환값2를 리턴
SELECT SUM(NVL2(AGE, 0, 1))
FROM USER_INFO
조건에 맞는 회원수 구하기
: 2021년에 가입한 회원 중 나이가 20세 이상 29세 이하인 회원이 몇 명인지 출력하는 SQL문을 작성해주세요.
풀이 1
- 날짜 함수 YEAR 사용
SELECT COUNT(*) AS USERS
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29
AND YEAR(JOINED) = 2021
풀이 2
- 날짜도 BETWEEN으로 범위 설정
SELECT COUNT(*)
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29
AND JOINED BETWEEN '2021-01-01' AND '2021-12-31'
풀이 3
- DATE 타입을 CHAR 타입으로 변환 후 문자 함수 사용
SELECT COUNT(*)
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29
AND TO_CHAR(JOINED,'YYYY-MM-DD') like '2021%
풀이 4
- TRUNC 함수 이용 : '월'에서 버림, 'YYYY-01-01' 형태로 바꿔버리는 함수
SELECT COUNT(*)
FROM USER_INFO
WHERE AGE BETWEEN 20 AND 29
AND TRUNC(JOINED, 'YEAR') = DATE '2021-01-01'
'외부 수업 > SQL 스터디' 카테고리의 다른 글
[코테 연습] Leetcode 코딩테스트 연습 MySQL Easy (0) | 2025.04.14 |
---|---|
[코테 연습] 프로그래머스 코딩테스트 연습 Lv4 (3) | 2025.04.07 |
[코테 연습] 프로그래머스 코딩테스트 연습 Lv3 (0) | 2025.03.31 |
[코테 연습] 프로그래머스 코딩테스트 연습 Lv2 (0) | 2025.03.24 |
[코테 연습] 프로그래머스 코딩테스트 연습 Lv1 (0) | 2025.03.17 |