18

これはいつも私を悩ませてきました-SQLステートメントのGROUPBY句で、すべての非集計列を含める必要があるのはなぜですか?これらの列はデフォルトで含まれている必要があります-一種の"GROUPBY*"-すべて含まれていないとクエリを実行することさえできないためです。すべての列は集計であるか、「GROUP BY」で指定する必要がありますが、集計されていないものはすべて自動的にグループ化されるようです。

それはANSI-SQL規格の一部かもしれませんが、それでも理由はわかりません。誰かが私がこの大会の必要性を理解するのを手伝ってもらえますか?

4

3 に答える 3

27

SQL言語の設計者が標準を作成したときに何を考えていたかを正確に知ることは困難ですが、これが私の意見です。

SQLは、原則として、期待と意図を明示的に述べる必要があります。言語は「あなたが何を意味するのかを推測」しようとはせず、自動的に空白を埋めます。これは良いことです

クエリを作成する場合、最も重要な考慮事項は、正しい結果が得られることです。間違えた場合は、意図を推測して正しくない可能性のある結果を返すよりも、SQLパーサーから通知される方がよいでしょう。SQLの宣言型の性質(SQLを取得する手順ではなく、取得したいものを指定する)により、誤って間違いを犯しやすくなります。言語構文にfuzziniessを導入しても、これは改善されません

実際、言語がショートカットを許可する場所について考えることができるすべてのケースで、問題が発生しました。たとえば、自然結合を考えてみましょう。結合する列の名前を省略して、データベースが列名に基づいてそれらを推測できるようにすることができます。列名が変更されると(時間の経過とともに自然に変更されます)、既存のクエリのセマンティクスも変更されますこれは悪いことです...非常に悪いことです。データベースコードの舞台裏でこの種の魔法が発生することは本当に望ましくありません。

ただし、この設計上の選択の結果の1つは、SQLが冗長な言語であり、その中で意図を明示的に表現する必要があるということです。これにより、必要以上に多くのコードを記述しなければならず、特定の構造が非常に冗長である理由について不満を抱く可能性があります...しかし、結局のところ、それはそれが何であるかです。

于 2010-05-05T22:40:44.583 に答える
2

GROUP BYグループ化の選択列に含まれていないフィールドを含めることができるため、この句を保持することが考えられる唯一の論理的な理由です。

例えば。

Select column1, SUM(column2) AS sum
 FROM table1
 GROUP BY column1, column3

column3はクエリの他の場所に表示されていませんが、結果をその値でグループ化することができます。(もちろん、一度それを実行すると、レコードがグループ化された理由を結果から判断することはできません。)

圧倒的に最も一般的なシナリオ(非集計列ごとにグループ化)の簡単なショートカットは、コーディングを高速化するためのシンプルで効果的なツールのようです。

多分"GROUP BY *"

SQLツールでは、結果の列番号(つまり、GROUP BY 1,2,3,など)で列を参照できるようにすることはすでにかなり一般的であるため、ユーザーが1回のキーストロークですべての非集計フィールドを自動的に含めることができるようにする方が簡単に思えます。

于 2016-07-18T23:17:36.327 に答える
0

これは次のように簡単です。from句のすべての列ごとに結果をSQLグループ化するように要求しました。つまり、from句SQLのすべての列について、SQLエンジンは結果セットを内部的にグループ化してから表示します。これは、fromに存在するすべての列についても言及するように求められる理由を説明しています。これは、部分的にグループ化することができないためです。sqlでのみ可能なgroupby句について言及した場合は、すべての列もグループ化することで意図を達成できます。これは数学の制限です。

于 2016-05-14T19:09:34.297 に答える