문법
COUNT (*)
COUNT (DISTINCT | ALL ] expr )
return [NUMBER]
파라미터
expr 어떤 식 열 이름
리턴
그룹의 레코드 건수 행수를 돌려 보낸다.
조건
SQL에서만 사용 가능. (PL/SQL 등)
내용
COUNT 함수에 별표 (*)를 사용하면 그룹의 모든 레코드 수를 돌린다.
식 또는 열 이름을 지정하면 해당식이 NULL 값 것들을 카운트에 포함하지 않는다.
또한 DISTINCT를 지정하면 중복 된 값의 행을 계산에 포함하지 않는다.
많은 경우 GROUP BY 절 을 사용하지 않고 전체 행수를 취득하는 경우가 많은데, 그룹 단위의 행수를 구하는 것도 가능하다.
COUNT의 특징적인 사용 방법은 그룹화 된 그룹 수를 결정하는데 COUNT (COUNT (*))과 중첩하여 사용할 수도 있다.
주의
COUNT 함수 식을 지정했을 경우, 식의 값이 NULL 값 의 경우 "정의되지 않음"을 나타낸다.
"정의되지 않음"은 존재하지 않는 것으로 다루어진다.
그러나 COUNT 함수는 NULL을 건수에 포함하는 데 특별한 별표 (*)를 사용하는 구문이 준비되어 있으며
NULL을 포함하여 행수를 취득 할 수 있다.
데이터가 한 건도없는 경우는 레코드가 선택되지 않았습니다 대신 0을 되돌린다.
그러나 group by 병용 및 분석 함수 COUNT의 경우 결과는 0이 아닌 레코드가 선택되지 않았습니다 이다.
예시
name | dept | salary |
A | 관리부 | 300,000 |
B | 관리부 | 400,000 |
C | 개발부 | 500,000 |
D | 개발부 | 500,000 |
E | 개발부 | 200,000 |
F | 개발부 | NULL |
COUNT (*)와 COUNT ( expr )와 COUNT ( DISTINCT expr )의 차이.
SQL> select COUNT (*), COUNT (salary), COUNT ( distinct salary)
2 from count_sample;
COUNT (*) COUNT (SALARY) COUNT (DISTINCTSALARY)
---------- ------------- --------------- ------
6 5 4
name | dept | salary | COUNT (*) | COUNT (salary) | COUNT(distinct salary) |
A | 관리부 | 300,000 | 1 | 1 | 1 |
B | 관리부 | 400,000 | 2 | 2 | 2 |
C | 개발부 | 500,000 | 3 | 3 | 3 |
D | 개발부 | 500,000 | 4 | 4 | |
E | 개발부 | 200,000 | 5 | 5 | 4 |
F | 개발부 | NULL | 6 | - | - |
결과 | - | - | 6 | 5 | 4 |
부문(dept) 별로 구하게 된다면 건수는
SQL> select dept, COUNT (*), COUNT (salary) from count_sample group by dept;
DEPT COUNT (*) COUNT (SALARY)
------------ ---------- -------------
관리부 2 2
개발부 4 3
식을 사용하여 NULL로 변환한 경우 : 급여가 500,000 의 것은 건수에 포함시키지 않는다.
(NULLIF 함수는 이러한 사용하지 않고, WHERE 조건으로 기술하는 방법이 맞다.)
SQL> select dept, COUNT ( nullif (salary 500000)), COUNT (null)
2 from count_sample group by dept;
DEPT COUNT ( NULLIF (SALARY 500000)) COUNT (NULL)
------------ ------------------------ ---- -----------
관리부 2 0
개발부 1 0
부문별로 급여가 200,000 이하의 수를 카운트하는 예시
select dept, COUNT (salary), count (*) from count_sample
where salary <= 200000 group by dept;
DEPT COUNT (SALARY) COUNT (*)
-------- ------------- ----------
개발부 1
부문별로 급여가 200,000 엔 이하의 수를 카운트하는 (그 2)
데이터로 존재하지 않지만 제조 부 라는 부서가 존재하는 경우에는 부서 목록 등의 외부 결합이 필요
select dept, COUNT (salary), count (salary2), count (*) from (
select dept,
case when salary> 200000 then null else salary end salary,
case when lnnvl (salary <= 200000) then null else salary end salary2
from count_sample
)
group by dept;
DEPT COUNT (SALARY) COUNT (SALARY2) COUNT (*)
-------- ------------- -------------- - --------
관리부 0 0 2
개발부 1 4
조건별로 계산하는 예제
select dept, trunc (salary / 1000), COUNT (salary)
from count_sample group by dept, trunc (salary / 1000)
order by dept, trunc (salary / 1000);
DEPT TRUNC (SALARY / 1000) COUNT (SALARY)
-------- ------------------ -------------
관리부 300 1
관리부 400 1
개발부 200 1
개발부 500 2
개발부 0
조건별로 계산 2 (COUNTIF 바람)
select dept,
COUNT ( case when salary> = 500000 then 'X' else null end) "> = 500K" ,
COUNT ( case when salary> = 400000 and salary <500000 then 'X' else null end) "400K" ,
COUNT ( case when salary> = 300000 and salary <400000 then 'X' else null end) "300K" ,
COUNT ( case when salary> = 200000 and salary <300000 then 'X' else null end) "200K" ,
COUNT ( case when salary> = 100000 and salary <200000 then 'X' else null end) "100K" ,
COUNT ( case when salary <100000 then 'X' else null end) "<100K" ,
COUNT ( case when salary is null then ' X ' else null end) "NULL"
from count_sample group by dept;
DEPT> = 500K 400K 300K 200K 100K <100K NULL
------ ------ ------ ------ ------ ------ ------ ------
관리부 0 1 1 0 0 0 0
개발부 2 0 0 1 0 0 1
카운트 함수의 계산 = COUNT (COUNT (*))
부문별로 구분하면 여러 그룹화되어 있는지 ... (관리부와 개발부의 2 그룹)
SQL> select COUNT ( COUNT (*)) from count_sample group by dept;
COUNT ( COUNT (*))
---------------
2