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 |
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_INTAKE | VARCHAR(N) | FALSE |
동물 보호소에 들어온 동물의 이름은 몇 개인지 조회하는 SQL 문을 작성해주세요. 이때 이름이 NULL인 경우는 집계하지 않으며 중복되는 이름은 하나로 칩니다.
출력 예
count |
---|
2 |
COUNT를 사용하는데 중복을 제거하므로 COUNT안에 DISTINCT를 사용한다. 또 NULL인 경우 카운트를 하지 않기 위해 IS NOT NULL을 사용한다.
SELECT COUNT(DISTINCT NAME) FROM ANIMAL_INS WHERE NAME IS NOT NULL;
동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성해주세요. 이때 고양이를 개보다 먼저 조회해주세요.
출력 예
ANIMAL_TYPE | count |
---|---|
Cat | 2 |
Dog | 1 |
ANIMAL_TYPE이라는 그룹별로 수를 세야하기 때문에 GROUP BY를 사용해서 COUNT한다.
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;
입양 게시판에 동물 정보를 게시하려 합니다. 동물의 생물 종, 이름, 성별 및 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 프로그래밍을 모르는 사람들은 NULL이라는 기호를 모르기 때문에, 이름이 없는 동물의 이름은 "No name"으로 표시해 주세요.
출력 예
ANIMAL_TYPE | NAME | SEX_UPON_INTAKE |
---|---|---|
Cat | Jewel | Spayed Female |
Cat | Meo | Neutered Male |
Dog | No name | Spayed Female |
IFNULL이라는 sql function을 사용하여 NULL인 경우 NO name으로 변경할 수 있도록 한다.
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') AS NAME, SEX_UPON_INTAKE FROM ANIMAL_INS
ORDER BY ANIMAL_ID;
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
출력 예
ANIMAL_TYPE | NAME | SEX_UPON_INTAKE |
---|---|---|
Cat | Jewel | Spayed Female |
Cat | Meo | Neutered Male |
Dog | No name | Spayed Female |
NAME의 count가 1 초과하는 동물의 이름과 그 수를 보여야하기 때문에 HAVING절을 이용한다.
SELECT NAME, COUNT(NAME) AS COUNT FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME;
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
출력 예
HOUR | COUNT |
---|---|
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
DATETIME에 HOUR sql function을 사용하면 시간만 나타낸다. 또한 9시와 20시 사이에 입양된 동물을 보여줘야 하므로 HAVING절을 이용한다.
SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR BETWEEN 9 AND 20
ORDER BY HOUR;
보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다. 중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다. 동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요. 이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
출력 예
ANIMAL_ID | NAME | 중성화 |
---|---|---|
A355753 | Elijah | O |
A373219 | Ella | O |
A382192 | Maxwell 2 | X |
이 문제는 IF와 Case를 이용하여 풀이하였다.
if 사용
SEX_UPON_INTAKE LIKE가 Neutered 또는 Spayed로 시작한다면 중성화가 됐다는 것을 의미하므로 if(LIKE절,"O","X")를 사용하여 해결
SELECT ANIMAL_ID, NAME, IF(SEX_UPON_INTAKE LIKE "Neutered%" OR SEX_UPON_INTAKE LIKE "Spayed%", "O", "X") AS 중성화 FROM ANIMAL_INS;
CASE 사용
CASE는 WHEN ~ THEN~을 사용하여 나타낼 수 있다.
SELECT ANIMAL_ID, NAME,
CASE
WHEN SEX_UPON_INTAKE LIKE "Neutered%" THEN "O"
WHEN SEX_UPON_INTAKE LIKE "Spayed%" THEN "O"
ELSE "X"
END AS 중성화
FROM ANIMAL_INS;