카운트(*) vs. 카운트(1) vs. 카운트(pk): 어느 쪽이 좋은가?
다음과 같은 세 가지 종류가 있습니다.
SELECT COUNT(*) FROM Foo;
SELECT COUNT(1) FROM Foo;
SELECT COUNT(PrimaryKey) FROM Foo;
내가 볼 때, 그들은 모두 같은 일을 하고 있고, 나는 코드베이스에 세 가지를 사용하고 있다.하지만, 나는 같은 일을 다른 방식으로 하는 것을 좋아하지 않는다.어느 쪽에 붙으면 좋을까요?그들 중 한 명이 다른 두 명보다 나은가요?
결산
중 하나를 합니다.COUNT(field) ★★★★★★★★★★★★★★★★★」COUNT(*)에서 허용하고 있는 , 계속 사용할 수 있습니다.COUNT(tableHere) ★★★★★★★★★★★★★★★★★」COUNT(tableHere.*)그것을 사용해라.
로 말하면, 「아까운 사람」은 하지 말아 .COUNT(1)무슨 일이 있어도. 포니로, 경우는 , 는 ' 포니'에합니다. 그리고 드문 경우엔count(*)
count(*) 위해서
*것을 쿼리에 에도, 「」, 「」를 사용합니다.*
SELECT boss.boss_id, COUNT(subordinate.*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
지만사 but but but but but but는 하지 마세요.COUNT(*)Join의 이 부모 LEFT Join의 않는 됩니다.
SELECT boss.boss_id, COUNT(*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
말을 할 때, 이런 *행 , 이 행은 테이블에서 .*느리다.그*SELECT COUNT(*) ★★★★★★★★★★★★★★★★★」SELECT * 전혀 하고 있을 이치노*.
대체 구문
할 수 경우 RDBMS 언어디자이너는 을 RDBMS로 지정할 수 .COUNT(tableNameHere)의 와 같은 것COUNT(*) §:
행 수를 세는 경우 다음과 같이 할 수 있습니다.
SELECT COUNT(emp) FROM emp
또, 보다 심플하게 할 수 있습니다.
SELECT COUNT() FROM emp
LEFT JOIN의 경우 다음과 같이 할 수 있습니다.
SELECT boss.boss_id, COUNT(subordinate)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
그들은 할 수 .COUNT(tableNameHere)SQL 표준에서는 테이블 이름과 동일한 이름으로 필드에 이름을 지정할 수 있습니다.
CREATE TABLE fruit -- ORM-friendly name
(
fruit_id int NOT NULL,
fruit varchar(50), /* same name as table name,
and let's say, someone forgot to put NOT NULL */
shape varchar(50) NOT NULL,
color varchar(50) NOT NULL
)
null로 카운트
또한 필드 이름이 테이블 이름과 일치하는 경우 필드를 null로 만드는 것은 좋은 방법이 아닙니다. ''NULL ' on '바나나', '애플', 'NULL', '' 값이 .fruit모든 행이 되는 것은 4 행이 3됩니다. 모든 행이 카운트되는 것이 아니라 4가 아닌 3만 출력됩니다.
SELECT count(fruit) FROM fruit
RDBMS에서는 COUNT의을만, RDBMS가 경우)에서합니다.subordinate필드 이름과 테이블 이름 사이에 이름 경합이 없는 한 아래 두 테이블 중 하나의 필드:
SELECT boss.boss_id, COUNT(subordinate)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
수 요.subordinate테이블 행이 아닌 필드(늘 수 있음)를 카운트하기 때문에 테이블 내의 필드입니다.
따라서 안전을 위해 다음을 사용하십시오.
SELECT boss.boss_id, COUNT(subordinate.*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
count(1) 포니 : ★★★★★★★★★★★★★★★★★★★★★★」
, 「」에 대해서.COUNT(1)원트릭 포니로, 1개의 테이블 쿼리만으로 동작합니다.
SELECT COUNT(1) FROM tbl
단, Join을 사용할 경우 이 트릭은 의미를 혼동하지 않으면 멀티테이블 쿼리에서 작동하지 않으며 특히 다음과 같이 쓸 수 없습니다.
-- count the subordinates that belongs to boss
SELECT boss.boss_id, COUNT(subordinate.1)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
여기서 카운트(1)의 의미는 무엇입니까?
SELECT boss.boss_id, COUNT(1)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
이거...?
-- counting all the subordinates only
SELECT boss.boss_id, COUNT(subordinate.boss_id)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
아니면 이건...?
-- or is that COUNT(1) will also count 1 for boss regardless if boss has a subordinate
SELECT boss.boss_id, COUNT(*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
생각해 보면, 그 이유는, 「이렇게 하다」라고할 수 .COUNT(1) is is is is is와 COUNT(*)(왼쪽 ) 조인의 결과에 는 금형을 할 수 .왼쪽 조인은 금형을 할 수 없습니다.COUNT(1)COUNT(subordinate.boss_id),COUNT(subordinate.*)
다음 중 하나를 사용합니다.
-- count the subordinates that belongs to boss
SELECT boss.boss_id, COUNT(subordinate.boss_id)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
Postgresql에서 동작합니다.세트의 카디널리티를 카운트하고 싶은 것은 확실합니다.
-- count the subordinates that belongs to boss
SELECT boss.boss_id, COUNT(subordinate.*)
FROM boss
LEFT JOIN subordinate on subordinate.boss_id = boss.boss_id
GROUP BY boss.id
세트의 카디널리티를 계산하는 다른 방법으로는 매우 영어다운 (테이블 이름과 같은 이름의 컬럼은 만들지 마십시오) http://www.sqlfiddle.com/ #!1/98515/7
select boss.boss_name, count(subordinate)
from boss
left join subordinate on subordinate.boss_code = boss.boss_code
group by boss.boss_name
http://www.sqlfiddle.com/ #!1/98515/8 이 조작은 할 수 없습니다.
select boss.boss_name, count(subordinate.1)
from boss
left join subordinate on subordinate.boss_code = boss.boss_code
group by boss.boss_name
이렇게 할 수 있지만 잘못된 결과가 나타납니다.http://www.sqlfiddle.com/ # ! 1 / 98515 / 9
select boss.boss_name, count(1)
from boss
left join subordinate on subordinate.boss_code = boss.boss_code
group by boss.boss_name
그 중 2개는 항상 같은 답을 제시합니다.
COUNT(*)를COUNT(1)합니다.
요.pk할 수 NULL을 사용할 수 없습니다.
COUNT(pk)합니다.
「」의 경우는, 「」입니다.pk늘이 . 즉, is늘 、 is is 、 is is 、 : is:::: 。그러면 다른 응답이 생성됩니다.
COUNT(possibly_null)는 열에서 를 카운트합니다.possibly_null.COUNT(DISTINCT pk)는 행의 수도 카운트합니다(프라이머리 키는 중복을 허용하지 않기 때문입니다).COUNT(DISTINCT possibly_null_or_dup)는 컬럼에 를 카운트합니다.possibly_null_or_dup.COUNT(DISTINCT possibly_duplicated)、 [ - - no - needs - non - no - new - no - new - no - new - no - new - no - new - - newable ) ]합니다.possibly_duplicated「」가 경우NOT NULL항이있있 있있있다다
보통 이렇게 .COUNT(*)입니다.; SQL의 경우 권장 표기법입니다. 「 」의 경우에도,EXISTS 저는 ,, 는, 나, 나다 라고 씁니다.WHERE EXISTS(SELECT * FROM ...)「 「 」의 「 」의 「 」의 「 」에서는는, 를 간파할 .하다최적화자는 보다 불명확한 표기를 간파해야 합니다.
온라인 책에는 이렇게 적혀 있다.COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } )
'1'과 표현입니다.COUNT(*)낙관론자는 사소한 것으로 인식하여 동일한 계획을 제시합니다.PK는 고유하고 null이 아닌 (적어도 SQL Server에서) 존재하기 때문에COUNT(PK)= = 카카)) )))))
입니다.EXISTS (SELECT * ... ★★★★★★★★★★★★★★★★★」EXISTS (SELECT 1 ...
ANSI 92 사양, 섹션 6.5, General Rules, Case 1을 참조하십시오.
a) If COUNT(*) is specified, then the result is the cardinality
of T.
b) Otherwise, let TX be the single-column table that is the
result of applying the <value expression> to each row of T
and eliminating null values. If one or more null values are
eliminated, then a completion condition is raised: warning-
null value eliminated in set function.
적어도 Oracle에서는 모두 동일합니다.http://www.oracledba.co.uk/tips/count_speed.htm
DBMS마다 성능 특성이 달라지는 것을 느낄 수 있습니다.모든 것은 그들이 그것을 어떻게 구현하느냐에 달려있다.저는 Oracle에 대해 폭넓게 연구해 왔기 때문에 그 관점에서 판단하겠습니다.
COUNT(*)- 함수에 에 행 null은 null로 합니다.
COUNT(1)각에 대해 값 대신 테이블 내의 각 행에 대해 1의 상수 값으로 카운트가 호출됩니다.WHERE치합니니다다
COUNT(PK)가 작성되어 있습니다.- Oracle의 PK입니다..일반적으로 인덱스 B+ 트리의 한 행은 실제 행보다 몇 배 작습니다.따라서 Disk IOPS 속도를 고려할 때 Oracle은 단일 블록 전송으로 Index에서 전체 행에 비해 몇 배 더 많은 행을 가져올 수 있습니다.스루풋
이를 통해 Oracle에서 첫 번째 카운트가 가장 느리고 마지막 카운트가 가장 빠르다는 것을 알 수 있습니다.
언급URL : https://stackoverflow.com/questions/2710621/count-vs-count1-vs-countpk-which-is-better
'codememo' 카테고리의 다른 글
| 오리진 마스터 분기의 파일 버전으로 되돌리는 방법 (0) | 2023.04.13 |
|---|---|
| Visual Studio에서 "사용하지 않은" 컴파일러 경고를 제거하려면 어떻게 해야 합니까? (0) | 2023.04.13 |
| 종속성 속성 SetValue()와 SetCurrentValue()의 차이점은 무엇입니까? (0) | 2023.04.13 |
| 클러스터된 인덱스와 비클러스터된 인덱스의 차이점은 무엇입니까? (0) | 2023.04.08 |
| 스크롤 막대를 숨길 수 있지만 스크롤할 수 있음 (0) | 2023.04.08 |