3

count(*)引数として属性を持つとの違いを理解していません。
ここで例を示します。2つの関係があります。

project (id, name, number);
employee (ssn, name, surname);
working_on (employee_ssn,   project_id);

employee_ssnどの参照employee(ssn)project_id参照でproject(id)
主キー:project(id)、、employee(ssn)working_on(employee_ssnproject_id)。
次に、プロジェクトごとに、プロジェクトのID、名前、およびプロジェクトに取り組んでいる従業員の数を見つける必要があります。
正しい解決策(本にあります)は次のとおりです。

select id, name, count (*)
from working_on join project on id=project_id
group by name, id

このソリューションが有効である理由がわかりませんが、count (*)すべてのタプルをカウントするべきではありませんか?なぜこの方法で、正確な数の従業員がそれに取り組んでいるのですか?
私は代わりにこのソリューションを書きました:

select id, name, count (employee_ssn)
from working_on join project on id=project_id
group by name, id

ソリューションは同等ですか?そして、一般的に、とを使用すると
違いがありますか?これらの2つの構文が異なる結果を生成する例を提供できますか?count (*)count(attribute)

4

4 に答える 4

4

ドキュメントから:

COUNT(expr)

ステートメントによって取得された行のexprNULLの非値の数のカウントを返します。SELECT


COUNT(*)は、値が含まれているかどうかに関係なく、取得された行数のカウントを返すという点で多少異なりNULLます。

言い換えると:

COUNT(expr)exprNULLの値を持たない行の数を返します。

COUNT(*)返された行の総数を返します。

GROUP BY句を使用しているかどうかは関係ありません。

于 2012-06-02T16:20:53.987 に答える
3

count(*)NULLをカウントし、カウントしcount(attribute)ません。したがって、列にNULL値がある場合にのみ違いが表示されます

于 2012-06-02T16:16:42.523 に答える
1

私は今まで2つの違いを理解しました-

  1. 上記のエリックのように、count(col)はnull値をカウントしませんが、count(*)はカウントします。

  2. 結合クエリでは動作が異なります。

従業員と部門のテーブルに参加する必要があり、各部門の従業員の数を見つける必要がある状況を考えてみます。

2.a.

SELECT     DPT.ID 
,          COUNT(*) EMP_COUNT
FROM       DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON         DPT.ID = E.DEPARTMENT_ID
GROUP BY   DPT.ID;

上記のクエリでは、employee table count=0のレコードは返されません。

2.b.

SELECT     DPT.ID 
,          COUNT(E.DEPARTMENT_ID) EMP_COUNT
FROM       DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON         DPT.ID = E.DEPARTMENT_ID
GROUP BY   DPT.ID;

count(*)の代わりにcount(E.DEPARTMENT_ID)を使用すると、今回は従業員テーブルcount=0の場合でもレコードが提供されます。

2.c.

SELECT     DPT.ID 
,          COUNT(DPT.ID) EMP_COUNT
FROM       DEPARTMENT DPT
INNER JOIN EMPLOYEE E
ON         DPT.ID = E.DEPARTMENT_ID
GROUP BY   DPT.ID;

これは興味深い部分です。COUNT(DPT.ID)を使用する場合、DPT.IDは部門の列であるため、ここでも従業員テーブルcount=0が考慮されないレコードがあります。

于 2012-06-02T16:27:11.960 に答える
0

他の人が言っているように、COUNT(*)取得された行の総数はカウントされますが、COUNT(attribute_name)null以外の値の数のみがカウントされます。実際には、どちらもnull以外の値の数をカウントしますが、リレーショナルデータベースでは、すべての値をNULLとして持つ行-タプル-は存在しないため(NULLにすることのできない主キーを持つ必要があります)、COUNT(*)常にテーブル内の行の総数を返します-relation-を構成し、主キー列の値の数-attribute-

于 2020-12-19T14:27:20.937 に答える