select count(*) from table_name
を実行すると、行数が返されます。
count(1)
は何をしますか?ここで_1
_は何を意味しますか?これはcount(*)
と同じですか(実行時に同じ結果が得られるため)?
COUNT関数のパラメーターは、行ごとに評価される式です。 COUNT関数は、式がNULL以外の値に評価される行の数を返します。 (*は評価されない特別な式で、単に行数を返します。)
式には、ALLとDISTINCTの2つの追加修飾子があります。これらは、重複を破棄するかどうかを決定します。 ALLがデフォルトであるため、例はcount(ALL 1)と同じです。つまり、重複が保持されます。
式 "1"はすべての行でnull以外と評価され、重複を削除しないため、COUNT(1)は常にCOUNT(*)と同じ数を返す必要があります。
リンク は、質問への回答に役立ちます。要するに:
count(*)はそれを書き込む正しい方法であり、count(1)は内部的にcount(*)になるように最適化されています
a)1がnullではない行をカウントするのは、
b)行を数える
Oracleのcount(*)とcount(1)の違いは?
count(*)は、すべてのレコード、つまりすべてのセルをカウントすることを意味しますが、
count(1)は、値1の疑似列を1つ追加し、すべてのレコードのカウントを返すことを意味します
これは次の違いに似ています
SELECT * FROM table_name and SELECT 1 FROM table_name.
もしあなたがそうするなら
SELECT 1 FROM table_name
テーブルの各行に番号1が与えられます。はい、count(*)
およびcount(1)
はcount(8)
またはcount(column_name)
と同じ結果を提供します
違いはありません。
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)規則が生まれました。
_SELECT COUNT(1) from <table name>
_
とまったく同じことをする必要があります
_SELECT COUNT(*) from <table name>
_
一部のデータベースでSELECT COUNT(*)
よりも優れたパフォーマンスを発揮する理由があったか、まだ残っている可能性がありますが、DBのバグと考えます。
_SELECT COUNT(col_name) from <table name>
_
ただし、指定された列の値がnull以外の行のみをカウントするため、意味は異なります。
oracleでは、これらはまったく同じ意味を持つと信じています
次のようにテストできます。
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;
誰に尋ねるかによって、select count(1) from random_table;
を実行するとselect count(*) from random_table
よりも速く実行されると報告する人もいます。他の人はまったく同じだと主張しています。
この リンク は、2つの速度の差が全表スキャンと高速全スキャンによるものであると主張しています。