본문 바로가기
Do it! SQL 입문/이론

SQL 시작하기

by Hwanii_ 2023. 6. 16.
728x90

03-5 데이터 그룹화 다루기

p.96 ~ 105

 

1.

데이터를 검색할 때 공통 그룹의 정보를 확인해야 하는 경우.

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

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

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

GROUP BY 문과 HAVING 문은 아래와 같이 사용한다.

 

GROUP BY 문과 HAVING 문의 기본 형식

SELECT [열] FROM [테이블] WHERE [열]

= 조건값 GROUP BY [열] HAVING [열] = [조건값]

 

1) GROUP BY : 데이터를 그룹화하는 구문.

 

2) [열] : 그룹화 기준의 열 이름을 지정한다. 1개 이상 그룹화할 수 있다.

 

3) [HAVING] : WHERE 하고 비슷한 기능을 하며 그룹화된 결과의 필터링 기능을 한다.

 

4) [조건값] : HAVING 필터에 적용할 조건값을 입력한다.

 

 

 

2.

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

그룹화는 중복된 결과를 제외해서 보여준다.

 

COUPON 테이블에 RATE 열을 보면

0.9, 0.9, 0.85, 0.8 로 총 4개를 확인할 수 있다.

 

그룹화할 기준열을 RATE로 잡아,

데이터를 그룹화 한 예시 이다.

 

한마디로 RATE 열에 어떤 값이 있는지 확인하는 쿼리문 이다.

값은 0.9, 0.9, 0.85, 0.8이 있는데

중복된 데이터는 제외해 결과로 보여주기 때문에,

0.9, 0.85, 0.8 만 나오는 모습을 확인할 수 있다.

 

2개 이상의 열 기준으로 그룹화를 하는 방법 >>

2개 이상의 열 기준으로 그룹화 하는 방법은,

기존 열을 1개만 지정해서 그룹화 했으면,

열을 2개 이상 지정해서 그룹화 하는 것이다.

GROUP BY에 나열한 열 순서대로 데이터를 그룹화 한다.

 

 

 

3.

GROUP BY 문은 집계 함수와 함께 자주 사용된다.

 

예시)

 

+----+------------+---------+-------+
| ID | Date       | Product | Price |
+----+------------+---------+-------+
| 1  | 2023-06-01 | A       | 10    |
| 2  | 2023-06-01 | B       | 20    |
| 3  | 2023-06-02 | A       | 15    |
| 4  | 2023-06-02 | B       | 25    |
| 5  | 2023-06-02 | C       | 30    |
+----+------------+---------+-------+

 

과 같은 SALES 테이블이 있다.

 

각 제품의 총 판매액을 계산하려면 다음과 같이 GROUP BY 문을 사용할 수 있다.

 

SELECT Product, SUM(Price) AS TotalSales
FROM sales
GROUP BY Product;

 

결과 : 

 

+---------+------------+
| Product | TotalSales |
+---------+------------+
| A       | 25         |
| B       | 45         |
| C       | 30         |
+---------+------------+

 

"제품" 열을 선택하고 SUM 함수를 사용하여 각 제품의 총 매출을 계산.

GROUP BY 문을 사용하여

행을 그룹화하여 "TotalSales" 열의 각 제품에 대한 총 판매량으로 원하는 결과를 얻을 수 있다.

 

 

 

4.

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

 

GROUP BY 문은 집계 함수와 함께 사용하는 경우가 많다고 3번에서도 정리했다.

 

위의 내용들은 단순히 특정 열을 기준으로 GROUP BY (그룹화)를 했을 때 

어떤 데이터가 있는지 확인한 정도였으면,

 

각 그룹에 몇 개의 행이 있는지를 세어 볼 수 있는 쿼리문을 아래에 정리.

 

예시)

 

SECTOR 열을 기준으로 그룹화한 다음 COUNT 함수로 그룹화한 각 행이

몇 개인지 검색하는 쿼리.

이때, COUNT 함수에는 AS CNT를 붙였는데 이는 개수를 센 결과를

출력할 때 열 이름을 CNT로 한다는 의미 이다.

 

SELECT SECTOR, COUNT(*) AS CNT FROM NASDAQ_COMPANY

GROUP BY SECTOR

 

