source

SQL에서 count(열)와 count(*)의 차이점은 무엇입니까?

lovecheck 2023. 9. 4. 20:25
반응형

SQL에서 count(열)와 count(*)의 차이점은 무엇입니까?

다음과 같은 질문이 있습니다.

select column_name, count(column_name)
from table
group by column_name
having count(column_name) > 1;

모든 전화를 대체하면 무엇이 달라질까요?count(column_name)로.count(*)?

이 질문은 Oracle의 테이블에서 중복된 값을 찾으려면 어떻게 해야 합니까?에서 영감을 받았습니다.


승인된 답변(및 내 질문)을 명확히 하기 위해, 대체count(column_name)와 함께count(*)다음을 포함하는 결과에서 추가 행을 반환합니다.null그리고 의 수null열에 값을 입력합니다.

count(*)카운트 NULL 및count(column)하지 않다

[edit] 사람들이 실행할 수 있도록 이 코드를 추가했습니다.

create table #bla(id int,id2 int)
insert #bla values(null,null)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,1)
insert #bla values(1,null)
insert #bla values(null,null)

select count(*),count(id),count(id2)
from #bla

결과 7 3 2

*를 사용하는 것과 특정 열을 사용하는 것 사이의 또 다른 사소한 차이점은 열의 경우 DISTINCT 키워드를 추가하고 카운트를 고유한 값으로 제한할 수 있다는 것입니다.

select column_a, count(distinct column_b)
from table
group by column_a
having count(distinct column_b) > 1;

또한 일부 데이터베이스 구현에서는 실제 데이터 행이 아닌 해당 테이블의 인덱스를 보고 카운트(*)를 계산합니다.특정 열이 지정되지 않았기 때문에 실제 행과 해당 값을 고려할 필요가 없습니다(특정 열을 세었을 때처럼).데이터베이스가 인덱스 데이터를 사용하도록 허용하는 것이 "실제" 행을 카운트하는 것보다 훨씬 빠를 수 있습니다.

설명서의 설명은 이를 설명하는 데 도움이 됩니다.

COUNT(*)는 NULL 값 및 중복 항목을 포함하여 그룹의 항목 수를 반환합니다.

COUNT(식)는 그룹의 각 행에 대한 식을 평가하고 null이 아닌 값의 수를 반환합니다.

따라서 count(*)에는 null이 포함되지만 다른 방법에는 포함되지 않습니다.

스택 Exchange 데이터 탐색기를 사용하여 간단한 쿼리로 차이점을 설명할 수 있습니다.스택 오버플로의 데이터베이스에 있는 사용자 테이블에는 사용자의 웹 사이트 URL과 같이 종종 비어 있는 열이 있습니다.

-- count(column_name) vs. count(*)
-- Illustrates the difference between counting a column
-- that can hold null values, a  'not null' column, and  count(*)

select count(WebsiteUrl), count(Id), count(*) from Users

데이터 탐색기에서 위의 쿼리를 실행하면 다음 항목에 대한 카운트가 동일하다는 것을 알 수 있습니다.count(Id)그리고.count(*)왜냐하면Id열에서 허용되지 않음null가치관.WebsiteUrl하지만 카운트는 훨씬 더 낮습니다. 왜냐하면 그 열이 허용하기 때문입니다.null.

  • COUNT(*) 문장은 NULL을 포함하여 테이블의 모든 행을 반환하는 SQL Server를 나타냅니다.
  • COUNT(columnn_name)는 행에 값이 없는 행만 검색합니다.

테스트 실행 SQL Server 2008은 다음 코드를 참조하십시오.

-- Variable table
DECLARE @Table TABLE
(
      CustomerId int NULL 
    , Name nvarchar(50) NULL
)

-- Insert some records for tests
INSERT INTO @Table VALUES( NULL, 'Pedro')
INSERT INTO @Table VALUES( 1, 'Juan')
INSERT INTO @Table VALUES( 2, 'Pablo')
INSERT INTO @Table VALUES( 3, 'Marcelo')
INSERT INTO @Table VALUES( NULL, 'Leonardo')
INSERT INTO @Table VALUES( 4, 'Ignacio')

