88번째 줄: | 88번째 줄: | ||
⸻ | ⸻ | ||
좋습니다! 이제 GROUP BY의 복잡한 예제와 함께 자주 같이 쓰이는 **고급 개념 (HAVING, 다중 컬럼 그룹화 등)**도 설명해드릴게요. | |||
⸻ | |||
1. 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 이상인 지역만 필터링합니다. | |||
⸻ | |||
2. 다중 컬럼 GROUP BY | |||
개념 | |||
• 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다. | |||
⸻ | |||
예제 2: 지역 + 제품별 판매 총액 구하기 | |||
SELECT region, product, SUM(amount) AS total_sales | |||
FROM sales | |||
GROUP BY region, product; | |||
결과 | |||
region product total_sales | |||
Seoul Laptop 4200 | |||
Seoul Phone 2300 | |||
Busan Laptop 1500 | |||
Busan Phone 1200 | |||
설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다. | |||
⸻ | |||
3. GROUP BY + JOIN 활용 | |||
복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다. | |||
⸻ | |||
예제 테이블 | |||
employees | |||
emp_id name dept_id | |||
1 John 10 | |||
2 Alice 10 | |||
3 Bob 20 | |||
departments | |||
dept_id dept_name | |||
10 Sales | |||
20 IT | |||
salaries | |||
emp_id salary | |||
1 3000 | |||
2 3500 | |||
3 4000 | |||
⸻ | |||
예제 3: 부서별 평균 급여 구하기 (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; | |||
결과 | |||
dept_name avg_salary | |||
Sales 3250 | |||
IT 4000 | |||
설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다. | |||
⸻ | |||
4. ROLLUP (고급) | |||
ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다. | |||
⸻ | |||
예제 4: 제품별 판매 총액과 전체 총액까지 보여주기 | |||
SELECT product, SUM(amount) AS total_sales | |||
FROM sales | |||
GROUP BY ROLLUP(product); | |||
결과 | |||
product total_sales | |||
Laptop 3700 | |||
Phone 3500 | |||
NULL 7200 | |||
설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다. | |||
⸻ | |||
요약 | |||
개념 설명 | |||
GROUP BY 특정 컬럼으로 그룹화 | |||
HAVING 그룹화된 결과에 조건을 거는 절 | |||
다중 그룹화 두 개 이상 컬럼으로 그룹화 | |||
JOIN + GROUP BY 여러 테이블 연결 후 그룹화 | |||
ROLLUP 그룹별 합계 + 전체 합계까지 한 번에 출력 | |||
⸻ | |||
[[category:oracle]] | [[category:oracle]] |
2025년 5월 10일 (토) 14:55 판
Welcome To DB STUDY
ORACLE
오라클 SQL 30일 학습
SQL 기본
데이터 베이스 용어 설명
SELECT 구문
GROUP BY 절
물론이죠! Oracle의 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는 특정 컬럼 값을 기준으로 같은 값들끼리 묶어서 결과를 보여주는 SQL 절입니다.
⸻
2. 특징 • 집계 함수(예: COUNT(), SUM(), AVG(), MAX(), MIN())와 함께 자주 사용됩니다. • 데이터를 그룹별 요약하거나 분류해서 볼 수 있습니다.
⸻
3. 사용 방법
SELECT 컬럼명, 집계함수 FROM 테이블명 GROUP BY 컬럼명;
⸻
4. 예제
예제 테이블: 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를 통해 부서별로 직원 수를 센 것입니다.
⸻
5. 주의사항 • GROUP BY에 사용하지 않은 컬럼은 SELECT절에 직접 쓸 수 없습니다. (단, 집계 함수 안에 들어가는 경우는 예외) • GROUP BY는 정렬 기능이 아닙니다. 정렬은 ORDER BY를 사용해야 합니다.
⸻
좋습니다! 이제 GROUP BY의 복잡한 예제와 함께 자주 같이 쓰이는 **고급 개념 (HAVING, 다중 컬럼 그룹화 등)**도 설명해드릴게요.
⸻
1. 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 이상인 지역만 필터링합니다.
⸻
2. 다중 컬럼 GROUP BY
개념 • 두 개 이상의 컬럼을 기준으로 복합적으로 그룹화할 수 있습니다.
⸻
예제 2: 지역 + 제품별 판매 총액 구하기
SELECT region, product, SUM(amount) AS total_sales FROM sales GROUP BY region, product;
결과
region product total_sales Seoul Laptop 4200 Seoul Phone 2300 Busan Laptop 1500 Busan Phone 1200
설명: region과 product를 동시에 그룹화하여, 각 지역-제품 조합별로 총 판매량을 계산했습니다.
⸻
3. GROUP BY + JOIN 활용
복잡한 데이터 분석에는 JOIN과 GROUP BY를 함께 사용합니다.
⸻
예제 테이블
employees
emp_id name dept_id 1 John 10 2 Alice 10 3 Bob 20
departments
dept_id dept_name 10 Sales 20 IT
salaries
emp_id salary 1 3000 2 3500 3 4000
⸻
예제 3: 부서별 평균 급여 구하기 (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;
결과
dept_name avg_salary Sales 3250 IT 4000
설명: 여러 테이블을 JOIN해서 dept_name 기준으로 묶고 평균 급여를 계산했습니다.
⸻
4. ROLLUP (고급)
ROLLUP은 그룹별 합계 외에 **전체 합계(총계)**까지 같이 보여줍니다.
⸻
예제 4: 제품별 판매 총액과 전체 총액까지 보여주기
SELECT product, SUM(amount) AS total_sales FROM sales GROUP BY ROLLUP(product);
결과
product total_sales Laptop 3700 Phone 3500 NULL 7200
설명: NULL은 전체 총합을 의미합니다. 제품별 합계 + 전체 합계를 한 번에 볼 수 있습니다.
⸻
요약
개념 설명 GROUP BY 특정 컬럼으로 그룹화 HAVING 그룹화된 결과에 조건을 거는 절 다중 그룹화 두 개 이상 컬럼으로 그룹화 JOIN + GROUP BY 여러 테이블 연결 후 그룹화 ROLLUP 그룹별 합계 + 전체 합계까지 한 번에 출력
⸻