Oracle SELECT(*)とSELECT(1)の違いについて

スポンサーリンク
スポンサーリンク

SELECT(*)とSELECT(1)の違いについて

SELECT(*)とSELECT(1)の違いについて勘違いしていたので、備忘のために検証結果を記しておきます。

COUNT関数の構文

SELECT 
  COUNT(*)
FROM
  テーブル名

または、

SELECT 
  [DISTINCT] COUNT(expr)
FROM
  テーブル名

上記のようにCOUNT(*)とするか、exprに任意の列名をいれてテーブルのレコード件数を取得することができます。
COUNT(*)で件数を取得する場合、重複値やNULL値を含んだ件数が取得できます。
exprに任意の列名を指定して件数を取得する場合は、NULL値を除いた件数が取得できます。

勘違いの内容と結論

COUNT文の構文でCOUNT(1)は、カラムの1番目を取得して件数を取得する記述方法と思っていました。
ですのでNULL値を含まない件数が取得できると思っていましたが違うようです。
1は定数を指定しているので必ずNULL以外になります。
1を指定した場合のCOUNT(expr)は、式が常に1になるため、レコード数が常にカウントされます。
ですので結論COUNT(*)と同じ件数が取得できます。

検証内容 1番目のカラムにNULLがある場合に取得できる件数はどうなるのか?

以下のテーブルで検証してみます。

CREATE TABLE TEST_TABLE 
 (
 id   VARCHAR2(10) ,
 name VARCHAR2(50)
 );
 DESC TEST_TABLE;
 名前                  NULL?    型
 --------------------- -------- ---------------------
 ID                             VARCHAR2(10)
 NAME                           VARCHAR2(50)

テストデータは、以下のデータを使います。

INSERT INTO TEST_TABLE VALUES(1, 'いるか');
INSERT INTO TEST_TABLE VALUES(NULL, 'うさぎ');
INSERT INTO TEST_TABLE VALUES(3, 'ぺんぎん');

検証結果

COUNT(*)とCOUNT(1)の取得件数は想定通り同値です。
COUNT(ID)については、IDにNULL値のレコードが1件あるので、
リファレンス通りNULL値が含まれない件数で取得されています。

 SELECT COUNT(*) FROM TEST_TABLE;

  COUNT(*)
----------
         3

 SELECT COUNT(1) FROM TEST_TABLE;

  COUNT(1)
----------
         3

 SELECT COUNT(ID) FROM TEST_TABLE;

  COUNT(ID)
----------
         2

 SELECT COUNT(NAME) FROM TEST_TABLE;

COUNT(NAME)
-----------
          3

コメント

タイトルとURLをコピーしました