1. 다중행 함수와 집계 함수
1️⃣ 다중행 함수와 집계 함수의 기초 개념
1) 다중행 함수
- 여러 행을 대상으로 동작하는 함수
(대부분 집계 함수를 의미)
2) 집계 함수 (Aggregate Function)
- SQL에서 여러 행의 데이터를 하나의 결과값으로 집계하는 데 사용되는 함수
- 목적 : 데이터 요약, 계산, 통계 등
- 함수 종류 :
SUM(),AVG(),COUNT(),MAX(),MIN()등
- 집계 함수의 특성
- 여러 행들의 그룹이 모여 그룹당 단 하나의 결과를 돌려주는 함수
- GROUP BY 절은 행들을 소그룹화함
- SELECT 절, HAVING 절, ORDER BY 절에서 사용할 수 있음
2️⃣ 다중행 함수의 종류 ⭐
집계 함수, 순위 함수, 윈도우 함수가 주로 출제됨
통계 함수, 데이터 분석 함수는 거의 출제된 적 없음 (기본 개념 정도만 숙지)
1) 집계 함수 ⭐
(’2과목 1장 SQL 기본’에서 설명)
COUNT(): 행의 개수 계산
SUM(): 합계 계산
AVG(): 평균 계산
MAX(): 최댓값
MIN(): 최솟값
SELECT SUM(SAL) AS TOTAL_SALARY,
AVG(SAL) AS AVERAGE_SALARY,
COUNT(*) AS EMPLOYEE_COUNT,
MAX(SAL) AS MAX_SALARY,
MIN(SAL) AS MIN_SALARY
FROM EMP;TOTAL_SALARY | AVERAGE_SALARY | EMPLOYEE_COUNT | MAX_SALARY | MIN_SALARY |
29025 | 2073.214 | 14 | 5000 | 800 |
2) 통계 함수
(’2과목 2장 SQL 활용’에서 설명)
집계 함수로 분류하기도 함
STDDEV(): 표준편차 계산
VARIANCE(): 분산 계산
3) 그룹 함수
(’2과목 2장 SQL 활용’에서 설명)
데이터 분석 함수로 분류하기도 함
LISTAGG(): 여러 행의 값을 하나의 문자열로 연결 (오라클)
STRING_AGG(): LISTAGG와 유사 (SQL Server)
GROUP_CONCAT(): LISTAGG와 유사 (My SQL)
4) 순위 함수 ⭐
(’2과목 2장 SQL 활용’에서 설명)
RANK(): 순위 계산 (동점 시 간격 발생)
DENSE_RANK(): 순위 계산 (동점 시 간격 없음)
ROW_NUMBER(): 각 행에 고유한 숫자 할당
5) 윈도우 함수 ⭐
(’2과목 2장 SQL 활용’에서 설명)
- 위의 다중행 함수들을 OVER 절과 함께 사용하여 윈도우 함수로 활용 가능
2. GROUP BY절
1️⃣ GROUP BY절 기초 개념
1) GROUP BY절
- SQL에서 데이터를 글룹화하는 데 사용되는 중요한 기능
- 지정된 칼럼(열)의 값이 같은 행들을 하나의 그룹으로 묶음 → 집계 함수를 사용하여 그룹의 특성 파악하기 위함
- 보고서, 통계, 데이터 요약 등의 실무에 자주 사용됨
2) HAVING절
- GROUP BY절에서 칼럼을 그룹으로 묶을 때 특정 조건을 지정하고 싶은 경우에 HAVING절 사용
- 그룹에 대한 조건 지정할 때 사용됨
- 대부분 GROUP BY절과 함께 사용됨
2️⃣ GROUP BY절 형식과 예
1) 여러 열을 사용한 그룹화 예
SELECT DEPTNO, JOB, SUM(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO;DEPTNO | JOB | SUM(SAL) |
10 | CLERK | 1300 |
10 | MANAGER | 2450 |
10 | PRESIDENT | 5000 |
20 | ANALYST | 6000 |
20 | CLERK | 1900 |
20 | MANAGER | 2975 |
30 | CLERK | 950 |
30 | MANAGER | 2850 |
30 | SALESMAN | 5600 |
2) GROUP BY절에서 ALIAS(별칭) 사용 불가 ❌ ⭐
- GROUP BY절에서는 ALIAS 사용 불가 ❌
- SELECT로 ALIAS 지정되기 전에 GROUP BY절 수행되기 때문
- ORDER BY절에서는 ALIAS 사용 가능 ⭕
- SELECT절 이후에 수행되기 때문
SELECT DEPTNO AS NO, JOB AS JOB_NAME, SUM(SAL) AS SUM_SAL
FROM EMP
GROUP BY DEPTNO, JOB // 별칭 사용 불가
ORDER BY NO; // 별칭 사용 가능DEPTNO | JOB | SUM(SAL) |
10 | CLERK | 1300 |
10 | MANAGER | 2450 |
10 | PRESIDENT | 5000 |
20 | ANALYST | 6000 |
20 | CLERK | 1900 |
20 | MANAGER | 2975 |
… | … | … |
3. HAVING절
1️⃣ HAVING절 기초 개념
- GROUP BY절과 함께 자주 사용되며, 그룹화된 결과에 조건 적용할 때 사용
- 필터를 통해 그룹 내에서 필터링된 값만 그룹화
- HAVING절에는 주로 집계 함수(COUNT, AVG, SUM 등)가 사용됨
- GROUP BY 없이 HAVING절을 사용할 수 있지만 드문 경우
2️⃣ HAVING절의 형식과 예
1) GROUP BY와 HAVING절 적용 예
SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) > 2000;DEPTNO | AVG(SAL) |
10 | 2916.667 |
20 | 2175 |
2) (오라클) GROUP BY와 HAVING절의 순서가 바뀐 경우
- 오라클에서는 순서가 바뀌어도 에러가 발생하지 않음 (결과물 동일)
- SQL Server에서는 에러 발생
SELECT DEPTNO, AVG(SAL)
FROM EMP
HAVING AVG(SAL) > 2000
GROUP BY DEPTNO;DEPTNO | AVG(SAL) |
10 | 2916.667 |
20 | 2175 |
3️⃣ 데이터를 필터링할 때 WHERE절 혹은 HAVING절의 차이
1) WHERE절에서 먼저 데이터 필터링하고 집계하는 방법
SELECT DEPTNO, AVG(SAL)
FROM EMP
WHERE SAL > 1500
GROUP BY DEPTNO;⬇️ SAL이 1500 초과인 행을 먼저 필터링
ENAME | SAL | DEPTNO |
KING | 5000 | 10 |
BLAKE | 2850 | 30 |
CLARK | 2450 | 10 |
ALLEN | 1600 | 30 |
JONES | 2975 | 20 |
SCOTT | 3000 | 20 |
FORD | 3000 | 20 |
⬇️ 그 후에 DEPTNO별로 그룹화하여 평균 급여 계산
DEPTNO | AVG(SAL) |
10 | 3725 |
30 | 2225 |
20 | 2991.667 |
2) HAVING절에서 데이터 필터링하는 방법
SELECT DEPTNO, AVG(SAL)
FROM EMP
GROUP BY DEPTNO
HAVING AVG(SAL) > 2000;⬇️ 모든 행을 DEPTNO별로 그룹화한 후 평균 급여가 2000 초과인 그룹 선택
DEPTNO | AVG(SAL) |
10 | 2916.667 |
20 | 2175 |
3) 정리
- WHERE절 : 그룹화 전 개별 행 필터링 (적용 대상 : 개별 행) → 집계 함수 사용 불가
- HAVING절 : 그룹화 후 그룹에 대해 필터링 (적용 대상 : 그룹화된 결과) → 집계 함수 사용 가능
- WHERE절과 HAVING절을 함께 사용하여 보다 정교한 데이터 필터링과 집계 가능
4️⃣ ORDER BY절
1) 단일 열 기준으로 오름차순 정렬
SELECT ENAME, JOB AS JOB_NAME, SAL
FROM EMP
ORDER BY SAL ASC;ENAME | JOB_NAME | SAL |
SMITH | CLERK | 800 |
JAMES | CLERK | 950 |
ADAMS | CLERK | 1100 |
WARD | SALESMAN | 1250 |
… | … | … |
2) 단일 열 기준으로 내림차순 정렬
SELECT ENAME, JOB, SAL
FROM EMP
ORDER BY SAL DESC;ENAME | JOB | SAL |
KING | PRESIDENT | 5000 |
SCOTT | ANALYST | 3000 |
FORD | ANALYST | 3000 |
JONES | MANAGER | 2975 |
… | … | … |
3) 여러 열 기준으로 정렬
SELECT ENAME, JOB, SAL, DEPTNO
FROM EMP
ORDER BY DEPTNO ASC, SAL DESC;ENAME | JOB | SAL | DEPTNO |
KING | PRESIDENT | 5000 | 10 |
CLARK | MANAGER | 2450 | 10 |
MILLER | CLERK | 1300 | 10 |
SCOTT | ANALYST | 3000 | 20 |
FORD | ANALYST | 3000 | 20 |
JONES | MANAGER | 2975 | 20 |
ADAMS | CLERK | 1100 | 20 |
SMITH | CLERK | 800 | 20 |
BLAKE | MANAGER | 2850 | 30 |
… | … | … | … |
4) 부서별로 가장 최근에 고용된 직원 찾기
SELECT ENAME, JOB, HIREDATE, DEPTNO
FROM EMP
ORDER BY DEPTNO ASC, HIREDATE DESC;ENAME | JOB | HIREDATE | DEPTNO |
MILLER | CLERK | 1982-01-11 | 10 |
KING | PRESIDENT | 1981-11-17 | 10 |
CLARK | MANAGER | 1981-05-09 | 10 |
ADAMS | CLERK | 1983-01-15 | 20 |
SCOTT | ANALYST | 1982-12-22 | 20 |
FORD | ANALYST | 1981-12-11 | 20 |
… | … | … | … |
Share article