여러가지 행을 그룹으로 묶기
group by 절이란?
- 기술된 열을 기준으로 같은 데이터 값끼리 그룹화 한다.
- 같은 데이터 값끼리 그룹화 후 그룹 함수를 유용하게 사용할 수 있다.
group by 절의 특징
- SELECT 절에 기준 열과 그룹함수가 같이 지정되면 GROUP BY 절에 기준 열 이름이 반드시 기술되어야 한다.
- WHERE 절을 사용하면 행을 그룹으로 묶기 전에 앞서 조건식이 적용 가능.
- SELECT 절에 그룹 함수를 사용하지 않아도 GROUP BY 절만으로도 사용 가능.
예제 테이블 ( user )
index |
name |
level |
salary |
1 |
홍길동 |
3 |
600 |
2 |
고길동 |
5 |
300 |
3 |
아무개 |
3 |
200 |
4 |
루피 |
7 |
900 |
5 |
이기영 |
5 |
450 |
6 |
호빵맨 |
4 |
170 |
7 |
세균맨 |
4 |
1300 |
level 이 4 이상인 데이터들의 그룹
SELECT * FROM user where LEVEL >= 4 GROUP BY LEVEL
index |
name |
level |
salary |
2 |
고길동 |
5 |
300 |
4 |
루피 |
7 |
900 |
6 |
호빵맨 |
4 |
170 |
level 이 3 이상인 데이터들의 그룹을 그룹 함수를 이용해 가꿔 보기
SELECT LEVEL ,sum(salary) AS '합', AVG (salary) AS '평균' FROM user WHERE LEVEL >= 3 GROUP BY LEVEL ORDER BY level;
level |
합 |
평균 |
3 |
800 |
400 |
4 |
1,470 |
735 |
5 |
750 |
375 |
7 |
900 |
900 |
연산된 그룹들에 조건 적용하기!!
앞에서 배운 where 절은 행 ( row ) 에 대한 조건을 적용할 때 사용했었습니다. 그렇지만 그룹에 대한 조건은 HAVING을 사용하는데요
예제를 보며 익혀봅시다.
우선 WHERE 절을 이용해서 조건적용 후 그룹을 묶어보겠습니다.
SELECT * FROM user WHERE salary > 850 GROUP BY level
index |
name |
level |
salary |
4 |
루피 |
7 |
900 |
7 |
세균맨 |
4 |
1300 |
HAVING 을 사용해 그룹에 대한 조건적용을 해보겠습니다.
SELECT *, SUM(salary) FROM user GROUP BY LEVEL HAVING SUM( salary ) > 850;
index |
name |
level |
salary |
SUM(salary) |
4 |
루피 |
7 |
900 |
900 |
6 |
호빵맨 |
4 |
170 |
1,470 |
그룹에 대한 조건은 HAVING 으로 묶는게 그룹 조건에 더 적합합니다!!.
조건에 해당하는 데이터들의 그룹 / 그룹화된 데이터들의 조건에 해당하는 데이터들은 차이가 많습니다!..