SQL「Group by」句ですべての列を明示的に指定する必要があるのはなぜですか?
-
03-10-2019 - |
質問
これはいつも私を悩ませてきました - なぜSQLステートメントのグループごとの条項が、私がすべての非凝集列を含めることを要求するのですか?これらの列は、デフォルトでは、すべてが含まれていない限りクエリを実行することさえできないため、デフォルトで「グループ *」の一種の「グループ」を含める必要があります。すべての列は、集計であるか、「Group by」で指定する必要がありますが、集約されていないものはすべて自動的にグループ化する必要があるようです。
たぶんそれはANSI-SQL標準の一部ですが、それでも私はその理由を理解していません。誰かが私がこの条約の必要性を理解するのを手伝ってくれますか?
解決
SQL言語のデザイナーが標準を書いたときに何を考えていたかを正確に知ることは困難です。 しかし、これが私の意見です.
SQLは、一般的なルールとして、あなたの期待と意図を明示的に述べる必要があります。言語はしようとしません 「あなたが意味したことを推測する」, 、そして自動的に空白を埋めます。 これは良いことです.
クエリを書くとき、最も重要な考慮事項はそれが 正しい結果が得られます. 間違いを犯した場合、SQLパーサーがあなたの意図を推測し、正しくないかもしれない結果を返すことを推測するよりも、おそらくより良いでしょう。 SQLの宣言的な性質(それを取得する方法ではなく、取得したいものを述べている場合)は、すでに誤って間違いを犯すことができます。 Fuzziniessを言語の構文に導入すると、これが改善されません.
実際、言語がどこで許可するかを考えることができるすべてのケースは ショートカット 問題を引き起こしました。たとえば、Natural結合 - 参加する列の名前を省略し、列名に基づいてデータベースがそれらを推測できるようにすることができます。列名が変更されたら(当然のことながら時間の経過とともに) - 既存のクエリのセマンティクスは、それらとともに変化します. これは悪いことです...非常に悪いです - あなたは本当にこの種のものを望んでいません 魔法 データベースコードの舞台裏で行われます。
ただし、この設計の選択の結果の1つは、SQLが意図を明示的に表現する必要がある冗長言語であることです。 これにより、あなたが好むよりも多くのコードを書く必要がある可能性があり、特定のコンストラクトが非常に冗長である理由について不満を抱く可能性があります...しかし、一日の終わりには、それが何であるかです。
他のヒント
このように簡単です。SQLグループに句のすべての列で結果をグループ化するように依頼しました。つまり、SQLエンジンは、節SQLのすべての列について、結果セットを内部的にグループ化して提示することを意味します。それは、それが部分的にグループではないため、Fromに存在するすべての列にも言及するように頼む理由を説明しています。すべての列をグループ化することにより、SQLのみを達成することができる句ごとにグループに言及した場合。それは数学の制限です。
私が維持するために考えることができる唯一の論理的な理由 GROUP BY
節は、グループの選択列に含まれていないフィールドを含めることができるということです。
例えば。
Select column1, SUM(column2) AS sum
FROM table1
GROUP BY column1, column3
column3はクエリの他の場所では表されていませんが、結果を値でグループ化することができます。 (もちろん、それをやったら、結果からレコードがそのままグループ化された理由を知ることはできません。)
圧倒的に最も一般的なシナリオ(非凝集列のそれぞれによるグループ化)のシンプルなショートカットは、コーディングを高速化するためのシンプルで効果的なツールのように思われます。
多分 "GROUP BY *"
SQLツールではすでにかなり一般的であるため、結果列番号(つまり、列への参照が許可されています。 GROUP BY 1,2,3,
など)1つのキーストロークにすべての非凝集フィールドを自動的に含めることができるように、まだ簡単に思えます。