메뉴 여닫기
개인 메뉴 토글
로그인하지 않음
만약 지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 15개는 보이지 않습니다)
1번째 줄: 1번째 줄:
=== GROUP BY 절 ===
=== GROUP BY 절 ===
1. GROUP BY 절이란?
{{요점
• 뜻 (영문): GROUP BY is used to group rows that have the same values in specified columns into summary rows.
|내용= GROUP BY 절이란?
• 뜻 (한글): GROUP BY는 특정 컬럼 값을 기준으로 같은 값들끼리 묶어서 결과를 보여주는 SQL 절입니다.
* (영문): GROUP BY is used to group rows that have the same values in specified columns into summary rows.
* (한글): GROUP BY는 특정 컬럼 값을 기준으로 같은 값들끼리 묶어서 결과를 보여주는 SQL 절입니다.
}}


=== 특징 ===
집계 함수(예: COUNT(), SUM(), AVG(), MAX(), MIN())와 함께 자주 사용됩니다.


2. 특징
데이터를 그룹별 요약하거나 분류해서 볼 수 있습니다.
• 집계 함수(예: COUNT(), SUM(), AVG(), MAX(), MIN())와 함께 자주 사용됩니다.
----
데이터를 그룹별 요약하거나 분류해서 볼 수 있습니다.


=== 사용 방법 ===
 
3. 사용 방법
<source lang=sql>
<source lang=sql>
SELECT 컬럼명, 집계함수
SELECT 컬럼명, 집계함수
18번째 줄: 18번째 줄:
GROUP BY 컬럼명;
GROUP BY 컬럼명;
</source>
</source>
4. 예제


예제 테이블: employees
==== 예제 ====
employees 테이블 예시
{| class="wikitable"
{| class="wikitable"
! emp_id !! name !! department !! salary
! emp_id !! name !! department !! salary
37번째 줄: 35번째 줄:
|}
|}


 
====  예제 1: 부서별 평균 급여 구하기 ====
예제 1: 부서별 평균 급여 구하기
<source lang=sql>
<source lang=sql>
SELECT department, AVG(salary) AS avg_salary
SELECT department, AVG(salary) AS avg_salary
44번째 줄: 41번째 줄:
GROUP BY department;
GROUP BY department;
</source>
</source>
결과
* 조회 결과  
 
