오늘 알아볼 문법은 여러개의 row를 집계하여 하나의 결과를 나타낼때 사용한다.
기본적인 집계함수에는 AVG(평균값), MIN(최솟값), MAX(최댓값), SUM(합), COUNT(갯수)가 있다.
SELECT SUM(salary)
FROM instructor
WHERE dept_name='Comp.Sci.'
SELECT MAX(DATETIME)
FROM ANIMAL_INS
동물 보호소에 가장 먼저 들어온 동물은 언제 들어왔는지 조회하는 SQL 문
-- 코드를 입력하세요
SELECT MIN(DATETIME)
FROM ANIMAL_INS
SELECT AVG(salary)
FROM instructor
WHERE dept_name='Comp.Sci.'
SELECT COUNT(*)
FROM ANIMAL_INS
count와 함께 사용하는 기능으로 COUNT()안의 변수 앞에 DISTINCT를 사용하면, 중복을 제거한다. 추가로, NULL인 이름을 가진 동물은 반영하지 않으므로 WHRER 조건을 함께 사용한다.
-- 코드를 입력하세요
SELECT COUNT(DISTINCT NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
특정 컬럼을 그룹화 하는 GROUP BY
특정 컬럼을 그룹화한 결과에 조건을 거는 HAVING
--컬럼 그룹화
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼;
--조건 처리 후에 컬럼 그룹화
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼;
--컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 GROUP BY 그룹화할 컬럼 HAVING 조건식;
--조건 처리 후에 컬럼 그룹화 후에 조건 처리
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식
--ORDER BY가 존재하는 경우
SELECT 컬럼 FROM 테이블 [WHERE 조건식]
GROUP BY 그룹화할 컬럼 [HAVING 조건식] ORDER BY 컬럼1 [, 컬럼2, 컬럼3 ...]
동물의 타입과 count를 SELECT하고,
이때 ANIMAL_TYPE 에 따라 GROUP BY한다.
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE
동물 보호소에 들어온 동물 이름 중 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수를 조회하는 SQL문을 작성해주세요. 이때 결과는 이름이 없는 동물은 집계에서 제외하며, 결과는 이름 순으로 조회해주세요.
SELECT NAME, COUNT(NAME)
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT(NAME) >= 2
ORDER BY NAME ASC
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SELECT HOUR(DATETIME) AS 'HOUR', COUNT(DATETIME) AS 'COUNT'
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME) >= 9 and HOUR(DATETIME) <= 19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR(DATETIME) ASC
* WHERE랑 HAVING의 차이점
WHERE는 그룹화 하기 전이고, HAVING은 그룹화 후에 조건을 줌
DISTINCT는 GROUP BY절과 마찬가지로 조회결과를 그룹으로 묶어서 그 결과를 가져옴
주로 UNIQUE한 컬럼을 조회할 경우 사용
GROUP BY절과 DISTINCT의 차이점
두 구절은 똑같이 그룹을 지어준다는 공통점이 있지만
차이점
- GROUP BY는 결과물을 정렬해서 표현
- DISTINCT는 결과물을 정렬하지 않음
--GROUP BY
SELECT칼럼 FROM 테이블 GROUP BY 칼럼명
--DISTINCT
SELECT DISTINCT 칼럼명 FROM 테이블명