データベーステーブルの「select count(1)from table_name」はどういう意味ですか?


92

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

何をしcount(1)ますか?1ここで何を意味しますか?これはcount(*)(実行時に同じ結果を与えるので)同じですか?


1
興味深い質問です。答えが実装依存であるかどうかにも興味があります(たとえば、クエリの結果がSQL ServerでもOracleと同じかどうか)。
Jon Schneider、

回答:


106

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

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

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


table1からDISTINCT coloumn1を選択することを忘れないでください!= table1からselect count(DISTINCT coloumn1)を選択してください。
Kanagavelu Sugumar

また、ここでのcount(1)1は列番号ではなく、式です。例)table1から1を選択します。テーブルに含まれる行がない場合、1を出力します。
Kanagavelu Sugumar 2013

table1からcount(DISTINCT / ALL columnName)を選択します。列(columnName)のすべての/個別のNOT NULL値は返しません。
Kanagavelu Sugumar 2013

table1からDISTINCT column1を選択します。列(column1)に1つのNULL値が含まれます。table1からcount(DISTINCT coloumn1)を選択します。NULL行は1つも含まれません。
Kanagavelu Sugumar 2013

1
@datps-同じ結果を与える式の数は実際には無制限です。COUNT( 'Hello、world!')も同様に機能するはずです。(私はそれを試していません。)それで問題は、同じことを行う方法がすでに無制限にあるのに、なぜ特別な式(*)を作成するのでしょうか。SQLの作成者(:)を償う罪が多い)について話すことはできませんが、おそらく、人々がnull以外の式を勝手に選択する必要がないようにするためです。それはクエリの作者の意図を混乱させたでしょう。「なぜ彼らは2ではなく1を書いたのですか?これは何かを意味しているに違いありません!」
Jeffrey L Whitledge、2016

26

ここにあなたの質問に答えるのに役立つリンクがあります。要するに:

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

a)1がnullでない
行を数えることは、b)行を数えるよりも効率が悪い


17

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

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

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


9

これは、

SELECT * FROM table_name and SELECT 1 FROM table_name.  

もし、するなら

SELECT 1 FROM table_name

テーブルの各行に1が表示されます。したがって、はいcount(*)、またはcount(1)同じ結果が得られます。count(8)count(column_name)


3
count(column_name)はまったく同じではありません-その列にnullがある行はカウントされません。詳細はこちらをご覧ください:stackoverflow.com/questions/169784
Blorgbeardが出ている

うーん、実際にはSQL Serverの場合です。Oracleの動作は異なると思います。
Blorgbeardは

標準SQL、ORacleおよびSQL Serverはこの点に関して同じ動作をするはずなので、Countは決してNULL値を使用しないでください。
Thorsten、

「SELECT * FROM table_nameとSELECT 1 FROM table_nameの違いに似ています。」 - あんまり。SELECT *とSELECT 1は異なります。SELECT(*)とSELECT(1)は同じ結果になります。
David Aldridge、

7

違いはありません。

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)規則が導入されました。


5
SELECT COUNT(1) from <table name>

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

SELECT COUNT(*)  from <table name>

SELECT COUNT(*)一部のデータベースよりもパフォーマンスが向上する理由があったか、それでもまだいくつかの理由がありますが、DBのバグだと思います。

SELECT COUNT(col_name) from <table name>

ただし、指定された列に対してnull以外の値を持つ行のみをカウントするため、別の意味があります。


3

オラクルでは、これらはまったく同じ意味を持つと思います


1は列1を指しますか?
dacracot 2008年

1
いいえ、1は定数1を指します。ORDERBY 1と言うと、列1を指します。
ティロ

それは私がしばらく前に思ったものですが、列数よりも大きい任意の数を指定できますが、結果は同じです。したがって、列番号ではありません。
Nrj 2008年

@dacracot:それはそうかもしれないが私はそうは思わない。私が理解していることから、オラクルはバックグラウンドでcount(1)をcount(*)に
書き換えるだけです

2

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

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;

0

誰に尋ねるかにselect count(1) from random_table;もよりselect count(*) from random_tableますが、実行はよりも高速であると報告する人もいます。まったく同じだと主張する人もいます。

このリンクは、2つの間の速度の違いは、フルテーブルスキャンと高速フルスキャンによるものであると主張しています。


リンクを誤って解釈しています。LSは、COUNT(COLUMN)がCOUNT(*)と同じで高速である可能性があることを主張していますが、NOT NULL列にインデックスが付けられておらず、COLUMNにインデックスが付けられており、実際にはnull値がない場合に限られます。トリックの質問の詳細。
David Aldridge、

1
リンクを使用して、状況によってはCOUNT(1)がCOUNT(*)よりも高速である可能性があるという主張を文書化しようとしました。以前のいくつかの回答では、2の間に違いはないという記述があり、私は可能な反例を提供していました。
Johann Zacharee、2008年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.