私はこれができるようになりたいです:
SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal
FROM dept
INNER JOIN invoices ON invoices.id_dept = dept.id
WHERE sumTotal > 10000
しかし、「sumTotal」の使用について不明な列が表示されます。
これは可能ですか?
使用HAVING
:
SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal
FROM dept
INNER JOIN invoices
ON invoices.id_dept = dept.id
HAVING sumTotal > 10000
問題は、WHERE
句がステートメントの前に実行されることです。SELECT
したがって、このsumTotal
列はまだ利用できません。
HAVING
句はステートメントの後に実行されます。SELECT
すべてを選択した後、結果をフィルタリングします。ただし、使用HAVING
が遅いため、注意してください。行のセット全体で動作します。
MySQLドキュメントから:
HAVING句は、アイテムがクライアントに送信される直前のほぼ最後に適用され、最適化は行われません。(制限はHAVINGの後に適用されます。)
SQL標準では、HAVINGはGROUPBY句の列または集計関数で使用される列のみを参照する必要があります。ただし、MySQLはこの動作の拡張をサポートしており、HAVINGがSELECTリストの列と外部サブクエリの列も参照できるようにします。
HAVING句は集計関数を参照できますが、WHERE句では参照できません。
SELECT user, MAX(salary)
FROM users
GROUP BY user
HAVING MAX(salary) > 10;
WHERE句に含める必要のある項目にはHAVINGを使用しないでください。
または、WHEREを使用します...
SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal
FROM dept
JOIN invoices ON invoices.id_dept = dept.id
WHERE invoices.col1 + invoices.col2 + invoices.col3 > 10000
これを試すこともできます:
WITH temp AS
(
SELECT
dept.id,
(invoices.col1 + invoices.col2 + invoices.col3) as sumTotal
FROM dept INNER JOIN invoices ON invoices.id_dept = dept.id
)
SELECT *
FROM temp
WHERE sumTotal > 10000
'having'を使用する必要があります-
SELECT dept.id, (invoices.col1 + invoices.col2 + invoices.col3) as sumTotal
FROM dept
INNER JOIN invoices ON invoices.id_dept = dept.id
HAVING sumTotal > 10000
エイリアスフィールドを使用できるかどうか、または'having(invoices.col1 + invoices.col2 + invoices.col3)>10000と書く必要があるかどうかはわかりません。
'where'ステートメントは'select'と連動して機能します。これは、最初に返されるレコードをフィルタリングします。次に、「Having」は、データセットを返すデータセットをフィルタリングします。これは通常、「select」の時点で「having」条件を認識できなかったためです。
1つのドキュメントを引用すると、「WHEREキーワードを集計関数で使用できなかったため、HAVING句がSQLに追加されました。」他の場所に記述されている' SQLHAVING句はSQLGROUPBY句と組み合わせて使用されます。SQL SELECTステートメントで使用して、SQLGROUPBYが返すレコードをフィルタリングできます。