-- Get all the collumns by indicating *
SELECT  COUNT(*) AS 'AllRowsCount'
FROM    @Table

-- Get only content columns ( exluce NULLs )
SELECT  COUNT(CustomerId) AS 'OnlyNotNullCounts'
FROM    @Table

COUNT(*)테이블의 총 레코드 수를 반환합니다(NULL 값 레코드 포함).

COUNT(Column Name)NULL이 아닌 레코드의 총 수를 반환합니다. 값 를 계산하는 은 무시됩니다.", "NULL"은 NULL을 의미합니다.

으로 기적으로본.COUNT(*)함수는 테이블의 모든 행을 반환하는 반면COUNT(COLUMN_NAME)그렇지 않습니다. 즉, 여기에 있는 모든 사용자가 여기서 응답한 null 값을 제외합니다.그러나 가장 흥미로운 부분은 쿼리를 만들고 데이터베이스를 최적화하여 사용하는 것이 더 낫습니다.COUNT(*)다중 카운트 또는 복잡한 쿼리를 수행하지 않는 한COUNT(COLUMN_NAME)그렇지 않으면 엄청난 양의 데이터를 처리하는 동안 DB 성능이 저하됩니다.

@SQL Meanance와 @Brannon이 제공한 답변에 대해 자세히 설명합니다.GROUP BYOP에 의해 언급되었지만 @SQLMenace에 의해 답변에 존재하지 않는 절

CREATE TABLE table1 ( 
id INT 
);
INSERT INTO table1 VALUES 
(1), 
(2), 
(NULL), 
(2), 
(NULL), 
(3), 
(1), 
(4), 
(NULL), 
(2);
SELECT * FROM table1;
+------+
| id   |
+------+
|    1 |
|    2 |
| NULL |
|    2 |
| NULL |
|    3 |
|    1 |
|    4 |
| NULL |
|    2 |
+------+
10 rows in set (0.00 sec)
SELECT id, COUNT(*) FROM table1 GROUP BY id;
+------+----------+
| id   | COUNT(*) |
+------+----------+
|    1 |        2 |
|    2 |        3 |
| NULL |        3 |
|    3 |        1 |
|    4 |        1 |
+------+----------+
5 rows in set (0.00 sec)

여기서,COUNT(*)에서는 각 합니다.id포하여를 NULL

SELECT id, COUNT(id) FROM table1 GROUP BY id;
+------+-----------+
| id   | COUNT(id) |
+------+-----------+
|    1 |         2 |
|    2 |         3 |
| NULL |         0 |
|    3 |         1 |
|    4 |         1 |
+------+-----------+
5 rows in set (0.00 sec)

여기서,COUNT(id)에서는 각 합니다.id 발생 .NULL

SELECT id, COUNT(DISTINCT id) FROM table1 GROUP BY id;
+------+--------------------+
| id   | COUNT(DISTINCT id) |
+------+--------------------+
| NULL |                  0 |
|    1 |                  1 |
|    2 |                  1 |
|    3 |                  1 |
|    4 |                  1 |
+------+--------------------+
5 rows in set (0.00 sec)

여기서,COUNT(DISTINCT id)에서는 각 합니다.id만 (), NULL

사용하는 것이 가장 좋습니다.

Count(1) in place of column name or * 

테이블에 있는 행의 수를 계산하는 경우, 테이블에 열 이름이 있는지 여부를 확인하지 않기 때문에 어떤 형식보다 빠릅니다.

테이블에 하나의 열이 고정되어 있는 경우와 둘 이상의 열을 사용하려는 경우에는 카운트할 열 수 있는 열 수를 지정해야 하는 경우와 차이가 없습니다.

감사해요.

답변에서 했듯이, 이전답변언바와같이급한서에,같▁as이와바,▁mentioned,Count(*)더 중요하게 여기다NULL에 열, 면count(Columnname)열에 값이 있는 경우에만 카운트됩니다.

항상 피하는 것이 최선의 방법입니다.*(Select *,count *, …)

언급URL : https://stackoverflow.com/questions/59294/in-sql-whats-the-difference-between-countcolumn-and-count

반응형