web-dev-qa-db-ja.com

where句で集計関数が許可されないのはなぜですか

これに関する説明を探しています。以下の2つのクエリを作成しています。

列ID、name、salaryを持つ従業員名のテーブルがあります

  1.  Select name from employee 
    where sum(salary) > 1000 ;

  2.  Select name from employee 
    where substring_index(name,' ',1) = 'nishant' ;

クエリ1は機能しませんが、クエリ2は機能します。私の開発経験から、これに対する可能な説明は次のように感じます。

Sum()は、引数で指定された値のセットに対して機能します。ここでは 'salary'列が渡されるため、この列のすべての値を合計する必要があります。ただし、where句内では、最初のレコード1がテストなどでチェックされるように、レコードが1つずつチェックされます。したがって、sum(salary)はすべての列値にアクセスする必要があるため計算されず、値のみが返されます。

クエリ2は、substring_index()が単一の値で機能するため、ここで機能します。したがって、ここでは、指定された値で機能します。

私の理解を検証してください。

13
Nishant_Singh

WHERE句でSUM()を使用できない理由は、句の評価の順序です。

FROMは、行の読み取り元を示します。行がディスクからメモリに読み込まれるとすぐに、WHERE条件がチェックされます。 (実際には多くの場合、WHERE句に失敗した行はディスクから読み取られません。「条件」は正式には述語として知られており、クエリ実行エンジンによっていくつかの述語が使用されます-ベーステーブルから読み込む行を決定します。これらはaccess述語と呼ばれます。ご覧のとおり、WHERE句は各行に適用されるときに適用されます。エンジン。

一方、集約は、すべての行(すべての述部を検証する)が読み取られた後にのみ行われます。

これについて考えてください:SUM()WHERE条件を満たす行にのみ適用されます。 WHERE句にSUM()を入れると、循環ロジックを要求しています。新しい行はWHERE句を渡しますか?どうやって知りますか?成功する場合は、SUMに含める必要がありますが、そうでない場合は、SUMに含めないでください。では、どのようにしてSUM条件を評価するのでしょうか?

39
mathguy

Where句で集計関数を使用できる理由

集計関数はデータのセットに対して機能します。 WHERE句はセット全体にはアクセスできませんが、現在作業中の行にのみアクセスできます。

もちろん、HAVING句を使用できます。

select name from employee 
group by name having sum(salary) > 1000;

WHEREを使用する必要がある場合、サブクエリを使用できます。

select name from (
    select name, sum(salary) total_salary from employee
    group by name
) t where total_salary > 1000;
10
Gurwinder Singh

sum()は集約関数です。一般的に、group byで動作すると期待します。したがって、最初のクエリにはgroup byがありません。 group byクエリでは、havingがフィルタリングに使用されますafter集約:

Select name
from employee 
group by name
having sum(salary) > 1000 ;
4
Gordon Linoff