본문 바로가기
SQL

[SQL] 다중행 함수와 데이터 그룹화_2

by lmyourpearl 2025. 12. 1.

최댓값을 구하는 MAX 함수와 최솟값을 구하는 MIN 함수

MAX([DISTINCT, ALL 중 하나를 선택하거나 아무 값도 지정하지 않음(선택)]
    [최댓값을 구할 열이나 연산자, 함수를 사용한 데이터(필수)])
OVER(분석할 때 사용할 여러 문법 지정)(선택)

MIN([DISTINCT, ALL 중 하나를 선택하거나 아무 값도 지정하지 않음(선택)]
    [최솟값을 구할 열이나 연산자, 함수를 사용한 데이터(필수)])
OVER(분석할 때 사용할 여러 문법 지정)(선택)
-- 숫자 데이터에서 MAX,MIN 함수 사용하기
SELECT MAX(SAL)
	FROM EMP
WHERE DEPTNO = 10;

SELECT MIN(SAL)
	FROM EMP
WHERE DEPT NO = 10;


-- 날짜 데이터에 MAX,MIN 함수 사용하기
SELECT MAX(HIREDATE)
	FROM EMP
WHERE DEPTNO = 20;

SELECT MIN(HIREDATE)
	FROM EMP
WHERE DEPTNO = 20;

평균값을 구하는 AVG 함수

숫자 또는 숫자로 암시적 형 변환할 수 있는 데이터만 사용 가능.

AVG([DISTINCT, ALL 중 하나를 선택하거나 아무 값도 지정하지 않음(선택)]
    [평균값을 구할 열이나 연산자, 함수를 사용한 데이터(필수)])
OVER(분석할 때 사용할 여러 문법 지정)(선택)

SELECT AVG(SAL)
    FROM EMP
WHERE DEPTNO = 30
;

SELECT AVG(DISTINCT SAL)
    FROM EMP
WHERE DEPTNO = 30;

결괏갑을 원하는 열로 묶어 출력하는 GROUP BY절

GROUP BY: 그룹화할 열 또는 데이터지정 필수 - 특정 열 또는 데이터를 기준으로 데이터를 그룹으로 묶음. 별칭을 인식하지 못하니 열 이름이나 연산식을 그대로 지정해야 함.

SELECT [조회할 열1 이름], [열2 이름],...[열n 이름]
FROM   [조회할 테이블 이름]
WHERE  [조회할 행을 선별하는 조건식]
GROUP BY [그룹화할 열을 지정(여러 개 지정할 수 있음)]
ORDER BY [정렬할 열 지정]
SELECT AVG(SAL), DEPTNO
  FROM EMP
GROUP BY DEPTNO;

-- 부서 번호와 직책별 평균 급여로 정렬하기
SELECT DEPTNO, JOB, AVG(SAL)
  FROM EMP
GROUP BY DEPTNO, JOB
ORDER BY DEPTNO, JOB;

 

-- 부서 번호와 직책별 평균 급여로 정렬하기 SELECT DEPTNO, JOB, AVG(SAL) FROM EMP GROUP BY DEPTNO, JOB ORDER BY DEPTNO, JOB;

 

-- 오류
-- GROUP BY절에 없는 열을 SELECT절에 포함할 때

SELECT ENAME, DEPTNO, AVG(SAL)
	FROM EMP
GROUP BY DEPTNO;

-- DEPTNO를 기준으로 그룹화하여 DEPTNO열과 AVG(SAL)열은 한 행으로 출력하지만,
-- ENAME 열은 여러 행으로 구성되어 열별 데이터 수가 달라져 출력할 수 없기 때문.

만든 그룹을 조건별로 출력할 때 사용하는 HAVING 절

HAVING절은 SELECT문에 GROUP BY절이 있을때만 사용할 수 있으며, 이 절은 GROUP BY절로 그룹화한 결괏값의 범위를 제한하는 데 사용.

SELECT [조회할 열1 이름], [열2 이름],...[열n 이름]
FROM   [조회할 테이블 이름]
WHERE  [조회할 행을 선별하는 조건식]
GROUP BY [그룹화할 열을 지정(여러 개 지정할 수 있음)]
HAVING   [출력 그룹을 제한하는 조건식]
ORDER BY [정렬할 열 지정]

** HAVING - 조건식 필수, GROUP BY정릉 사용해 그룹화한 결과 중 출력 그룹을 선별하는 조건식을 지정.

HAVING 절은 GROUP BY절이 있을 때 이 절 바로 뒤에 작성함.

별칭 사용 불가.

-- GROUP BY절과 HAVING절을 사용하여 출력하기
SELECT DEPTNO, JOB, AVG(SAL)
	FROM EMP
GROUP BY DEPTNO, JOB
	HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;

HAVING절을 사용할 때 유의점

WHERE절은 출력 대상 행을 제한하고, HAVING절은 그룹화한 대상을 출력에서 제한하므로 쓰임새는 전혀 다름. 하지만 둘다 조건식을 지정하고 조건식이 참인 결과만 출력한다는 점은 비슷함.

 

**WHERE절과 HAVING절의 차이점

HAVING 절을 처음 사용한 SELECT문에 WHERE절 조건을 추가하여 실행.

 WHERE절을 사용하지 않고 HAVING절만 사용한 경우
SELECT DEPTNO, JOB, AVG(SAL)
	FROM EMP
GROUP BY DEPTNO, JOB
	HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;


-- WHERE절과 HAVING절을 모두 사용한 경우
SELECT DEPTNO, JOB, AVG(SAL)
	FROM EMP
WHERE SAL <= 3000
GROUP BY DEPTNO, JOB
	HAVING AVG(SAL) >= 2000
ORDER BY DEPTNO, JOB;