✅ Group by
- 데이터를 컬럼별로 그룹화 해주는 역할
- 주로 집계 함수와 같이 사용되곤 한다
- NULL 값을 가진 행을 제외하고 수행한다.
[형태]
SELECT <column_name> FROM <table_name> WHERE <condition> GROUP BY <column_name> HAVING <condition>
[예제] 회원별로 묶어준 후, 구매한 개수 합치기
select mem_id,count(mem_id) from buy group by mem_id;

[예제] 프로그래머스 - 고양이와 개는 몇 마리 있을까
: ANIMAL_INS 테이블에서 ANIMAL_TYPE 컬럼을 기준으로 유형을 분류하는데, 이때 고양이와 개의 수를 카운팅한다.
select ANIMAL_TYPE, count(ANIMAL_TYPE) as count from ANIMAL_INS group by ANIMAL_TYPE

[예제] 프로그래머스 - 주문량이 많은 아이스크림들 조회하기
:
select F.FLAVOR
from (FIRST_HALF F join JULY J on F.FLAVOR = J.FLAVOR ) # 두 테이블을 FLAVOR을 기준으로 조인한다.
group by F.FLAVOR # 7월은 두 공장에서 하나의 아이스크림 가게로 출하하는 경우가 있어서 중복되는 FLAVOR 행이 있다. 떄문에 group by를 통해 모든 FLAVOR을 하나의 행으로 묶어준다.
order by sum(F.TOTAL_ORDER+J.TOTAL_ORDER) desc # 정렬 기준은 상반기와 7월의 주문량 더한 값이 큰 순서대로
limit 3 # 상위 3개만 조회

✅ Having
- 집계 함수에 대해 조건을 제한하는 것임
<having과 where 구별>
having | where |
그룹 필터 | 일반 행 필터 |
그룹화,집계 발생한 후에 조건 필터됨 | 그룹화,집계 발생하기 전에 조건 필터 |
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;
[예제] mem_id 기준으로 그룹화 하면서 총 구매액을 구하는데, 그 총 구매금액이 1000 이상인 것만 출력
select mem_id, sum(price*amount) as "총 구매금액" from buy
group by mem_id
having sum(price*amount )> 1000 -- 그룹함수가 포함된 조건
✅ 집계 함수
SUM() : 합계 계산
AVG() : 평균 계산
MIM() : 최소값 구하기
MAX() : 최대값 구하기
COUNT() : 행의 개수 세기
COUNT(DISTINCT) : 행의 개수 세기 (중복제거하고 카운트함)
SELECT count(mem_id) FROM buy; -- 결과 : 12
SELECT count(DISTINCT(mem_id)) FROM buy; -- 결과 : 4

참고자료
'DB > SQL' 카테고리의 다른 글
[SQL] 행 입력, 수정, 삭제 CRUD (0) | 2023.05.30 |
---|---|
[SQL]프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력 (0) | 2023.05.30 |
[SQL] join, on (0) | 2023.05.25 |
[SQL] 서브쿼리 - TODO (0) | 2023.05.21 |
DB 기초개념 (0) | 2023.05.17 |
✅ Group by
- 데이터를 컬럼별로 그룹화 해주는 역할
- 주로 집계 함수와 같이 사용되곤 한다
- NULL 값을 가진 행을 제외하고 수행한다.
[형태]
SELECT <column_name> FROM <table_name> WHERE <condition> GROUP BY <column_name> HAVING <condition>
[예제] 회원별로 묶어준 후, 구매한 개수 합치기
select mem_id,count(mem_id) from buy group by mem_id;

[예제] 프로그래머스 - 고양이와 개는 몇 마리 있을까
: ANIMAL_INS 테이블에서 ANIMAL_TYPE 컬럼을 기준으로 유형을 분류하는데, 이때 고양이와 개의 수를 카운팅한다.
select ANIMAL_TYPE, count(ANIMAL_TYPE) as count from ANIMAL_INS group by ANIMAL_TYPE

[예제] 프로그래머스 - 주문량이 많은 아이스크림들 조회하기
:
select F.FLAVOR
from (FIRST_HALF F join JULY J on F.FLAVOR = J.FLAVOR ) # 두 테이블을 FLAVOR을 기준으로 조인한다.
group by F.FLAVOR # 7월은 두 공장에서 하나의 아이스크림 가게로 출하하는 경우가 있어서 중복되는 FLAVOR 행이 있다. 떄문에 group by를 통해 모든 FLAVOR을 하나의 행으로 묶어준다.
order by sum(F.TOTAL_ORDER+J.TOTAL_ORDER) desc # 정렬 기준은 상반기와 7월의 주문량 더한 값이 큰 순서대로
limit 3 # 상위 3개만 조회

✅ Having
- 집계 함수에 대해 조건을 제한하는 것임
<having과 where 구별>
having | where |
그룹 필터 | 일반 행 필터 |
그룹화,집계 발생한 후에 조건 필터됨 | 그룹화,집계 발생하기 전에 조건 필터 |
SELECT 컬럼 FROM 테이블 WHERE 조건식 GROUP BY 그룹화할 컬럼 HAVING 조건식;
[예제] mem_id 기준으로 그룹화 하면서 총 구매액을 구하는데, 그 총 구매금액이 1000 이상인 것만 출력
select mem_id, sum(price*amount) as "총 구매금액" from buy
group by mem_id
having sum(price*amount )> 1000 -- 그룹함수가 포함된 조건
✅ 집계 함수
SUM() : 합계 계산
AVG() : 평균 계산
MIM() : 최소값 구하기
MAX() : 최대값 구하기
COUNT() : 행의 개수 세기
COUNT(DISTINCT) : 행의 개수 세기 (중복제거하고 카운트함)
SELECT count(mem_id) FROM buy; -- 결과 : 12
SELECT count(DISTINCT(mem_id)) FROM buy; -- 결과 : 4

참고자료
'DB > SQL' 카테고리의 다른 글
[SQL] 행 입력, 수정, 삭제 CRUD (0) | 2023.05.30 |
---|---|
[SQL]프로그래머스 - 즐겨찾기가 가장 많은 식당 정보 출력 (0) | 2023.05.30 |
[SQL] join, on (0) | 2023.05.25 |
[SQL] 서브쿼리 - TODO (0) | 2023.05.21 |
DB 기초개념 (0) | 2023.05.17 |