1. Group by
(1) Aggregate functions - Group by
- 그룹화하여 데이터를 조회할 수 있도록 하는 operation
- 특정 column을 그룹화하는 것이다.
SELECT 컬럼 FROM 테이블 GROUP BY 컬럼;
ex. 각 학과의 교수들의 평균 연봉을 출력하시오.
select dept_name, avg(salary)
from instructor
group by dept_name;
- 이렇게 학과 별로 나누어진 salary들의 평균을 구하면 다음과 같다.
- relation의 통계 처리가 가능해진다.
(2) 주의사항
/* erroneous query */
select dept_name, ID, avg (salary)
from instructor
group by dept_name;
- 위의 sql query가 오류인 이유는, 학과 별로 그룹화 했을 때, 어느 한 ID가 그 그룹을 대표한다고 볼 수 없기 때문이다.
- 따라서, ID는 빼주어야 한다. (학과를 대표하는 교수는 존재하지 않는다.)
2. Having
(1) Aggregate functions - Having Clause
- 컬럼을 그룹화한 후 조건 처리해주는 operation
SELECT 컬럼 FROM 테이블 GROUP BY 컬럼 HAVING 조건식;
- group by 절에서 조건을 주려면, where절이 아니라 having절을 써야 한다.
ex. 평균 연봉이 42000이 넘는 학과의 이름과 평균 연봉을 출력하시오
select dept_name, avg(salary) as avg_salary
from instructor
group by dept_name
having avg(salary) > 42000;
(2) 연산 해석 순서
from ▶ where ▶ group by ▶ having ▶ order by ▶ select
(3) Having과 Where의 차이
- Having : 특정 필드로 그룹화 되어진 새로운 테이블에 조건을 줄 수 있음 (그룹 필터링). group by 뒤에 위치.
- Where : 기본적인 조건절로, 모든 필드를 대상으로 조건을 줄 수 있음 (행 필터링). group by 앞에 위치.
ex.
select name, count(*) as cnt
from 테이블
where age=20
group by name;
where 절 먼저 해석해서, 나이가 20인 사람들만을 추출한 후 이름을 기준으로 그룹화하여 count하는 방식이다.
select name, count(*) as cnt
from 테이블
group by name
having count(*)>1;
이름을 기준으로 그룹화하고 그 그룹화된 결과를 바탕으로 2개 이상인 것만을 출력하는 방식이다.
'[ CS 전공 ]' 카테고리의 다른 글
[ DB ] 8. SQL (3) : Subqueries (0) | 2022.04.28 |
---|---|
[ DB ] 6. SQL (1) : rename, string, ordering operation | MySQL (0) | 2022.04.27 |
[ DB ] 5. Table 생성, 수정, 삭제 (0) | 2022.04.27 |
[ OS ] Basic component, ISA, Instruction Cycle, PIC (0) | 2022.03.27 |
[ DB ] Relational Model (2) : Relational Algebra (0) | 2022.03.26 |