편집 요약 없음 |
|||
(같은 사용자의 중간 판 20개는 보이지 않습니다) | |||
1번째 줄: | 1번째 줄: | ||
=== | === GROUP BY 절 === | ||
{{요점 | |||
|내용= 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())와 함께 자주 사용됩니다. | |||
데이터를 그룹별 요약하거나 분류해서 볼 수 있습니다. | |||
---- | |||
=== 사용 방법 === | |||
<source lang=sql> | <source lang=sql> | ||
SELECT 컬럼명, 집계함수 | SELECT 컬럼명, 집계함수 | ||
18번째 줄: | 18번째 줄: | ||
GROUP BY 컬럼명; | GROUP BY 컬럼명; | ||
</source> | </source> | ||
emp_id name department salary | ==== 예제 ==== | ||
1 John Sales 3000 | employees 테이블 예시 | ||
2 Alice Sales 3200 | {| class="wikitable" | ||
3 Bob IT 4000 | ! emp_id !! name !! department !! salary | ||
4 Carol IT 4200 | |- | ||
5 David HR 2800 | | 1 || John || Sales || 3000 | ||
|- | |||
| 2 || Alice || Sales || 3200 | |||
|- | |||
| 3 || Bob || IT || 4000 | |||
|- | |||
| 4 || Carol || IT || 4200 | |||
|- | |||
| 5 || David || HR || 2800 | |||
|} | |||
예제 1: 부서별 평균 급여 구하기 | ==== 예제 1: 부서별 평균 급여 구하기 ==== | ||
<source lang=sql> | <source lang=sql> | ||
SELECT department, AVG(salary) AS avg_salary | SELECT department, AVG(salary) AS avg_salary | ||
37번째 줄: | 41번째 줄: | ||
GROUP BY department; | GROUP BY department; | ||
</source> | </source> | ||
결과 | * 조회 결과 | ||
{| class="wikitable" | |||
department avg_salary | ! department !! avg_salary | ||
Sales 3100 | |- | ||
IT 4100 | | Sales || 3100 | ||
HR 2800 | |- | ||
| IT || 4100 | |||
|- | |||
| HR || 2800 | |||
|} | |||
설명: department(부서)별로 묶어서, 각 부서의 salary(급여) 평균을 구한 것입니다. | 설명: department(부서)별로 묶어서, 각 부서의 salary(급여) 평균을 구한 것입니다. | ||
==== 예제 2: 부서별 직원 수 구하기 ==== | |||
예제 2: 부서별 직원 수 구하기 | |||
<source lang=sql> | <source lang=sql> | ||
SELECT department, COUNT(*) AS num_employees | SELECT department, COUNT(*) AS num_employees | ||
54번째 줄: | 60번째 줄: | ||
GROUP BY department; | GROUP BY department; | ||
</source> | </source> | ||
* 조회 결과 | |||
결과 | {| class="wikitable" | ||
! department !! num_employees | |||
department num_employees | |- | ||
Sales 2 | | Sales || 2 | ||
IT 2 | |- | ||
HR 1 | | IT || 2 | ||
|- | |||
| HR || 1 | |||
|} | |||
설명: GROUP BY department를 통해 부서별로 직원 수를 센 것입니다. | 설명: GROUP BY department를 통해 부서별로 직원 수를 센 것입니다. | ||
---- | |||
==== 주의사항 ==== | |||
GROUP BY에 사용하지 않은 컬럼은 SELECT절에 직접 쓸 수 없습니다. (단, 집계 함수(max(),count(),sum()..) 안에 들어가는 경우는 예외) | |||
GROUP BY는 정렬 기능이 아닙니다. 정렬은 ORDER BY를 사용해야 합니다. | |||
---- | |||
=== GROUP BY 절 고급 === | |||
==== HAVING 절 ==== | |||
HAVING은 GROUP BY로 그룹화한 결과에 조건을 거는 절입니다. | |||
WHERE는 그룹화 전에 조건, HAVING은 그룹화 후 조건입니다. | |||
예제 테이블: sales | 예제 테이블: sales | ||
id product region amount | {| class="wikitable" | ||
1 Laptop Seoul 2000 | ! id !! product !! region !! amount | ||
2 Laptop Busan 1500 | |- | ||
3 Phone Seoul 1000 | | 1 || Laptop || Seoul || 2000 | ||
4 Phone Busan 1200 | |- | ||
5 Laptop Seoul 2200 | | 2 || Laptop || Busan || 1500 | ||
6 Phone Seoul 1300 | |- | ||
| 3 || Phone || Seoul || 1000 | |||
|- | |||
| 4 || Phone || Busan || 1200 | |||
|- | |||
| 5 || Laptop || Seoul || 2200 | |||
|- | |||
| 6 || Phone || Seoul || 1300 | |||
|} | |||
예제 1: 지역별로 제품 판매 총합이 3000 이상인 경우만 보기 | 예제 1: 지역별로 제품 판매 총합이 3000 이상인 경우만 보기 | ||
108번째 줄: | 120번째 줄: | ||
결과 | 결과 | ||
region total_sales | {| class="wikitable" | ||
Seoul 5500 | ! region !! total_sales | ||
|- | |||
| Seoul || 5500 | |||
|} | |||
설명: GROUP BY region으로 지역별로 묶고, HAVING을 통해 총합이 3000 이상인 지역만 필터링합니다. | 설명: GROUP BY region으로 지역별로 묶고, HAVING을 통해 총합이 3000 이상인 지역만 필터링합니다. | ||
==== 다중 컬럼 GROUP BY ==== | |||
개념 | 개념 | ||
• 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다. | • 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다. | ||
예제 2: 지역 + 제품별 판매 총액 구하기 | 예제 2: 지역 + 제품별 판매 총액 구하기 | ||
131번째 줄: | 145번째 줄: | ||
결과 | 결과 | ||
{| class="wikitable sortable" | |||
Seoul Laptop | |+ 지역별 제품 매출 | ||
Seoul Phone | |- | ||
Busan Laptop | ! 지역 | ||
Busan Phone | ! 제품 | ||
! 매출액(USD) | |||
|- | |||
| Seoul || Laptop || 4,200 | |||
|- | |||
| Seoul || Phone || 2,300 | |||
|- | |||
| Busan || Laptop || 1,500 | |||
|- | |||
| Busan || Phone || 1,200 | |||
|} | |||
설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다. | 설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다. | ||
==== GROUP BY + JOIN 활용 ==== | |||
복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다. | 복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다. | ||
예제 테이블 | 예제 테이블 | ||
employees | * employees | ||
{| class="wikitable sortable" | |||
|+ 직원 정보 | |||
|- | |||
! 사원 ID | |||
! 이름 | |||
! 부서 ID | |||
|- | |||
| 1 || John || 10 | |||
|- | |||
| 2 || Alice || 10 | |||
|- | |||
| 3 || Bob || 20 | |||
|} | |||
* departments | |||
{| class="wikitable sortable" | |||
|+ 부서 정보 | |||
|- | |||
! 부서 ID | |||
! 부서 이름 | |||
|- | |||
| 10 || Sales | |||
|- | |||
| 20 || IT | |||
|} | |||
* salaries | |||
{| class="wikitable sortable" | |||
|+ 직원 급여 정보 | |||
|- | |||
! 사원 ID | |||
! 급여 (USD) | |||
|- | |||
| 1 || 3,000 | |||
|- | |||
| 2 || 3,500 | |||
|- | |||
| 3 || 4,000 | |||
|} | |||
==== 부서별 평균 급여 구하기 (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 | ||
184번째 줄: | 224번째 줄: | ||
결과 | 결과 | ||
{| class="wikitable sortable" | |||
Sales | |+ 부서별 평균 급여 | ||
IT | |- | ||
! 부서명 | |||
! 평균 급여(USD) | |||
|- | |||
| Sales || 3,250 | |||
|- | |||
| IT || 4,000 | |||
|- | |||
| '''전체 평균''' || style="background-color: #f8f9fa; font-weight:bold" | 3,625 | |||
|} | |||
설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다. | 설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다. | ||
==== ROLLUP (고급) ==== | |||
ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다. | ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다. | ||
예제 4: 제품별 판매 총액과 전체 총액까지 보여주기 | 예제 4: 제품별 판매 총액과 전체 총액까지 보여주기 | ||
207번째 줄: | 255번째 줄: | ||
결과 | 결과 | ||
{| class="wikitable sortable" | |||
Laptop | |+ 제품별 매출 현황 (집계 결과) | ||
Phone | |- | ||
! 제품 | |||
! 매출액(USD) | |||
|- | |||
| Laptop || 3,700 | |||
|- | |||
| Phone || 3,500 | |||
|- | |||
| style="font-weight:bold; color:#AA0000" | 전체 합계 || 7,200 | |||
|} | |||
설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다. | 설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다. | ||
=== 요점정리 === | |||
{| class="wikitable sortable" | |||
|+ SQL 그룹화(Grouping) 주요 개념 | |||
|- | |||
! style="border-right: 1px solid #aaa; padding: 5px;" |개념 | |||
! 설명 | |||
! 사용 예시 | |||
|- | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |'''GROUP BY''' | |||
| 특정 컬럼 값으로 행을 그룹화 | |||
| <source lang=sql> | |||
SELECT dept, COUNT(*) | |||
FROM emp | |||
GROUP BY dept | |||
</source> | |||
|- | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |'''HAVING''' | |||
| 그룹화된 결과에 필터링 조건 적용<br>(WHERE 절과 유사하지만 그룹 후 적용) | |||
| <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;" |'''다중 그룹화''' | |||
| 두 개 이상 컬럼으로 계층적 그룹화 | |||
| <source lang=sql> | |||
SELECT dept, gender, COUNT(*) | |||
FROM emp | |||
GROUP BY dept, gender | |||
</source> | |||
|- | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |'''JOIN + GROUP BY''' | |||
| 여러 테이블 연결 후 그룹화 수행 | |||
| <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> | |||
|- | |||
| style="border-right: 1px solid #aaa; padding: 5px;" |'''ROLLUP''' | |||
| 그룹별 소계 + 총계를 한 번에 출력<br>(다차원 분석용) | |||
| <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 절
- (영문): 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은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다.
요점정리
개념 | 설명 | 사용 예시 |
---|---|---|
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) |