[SQL] 데이터 그룹화 하기

Joney의 SW 공부 블로그·2023년 1월 22일
0

SQL

목록 보기
5/14

데이터의 그룹화

그룹화 (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구에 적는 조건은 모든 레코드에 대한 조건
  • WHEREGROUP 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구의 실행 순서

  • 구의 실행 순서
    1. FROM에서 테이블을 지적하고 전체 레코드 추출
    2. WHERE에서 조건에 따라 레코드를 축소
    3. GROUP BY에서 그룹을 통합
    4. HAVING에서 그룹에 조건을 줘 그룹을 축소
    5. SELECT에서 가져올 데이터를 선택
    6. DISTINCT에서 중복 데이터를 통합
  • 레코드 수가 많아지면 SELECT는 실행에 시간이 많이 걸림
  • 최대한 SELECT할 레코드 수를 줄이는게 핵심

출처: 그림으로 배우는 SQL 입문
profile
SW 지식 노트 블로그

0개의 댓글