데이터베이스 테이블에서 "select count (1) from table_name"은 무엇을 의미합니까?


93

실행 select count(*) from table_name하면 행 수를 반환합니다.

무엇을 count(1)합니까? 여기서 무엇을 1의미합니까? 이것은 count(*)(실행시 동일한 결과를 제공하기 때문에) 동일합니까?


1
흥미로운 질문입니다. 또한 대답이 구현에 따라 달라지는 지 여부 (예 : 쿼리 결과가 SQL Server에서 Oracle과 동일한 지 여부)에 관심이 있습니다.
Jon Schneider

답변:


107

COUNT 함수에 대한 매개 변수는 각 행에 대해 평가되는 표현식입니다. COUNT 함수는 표현식이 널이 아닌 값으로 평가되는 행 수를 리턴합니다. (*는 평가되지 않는 특수 표현식이며 단순히 행 수를 반환합니다.)

표현식에는 ALL 및 DISTINCT의 두 가지 추가 수정자가 있습니다. 중복 항목을 삭제할지 여부를 결정합니다. ALL이 기본값이므로 예제는 count (ALL 1)과 동일하므로 중복이 유지됩니다.

표현식 "1"은 모든 행에 대해 널이 아닌 것으로 평가되고 중복을 제거하지 않기 때문에 COUNT (1)은 항상 COUNT (*)와 동일한 숫자를 리턴해야합니다.


table1에서 DISTINCT coloumn1을 선택하십시오! = table1에서 count (DISTINCT coloumn1)를 선택하십시오.
Kanagavelu Sugumar 2013

또한 count (1) 여기서 1은 coloumn no가 아니라 표현식입니다. 예) table1에서 1을 선택합니다. 테이블에 행이없는 경우 1 번 인쇄하지 않습니다.
Kanagavelu Sugumar 2013

table1에서 count (DISTINCT / ALL columnName)를 선택하십시오. 열 (columnName)의 모든 / 고유 NOT NULL 값을 반환하지 않습니다.
Kanagavelu Sugumar 2013

table1에서 DISTINCT column1을 선택하십시오. 열 (column1)에 하나의 NULL 값이 포함됩니다. table1에서 count (DISTINCT coloumn1)를 선택합니다. 하나의 NULL 행도 포함하지 않습니다.
Kanagavelu Sugumar 2013

1
@datps-실제로 동일한 결과를 제공하는 표현식이 무제한입니다. COUNT ( 'Hello, world!')도 잘 작동합니다. (나는 그것을 시도하지 않았습니다.) 그래서 질문은, 같은 일을 할 수있는 방법이 이미 무제한인데 왜 특별한 표현 (*)을 만드나요? 나는 SQL의 창시자들 (:)에 대해 속죄해야 할 많은 죄를 가지고 있다고 말할 수는 없지만, 아마도 사람들이 null이 아닌 표현을 임의로 선택할 필요가 없었을 것입니다. 그것은 쿼리 작성자의 의도를 흐트러 뜨렸을 것입니다. "왜 그들은 2 대신 1을 썼는가? 이것은 뭔가 의미가있을 것입니다!"
Jeffrey L Whitledge

26

다음은 귀하의 질문에 대한 답변을 제공 하는 링크 입니다. 요컨대 :

count (*)는 그것을 쓰는 올바른 방법이고 count (1)은 내부적으로 count (*)되도록 최적화되어 있습니다.

a) 1이 null이 아닌 행을 계산하는 것이 비효율적입니다
.b) 행을 계산합니다.


17

오라클에서 count (*)와 count (1)의 차이점은 무엇입니까?

count (*)는 모든 레코드, 즉 각각의 모든 셀을 계산하지만

count (1)은 값이 1 인 하나의 유사 열을 추가하고 모든 레코드의 개수를 반환 함을 의미합니다.


9

이것은 다음의 차이점과 유사합니다.

SELECT * FROM table_name and SELECT 1 FROM table_name.  

만약 당신이

SELECT 1 FROM table_name

테이블의 각 행에 대해 숫자 1을 제공합니다. 예 그래서 count(*)count(1)의지와 동일한 결과를 제공 count(8)하거나count(column_name)


3
count (column_name)은 그다지 동일하지 않습니다. 해당 열에 null이있는 행을 계산하지 않습니다. 자세한 내용은 여기를 참조하십시오 : stackoverflow.com/questions/169784
Blorgbeard는

음, 실제로 SQL Server 용입니다. Oracle은 내가 생각하는 것과 다르게 작동 할 수 있습니다.
Blorgbeard는

Count는 표준 SQL에 따라 NULL 값을 사용해서는 안되며, ORacle 및 SQL Server는 이와 관련하여 동일한 동작을 가져야합니다.
Thorsten

"SELECT * FROM table_name과 SELECT 1 FROM table_name의 차이점과 유사합니다." -별로. SELECT *와 SELECT 1은 다릅니다. SELECT (*)와 SELECT (1)는 동일한 결과를 제공합니다.
David Aldridge

7

다른 점이 없다.

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) 규칙이 생겼습니다.


5
SELECT COUNT(1) from <table name>

다음과 똑같은 일을해야합니다.

SELECT COUNT(*)  from <table name>

SELECT COUNT(*)일부 데이터베이스 보다 더 나은 성능 을 발휘할 수있는 몇 가지 이유가있을 수 있지만 DB의 버그라고 생각합니다.

SELECT COUNT(col_name) from <table name>

그러나 주어진 열에 대해 널이 아닌 값을 가진 행만 계산하므로 다른 의미를 갖습니다.


3

오라클에서는 이것들이 정확히 같은 의미를 가지고 있다고 믿습니다.


1이 열 1을 참조합니까?
dacracot

1
아니오, 1은 상수 1을 나타냅니다. ORDER BY 1이라고하면 열 1을 나타냅니다.
Thilo

그게 제가 얼마 전에 궁금했던 것입니다.하지만 열 수보다 큰 숫자를 지정할 수 있지만 결과는 동일합니다. 따라서 확실히 열 번호가 아닙니다.
Nrj

@dacracot : 그럴 수도 있지만 그렇게 믿지 않습니다. 내가 이해하는 것에서 오라클은 백그라운드에서 count (1)를 count (*)로 다시 작성합니다
Jarod Elliott

2

다음과 같이 테스트 할 수 있습니다.

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;

0

질문하는 사람에 따라 일부 사람들은 실행 select count(1) from random_table;select count(*) from random_table. 다른 사람들은 그들이 똑같다고 주장합니다.

링크 는 2 개의 속도 차이가 FULL TABLE SCAN 대 FAST FULL SCAN 때문이라고 주장합니다.


링크를 잘못 해석하고 있습니다. LS는 COUNT (COLUMN)이 COUNT (*)와 같고 빠를 수 있지만 NOT NULL 열이 인덱싱되지 않았지만 COLUMN이 인덱싱되고 실제로는 null 값이없는 경우에만 해당됩니다. 더 많은 속임수 질문.
David Aldridge

1
링크를 사용하여 일부 상황에서 COUNT (1)이 COUNT (*)보다 빠를 수 있다는 주장을 문서화하려고했습니다. 이전 답변 중 일부는 2 사이에 차이가 없다고 진술했으며 가능한 반대 사례를 제공했습니다.
Johann Zacharee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.