私の教授は、「COUNT」は重複をカウントしないことを教えてくれました


40

大学で、私の教授は今年このSQLステートメントを教えてくれました。

SELECT COUNT(length) FROM product

2次のデータセットで戻ります:

|   product         |
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |    40  | A31  |

彼女はCOUNT重複を数えないと言ってそれを正当化した。

私は教授にエラーを犯したと思ったと言いました。彼女は、一部のDBMSが重複をカウントする場合としない場合があると答えました。

多くのDBMSを試した後、このような動作をするものを見つけたことがありません。

このDBMSは存在しますか?

教授がこの行動を教える理由はありますか?また、他のDBMSの動作が異なる可能性があることさえ言及していませんか?


参考までに、コースサポートはこちら(フランス語)でご利用いただけます。関係するスライドは、10ページの左下隅にあります。


1
スライドではANSi SQLについて説明しているため、1992年の標準(contrib.andrew.cmu.edu/~shadow/sql/sql1992.txtの 125ページを参照)でも、DISTINCTを使用した場合と使用しない場合のカウントのさまざまな動作が一覧表示されます。更新されたバージョン(ALL / OVERなどのオプションを含む)を追加したライブラリにアクセスすることをお勧めします
-eckes

回答:


38

COUNT 私が知っているすべてのDBMSで重複をカウントしますが、。

教授がこの行動を教える理由はありますか

はい、理由があります。元の関係理論(現代のすべてのリレーショナルDBMSの根底にある)では、関係はこの言葉の数学的な意味での集合です。つまり、「テーブル」だけでなく、すべての移行リレーションを含め、リレーションに重複を含めることはできません。

この原則に従って、SELECT length FROM productすでに2行しか含まれていないため、対応するCOUNTreturn 2であると言うことができ3ます。


たとえば、Rel DBMSでは、質問とチュートリアルDの構文で指定された関係を使用します。

SUMMARIZE product {length} BY {}: {c := COUNT()}

与える:

リリース結果


1
今年の後半にこの教授との関係理論のコースがあったので、これが正解だと思います。とにかく、私は教授に詳細を尋ねます。
ジュールラムール

2
先生は、SQL DBMSだけでなく、DBMS全般について話しているのかもしれません。編集が示すように、リレーショナルモデル(Relなど)のCOUNT実装があり、SQL実装とは動作が異なります。
ypercubeᵀᴹ

47

あなたの教授が間違いを犯したか、彼女が言ったことを誤解したかのどちらかです。さまざまなベンダーによって実装されているリレーショナルDBMSのコンテキストでは、集計関数COUNT(<expression>)<expression>結果セット(またはグループ)のNULL以外の値の数を返します。

の特殊なケースがあり、結果セットまたはグループ内COUNT(*)数を返します。値の値の数ではありません。これはCOUNT(<constant expression>)、などと同等COUNT(1)です。

多くのデータベースがサポートしますCOUNT(DISTINCT <expression>)。これ、の一意の値の数を返します<expression>


13

教授がSQLについて話している場合、ステートメントは間違っています。COUNT(x)xがIS NOT NULL重複を含む行の数を返します。COUNT(*) or COUNT([constant])は、すべての列がであっても、行をカウントする特殊なケースですNULL。ただし、を指定しない限り、重複は常にカウントされますCOUNT(distinct x)。例:

with t(x,y) as ( values (null,null),(null,1),(1,null),(1,1) )

select count(*) from t
4

select count(1) from t
4

select count(distinct 1) from t
1

select count(x) from t
2

select count(distinct x) from t
1

COUNT(distinct *) 無効なAFAIKです。

副次的な注意事項として、NULLは直感的でない動作を導入します。例として:

SELECT SUM(x) + SUM(y),  SUM(x + y) FROM T
4, 2

すなわち:

SUM(x)+SUM(y) <> SUM(x+y)

彼/彼女が、例えば、本データベース、タイプ、および関係モデル: CJ日付とヒュー・ダーウェンによる第三のマニフェストで説明されているような関係システムについて話しているなら、それは正しい声明でしょう。

関係があるとしましょう:

STUDENTS = Relation(["StudentId", "Name"]
                    , [{"StudentId":'S1', "Name":'Anne'},
                       {"StudentId":'S2', "Name":'Anne'},
                       {"StudentId":'S3', "Name":'Cindy'},
                     ])
SELECT COUNT(NAME) FROM STUDENTS

に対応:

COUNT(STUDENTS.project(['Name']))

すなわち

COUNT( Relation(["Name"]
               , [{"Name":'Anne'},
                  {"Name":'Cindy'},
                ]) )

これは2を返します。


3

これがMS SQL Serverでの動作です

COUNT(*)は、グループ内のアイテムの数を返します。これには、NULL値と重複が含まれます。

COUNT(ALL expression)は、グループ内の各行の式を評価し、null以外の値の数を返します。

COUNT(DISTINCT expression)は、グループ内の各行の式を評価し、一意の非ヌル値の数を返します。


1

テーブルがこんな感じだったら、

|   product         |
|id | length | code |
|-------------------|
| 1 |    11  | X00  |
| 2 |    11  | C02  |
| 3 |  null  | A31  |

NULLはカウントされないため、少なくともOracle DBではクエリが2を返すと予想できます。ただし、重複は問題なくカウントされます。


-7

多分彼女はユニークと一緒に意味しますが、カウントは重複を数えます。自分のことを知らない教師もいますが、クラスメート/友達に通知するだけで心配する必要はありません。いくつかのSQL関数を理解し、デモンストレーションが必要な場合、教師がクラスに挿入するものを提案する方法を考えてもらいます(データが大きくないようにしてください)、関数カウントを使用するときに彼女を取得します。一部の人々はそれを拾います。また、彼女が他のデータベースを言うとき、あなたの友人にどのデータベースを尋ねてもらい、次に彼女を二重スネアにし、あなたがそれらすべてのデータベースを試してみて、彼女が言ったように動作しないと言います。


2
意図的に教師に敵対するために着手するかどうかはわかりません。いくつかの場合、反論の準備ができている状態で、彼らと直接会ってそれについて尋ねるだけで完全に適切かもしれません(尋ねる理由があることを示すためだけに)。それでも、アプローチの基本は有効です。OPまで、使用する特定の方向。
RDFozz
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.