-
SQL COUNT 집계함수Database 2021. 3. 29. 13:18728x90
SQL은 데이터베이스라는 "데이터 집합"을 다루는 언어이다.
SQL은 이러한 집합을 다루는 다양한 집계함수를 제공한다.
COUNT(집합) SUM(집합) AVG(집합) MIN(집합) MAX(집합)
일반적인 함수는 인수로 하나의 값을 지정하지만, 집계함수는 인수로 집합을 지정한다.
집계 함수의 특징은 복수의 값(집합)에서 하나의 값을 계산해내는 것이다.
일반적인 함수는 하나의 행에 대하여 하나의 값을 반환하지만, 집계함수는 집합으로부터 하나의 값을 반환한다.
이처럼 집합으로부터 하나의 값을 계산하는 것을 집계라 부른다.
위와 같은 이유로 집계함수를 SELECT 구에 사용하면 WHERE 구 유/무와 관계없이 결괏값으로 하나의 행을 반환한다.
COUNT
SELECT COUNT FROM products; (X) SELECT COUNT(*) FROM products; (O) * -> 에스터리스크 모든열을 나타낼때 사용하는 메타문자
COUNT 인수로 지정된 집합(이 경우 테이블 전체) 68행의 결과로 68이라는 하나의 행으로 결괏값이 반환된다.
COUNT + WHERE
select * from products where is_in_stock=0;
이전에 살펴보았듯 WHERE 구의 처리 순서가 먼저이다.
따라서, WHERE 구를 지정하는 순간 테이블 전체가 아닌 WHERE 구로 검색된 행이 COUNT로 넘어가게 된다.
앞의 예제에서도 보았듯 검색된 행은 11개 였지만 결과는 하나의 행으로 반환되는 것을 볼 수 있다.
select count(*) from products where is_in_stock=1; select count(*) from products where is_in_stock=0;
COUNT 열명 지정하기
COUNT의 인수로 열명을 지정하여 그 열에 한해서 행의 개수를 구할 수 있다.
특히, *를 인수로 할 수 있는 집계함수는 COUNT 뿐이다.
select count(id), count(price) from products; select count(id), count(price), count(discount_id) from products;
discount_id 열은 왜 혼자여 0을 반환하고 있을까?
아래에서 알아보도록 하자.
집계함수에서의 NULL 값
SQL에서는 NULL값을 고려 해야하는데, 집계함수에서는 NULL값이 있을 경우 이를 제외하고 처리한다.
따라서 위 discount_id 결과가 0이 나온것이다. (discount_id는 모든 열의 값이 NULL 인상태이다.)
만약 discount_id 중 하나의 값만이 NULL이라면 67을 반환할 것이다.
집계함수에서는 집합 안의 NULL값이 있을 경우 무시한다는 점을 기억하자.
DISTINCT로 중복 제거하기
경우에 따라 집합안에 중복된 값이 있는지 여부를 판별하는 일은 빈번하다.
이때 SQL의 SELECT 명령은 중복된 값을 제거하는 키워드인 DISTINCT를 제공한다.
DISTINCT는 예약어이다.
아래에서 category_id 의 중복된 값을 제외해보도록 하자.
select all category_id from products; select distinct category_id from products;
all, distinct 중 어느것도 지정하지 않을 경우 중복값은 제거되지 않으며 생략은 all로 간주 한다.
COUNT + DISTINCT 함께 사용하기
열에서 NULL값을 제거하고 중복되지 않는 데이터의 갯수를 구해보자.
집계함수의 인수로 DISTINCT를 사용한 수식을 지정해주면 된다.
DISTINCT로 집합에서 중복을 제거한뒤 COUNT로 개수를 구하면 되는 것이다.
SELECT COUNT(ALL name), COUNT(DISTINCT name) FROM EXAMPLES;
이때 DISTINCT와 ALL은 인수가 아니므로 콤마를 붙이지 않는다.
만약 all name의 총 행의 갯수가 4라면 distinct name의 행의 갯수는 3이 될것이다. (NULL값 1개 존재한다고 가정)
select count(all discount_id), count(distinct discount_id) from products;
현재 discount_id 는 모두 NULL 값으로 꽉 채워진 상태로 아래와 같이 결과가 나오게 된다.
이유 -> 집계함수는 NULL값을 제외하고 처리하기 때문
출처 :
SQL 첫걸음/ 아사이 아츠시 지음/ 한빛미디어
728x90'Database' 카테고리의 다른 글
SQL 서브쿼리_1 (0) 2021.04.09 SQL GROUP BY (0) 2021.04.09 물리삭제와 논리삭제 (0) 2021.03.29 SQL UPDATE (데이터 갱신하기) (0) 2021.03.25 SQL DELETE(행 삭제하기) (2) 2021.03.25