728x90
프로그래머스에서 제공하는 SQL문제 매일 풀기 챌린지
문제 설명
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다.
ANIMAL_INS 테이블 구조는 다음과 같으며,
ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는
각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
INTAKE_CONDITION | VARCHAR(N) | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
문제
보호소에 돌아가신 할머니가 기르던 개를 찾는 사람이 찾아왔습니다. 이 사람이 말하길 할머니가 기르던 개는 이름에 'el'이 들어간다고 합니다. 동물 보호소에 들어온 동물 이름 중, 이름에 "EL"이 들어가는 개의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 이름 순으로 조회해주세요. 단, 이름의 대소문자는 구분하지 않습니다.
예시
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
A355753 | Dog | 2015-09-10 13:14:00 | Normal | Elijah | Neutered Male |
A352872 | Dog | 2015-07-09 17:51:00 | Aged | Peanutbutter | Neutered Male |
A353259 | Dog | 2016-05-08 12:57:00 | Injured | Bj | Neutered Male |
A373219 | Cat | 2014-07-29 11:43:00 | Normal | Ella | Spayed Female |
A382192 | Dog | 2015-03-13 13:14:00 | Normal | Maxwell 2 | Intact Male |
- 이름에 'el'이 들어가는 동물은 Elijah, Ella, Maxwell 2입니다.
- 이 중에서 animal_type이 '개'인 것은 Elijah, Maxwell 2입니다.
따라서 sql문을 실행하면, 다음과 같이 나와야 합니다.
ANIMAL_ID | NAME |
A355753 | Elijah |
A382192 | Maxwell 2 |
본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.
정답
# 오라클 정답
select animal_id, name
from animal_ins
where upper(name) like '%EL%'
and animal_type = 'Dog'
order by name asc;
# MySQL 정답
select animal_id, name
from animal_ins
where name like '%EL%'
and animal_type = 'dog'
order by name asc;
해설하기
# 1. SELECT 절
출력하고자 하는 컬럼명을 순서대로 나열한다.
# 2. FROM절
나열한 컬럼명과 데이터를 가져올 테이블 명을 기입한다.
# 3. WHERE절
--조건1 : LIKE함수와 와일드 카드(%) 사용--
이름(NAME)에 EL이 포함된 행만 출력해야하므로
특정 값이 포함된 데이터를 출력하는 함수인 LIKE함수 를 사용해줘야한다.
와일드 카드(%)는 그 자리에 무엇이 와도 상관없고, 개수가 몇 개가 와도 상관없다는 의미이다.
따라서 NAME LIKE '%EL%'은 아래와 같이 해석할 수 있다
'동물의 이름에서 EL이라는 문자가 포함된 이름만 출력하라'
* 단, 여기서 주의할 점
▶ 오라클
오라클의 경우 대소문자를 구분하기 때문에
UPPER() 함수 혹은 LOWER()함수를 사용하여
NAME의 데이터를 통일시켜주고 UPPER 혹은 LOWER에 맞게
'%EL%' 혹은 '%el%'로 작성해줘야한다.
upper(name) like '%EL%'
혹은
lower(name) like '%el%'
▶ MySQL
mysql의 경우에는 대소문자를 구분하지 않기 때문에
upper나 lower없이 실행시키면 된다.
--조건 2: animal_type 이 '개'인 동물 추출--
animal_type = 'Dog'로 해주면 되는데,
데이터 형식이 Dog로 들어가 있어서
오라클의 경우 형식에 맞게 대소문자를 구분해줘야 한다.
하지만, mysql의 경우에는 대소문자를 구분하지 않기 때문에
dog, DOG등 다른 방식으로 넣어도 sql문에 오류가 발생하지 않는다.
결과 출력
출처 : 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
반응형
'SQL 문제 풀기 > 1. 프로그래머스 SQL : 2023.12.17~2024.2.29' 카테고리의 다른 글
<프로그래머스 31> DATETIME에서 DATE로 형 변환(Lv.2) (2) | 2024.01.16 |
---|---|
<프로그래머스 30> NULL 처리하기(Lv.2) (2) | 2024.01.15 |
<프로그래머스 28> 동명 동물 수 찾기(Lv.2) (4) | 2024.01.13 |
<프로그래머스 27> 중복 제거하기(Lv.2) (2) | 2024.01.12 |
<프로그래머스 26> 최솟값 구하기(Lv.2) (0) | 2024.01.11 |