-
SQLite 5. 집계함수와 GROUP BYSQL/Sqlite 2021. 12. 30. 12:04반응형
집계함수, 집약함수, 그룹함수 모두 같은 말이다.
데이터를 가져오지 않고 하나의 값으로 요약한다.
COUNT, SUM, AVG, MAX, MIN 이 있다.COUNT
행의 개수를 리턴한다.
SELECT count(*) FROM mlb_players
AVG
SELECT avg("Height(inches)") as avg, max("Height(inches)") as max, min("Height(inches)") as min FROM mlb_players
AVG 평균
SUM 합계
MIN 최소
MAX 최대GROUP BY
* GROUP BY 절은 WHERE 뒤 ORDER BY 앞에 위치해야 한다.
SELECT * FROM mlb_players GROUP BY Team
실행해보면 각팀의 가장 앞에 있던 선수들이 출력 될 뿐이다.
이게 뭐냐 싶은 정도의 결과다.하지만 이렇게 집계함수를 같이 사용하면..
SELECT Team, count(*) FROM mlb_players GROUP BY Team
각 팀의 선수 수를 알 수 있다.
DBMS는 GROUP BY 절이 있으면, 데이터를 그루핑한 뒤 집계함수를 돌린다.
그룹별로 하나의 집계 결과를 볼 수 있다.
중첩 그룹(여러 컬럼)을 사용할 수 있다.SELECT Team, Position, count(*) FROM mlb_players GROUP BY Team, Position
각 팀의 포지션 별 인원을 알 수 있다.
SELECT Team, Position, count(*), avg("Height(inches)") FROM mlb_players GROUP BY Team, Position
각 팀 별 포지션 별 평균 신장을 알 수 있다.
GROUP BY부터 SQL의 매력을 느낄 수 있다.
대신 어려워진다.WHERE
WHERE와 같이 사용해 보자.
'키가 72인치를 넘는' 선수들의 포지션과 숫자를 알아보자.
SELECT Position, count(*) FROM mlb_players WHERE "Height(inches)">72 -- GROUP BY Position
별 생각없이 쿼리를 작성하다 보면 이런 게 나올 수도 있다.
GROUP BY가 필요하다.* 포지션의 Catcher는 가장 위에 있었던 선수의 그것일 뿐이다.
이런 결과를 원했을 테니 말이다.
순서를 잘 기억해야 하는데, WHERE는 GROUP BY 전에 작동한다.
즉 전체 ROW 중에
72인치 보다 큰 선수들의 ROW만 모아서
GROUP BY에 보내주는 것이다.HAVING
HAVING은 GROUP BY 이후에 작동한다. 위의 예에서 GROUP BY 후 COUNT가 40 이상인 것들을 골라보자.
SELECT Position, count(*) FROM mlb_players WHERE "Height(inches)">72 GROUP BY Position HAVING count(*)>=40
AS 를 사용할 수도 있다.
ORDER BY와 GROUP BY
시각적으로는 비슷하지만 집계함수를 쓰려면 GROUP BY 절을 써야한다.
SELECT문의 순서
SELECT Position, count(*) as CNT FROM mlb_players WHERE "Height(inches)">72 GROUP BY Position HAVING CNT>=40 ORDER BY Position
반응형