これに関する説明を探しています。以下の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()が単一の値で機能するため、ここで機能します。したがって、ここでは、指定された値で機能します。
私の理解を検証してください。
WHERE
句でSUM()
を使用できない理由は、句の評価の順序です。
FROM
は、行の読み取り元を示します。行がディスクからメモリに読み込まれるとすぐに、WHERE
条件がチェックされます。 (実際には多くの場合、WHERE
句に失敗した行はディスクから読み取られません。「条件」は正式には述語として知られており、クエリ実行エンジンによっていくつかの述語が使用されます-ベーステーブルから読み込む行を決定します。これらはaccess述語と呼ばれます。ご覧のとおり、WHERE
句は各行に適用されるときに適用されます。エンジン。
一方、集約は、すべての行(すべての述部を検証する)が読み取られた後にのみ行われます。
これについて考えてください:SUM()
はWHERE
条件を満たす行にのみ適用されます。 WHERE
句にSUM()
を入れると、循環ロジックを要求しています。新しい行はWHERE
句を渡しますか?どうやって知りますか?成功する場合は、SUM
に含める必要がありますが、そうでない場合は、SUM
に含めないでください。では、どのようにしてSUM
条件を評価するのでしょうか?
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;
sum()
は集約関数です。一般的に、group by
で動作すると期待します。したがって、最初のクエリにはgroup by
がありません。 group by
クエリでは、having
がフィルタリングに使用されますafter集約:
Select name
from employee
group by name
having sum(salary) > 1000 ;