group by & having
1. Group by
- 어떤 칼럼의 데이터 값에서, 같은 데이터 값을 그룹화하여 (같은 데이터값으로 묶어서) 조회하는 방법
- crime_status 테이블의, police_station을 조회하면 총 311 개의 열이 나온다. 같은 경찰서에서 죄목별 , 발생/검거 건별 다양하게 있으므로 그에 따라 분류된 같은 경찰서명이지만, 값들에 따라 경찰서명들이 많이 조회된다.
- group by police_station을 하면, 같은 경찰서명들끼리는 하나로 묶어서 조회되기 때문에 반복된 값들은 제외하고 한번만 조회된다.
- 겹치는 경찰서 명을 제외하고, 하나로만 조회한다면 distinct 를 사용할 수도 잇지만 distinct 를 쓰면, order by 를 쓸 수 없다.
- crime_status 테이블에서, 각 경찰서 별로 발생과 검거 중에, 발생한 건수들의 총합을 구할수 있다.
- case_number 의 sum을 발생건수라는 컬럼으로 생성하고, status_type이 발생인 경우의 값들만 구한다. 이때, group by 를 police_station으로 하면 각 경찰서별로 발생건수의 합을 구할수 있다.
- 경찰서별로, 발생건수의 평균과 검거건수의 평균을 구하고싶을때, group by police_station만 하면 경찰서별로만 묶어져서 발생과 검거의 구분은 지어지지않고 발생과 검거 모두의 평균값이 발생이라는 하나의 데이터값으로 나온다. 이렇게되면 발생과 검거의 평균값이 구분지어지지 않기때문에 잘못된 계산값을 내게되는것이다.
- 발생/검거 에 대한 각자의 평균을 구할 것이기 때문에 반드시 status_type 칼럼에 대해서도 group by 를 적용하여 따로 두가지로 묶어주어야 평균값 계산이 두 경우에 나뉘어 올바르게 된다.
2. Having
- where 문에서, 사용되는 조건문에 집계함수는 들어갈 수 없다. 집계함수가 사용되는 조건문을 사용하기 위해서는 where 가 아니라 having 절에서 쓴다.
- 경찰서별로, 사건이 발생한 경우의 합이 4000이 넘는 경찰서만 조회한다. 사건 발생한 경찰서의 총 합(sum) 집계함수를 써야하므로 where 가 아닌 having 문에 조건을 써준다.
- 강남의 발생 건수 합을 검색해보면 정확하게 나온다.
- 위의 예와 같이, 평균을 구하는 집계함수를 사용하여 having 절에서 평균값을 이용한 조건절을 썼다. 폭력과 절도가 발생한 현장들의 총 합 평균을 경찰서별로 정리하여 평균이 2000이 넘는 경우이다.