SQL은 통계에서 자주 사용되는 연산을 함수로 제공한다. 이를 집계함수(aggregate function)이라 한다. 집계함수에는 count, sum, avg, max, min이 있다. 집계함수의 X는 필드이다.
테이블은 필드로 테이블을 정의하고 레코드로 테이블을 생성한다. 집계함수의 X는 레코드로 들어간 필드의 값들을 의미한다.
SELECT count(distinct dept_id)
FROM student;
학생 테이블에 저장된 학과 ID가 포함된 레코드의 개수를 세는 SQL문이다. distinct를 통해, 중복되는 학과 ID를 제거했다. 집계되는 레코드는 WHERE을 통해서 조건을 걸어줄수도 있다.
SELECT count(*)
FROM student s , department d
WHERE s.dept_id = d.dept_id and d.dept_name ='컴퓨터공학과';
컴퓨터공학과인 학생의 레코드를 count하는 SQL문이다. 하지만 이런 식의 집계함수는 문제가 있다. SELECT는 레코드를 추출하는 것이 목적인데 집계함수를 사용하면 연산결과가 출력된다. 그러므로 집계함수가 포함된 테이블을 작성하려면 그룹화를 해주어야 한다.
GROUP BY
학점 A,B,C,D,F 를 받은 학생의 수를 계산하려고 한다. 학생의 수는 count 집계함수로 집계할 수 있다 . 그러면 이를 학점별로 그룹지어야한다. 이때 GROUP BY가 사용된다.
SELECT gra, count(*)
FROM student, takes
WHERE student.std_id = takes.std_id
GROUP BY gra;
처리되는 순서는 이렇다.
FROM (카디션 프러덕트(곱집합) )
모든 경우의 수의 레코드를 출력
WHERE
동등조건에 있는 레코드 거르기
GROUP BY 필드
걸러진 레코드를 필드 값에 따라 그룹화
SELECT
그룹별로 집계함수를 적용하여 레코드 추출
여기서는 유의해야할 점이 있다. WHERE는 그룹화에 사용될 레코드를 거를 때 사용되는 조건이다. 그러므로 WHERE 위치에 집계함수의 조건을 사용하면 안된다.
WHERE count(gra) > 10
집계함수에 적용되는 조건은 그룹화(GROUP BY)를 한 뒤 써야한다.
HAVING
HAVING 절에는 그룹화와 관련된 조건이 나온다.
부서별 직원의 수, 직원 월급 평균, 최고, 최저를 출력하려고 한다. 단, 조건이 있다. 부서별 직원의 수가 5명 이상인 부서만 테이블에 출력한다.
SELECT department_name, count(*), avg(salary), max(salary), min(salary)
FROM employee e, department d
WHERE e.department_id = d.department_id
GROUP BY department_name
HAVING count(*) >=5
부서별로 그룹화와 관련된 조건은 HAVING을 사용한다.
참고자료
Understanding of Database저자이상구, 장재영, 김한준, 정재헌출판이한미디어발매2012.08.20.
'DB > DB Basic' 카테고리의 다른 글
[DB] 무결성 (Integrity)이란? (0) | 2021.06.25 |
---|---|
[DB] SQL3 (Oracle) (0) | 2021.06.25 |
[DB] SQL1 (Oracle) (0) | 2021.06.25 |
[DB] Oracle의 구조 (0) | 2021.06.24 |
[DB] 관계해석(Relational Calculus) (0) | 2021.06.24 |