실행 select count(*) from table_name
하면 행 수를 반환합니다.
무엇을 count(1)
합니까? 여기서 무엇을 1
의미합니까? 이것은 count(*)
(실행시 동일한 결과를 제공하기 때문에) 동일합니까?
답변:
COUNT 함수에 대한 매개 변수는 각 행에 대해 평가되는 표현식입니다. COUNT 함수는 표현식이 널이 아닌 값으로 평가되는 행 수를 리턴합니다. (*는 평가되지 않는 특수 표현식이며 단순히 행 수를 반환합니다.)
표현식에는 ALL 및 DISTINCT의 두 가지 추가 수정자가 있습니다. 중복 항목을 삭제할지 여부를 결정합니다. ALL이 기본값이므로 예제는 count (ALL 1)과 동일하므로 중복이 유지됩니다.
표현식 "1"은 모든 행에 대해 널이 아닌 것으로 평가되고 중복을 제거하지 않기 때문에 COUNT (1)은 항상 COUNT (*)와 동일한 숫자를 리턴해야합니다.
다음은 귀하의 질문에 대한 답변을 제공 하는 링크 입니다. 요컨대 :
count (*)는 그것을 쓰는 올바른 방법이고 count (1)은 내부적으로 count (*)되도록 최적화되어 있습니다.
a) 1이 null이 아닌 행을 계산하는 것이 비효율적입니다
.b) 행을 계산합니다.
오라클에서 count (*)와 count (1)의 차이점은 무엇입니까?
count (*)는 모든 레코드, 즉 각각의 모든 셀을 계산하지만
count (1)은 값이 1 인 하나의 유사 열을 추가하고 모든 레코드의 개수를 반환 함을 의미합니다.
이것은 다음의 차이점과 유사합니다.
SELECT * FROM table_name and SELECT 1 FROM table_name.
만약 당신이
SELECT 1 FROM table_name
테이블의 각 행에 대해 숫자 1을 제공합니다. 예 그래서 count(*)
및 count(1)
의지와 동일한 결과를 제공 count(8)
하거나count(column_name)
다른 점이 없다.
COUNT(1)
기본적으로 각 행에 대해 상수 값 1 열을 계산합니다. 여기에 다른 사용자가 말했듯이 COUNT(0)
또는 과 동일합니다 COUNT(42)
. NULL
값이 아닌 모든 것으로 충분합니다.
http://asktom.oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789
오라클 옵티마이 저는 분명히 버그를 가지고 있었기 때문에 어떤 열을 선택했는지와 인덱스에 있는지 여부에 따라 카운트가 영향을 받았기 때문에 COUNT (1) 규칙이 생겼습니다.
오라클에서는 이것들이 정확히 같은 의미를 가지고 있다고 믿습니다.
다음과 같이 테스트 할 수 있습니다.
create table test1(
id number,
name varchar2(20)
);
insert into test1 values (1,'abc');
insert into test1 values (1,'abc');
select * from test1;
select count(*) from test1;
select count(1) from test1;
select count(ALL 1) from test1;
select count(DISTINCT 1) from test1;
질문하는 사람에 따라 일부 사람들은 실행 select count(1) from random_table;
이 select count(*) from random_table
. 다른 사람들은 그들이 똑같다고 주장합니다.
이 링크 는 2 개의 속도 차이가 FULL TABLE SCAN 대 FAST FULL SCAN 때문이라고 주장합니다.