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문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
예를 들어 ANIMAL_INS 테이블이 다음과 같다면
ANIMAL_ID | ANIMAL_TYPE | DATETIME | INTAKE_CONDITION | NAME | SEX_UPON_INTAKE |
---|---|---|---|---|---|
A396810 | Dog | 2016-08-22 16:13:00 | Injured | Raven | Spayed Female |
A377750 | Dog | 2017-10-25 17:17:00 | Normal | Lucy | Spayed Female |
A355688 | Dog | 2014-01-26 13:48:00 | Normal | Shadow | Neutered Male |
A399421 | Dog | 2015-08-25 14:08:00 | Normal | Lucy | Spayed Female |
A400680 | Dog | 2017-06-17 13:29:00 | Normal | Lucy | Spayed Female |
A410668 | Cat | 2015-11-19 13:41:00 | Normal | Raven | Spayed Female |
Raven 이름은 2번 쓰였습니다.
Lucy 이름은 3번 쓰였습니다
Shadow 이름은 1번 쓰였습니다.
따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
NAME | COUNT |
---|---|
Lucy | 3 |
Raven | 2 |
문제 링크
본 문제는 Kaggle의 "Austin Animal Center Shelter Intakes and Outcomes"에서 제공하는 데이터를 사용하였으며 ODbL의 적용을 받습니다.
문제의 조건을 나열해보면 아래와 같다.
having
절 사용하여 count >= 2
select
절에서 선언where
에서 IS NOT NULL
조건 사용order by
에서 default인 ASC
사용SELECT NAME, COUNT(NAME) AS count
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(*) >= 2
ORDER BY NAME;
아래 연산자들을 문제 조건에 맞게 적절하게 조합하여 where절에서 사용할 수 있다. 여러 조건을 사용할 경우 괄호를 통해 연산 순서가 보이게 해주면 가독성이 높아진다는 장점이 있다.
AND 연산자로 연결된 조건을 모두 만족하는 경우 맞는 것으로 처리된다.
WHERE ANIMAL_TYPE = 'A' AND NAME = 'B'
AND 로도 표현할 수 있지만 조건의 범위를 나타낼 때 사용되는 연산자이다.
WHERE ANIMAL_AGE BETWEEN 10 AND 20
OR 연산자로 연결된 조건 중 하나 이상과 일치하면 조건에 맞는 것으로 처리된다.
WHERE ANIMAL_NAME = 'A' OR ANIMAL_NAME = 'B'
OR 관계로 묶어서 나열하는 것과 비슷하지만, 조건의 범위를 지정하는 데 주로 사용된다.
콤마(,)로 구분하여 괄호 내에 작성하고 하나 이상과 일치하면 조건에 맞는 것으로 처리된다.
OR 연산자보다 실행 속도도 빠르고, 이해하기 쉽다는 장점이 있다.
또한 IN 연산자 내에 다른 SELECT문을 작성하여 조건을 지정할 수도 있다.
WHERE ANIMAL_NAME IN ('A','B','C')
NOT 연산자는 뒤에 오는 조건을 부정할 때 사용한다. 다른 연산자들과 달리 조건 컬럼의 앞에 붙는다.
WHERE NOT ANIMAL_ID IN ('A', 'B')
앞에 오는 컬럼의 값에 대해 NULL 여부를 체크하는 연산자이다.
WHERE ANIMAL_ID IS NULL
WHERE ANIMAL_ID IS NOT NULL
특정 키워드가 포함된 값을 검색할 때 사용하는 연산자이다.
WHERE ANIMAL_ID LIKE '%A%' #A를 포함하는
WHERE ANIMAL_ID LIKE '%A' #A로 끝나는
WHERE ANIMAL_ID LIKE 'A%' #A로 시작하는