web-dev-qa-db-ja.com

データベーステーブルの "select_count(1)from table_name"とはどういう意味ですか?

select count(*) from table_nameを実行すると、行数が返されます。

count(1)は何をしますか?ここで_1_は何を意味しますか?これはcount(*)と同じですか(実行時に同じ結果が得られるため)?

83
Nrj

COUNT関数のパラメーターは、行ごとに評価される式です。 COUNT関数は、式がNULL以外の値に評価される行の数を返します。 (*は評価されない特別な式で、単に行数を返します。)

式には、ALLとDISTINCTの2つの追加修飾子があります。これらは、重複を破棄するかどうかを決定します。 ALLがデフォルトであるため、例はcount(ALL 1)と同じです。つまり、重複が保持されます。

式 "1"はすべての行でnull以外と評価され、重複を削除しないため、COUNT(1)は常にCOUNT(*)と同じ数を返す必要があります。

99

リンク は、質問への回答に役立ちます。要するに:

count(*)はそれを書き込む正しい方法であり、count(1)は内部的にcount(*)になるように最適化されています

a)1がnullではない行をカウントするのは、
b)行を数える

26
Eddie Awad

Oracleのcount(*)とcount(1)の違いは?

count(*)は、すべてのレコード、つまりすべてのセルをカウントすることを意味しますが、

count(1)は、値1の疑似列を1つ追加し、すべてのレコードのカウントを返すことを意味します

17
rakesh

これは次の違いに似ています

SELECT * FROM table_name and SELECT 1 FROM table_name.  

もしあなたがそうするなら

SELECT 1 FROM table_name

テーブルの各行に番号1が与えられます。はい、count(*)およびcount(1)count(8)またはcount(column_name)と同じ結果を提供します

8
ChrisHDog

違いはありません。

COUNT(1)は、基本的に各行の定数値1列をカウントするだけです。ここで他のユーザーが言ったように、それはCOUNT(0)またはCOUNT(42)と同じです。 NULL以外の値で十分です。

http://asktom.Oracle.com/pls/asktom/f?p=100:11:2603224624843292::::P11_QUESTION_ID:1156151916789

Oracleオプティマイザーは明らかにバグを使用していたため、選択した列とインデックス内にあるかどうかによってカウントが影響を受けたため、COUNT(1)規則が生まれました。

6
Cade Roux
_SELECT COUNT(1) from <table name>
_

とまったく同じことをする必要があります

_SELECT COUNT(*)  from <table name>
_

一部のデータベースでSELECT COUNT(*)よりも優れたパフォーマンスを発揮する理由があったか、まだ残っている可能性がありますが、DBのバグと考えます。

_SELECT COUNT(col_name) from <table name>
_

ただし、指定された列の値がnull以外の行のみをカウントするため、意味は異なります。

5
Thilo

oracleでは、これらはまったく同じ意味を持つと信じています

2
Jarod Elliott

次のようにテストできます。

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;
2
Vikas Kumar

誰に尋ねるかによって、select count(1) from random_table;を実行するとselect count(*) from random_tableよりも速く実行されると報告する人もいます。他の人はまったく同じだと主張しています。

この リンク は、2つの速度の差が全表スキャンと高速全スキャンによるものであると主張しています。

0
Johann Zacharee