Notice
Recent Posts
Recent Comments
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

08 데이터 그룹화 다루기 본문

MSSQL/SQL 시작하기

08 데이터 그룹화 다루기

빌드이너프 2024. 10. 1. 21:47

데이터를 검색할 때 공통 그룹의 정보를 확인해야 할 때가 있다.

그룹의 특정 조건을 필터링해 해당 그룹의 데이터만 검색해야 하는 경우도 많다.

이렇게 데이터를 그룹화할 때 GROUP BY 문을 사용한다.

또한 그룹을 필터링할 때는 HAVING 문을 사용한다

 

GROUP BY 문과 HAVING 문의 기본 형식

SELECT [열] FROM [테이블] WHERE [열] = [조건값] GROUP BY [열] HAVING [열] = [조건값]

 

GROUP BY 문으로 데이터 그룹화하기

GROUP BY 문은 지정한 열에 있는 데이터를 그룹화한다.

 

1개 열 기준으로 그룹화

데이터를 그룹화할 때는 반드시 그룹화할 기준 열을 지정해야 한다.

sector로 그룹화

SELECT sector FROM nasdaq_company
GROUP BY sector;

 

industry로 그룹화

SELECT industry FROM nasdaq_company
GROUP BY industry;

 

2개 이상의 열 기준으로 그룹화하기

열을 2개 이상 지정해 그룹화하는 경우에는 GROUP BY에 나열한 열 순서대로 데이터를 그룹화할 뿐이고 전체 결과는 달라지지 않는다.

예를 들어 sector, industry 열 순서로 그룹화하면 sector 열로 우선 그룹화한 다음 industry 열로 그룹화한 결과를 출력한다.

sector, industry 열 순서로 그룹화

SELECT sector, industry FROM nasdaq_company
GROUP BY sector, industry;

 

industry, sector 열 순서로 그룹화

SELECT sector, industry FROM nasdaq_company
GROUP BY industry, sector;

 

집계 함수 COUNT로 그룹화한 열의 데이터 개수 확인하기

GROUP BY 문은 집계 함수와 함께 사용하는 경우가 많다.

sector 열을 기준으로 그룹화한 다음 COUNT 함수로 그룹화한 각 행이 몇 개인지 검색하는 쿼리

SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector;

 

sector, industry 열 기준으로 그룹화한 각 행의 개수 검색

SELECT sector, industry, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector, industry
ORDER BY sector, industry;

 

GROUP BY 사용시 주의 사항

GROUP BY 문에 사용한 열 이름이 SELECT 문에 그대로 사용되어야 오류가 발생하지 않는다.

데이터를 그룹화할 때는 그룹 기준이 되는 열이 필요하기 때문이다.

 

HAVING 문으로 그룹화한 데이터 필터링하기

그룹화한 데이터에서 데이터를 필터링하려면 HAVING 문을 사용해야 한다.

HAVING 문은 WHERE 문과 비슷하지만, WHERE 문은 데이터에 있는 열에 적용하는 것이라면

HAVING 문은 SELECT문이나 GROUP BY 문에 사용한 열에만 적용할 수 있다.

sector, industry 열을 기준으로 그룹화한 데이터에서 industry가 'Advertising'인 데이터만 검색

SELECT sector, industry FROM nasdaq_company
GROUP BY sector, industry
HAVING industry = 'Advertising';

 

그룹화한 데이터의 개수가 1000보다 큰 그룹만 필터링

SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
HAVING COUNT(*) > 1000;

 

만약 그룹화에 사용하지 않은 열을 HAVING 문에 사용하면 오류가 발생한다.

SELECT sector, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector
HAVING industry = 'Advertising';

 

오류를 고치기 위해 HAVING 문에 사용한 열을 SELECT 문, GROUP BY 문에 추가한다.

여기서 COUNT 함수로 생신 열 별칭(AS)을 HAVING 문에 사용하면 오류가 발생한다, cnt는 실제 데이터 열이 아닌 별칭이기 때문이다.

GROUP BY 문과 HAVING 문은 실제 테이블에 있는 열 이름만 사용할 수 있다.

SELECT sector, industry, COUNT(*) AS cnt FROM nasdaq_company
GROUP BY sector, industry
HAVING industry = 'Advertising' AND COUNT(*) > 10;

 

DISTINCT 문으로 중복 데이터 제거하기

GROUP BY 문을 사용하지 않고 중복 데이터를 제거하고 싶다면 DISTINCT 문을 사용한다.

 

DISTINCT 문 기본 형식

SELECT DISTINCT [열 이름] FROM [테이블 이름]

DISTINCT 문은 지정한 열의 중복 데이터를 제거한다.

 

sector, industry 열의 중복을 제거하는 쿼리

결과를 보면 GROUP BY 문으로 얻은 결과와 같다.

SELECT DISTINCT sector, industry
FROM nasdaq_company;
SELECT sector, industry
FROM nasdaq_company
GROUP BY sector, industry;

 

GROUP BY 문과 DISTINCT 문 차이

GROUP BY 문과 DISTINCT 문이 결과가 같지만 DISTINCT 문은 중복을 제거할 뿐이지 집계하거나 계산을 할 수 없다.

DISTINCT 문에 COUNT 함수를 사용: 오류 발생

SELECT DISTINCT sector, industry, COUNT(*)
FROM nasdaq_company;