[Programmers] 동명 동물 수 찾기 (MySQL)

mingreen·2021년 7월 17일
0

코딩 테스트

목록 보기
14/19

문제 📚

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.

NAMETYPENULLABLE
ANIMAL_IDVARCHAR(N)FALSE
ANIMAL_TYPEVARCHAR(N)FALSE
DATETIMEDATETIMEFALSE
INTAKE_CONDITIONVARCHAR(N)FALSE
NAMEVARCHAR(N)TRUE
SEX_UPON_INTAKEVARCHAR(N)FALSE

동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.

예시

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

ANIMAL_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKE
A396810Dog2016-08-22 16:13:00InjuredRavenSpayed Female
A377750Dog2017-10-25 17:17:00NormalLucySpayed Female
A355688Dog2014-01-26 13:48:00NormalShadowNeutered Male
A399421Dog2015-08-25 14:08:00NormalLucySpayed Female
A400680Dog2017-06-17 13:29:00NormalLucySpayed Female
A410668Cat2015-11-19 13:41:00NormalRavenSpayed Female

Raven 이름은 2번 쓰였습니다.
Lucy 이름은 3번 쓰였습니다
Shadow 이름은 1번 쓰였습니다.

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

NAMECOUNT
Lucy3
Raven2

문제 링크
본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.

풀이 ✏️

문제의 조건을 나열해보면 아래와 같다.

  • 동물 이름 중 두 번 이상 쓰인 이름 : having 절 사용하여 count >= 2
  • 이름과 해당 이름이 쓰인 횟수를 조회 : select 절에서 선언
  • 결과는 이름이 없는 동물은 집계에서 제외 : where 에서 IS NOT NULL 조건 사용
  • 결과는 이름 순으로 조회 : order by에서 default인 ASC 사용

코드(mysql)

SELECT NAME, COUNT(NAME) AS count 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL
GROUP BY NAME 
HAVING COUNT(*) >= 2
ORDER BY NAME;

WHERE 절의 조합 📌

아래 연산자들을 문제 조건에 맞게 적절하게 조합하여 where절에서 사용할 수 있다. 여러 조건을 사용할 경우 괄호를 통해 연산 순서가 보이게 해주면 가독성이 높아진다는 장점이 있다.

AND

AND 연산자로 연결된 조건을 모두 만족하는 경우 맞는 것으로 처리된다.

WHERE ANIMAL_TYPE = 'A' AND NAME = 'B'

BETWEEN

AND 로도 표현할 수 있지만 조건의 범위를 나타낼 때 사용되는 연산자이다.

WHERE ANIMAL_AGE BETWEEN 10 AND 20

OR

OR 연산자로 연결된 조건 중 하나 이상과 일치하면 조건에 맞는 것으로 처리된다.

WHERE ANIMAL_NAME = 'A' OR ANIMAL_NAME = 'B'

IN

OR 관계로 묶어서 나열하는 것과 비슷하지만, 조건의 범위를 지정하는 데 주로 사용된다.
콤마(,)로 구분하여 괄호 내에 작성하고 하나 이상과 일치하면 조건에 맞는 것으로 처리된다.

OR 연산자보다 실행 속도도 빠르고, 이해하기 쉽다는 장점이 있다.
또한 IN 연산자 내에 다른 SELECT문을 작성하여 조건을 지정할 수도 있다.

WHERE ANIMAL_NAME IN ('A','B','C')

NOT

NOT 연산자는 뒤에 오는 조건을 부정할 때 사용한다. 다른 연산자들과 달리 조건 컬럼의 앞에 붙는다.

WHERE NOT ANIMAL_ID IN ('A', 'B')

IS NULL, IS NOT NULL

앞에 오는 컬럼의 값에 대해 NULL 여부를 체크하는 연산자이다.

WHERE ANIMAL_ID IS NULL

WHERE ANIMAL_ID IS NOT NULL

LIKE

특정 키워드가 포함된 값을 검색할 때 사용하는 연산자이다.

WHERE ANIMAL_ID LIKE '%A%' #A를 포함하는
WHERE ANIMAL_ID LIKE '%A' #A로 끝나는
WHERE ANIMAL_ID LIKE 'A%' #A로 시작하는
profile
주니어 백엔드 개발자의 기록하는 습관 만들기🧑‍💻

0개의 댓글