의문) 무엇을 그루핑 하는가 주어가 없다.
grop by 는 데이터를 특정 컬의 조합에 따라 그룹화 하여 요약정보를 얻게하는 구문이다.
주로 집계 함수(count, sum, avg, max, min)과 함께 사용되어 데이터를집계하거나 분석할때 활용된다.
기본 구문
select 데이터를그룹화할 기준이되는 컬럼1, 집계함수
from table
group by 컬럼1
다중열 구문
select 칼럼1, 칼럼2, 집계함수
from table
group by 칼럼1, 칼럼2 == group by 1, 2
그룹화 기준 : 기준열의 고유 값별로 데이터를 그룹화한다. 그룹별로 집계함수가 적용되어 요약된 결과를 반영한다.
집계함수는 그룹화의 대상이 아니라 그룹화한 컬럼들에 대한 집계처리
그룹화에 나열된 열들은 그룹화를 위해 반드지 select문에도 함께 사용되어야 한다.
그룹화열 이외의 열은 집게함수와 사용한다. 그룹화되지 않은 열은 집계함수 없이 select에 포함될 수 없다. 왜?
SQL에서 그룹화되지 않은 열을 SELECT 문에 사용할 수 없는 이유는 집계 함수와 GROUP BY의 동작 원리 때문이다. GROUP BY는 특정 열의 값들을 기준으로 데이터를 그룹화하고, 그룹별로 데이터를 처리하기 때문에 그룹화되지 않은 열은 그룹 내에서 고유하지 않게 된다.
group by 에 포함된 열들 이외의 열은 select에 집계함수로 처리하지 않으면 오류가 난다.
의문점) 단일컬럼이면 그룹화 하지 않아도 되는거 아닌가?
select alphtbet count
from mail
와
selct alphabet, count
from mail
group by 1
의 차이
첫번째 쿼리는 모든 글자수를 세고 두번째 쿼리는 알파벳별로 센다. a는 몇개 b는 몇개
SELECT visit_date, COUNT(visitor_id)
FROM website_logs
GROUP BY visit_date;
group by 있고 없고의 차이.
없는경우 : visit_date별로 데이터를 분류하지않고 전체 테이블을 하나의 그룹으로 간주
하여 visitor_id를 전부 센다. 1일~3일중 방문객이 100명이라면 100이 나오는식
있는경우 visit_date값별로 데이터를 그룹화한다. 날짜별로 visitor_id를 카운팅한다.
id visit date
a day1
b day2
c day1
a와 c 는 같은그룹화 된다.
실습중 의문점) 다중열로 그룹화 할 때 그 범위는 어디까지인가 집계함수를 제외한부분까지?
그룹화 기준은 지정된 모든 열들의 고유한 조합이며, 이러한 조합이 동일한 행들끼리 하나의 그룹으로 묶인다.
행이 같은 값을 가진것들을 특정한다. 단일컬럼에서도 동일하다. visit date 값이 day1인 것들을 특정한다=그룹화한다.
date male vehicle
day1 o o
day2 o x
day1 o o
day2 o x
day 2 o o
day1 o x
day1 o o 그룹 두개
day2 o x 그룹 두개
day1 o x 그룹 한개
day2 o o 그룹 한개
이러한 고유한 데이터들의 조합이 그룹화의 기준이 된다. 집계 함수는 그룹화 할 수가 없었던것.
그룹화란 같은값을 가진 행들을 특정하는것이다.
실습) [지역(시도)] 음식점이름(음식종류) 컬럼을 만들고, 총 주문건수 구하기 select concat('[',substr(addr,1,2),']',restaurant_name,' (', cuisine_type,')') "음식점", count(1) '주문건수'
from food_orders fo
group by 1
실습) 이메일 도메인별 고객 수와 평균 연령 구하기
select SUBSTR(email, 10) "도메인",
count(1) "고객수",
avg(age) "평균연령"
from customers
group by 1
select된 컬럼의 계산 값이 같은것들끼리 그룹화=특정화.