>> SECTOR 열 기준으로 그룹화한 객 행의 개수 검색

 

 

5.

2개 열을 기준으로 하여 그룹화 하는 쿼리문

 

SELECT SECTOR, INDUSTRY, COUNT(*) AS CNT

FROM NASDAQ_COMPANY GROUP BY SECTOR, INDUSTRY

ORDER BY SECTOR, INDUSTRY

 

>>

위의 쿼리문은 SECTOR, INDUSTRY 열을 기준으로 그룹화.

그리고 각 그룹에 해당하는 데이터가 총 몇 개인지 COUNT 함수로 집계.

쿼리문 마지막에 ORDER BY 문을 입력한 이유는

검색한 데이터의 결과를 정렬해 행 개수를 쉽게 확인 하기 위함 이다.

 

 

ORDER BY로 오름차순 정렬을 하지 않았을 경우,

SECTOR 열이 오름차순 정렬이 되지 않는 모습을 확인할 수 있다.

 

 

 6.

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

 

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

HAVING 문은 WHERE 문과 비슷하지만,

WHERE 문은 테이블에 있는 열에 적용하는 것이고,

HAVING 문은 SELECT 문이나 GROUP BY 문에 사용한 열에만 적용 가능 하다.

 

예시)

 

해당 테이블에 있는

칼럼명 2개를 SELECT 해줘.

 

근데, 그룹화 할거야.

SECTOR 하고 INDUSTRY 를

 

거기서, 그룹화 한 INDUSTRY에서 ADVERTISING 이라는 데이터만 검색 할거야.

 

 

7.

COUNT 함수 적용 예시

 

아래는 SECTOR 열을 기준으로 그룹화한 다음 그룹화한 데이터의 개수가

1,000 보다 큰 것만 검색하는 쿼리문 이다.

 

 

 

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

 

 

 

해결 방법

 

HAVING 문에 사용한 열을 SELECT 문, GROUP BY 문에 추가.

 

 

 

8.

열 별칭을 사용해 데이터 필터링을 시도시 에러 발생.

 

COUNT 함수로 생긴 열 별칭을 HAVING 문에 사용하면 오류가 발생.

'개수' 는 실제 테이블 의 칼럼명이 아닌 별칭이기 때문 이다.

 

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

 

9.

DISTINCT 문으로 중복 데이터 제거.

 

위에서 GROUP BY 문은 중복 데이터를 제거하여 보여준다고 했는데,

만약 GROUP BY 문을 사용하지 않고도 중복 데이터를 제거해서 보고 싶으면

DISTINCT 문을 사용 하면 된다.

 

10.

DISTINCT 문의 기본 형식.

 

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

 

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

 

하지만, GROUP BY 문과 결과가 같다고 해서 DISTINCT 문과 GROUP BY 문이

같다고 생각하면 안된다.

 

DISTINCT 문은 중복을 제거할 뿐

집계하거나 계산할 수 없다.

 

따라서,

집계하거나 계산을 원하면 GROUP BY 문을 사용하고

단순, 중복만 제거한 결과를 보고싶으면 DISTINCT 문을 사용.

 

예시)

 

 

해당 테이블에서 두개의 칼럼만 보고싶은 상황.

 

 

 

DISTINCT 문을 추가.

 

 

 

 

중복 데이터가 제거된 것을 확인할 수 있다.

 

참고

 

SECTOR 열과 INDUSTRY 두개를 SELECT 해야 하는 상황이라,

INDUSTRY 에 중복되지 않는 데이터값을 전부 보여줘야하니,

그렇게 보여주고,

해당하는 SECTOR의 데이터들을 보여주는 상황 이다.

 

만약에

 

SECTOR 열만 보고 싶어서 열을 SECTOR만 적었다면,

 

정말로 SECTOR 열의 중복되는 데이터를 모두 제거하고 보여주게 된다.

 

 

반응형

'Do it! SQL 입문 > 이론' 카테고리의 다른 글

SQL 시작하기  (0) 2023.06.18
나만의 SQL 실습 환경 만들기  (0) 2023.06.18
SQL 시작하기  (1) 2023.06.16
SQL 시작하기  (0) 2023.06.15
SQL 시작하기  (0) 2023.06.15