sql

[mysql] GROUP BY, HAVING

scone 2022. 7. 6. 02:54

[GROUP BY] 

  • 그룹별 데이터를 조회

 

  • crime status에서 경찰서 별로 그룹화 하여 경찰서 이름을 조회
    DISTINCT와 차이점은, ORDER BY도 쓸 수 있다는 점
SELECT police_station FROM crime_status
GROUP BY police_station;

이름 별로 그룹화 되어서 볼 수 있다.

 

  • 경찰서 별로 그룹화 하여 총 발생 범죄 건수를 조회
SELECT police_station, SUM(case_number) 발생건수 FROM crime_status
WHERE status_type = '발생'
GROUP BY police_station
ORDER BY 발생건수 DESC;

 

  • 경찰서 별 평균 범죄 검거 건수
SELECT police_station, AVG(case_number) 평균건수 FROM crime_status
WHERE status_type = '검거'
GROUP BY police_station
ORDER BY 평균건수 DESC;

 

  • 경찰서 별 평균 범죄 발생 건수와 평균 범죄 검거 건수를 검색 ( status_type에는 검거와 발생 두 가지만 있다.)
SELECT police_station, status_type, AVG(case_number) 평균건수 FROM crime_status
GROUP BY police_station, status_type
ORDER BY 평균건수 DESC;


[HAVING] 

  • 조건에 집계함수가 포함되는 경우 WHERE 대신 HAVING 을 사용해야  한다.

 

  • 경찰서 별로 발생한 범죄 건수 합이 4000건 보다 큰 경우
SELECT police_station, SUM(case_number) 범죄건수합 FROM crime_status
WHERE status_type = '발생'
GROUP BY police_station
HAVING 범죄건수합 > 4000;

확인

SELECT SUM(case_number) 범죄건수합 FROM crime_status
WHERE status_type = '발생' AND police_station = '영등포';

 

  • 경찰서 별로 발생한 폭력과 절도의 범죄 건수 평균이 2000보다 큰 경우
SELECT police_station, AVG(case_number) 평균건수 FROM crime_status
WHERE ( crime_type LIKE '%폭력%' OR crime_type LIKE '%절도%' ) AND status_type LIKE '%발생%'
GROUP BY police_station
HAVING 평균건수 > 2000;