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
コメント