PLOD

[SQL] GROUP 함수 본문

개발 공부/Database

[SQL] GROUP 함수

훌룽이 2023. 2. 13. 17:48

 


SELECT 그룹함수(컬럼 명), 컬럼1, 컬럼2.. -----------------------> 다섯번째 실행
FROM 테이블 ---------------------------------->첫번째 실행
WHERE 조건------------------------------------------>두번째 실행
GROUP BY 컬럼1 , 컬럼2...(그룹함수 X)------------------>세번째 실행
HAVING 그룹 조건 ----------------- >네번째 실행
ORDER BY 컬럼1, 컬럼2 --------------->여섯번째 실행

GROUP절은 WHERE절 아래에 위치하며 , SQL에서 그룹 함수를 사용할 때 , 그룹함수를 사용하지 않은 컬럼을 기준으로 결과를 출력하기 위해서 사용한다. GROUP 절에 포함되는 컬럼은 그룹 함수를 사용하지 않은 컬럼이 포함된다.

* 다중 행 함수(Multiple-row-function)

여러 행을 바탕으로 하나의 결과 값을 도출해 내기 위해 사용하는 함수이다. EX) SUM,AVG,MAX,MIN,COUNT

SELECT DEPTNO , SUM(SAL) "부서별 평균"
FROM EMP
GROUP BY DEPTNO;

위의 SUM 함수는 EMP의 SAL 컬럼의 모든 행을 더해주는 함수이다. 위와 같은 다중행 함수는 여러 행이 입력되어 하나의 결과 값으로 출력해주는 함수이다. 다중행 함수와 그룹 함수를 사용하지 않은 함수는  SELECT  절에 같이 사용 할 수 없다. 그렇기 때문에 FROM 절 뒤로 사용해 주는 것이 GROUP BY 절이다.

 

1) SUM(컬럼) : 그룹의 합을 더하게 해준다.

SELECT SUM(DISTINCT SAL), SUM(ALL SAL), SUM(SAL)
FROM EMP;

 

2) COUNT(컬럼)  : 그룹의 데이터 개수를 구해게 해준다.

SELECT COUNT(*) FROM EMP	 -- 행의 개수 구하기
WHERE DEPTNO = 30;

https://school.programmers.co.kr/learn/courses/30/lessons/132202

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

SELECT MCDP_CD AS "진료과 코드" , COUNT(*) AS "5월예약건수"
FROM APPOINTMENT
WHERE DATE_FORMAT(APNT_YMD,"%m") = '05' AND DATE_FORMAT(APNT_YMD,"%Y") = '2022'
GROUP BY MCDP_CD
ORDER BY 2 ASC, 1 ASC

3) MAX(컬럼) : 그룹의 최대값을 구하게 해준다

4) MIN(컬럼) : 그룹의 최소값을 구하게 해준다.

SELECT MAX(SAL), MIN(SAL)
FROM EMP;

5) AVG(컬럼) : 그룹의 평균을 구하게 해준다.

SELECT TRUNC(AVG(SAL))
FROM EMP;

 

※그룹함수는 null값을 연산에 포함하지 않는다. 

select  avg(comm) ,  sum(comm)/14   
from  emp;

위의 데이터에서 AVG와 COMM의 SUM 값에서 데이터의 개수인 14를 나누어 준 값은 같은 것처럼 보이나 , NULL 값은 그룹 함수 연산에 포함 되지 않기 떄문에 다른 결과 값이 나온다. (NULL  값은 0이 아니다) 그렇기 때문에 커미션 평균을 구하기 위해서는 아래와 같이 NVL함수를 추가적으로 사용하여 NULL 값이면 0으로 반환해 주는 처리를 해주어야 정확한 연산을 할 수가 있다.

SELECT AVG(NVL(COMM,0))			-- 커미션 평균을 구하는 그룹 연산
FROM EMP;

 

* GROUP BY : 컬럼들 그룹화

여러 데이터에서 의미 있는 하나의 결과를 특정 열 값별로 묶어서 출력 할 때 데이터를 그룹화한다고 표현한다. 그룹함수는 GROUP BY 절을 사용하여 테이블의 행을 더 작은 그룹으로 나누고 GROUP BY  절에 명시하는 열은 여러개 지정할 수 있다. SELECT 목록의 열 중 그룹 함수에 없는 열(다중 행 함수를 사용하지 않은 일반 열)은 모두 GROUP BY 절에 포함 되어야 한다. GROUP BY 열을 SELECT  절에 포함 시키지 않아도 된다. 하나 이상의 GROUP BY 열을 나열 하여 그룹에 대한 요약 결과를 조회 할 수 있다.

 

 

*HAVING : 그룹화한 결과 중 출력 그룹을 선별

HAVING 절은 GROUP BY 절이 있을 때만 사용 가능하다. 그룹은 WHERE 절을 사용하여 그룹을 제한 할 수 없다  . HAVING 절을 사용하여 GROUP BY 절을 제한한다. 그룹이 형성되고 그룹 함수가 계산된 후 HAVING 절이 적용된다. HAVING 절을 GROUP BY 앞에 사용해도 되지만 GROUP BY 절을 뒤에 쓸 것을 권장한다. 

SELECT DEPTNO, JOB, AVG(SAL)
FROM EMP
GROUP BY DEPTNO, JOB
HAVING AVG(SAL) > 2000
ORDER BY DEPTNO, JOB;

위의 SQL 질의에서 부서번호와 직업으로 나눈 분류에서 SAL의 평균값이 2000이 넘는 것들만 그룹 기준 내림차순으로 출력 하였다. 

 

WHERE 절과 HAVING 절은 조건에 따라 값을 출력한다는 점에서 비슷하지만 WHERE 절은 출력 대상 행을 제한하고 , HAVING 절은 그룹화된 대상을 출력 에서 제한한다. (WHERE -> 그룹 함수 적용 안한 컬럼, HAVING - > 그룹 함수 적용한 컬럼)

 

WHERE과 GROUP BY + HAVING 이 같이 쓰인다면 WHERE 절이 먼저 수행되고 그다음에 GROUP + HAVING 이 수행된다. 

SELECT DEPTNO,JOB,AVG(SAL),SUM(SAL)					-- 직업이 SALESMAN인 그룹중에서 평균이 1000보다 큰 부서 정보 출력
FROM EMP
WHERE JOB = 'SALESMAN'
GROUP BY JOB,DEPTNO
HAVING AVG(SAL) > 1000;

'개발 공부 > Database' 카테고리의 다른 글

[DB] Redis  (0) 2024.08.20
[SQL] SUB QUERY  (0) 2023.02.21
[SQL] SQL 함수  (0) 2023.02.05
[DB]Concurrency Control  (0) 2022.12.11
[DB]Transaction  (0) 2022.12.11
Comments