본문 바로가기

CS/데이터베이스

[데이터베이스 기초] SQL의 집단함수와 GROUP BY 절, HAVING 절 정리

집단함수

: 검색 결과의 합이나 개수 등 요약 정보를 제공하는 함수로 COUNT, SUM, MAX, MIN, AVG가 있음

* 집단함수는 SELECT 절에만 오는 것이 아닌, WHERE 절에도 올 수 있다.

* 일반적으로 집단함수를 정의할 경우 null은 어떻게 처리할까?

보통 null값은 빼고 계산한다. 전체가 null일 경우는 null값을 돌려주지만 예외로 COUNT인 경우만 0을 돌려준다.

 

직원의 급여 합, 급여 최대값, 급여 최솟값, 급여 평균을 검색하라

SELECT SUM(Salary), Max(Salary), MIN(Salary), AVG(Salary)
FROM EMPLOYEE;

직원의 수를 검색하라

SELECT COUNT(*) FROM EMPLOYEE;

급여 종류의 수를 검색하라

SELECT(DISTINCT Salary)
FROM EMPLOYEE;

 

 

GROU BY

특정 애트리뷰트 값에 대해 그룹을 만들 수 있다. 특정 그룹에도 집단 함수를 적용할 수 있다.

null값이 있다면? null을 한 그룹으로 묶는 것이 아닌, 하나하나 그룹이 만들어진다. 

* SELECT 절에 나올수 있는 애트리뷰트는 GROUP BY절에 있는 애트리뷰트나 집단함수만 나올 수 있다.

 

부서에 대해여 부서 번호, 부서마다 직원 수, 부서마다 평균 급여를 검색해라.

SELECT Dno, COUNT(*), AVG(SALARY)
FROM EMPLOYEE
GROUP BY Dno;

프로젝트에 대해서 프로젝트 번호, 프로젝트 이름, 프로젝트에서 일하는 직원의 수를 검색해라.

SELECT Pnumber, Pname, COUNT(*)
FROM PROJECT, WORKS_ON
WHERE Pnumber=Pno
GROUP BY Pnumber, Pname;

 

HAVING

그룹을 필터링하는 절이다.

HAVING 절에는 GROUP BY에 있는 애트리뷰트 거나 집단함수만 올 수 있다.

 

직원이 2명 이상 참여한 프로젝트에 대하여 프로젝트 번호, 프로젝트 이름, 참여한 직원의 수를 검색하라

SELECT Pnumber Pname, COUNT(*)
FROM PROJECT, WORKS_ON
WHERE Pnumber = pno
GROUP BY Pnumber, Pname
HAVING COUNT(*) > 2;

 

* WHERE, HAVING 조건 절이 2개 이기 때문에 어느 절에 조건이 들어가야 할지 잘 판단해야 한다.

(WHERE 절이 먼저 적용되고 HAVING 절이 나중에 적용되기 때문에 잘 판단해야 함)

 

1) 각각의 프로젝트에 대하여 5번 부서에서 일하는 직원의 프로젝트 번호, 프로젝트 이름과  직원 수를 검색하라.

SELECT Pnumber, Pname, COUNT(*)
FROM PROJECT, WORKS_ON, EMPLOYEE
WHERE Pnumber=Pno AND Ssn=Essn AND Dno=5
GROUP BY Pnumber, Pname;

2) 근무하는 부서의 직원수가 3명 이상인 부서에 대해서 각 부서에서 연봉이 40000이 넘는 직원들의 총 수를  검색하라.  

틀린 답)

SELECT Dno, COUNT(*)
FROM EMPLOYEE
WHERE Salary > 40000
GROUP BY Dno
HAVING COUNT(*) > 3;

WHERE 절이 먼저 적용되기 때문에 COUNT(*) 값에 왜곡이 생긴다. 따라서 둘 다 WHERE 절에 들어가야 한다.

 

정답)

SELECT Dno, COUNT(*)
FROM EMPLOYEE
WHERE Salary>40000 AND
	Dno IN (SELECT Dno FROM EMPLOYEE GROUP BY DNO HAVING COUNT(*) > 3)
GROUP BY Dno;