codememo

카운트(*) vs. 카운트(1) vs. 카운트(pk): 어느 쪽이 좋은가?

tipmemo 2023. 4. 13. 20:52
반응형

카운트(*) 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

반응형