본문 바로가기
데이터분석/SQL

[SQL] 어린 동물 찾기(프로그래머스/MySQL)

by ms-da 2024. 10. 8.
반응형

 

안녕하세요! ms-da입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "어린 동물 찾기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/59037)

 

 


 

 

1. 문제 :  어린 동물 찾기(Lv. 1)

 

 

 


 

 

2. 문제 설명

 

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

 

 

동물 보호소에 들어온 동물 중 젊은 동물의 아이디와 이름을 조회하는 SQL 문을 작성해주세요.

 

이때 결과는 아이디 순으로 조회해주세요.

(젊은 동물은 "INTAKE_CONDITION"이 Aged가 아닌 경우를 뜻함)

 

 

[ 예시 ]

 

예를 들어 ANIMAL_INS 테이블이 다음과 같다면

ANIMAL_ID ANIMAL_TYPE DATETIME INTAKE_CONDITION NAME SEX_UPON_INTAKE
A365172 Dog 2014-08-26 12:53:00 Normal Diablo Neutered Male
A367012 Dog 2015-09-16 09:06:00 Sick Miller Neutered Male
A365302 Dog 2017-01-08 16:34:00 Aged Minnie Spayed Female
A381217 Dog 2017-07-08 09:41:00 Sick Cherokee Neutered Male

 

이 중 젊은 동물은 Diablo, Miller, Cherokee입니다.

 

따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.

 

 

[ 출력 결과 ]

ANIMAL_ID NAME
A365172 Diablo
A367012 Miller
A381217 Cherokee

 

 


 

 

3. 문제 풀이

 

# 1안(!= 사용)
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID ASC

# 2안(NOT IN 사용)
SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION NOT IN ("Aged")
ORDER BY ANIMAL_ID ASC

 

이번 문제는 1안과 2안 2가지로 작성했습니다!

 

# 1안 풀이 설명

ANIMAL_INS의 테이블에 존재하는 컬럼들이 [출력 결과]에 나와 있는 컬럼들과 동일하게

 

" SELECT "를 통해 'ANIMAL_ID' 컬럼과 'NAME' 컬럼을 보여주고

 

" WHERE "을 통해 'INTAKE_CONDITION' 컬럼의 값이 "Aged"가 아닌 값만을 !=(같지 않음)으로 필터링했어요!

( 'INTAKE_CONDITION' 컬럼의 값이 "Aged"가 아닌 행을 조회)

 

" ORDER BY (컬럼) ASC "를 통해 'ANIMAL_ID' 컬럼의 오름차순으로 조회 결과가 나타나게 코드를 작성했어요!

 

# 2안 풀이 설명

2안 풀이는 1안과 거의 동일해요!

 

차이가 나는 부분은 " WHERE "을 통해 데이터를 필터링하는 과정에서 != 가 아닌 NOT IN 을 이용했어요!

 

" WHERE "을 통해 'INTAKE_CONDITION' 컬럼의 값이 "Aged"를 포함하지 않는 값을 가져오게 조회했어요!

( 'INTAKE_CONDITION' 컬럼의 값이 "Aged"가 포함하지 않는 행을 조회)

 

 


 

4. 문제 풀이 후기

 

이번 문제는 저번 포스팅에서 다룬 문제와 유사한 문제예요!!

 

저번 포스팅에서 다룬 문제(아픈 동물 찾기)에서는

 

특정 조건과 일치하는 데이터를 조회하는 문제였고

 

이번 문제는 특정 조건을 제외한 데이터를 조회하는 문제입니다!

 

특정 조건의 값을 조회하거나, 특정 조건의 값을 제외해서 조회하는 경우는 

 

WHERE 문에 = , != , IN , NOT IN 을 이용해서 조회하면 됩니다!

 

나중에 여러 테이블을 결합하여 사용하거나

 

데이터 수가 많은 경우에는 SQL 최적화 작업을 통해 더 빠르게 조회할 수 있게 만들어야 하는데

 

그때는 테이블들의 특성과 조회해야 하는 조건에 맞게 더 적합한 방법을 이용해 주시면 됩니다!

(SQL 최적화에 관한 내용은 다음에 포스팅해 볼게요!)

 

 

이번 문제는 WHERE 문을 이용해 조건을 넣어서 특정한 값을 제외하고 조회하는 문제를 풀어봤습니다!

 

설명이 어려운 부분 혹은 잘 이해가 안 가는 부분은 그리고 더 궁금한 내용이 있다면

 

언제든지 댓글로 남겨주세요!

 

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

 

읽어주셔서 감사해요!

 

또 다른 SQL 문제로 찾아뵐게요!

 

 

 

 

 

 

 

 

반응형