- 고양이와 개는 몇 마리 있을까
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLEANIMAL_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_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKEA373219 | Cat | 2014-07-29 11:43:00 | Normal | Ella | Spayed Female |
A377750 | Dog | 2017-10-25 17:17:00 | Normal | Lucy | Spayed Female |
A354540 | Cat | 2014-12-11 11:48:00 | Normal | Tux | Neutered Male |
고양이는 2마리, 개는 1마리 들어왔습니다. 따라서 SQL문을 실행하면 다음과 같이 나와야 합니다.
ANIMAL_TYPEcountCat | 2 |
Dog | 1 |
(문제 설명)
동물 타입: 카운트(동물타입) ==>을 코드로 옮기면된다.
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE) AS count FROM ANIMAL_INS GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
- 동명 동물 수 찾기
ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLEANIMAL_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_IDANIMAL_TYPEDATETIMEINTAKE_CONDITIONNAMESEX_UPON_INTAKEA396810 | 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문을 실행하면 다음과 같이 나와야 합니다.
NAMECOUNTLucy | 3 |
Raven | 2 |
(문제 설명)
원하는 형태로 sql문의 결과를 출력 하려고 할 때 group by를 사용한다.
+
원하는 형티의 결과와 동시에 출력시 조건을 달고 싶으면 group, having 같이 사용하면 된다.
우리는 이름이 2번 이상 나온 이름을 출력하고 싶으므르로
group by name
having count(name) > 1
이런식으로 쓸 수 있겠다.
SELECT name, count(name) as cnt from ANIMAL_INS
group by name
having count(name) > 1
ORDER BY NAME ASC;
- 입양 시각 구하기(1)
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLEANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
예시SQL문을 실행하면 다음과 같이 나와야 합니다.
HOURCOUNT9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
(문제 설명)
sql에서 알맞은 날짜는 다음과 같이 추출할 수 있다.
YEAR(기준 날짜);
MONTH(기준 날짜);
DAY(기준 날짜);
HOUR(기준 날짜);
MINUTE(기준 날짜);
SECOND(기준 날짜);
우리는 이중에 hour()쓸 것이다.
그럼 hour(입양날짜)를 하면 해당 입양날짜의 시간이 추출 될 것이다.
이상태로 group by를 하고 정해진 시간 9~19시만 추출하기 위해
having hour(입양날짜) > 9 and hour(입양날짜) < 19
이런식으로 group by해서 출력해주면 된다.
SELECT hour(datetime) as HOUR, count(hour(datetime)) as cnt from animal_outs
group by hour
having HOUR >= 9 AND HOUR < 20
order by hour
- 입양 시각 구하기(2)
ANIMAL_OUTS 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, NAME, SEX_UPON_OUTCOME는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAMETYPENULLABLEANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
예시SQL문을 실행하면 다음과 같이 나와야 합니다.
HOURCOUNT0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 3 |
8 | 1 |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
20 | 0 |
21 | 0 |
22 | 0 |
23 | 0 |
1. SET @hour
=> 변수할당
2. @hour := @hour+1
=> ":=" 연산자는 오른쪽 값을 왼쪽에 할당하는 뜻.
3. 핵심
1) select안에 select
2) hour이라는 변수를 설정하는 법 그리고 이용
3) hour+=1을 진행하면서 각각에 해당되는 값마다 count 를 적용하여 출력한다.
SET @hour = -1;
SELECT
(@hour := @hour + 1) as hour,
(SELECT COUNT(datetime) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) as COUNT
FROM ANIMAL_OUTS
WHERE @hour < 23
후기
마지막 문제의 이용은 한 번 고심해서 더 볼필요가 있다.
기존의 sql문제들과는 괴를 달리하는 문제이기 때문.
sql에서 카운트 되지 않는 값을 출력하려고 할 때 이 방법을 쓰면 좋을듯 하다.
'SQL' 카테고리의 다른 글
SQL_kit_[프로그래머스]- join (0) | 2022.06.12 |
---|---|
SQL_kit_isnull[프로그래머스] (0) | 2022.06.05 |
SQL_kit_SUM, MAX, MIN (0) | 2022.06.03 |
SQL 정리 - SELECT 이용 (2) (0) | 2022.05.23 |
SQL 정리 - SELECT 이용 (1) (0) | 2022.05.20 |