ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQLite 5. 집계함수와 GROUP BY
    SQL/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
    반응형
Designed by Tistory.