SQLでは、count(column)とcount(*)の違いは何ですか?


205

次のクエリがあります。

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(*)を含む追加の行が結果に返されます。nullnull

回答:


235

count(*)NULLをカウントし、count(column)しない

[編集]人々が実行できるようにこのコードを追加しました

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


8
すべてが NULLの行がある場合でも、count(*)はそれをカウントしますか、それともすべての列のcount(column)だけですか?
Joel Coehoorn

7
これはDBMS全体の標準ですか?
Eclipse、

51
IDなどのnullを許容しない列がある場合、count(ID)を使用すると、count(*)よりもパフォーマンスが大幅に向上することに注意してください。
tsilb 2009

12
@tsilb:@Alanによって投稿された回答は、「count(*)は、実際のデータ行ではなく、問題のテーブルのインデックスを調べることによって計算される」と述べており、trueの場合、コメントは無効になります。@Alanが間違っている可能性があることに感謝しますが、どちらが正しいかを調べるために、情報源に興味があります。
Tony

12
@tsilb:多くの最新のクエリオプティマイザーは、必要に応じてcount(*)を最適化してインデックスを使用します。
Shannon Severance 2010

37

*と特定の列の使用のもう1つの小さな違いは、列の場合、キーワードDISTINCTを追加して、カウントを個別の値に制限できることです。

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

1
列ごとのグループとカウントされるグループは異なる必要がありますか?そうしないと、このクエリから何も得られません
steevc

はい、申し訳ありません。例で同じ列になっていることに気づきませんでした。投稿を更新します。
ブラノン

16

さらに、おそらく微妙な違いは、一部のデータベース実装では、実際のデータ行ではなく、問題のテーブルのインデックスを参照することでcount(*)が計算されることです。特定の列が指定されていないため、実際の行とその値を気にする必要はありません(特定の列を数えた場合のように)。データベースがインデックスデータを使用できるようにすると、「実際の」行を数えるよりも大幅に高速化できます。


5
+1はい、確かにOracleと9.2以降のPostgreSQLに当てはまります。
David Aldridge 2013

@DavidAldridgeこれが言及されているドキュメント(特にpostgresql)へのポインタを提供できますか?ありがとう。
ブーシャン


10

docsの説明は、これを説明するのに役立ちます:

COUNT(*)は、NULL値や重複を含む、グループ内のアイテムの数を返します。

COUNT(式)は、グループの各行の式を評価し、null以外の値の数を返します。

したがって、count(*)にはnullが含まれますが、他のメソッドには含まれません。


SQL newbsの場合:どのヘルプファイルを参照していますか?
リザードに請求する

10

Stack Exchange Data Explorerを使用して、簡単なクエリとの違いを説明できます。Stack OverflowのデータベースのUsersテーブルには、ユーザーのウェブサイトの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


2

基本的に、このCOUNT(*)関数はテーブルからすべての行を返しますが、COUNT(COLUMN_NAME)そうではありません。つまり、ここで誰もがここで回答したnull値は除外されます。しかし、最も興味深い部分は、クエリとデータベースを最適化することです。COUNT(*)複数のカウントまたは複雑なクエリを実行する場合を除いて、使用する方が適切ですCOUNT(COLUMN_NAME)。そうしないと、膨大な数のデータを処理している間、DBのパフォーマンスが実際に低下します。


1
  • COUNT(*)文は、SQL ServerがNULLを含むテーブルからすべての行を返すことを示しています。
  • COUNT(column_name)は、行にnull以外の値を持つ行を取得するだけです。

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

1

COUNT(*) –テーブル内のレコードの総数を返します(NULL値のレコードを含む)。

COUNT(Column Name) – NULL以外のレコードの総数を返します。つまり、その特定の列のNULL値のレコードのカウントは無視されます。


0

使うのが一番

Count(1) in place of column name or * 

テーブル内の行数をカウントする場合、テーブルに列名が存在するかどうかを確認することはないため、どのフォーマットよりも高速です。


4
少なくともOracleでは正しくありません。他のRDBMSについても同様です。内部的にcount(1)はcount(*)に変換されます。特に、count(*)のパフォーマンスは、一般的な誤解である行のサイズによって悪影響を受けません。
David Aldridge 2013

これはSQL Serverにも当てはまります。@Ali Adraviが言ったように、COUNT(*)と比較するCOUNT(columnName)と、列を列挙するだけなので、列の値をチェックしません。しかし、カラムに適用されCOUNT(columnName)ても遅くなります!もちろん、少なくともSQL Serverでは。countid
ABS

0

テーブルで1つの列が修正されている場合でも、複数の列を使用したい場合でも、カウントする必要がある列の数を指定する必要がある場合と同じです。

おかげで、


0

以前の回答で述べたように、列Count(*)もカウントしますが、列に値がある場合にのみカウントします。NULLcount(Columnname)

それは、常に回避するためのベストプラクティスです*Select *count *...、)


避けることは決してベストプラクティスではありませんCOUNT(*)
David Faber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.