{| class="wikitable"
{| class="wikitable"
! department !! avg_salary
! department !! avg_salary
58번째 줄: 54번째 줄:
설명: department(부서)별로 묶어서, 각 부서의 salary(급여) 평균을 구한 것입니다.
설명: department(부서)별로 묶어서, 각 부서의 salary(급여) 평균을 구한 것입니다.


==== 예제 2: 부서별 직원 수 구하기 ====
 
예제 2: 부서별 직원 수 구하기
<source lang=sql>
<source lang=sql>
SELECT department, COUNT(*) AS num_employees
SELECT department, COUNT(*) AS num_employees
66번째 줄: 60번째 줄:
GROUP BY department;
GROUP BY department;
</source>
</source>
 
* 조회 결과  
결과
 
{| class="wikitable"
{| class="wikitable"
! department !! num_employees
! department !! num_employees
80번째 줄: 72번째 줄:


설명: GROUP BY department를 통해 부서별로 직원 수를 센 것입니다.
설명: GROUP BY department를 통해 부서별로 직원 수를 센 것입니다.
----


==== 주의사항 ====
 
GROUP BY에 사용하지 않은 컬럼은 SELECT절에 직접 쓸 수 없습니다. (단, 집계 함수(max(),count(),sum()..) 안에 들어가는 경우는 예외)
5. 주의사항
GROUP BY에 사용하지 않은 컬럼은 SELECT절에 직접 쓸 수 없습니다. (단, 집계 함수 안에 들어가는 경우는 예외)
• GROUP BY는 정렬 기능이 아닙니다. 정렬은 ORDER BY를 사용해야 합니다.


GROUP BY는 정렬 기능이 아닙니다. 정렬은 ORDER BY를 사용해야 합니다.
----


좋습니다! 이제 GROUP BY의 복잡한 예제와 함께 자주 같이 쓰이는 **고급 개념 (HAVING, 다중 컬럼 그룹화 등)**도 설명해드릴게요.
=== GROUP BY 절 고급 ===


==== HAVING 절 ====
HAVING은 GROUP BY로 그룹화한 결과에 조건을 거는 절입니다.


1. HAVING 절
WHERE는 그룹화 전에 조건, HAVING은 그룹화 후 조건입니다.


개념
• HAVING은 GROUP BY로 그룹화한 결과에 조건을 거는 절입니다.
• WHERE는 그룹화 전에 조건, HAVING은 그룹화 후 조건입니다.




예제 테이블: sales
예제 테이블: sales
120번째 줄: 108번째 줄:




 


예제 1: 지역별로 제품 판매 총합이 3000 이상인 경우만 보기
예제 1: 지역별로 제품 판매 총합이 3000 이상인 경우만 보기
140번째 줄: 128번째 줄:
설명: GROUP BY region으로 지역별로 묶고, HAVING을 통해 총합이 3000 이상인 지역만 필터링합니다.
설명: GROUP BY region으로 지역별로 묶고, HAVING을 통해 총합이 3000 이상인 지역만 필터링합니다.




2. 다중 컬럼 GROUP BY


==== 다중 컬럼 GROUP BY ====
개념
개념
• 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다.
• 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다.


 


예제 2: 지역 + 제품별 판매 총액 구하기
예제 2: 지역 + 제품별 판매 총액 구하기
176번째 줄: 163번째 줄:
설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다.
설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다.




3. GROUP BY + JOIN 활용


==== GROUP BY + JOIN 활용 ====
복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다.
복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다.


 


예제 테이블
예제 테이블
227번째 줄: 213번째 줄:
|}
|}


 
==== 부서별 평균 급여 구하기 (JOIN 사용) ====
 
예제 3: 부서별 평균 급여 구하기 (JOIN 사용)
<source lang=sql>
<source lang=sql>
SELECT d.dept_name, AVG(s.salary) AS avg_salary
SELECT d.dept_name, AVG(s.salary) AS avg_salary
241번째 줄: 224번째 줄:
결과
결과


dept_name avg_salary
{| class="wikitable sortable"
Sales 3250
|+ 부서별 평균 급여
IT 4000
|-
! 부서명
! 평균 급여(USD)
|-
| Sales || 3,250
|-
| IT || 4,000
|-
| '''전체 평균''' || style="background-color: #f8f9fa; font-weight:bold" | 3,625
|}


설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다.
설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다.




4. ROLLUP (고급)


==== ROLLUP (고급) ====
ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다.
ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다.


 


예제 4: 제품별 판매 총액과 전체 총액까지 보여주기
예제 4: 제품별 판매 총액과 전체 총액까지 보여주기
279번째 줄: 270번째 줄:
설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다.
설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다.




요약


=== 요점정리 ===
{| class="wikitable sortable"
{| class="wikitable sortable"
|+ SQL 그룹화(Grouping) 주요 개념
|+ SQL 그룹화(Grouping) 주요 개념
|-
|-
! 개념
! style="border-right: 1px solid #aaa; padding: 5px;" |개념
! 설명
! 설명
! 사용 예시
! 사용 예시
|-
|-
| '''GROUP BY'''
| style="border-right: 1px solid #aaa; padding: 5px;" |'''GROUP BY'''
| 특정 컬럼 값으로 행을 그룹화
| 특정 컬럼 값으로 행을 그룹화
| <code>SELECT dept, COUNT(*) FROM emp GROUP BY dept</code>
| <source lang=sql>
SELECT dept, COUNT(*)  
  FROM emp  
GROUP BY dept
</source>
|-
|-
| '''HAVING'''
| style="border-right: 1px solid #aaa; padding: 5px;" |'''HAVING'''
| 그룹화된 결과에 필터링 조건 적용<br>(WHERE 절과 유사하지만 그룹 후 적용)
| 그룹화된 결과에 필터링 조건 적용<br>(WHERE 절과 유사하지만 그룹 후 적용)
| <code>SELECT dept, AVG(salary) FROM emp<br>GROUP BY dept HAVING AVG(salary) > 5000</code>
| <source lang=sql>
SELECT dept, AVG(salary)  
  FROM emp
GROUP BY dept  
HAVING AVG(salary) > 5000
</source>
|-
|-
| '''다중 그룹화'''
| style="border-right: 1px solid #aaa; padding: 5px;" |'''다중 그룹화'''
| 두 개 이상 컬럼으로 계층적 그룹화
| 두 개 이상 컬럼으로 계층적 그룹화
| <code>SELECT dept, gender, COUNT(*) FROM emp<br>GROUP BY dept, gender</code>
| <source lang=sql>
SELECT dept, gender, COUNT(*)  
  FROM emp
GROUP BY dept, gender
</source>
|-
|-
| '''JOIN + GROUP BY'''
| style="border-right: 1px solid #aaa; padding: 5px;" |'''JOIN + GROUP BY'''
| 여러 테이블 연결 후 그룹화 수행
| 여러 테이블 연결 후 그룹화 수행
| <code>SELECT d.dept_name, COUNT(e.emp_id)<br>FROM emp e JOIN dept d ON e.dept_id = d.dept_id<br>GROUP BY d.dept_name</code>
| <source lang=sql>
SELECT d.dept_name, COUNT(e.emp_id)
  FROM emp e  
  JOIN dept d ON e.dept_id = d.dept_id
GROUP BY d.dept_name</source>
|-
|-
| '''ROLLUP'''
| style="border-right: 1px solid #aaa; padding: 5px;" |'''ROLLUP'''
| 그룹별 소계 + 총계를 한 번에 출력<br>(다차원 분석용)
| 그룹별 소계 + 총계를 한 번에 출력<br>(다차원 분석용)
| <code>SELECT dept, gender, SUM(salary)<br>FROM emp GROUP BY ROLLUP(dept, gender)</code>
| <source lang=sql>
SELECT dept, gender, SUM(salary)
  FROM emp  
GROUP BY ROLLUP(dept, gender)
</source>
|}
|}








[[category:oracle]]
[[category:oracle]]

2025년 5월 22일 (목) 21:30 기준 최신판

GROUP BY 절

menu_book GROUP BY 절이란?
  • (영문): GROUP BY is used to group rows that have the same values in specified columns into summary rows.
  • (한글): GROUP BY는 특정 컬럼 값을 기준으로 같은 값들끼리 묶어서 결과를 보여주는 SQL 절입니다.


특징

집계 함수(예: COUNT(), SUM(), AVG(), MAX(), MIN())와 함께 자주 사용됩니다.

데이터를 그룹별 요약하거나 분류해서 볼 수 있습니다.


사용 방법

SELECT 컬럼명, 집계함수
FROM 테이블명
GROUP BY 컬럼명;

예제

employees 테이블 예시

emp_id name department salary
1 John Sales 3000
2 Alice Sales 3200
3 Bob IT 4000
4 Carol IT 4200
5 David HR 2800

예제 1: 부서별 평균 급여 구하기

SELECT department, AVG(salary) AS avg_salary
FROM employees
GROUP BY department;
  • 조회 결과
department avg_salary
Sales 3100
IT 4100
HR 2800

설명: department(부서)별로 묶어서, 각 부서의 salary(급여) 평균을 구한 것입니다.

예제 2: 부서별 직원 수 구하기

SELECT department, COUNT(*) AS num_employees
FROM employees
GROUP BY department;
  • 조회 결과
department num_employees
Sales 2
IT 2
HR 1

설명: GROUP BY department를 통해 부서별로 직원 수를 센 것입니다.


주의사항

GROUP BY에 사용하지 않은 컬럼은 SELECT절에 직접 쓸 수 없습니다. (단, 집계 함수(max(),count(),sum()..) 안에 들어가는 경우는 예외)

GROUP BY는 정렬 기능이 아닙니다. 정렬은 ORDER BY를 사용해야 합니다.


GROUP BY 절 고급

HAVING 절

HAVING은 GROUP BY로 그룹화한 결과에 조건을 거는 절입니다.

WHERE는 그룹화 전에 조건, HAVING은 그룹화 후 조건입니다.


예제 테이블: sales

id product region amount
1 Laptop Seoul 2000
2 Laptop Busan 1500
3 Phone Seoul 1000
4 Phone Busan 1200
5 Laptop Seoul 2200
6 Phone Seoul 1300



예제 1: 지역별로 제품 판매 총합이 3000 이상인 경우만 보기

SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region
HAVING SUM(amount) >= 3000;

결과

region total_sales
Seoul 5500

설명: GROUP BY region으로 지역별로 묶고, HAVING을 통해 총합이 3000 이상인 지역만 필터링합니다.


다중 컬럼 GROUP BY

개념 • 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다.


예제 2: 지역 + 제품별 판매 총액 구하기

SELECT region, product, SUM(amount) AS total_sales
FROM sales
GROUP BY region, product;

결과

지역별 제품 매출
지역 제품 매출액(USD)
Seoul Laptop 4,200
Seoul Phone 2,300
Busan Laptop 1,500
Busan Phone 1,200

설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다.


GROUP BY + JOIN 활용

복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다.


예제 테이블

  • employees
직원 정보
사원 ID 이름 부서 ID
1 John 10
2 Alice 10
3 Bob 20
  • departments
부서 정보
부서 ID 부서 이름
10 Sales
20 IT
  • salaries
직원 급여 정보
사원 ID 급여 (USD)
1 3,000
2 3,500
3 4,000

부서별 평균 급여 구하기 (JOIN 사용)

SELECT d.dept_name, AVG(s.salary) AS avg_salary
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id
JOIN salaries s ON e.emp_id = s.emp_id
GROUP BY d.dept_name;

결과

부서별 평균 급여
부서명 평균 급여(USD)
Sales 3,250
IT 4,000
전체 평균 3,625

설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다.


ROLLUP (고급)

ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다.


예제 4: 제품별 판매 총액과 전체 총액까지 보여주기

SELECT product, SUM(amount) AS total_sales
FROM sales
GROUP BY ROLLUP(product);

결과

제품별 매출 현황 (집계 결과)
제품 매출액(USD)
Laptop 3,700
Phone 3,500
전체 합계 7,200

설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다.


요점정리

SQL 그룹화(Grouping) 주요 개념
개념 설명 사용 예시
GROUP BY 특정 컬럼 값으로 행을 그룹화
SELECT dept, COUNT(*) 
  FROM emp 
 GROUP BY dept
HAVING 그룹화된 결과에 필터링 조건 적용
(WHERE 절과 유사하지만 그룹 후 적용)
SELECT dept, AVG(salary) 
  FROM emp
 GROUP BY dept 
HAVING AVG(salary) > 5000
다중 그룹화 두 개 이상 컬럼으로 계층적 그룹화
SELECT dept, gender, COUNT(*) 
  FROM emp
 GROUP BY dept, gender
JOIN + GROUP BY 여러 테이블 연결 후 그룹화 수행
SELECT d.dept_name, COUNT(e.emp_id)
  FROM emp e 
  JOIN dept d ON e.dept_id = d.dept_id
 GROUP BY d.dept_name
ROLLUP 그룹별 소계 + 총계를 한 번에 출력
(다차원 분석용)
SELECT dept, gender, SUM(salary)
  FROM emp 
 GROUP BY ROLLUP(dept, gender)