데이터의 그룹화
그룹화 (GROUP BY)
- inquiry 테이블의 pref 컬럼의 값들을 그룹화 한 뒤, 각 그룹의 평균을 구하기
- 컬럼의 값에
NULL
이 있는 경우 NULL
도 그룹화 됨
- 아래의 예시의 경우, pref 컬럼으로 그룹화 후, pref 컬럼과 star 컬럼의 평균값을 가져옴
SELECT
pref, AVG(star)
FROM
inquiry
GROUP BY
pref;
SELECT 구에 지정할 수 있는 것
- 그룹화는 하나의 그룹이 하나의 행으로 표현되므로 하나의 그룹이 여러 값을 나타내는 쿼리는 쓸 수 없음
여러 집약 키 지정
- 집약 키를 여러개 설정할 경우, 그룹을 더 세분화 가능
- 예를 들어 서울시 중에 나이 40, 20 그룹, 경기도 중에 나이 30 그룹 등
SELECT
pref, age, COUNT(*)
FROM
inquiry
GROUP BY
pref, age;
GROUP BY가 시행되는 타이밍
- star칼럼의 값이 3이상인 레코드를 pref 컬럼으로 그룹화하고 그룹마다 star 칼럼의 평균값을 계산
WHERE
구가 먼저 실행되고 GROUP BY
가 실행
SELECT
pref, AVG(star)
FROM
inquiry
WHERE
star >= 3
GROUP BY
pref;
그룹에 조건 부여
그룹에 조건 부여
WHERE
구에 적는 조건은 모든 레코드에 대한 조건
WHERE
은GROUP BY
보다 먼저 실행 되므로 그룹에 대한 조건을 줄 수 없음
- 그룹에 조건을 줄 때는
HAVING
구를 사용
- inquiry 테이블을 pref 컬럼에서 그룹화했을 때, 그룹의 레코드 수가 2 이상인 그룹만 가져오고 그룹화한 pref 값과 레코드 수 표시
HAVING
에 적을 수 있는 것은 그룹화했을 때 SELECT
구에 적을 수 있는 것만 가능
SELECT
pref, COUNT(*)
FROM
inquiry
GROUP BY
pref
HAVING
COUNT(*) >= 2;
WHERE
구는 레코드에 대한 조건
HAVING
구는 그룹에 대한 조건
- age가 30 이상인 레코드를 pref 컬럼에서 그룹화 하고, star의 평균값이 4 이상인 그룹만 inquiry 테이블에서 가져온다
SELECT
pref, AVG(star)
FROM
inquiry
WHERE
age >= 30
GROUP BY
pref
HAVING
AVG(star) >= 2;
- 두개의 실행 결과는 같음
- 레코드 수가 많다면
pref != '서울시'
의 조건을 HAVING
구에 적으면 GROUP BY
구는 많은 레코드 수인 채로 처리하게 됨
WHERE
구에서 레코드를 축수함으로서 그룹화 하는 레코드 수가 줄어듦
SELECT
pref, AVG(star)
FROM
inquiry
WHERE
pref != '서울시'
GROUP BY
pref;
SELECT
pref, AVG(star)
FROM
inquiry
GROUP BY
pref
HAVING
pref != '서울시';
SQL구의 실행 순서
- 구의 실행 순서
FROM
에서 테이블을 지적하고 전체 레코드 추출
WHERE
에서 조건에 따라 레코드를 축소
GROUP BY
에서 그룹을 통합
HAVING
에서 그룹에 조건을 줘 그룹을 축소
SELECT
에서 가져올 데이터를 선택
DISTINCT
에서 중복 데이터를 통합
- 레코드 수가 많아지면
SELECT
는 실행에 시간이 많이 걸림
- 최대한
SELECT
할 레코드 수를 줄이는게 핵심
출처: 그림으로 배우는 SQL 입문