본문 바로가기

Data Literacy/SQL

Chapter 2. JOIN을 이용한 데이터 조합 - (7) 집계 함수 : COUNT 1

 

PostgreSQL logo image

 

 

이번 시간부터는 빠르게 집계함수에 대해서 배워보겠습니다. 사실 원래는 GROUP BY를 배워볼 차례인데요, GROUP BY라는 clause가 짧은 문장으로 그 개념을 설명하기 쉽지 않은 구절입니다. 그러다 보니 몇몇 강의나 설명에서 바로 예제부터 설명한다거나(이렇게 모아주는 편리한 기능이에요~), 단순히 "같은 것 끼리 집합을 만들어 모아주는 거예요~" 정도의 추상적인 설명을 하기도 합니다. 

 

GROUP BY라는 clause는, 결국 집계함수와 함께 사용해야 의미있는 쿼리가 됩니다. 결국 SQL의 집계 함수에 대해서 사전에 이해가 이루어지고, GROUP BY를 배워야 그 관념이 자연스럽게 익혀지게 되는 것이죠. 그리고 그 이후에 HAVING 같은 구문을 학습하게 되면 가장 자연스러운 이해를 진행할 수 있습니다. 만약 본인이 GROUP BY에서 개념 이해가 잘 되지 않는다면, SQL 개념을 배우는 순서가 잘못된 것입니다. 

 

우선 기본적인 집계함수부터 차근차근 살펴보겠습니다. 

 

 

 


 

 

우선 첫번째로 집계 함수(Aggregate Function)의 간단한 정의 먼저 살펴보겠습니다. 집계 함수는 일반 함수와는 다르기 때문에 '집계'라는 단어를 쓰는 것이겠죠? 자, SQL에서 [일반적인] 함수는 하나의 행(row)에 대해 하나의 결괏값을 리턴합니다. 그럼 집계 함수는 어떨까요? 

 

집계 함수라는 말에서 힌트를 얻을 수 있습니다. 복수의 행(row)에 대해서 하나의 결괏값을 리턴하는 함수를 의미하게 됩니다. 여기서 말하는 '복수의 행(row)' 또는 '집합'은 SQL에서 사용할 때 사실상 '특정 열(column)'을 가리키게 됩니다. 우리가 엑셀에서 특정 열을 드래그하거나 복수 선택을 하게 되면 해당 열에 대한 합계나 개수가 나오는 것을 생각해 주시면 됩니다. 

 

이러한 집계 함수에는 대표적으로 COUNT / SUM / AVG / MIN / MAX가 있습니다. 엑셀 정도만 다뤄봤어도 어떤 함수들인지 눈치가 오시죠? 하지만 여기서 중요한 것은 이 함수의 동작 자체가 아닙니다. SQL의 행렬 구조에서 어떻게 작용지가 중요합니다. 

 

 

 


 

 

 

○ COUNT : 행의 개수 구하기

 

COUNT 함수는, 인자로 전달된 집합행 개수를 계산해 주는 함수입니다. 기본적으로 COUNT(인자)의 형태로 사용하게 되며, SELECT 문에 전달해서 사용하게 됩니다. 

 

우선은 기본적인 사용법을 테스트 해보겠습니다. COUNT( ) 함수에 인자로 '*'를 넣어보고 결과를 살펴보겠습니다. 아래와 같이 dvdrental DB의 테이블을 하나 골라서 예제를 입력해 보겠습니다. 

 

select count(*)
  from actor;

 

 

 

대충 눈치 채셨겠지만 ACTOR 테이블에는 200명의 배우 정보가 담겨있었습니다. 여기서 특정 집합(열)을 지정하지 않고 *로 전체를 지정하여 COUNT 함수를 사용했습니다. 여기서 COUNT(*)는 "모든 열"을 의미하죠. 그래서 결국 "테이블 전체"를 의미하게 되었습니다. 결국 ACTOR라는 테이블에는 행이 몇 개 있는지를 계산해 200개를 산출한 것입니다.

 

만일 여기서 WHERE을 사용한다면 어떻게 될까요? 이 원칙은 기억해 두세요. SELECT는 WHERE보다 나중에 처리됩니다. 만약에 위의 ACTOR 테이블에서 WHERE을 사용해 특정 규칙으로 검색한다면, 그 검색 결과를 COUNT 하게 됩니다. 아래 예시를 보겠습니다. 

 

select count(*)
  from actor
 where last_name = 'Dee';

 

 

위와 같은 쿼리를 실행하면, COUNT 건수는 2개가 출력됩니다. 왜냐하면, 해당 테이블에 LAST_NAME이 'Dee'인 사람은 딱 두 명이었거든요. WHERE 조건으로 검색한 테이블 결괏값에서 COUNT 함수를 실행하고 그 결과를 리턴하는 것입니다. 실제로는 아래 테이블에서 COUNT(*)를 실행한 것입니다.