Giken Dev
article thumbnail
반응형

1. 고양이와 개는 몇 마리 있을까

SELECT ANIMAL_TYPE, COUNT(*) count 
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;

동물의 TYPE 별로 그룹핑하고, 오름차순 정렬을 해줘서 조회합니다.

또한 COUNT(*)로 각 그룹에 속하는 튜플의 갯수도 같이 출력합니다.

 

2. 동명 동물 수 찾기

SELECT NAME, COUNT(*) COUNT
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT > 1
ORDER BY NAME;

GROUP의 뒤에 HAVNIG 절을 달아줌으로써 COUNT > 1 에 대항하는  GROUP만 조회합니다.

 

3. 입양 시각 구하기(1)

SELECT HOUR(DATETIME), COUNT(*) COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 AND HOUR(DATETIME) < 20
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME);

DATETIME 에서 시간만 추출해서 원하는 시간대의 입양만 조회합니다. 또한 시간대별로 GROUPING 합니다.

 

4. 입양 시각 구하기(2)

SET @HOUR = -1; 
SELECT (@HOUR := @HOUR +1) AS HOUR, 
    (SELECT COUNT(*) 
     FROM ANIMAL_OUTS 
     WHERE HOUR(DATETIME) = @HOUR) AS COUNT 
FROM ANIMAL_OUTS 
WHERE @HOUR < 23

중요하다고 할 수 있는 부분은 SET을 활용해 새로운 칼럼을 만들어주는 것입니다. 이 이유는 원본 테이블의 DATETIME을 보면 0시~23시 중간에 COUNT가 0인 시간대가 있기 때문이다. 따라서 문제에서 요구하는 연속적인 [0,1,2,3, ..., 23] 시까지의 모든 튜플을 만들어주어야 한다.

 

SET 문을 통해서 @HOUR 라는 변수를 잡습니다. (int hour;  처럼)

SET @HOUR = -1; 
SELECT (@HOUR := @HOUR +1) AS HOUR
FROM ANIMAL_OUTS

중간 단계를 보기 위해서, 위까지 작성하면 HOUR 컬럼만 출력이 되고, HOUR는 0부터 무한히 출력됩니다.

여기서 추가로

WHERE @HOUR < 23

조건을 추가해주면 HOUR는 23까지만 출력이 되겠습니다.

 

그리고 추가로, 그룹별로 COUNT한 컬럼을 추가하기위해서, 서브쿼리를 뒤에 넣어줍니다. (SELECT 뒤의 인자에 괄호 한의 SELECT문)

 

그리고 서브쿼리로 들어가있는 SELECT 문에서 @HOUR의 변수를 조건에 넣으면 GROUPING 과 같은 효과를 얻을 수 있습니다.

해당 문법이 생소한 문법이라 공부가 필요하겠습니다.

반응형
profile

Giken Dev

@기켄

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!