본문 바로가기

Data Literacy/SQL

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

PostgreSQL logo image

 

 

앞서서 우리는 집계함수 COUNT( )에 대한 기본적인 사용법을 알아보았습니다. 다시 한번 되짚어보자면, COUNT의 파라미터에는 인수로 특정 테이블의 열 이름을 전달할 수 있습니다. 이렇게 열 이름을 지정하게 되면, 해당 열에 한해 행의 개수를 카운트하게 됩니다. 그리고 '*'를 인자 값으로 전달할 수 있는 함수는 COUNT( ) 함수가 유일합니다. 

 

그럼, COUNT( ) 함수로 특정 열의 개수를 셀 때, NULL은 어떻게 처리할까요? 일단 행이 있긴 있으니 카운트에 포함하지 않을까요? 한번 직접 알아보도록 하겠습니다. 

 

우선 dvdrental DB의 ADDRESS 테이블을 살펴보도록 하겠습니다. 전체 데이터를 살펴보고, ADDRESS2 칼럼에 NULL이 몇 개나 있을지 확인해 보겠습니다. 

 

select *
  from address a;
  
select *
  from address a
 where address2 isnull;

 

위와같이 확인해 보면, 전체 데이터 중 ADDRESS2 칼럼에 NULL이 포함된 데이터는 총 4개 임을 알 수 있습니다. 그럼 여기서 ADDRESS와 ADDRESS2 칼럼을 각각 COUNT 하여 출력해 보겠습니다. 

 

select count(address) as address_count 
       , count(address2) as address2_count
  from address a;

 

 

위의 결과를 살펴보면, ADDRESS2를 COUNT로 집계 했을 때 NULL이 포함된 데이터 개수 4개가 제외되어 카운트된 것을 확인할 수 있습니다. 여기서 알 수 있듯이, 집계함수는 집합(칼럼) 안에 NULL이 있으면 집계에서 무시한다는 점을 기억해야 합니다. 단, COUNT(*)를 사용할 경우에는 모든 칼럼을 대상으로 하기 때문에 603개가 나오겠죠?

 

 

 


 

 

○ 집계함수에서 DISTINCT 사용하기

 

우리는 초반에 DISTINCT에 대해서 살펴본 적이 있습니다. SELECT에서 사용해 '중복된 데이터를 제거하고 출력하는' 기능으로 사용한다고 배웠죠? 우선 DISTINCT 사용법을 다시 상기하고 오시기 바랍니다.

 

 

Chapter 1. 데이터 조회, 필터링(3) - SELECT DISTINCT

이번 아티클에서는 SELECT DISTINCT 문을 배워보도록 하겠습니다. 지금까지 다룬 명령어에 비해서 살짝 난이도가 올라가는 부분이니, 꼼꼼하게 내용을 살펴보도록 하겠습니다. SELECT DISTINCT는 한마디

nozeroslope.tistory.com

 

그럼, 위에서 배운 집계함수 COUNT와 DISTINC를 조합하여 사용하는 경우에 대해서 알아보겠습니다. 우선, 이 케이스를 살펴보기 위해서 앞서 만들어보았던 T1 테이블을 다시 살펴보겠습니다. 

 

select *
  from t1 t;

 

 

총 12개의 행이 있고, BCOLOR / FCOLOR 열을 갖고 있습니다. 그리고 각각의 열이 1개씩 NULL을 갖고 있네요. 자, 이제 조건을 한번 상정해 보겠습니다. 

 

BCOLOR 열에서 NULL을 제외하고, 중복되지 않는 데이터의 개수를 카운트 할 것

 

일단, 위의 조건을 간단하게 생각해 보면 [SELECT DISTINCT COUNT(BCOLOR)]를 사용하면 되지 않을까, 생각이 들것입니다. 하지만 이 쿼리는 조건을 만족하지 못합니다. 왜일까요? 바로 COUNT(BCOLOR)가 먼저 수행되기 때문입니다. 더불어 WHERE을 사용하는 방법은 없을까요? 검색 조건을 지정하는 것 밖에 되지 않으므로, NULL을 제외하는 정도는 가능하지만 중복된 값을 체크하는 함수는 없습니다. 

 

방법은, 다음과 같이 집계함수의 인자로 DISTINCT를 사용한 수식을 전달하는 것입니다. 다음과 같이 작성해 봅시다. 

 

select count(all bcolor)
       , count(distinct bcolor)
  from t1;

 

 

결과는 위와 같이 11개, 3개가 출력됩니다. 일단 두 칼럼 모두 COUNT( )를 사용했기 때문에 집계함수에서의 원칙에 따라 NULL이 제외된 값이 카운트됩니다. 첫 번째 열의 경우 별다른 조건 없이 BCOLOR 열을 카운트했습니다. 참고로 ALL은 DISTINCT와 구분하기 위해 명시적으로 작성하였으며, 평소에 그냥 작성하면 디폴트로 ALL을 적용합니다. 

 

그리고 두 번째 열의 경우, COUNT( )를 사용했으므로 역시 NULL이 제외된 상태이며, 여기서 중복이 제거되어 RED, GREEN, BLUE만이 카운트되어 3이 출력되었습니다.