2016-04-05 7 views
0

私が気付いたのは、select * from the tableName group by columnName;の場合、エラーにはなりません。また、グループ化されていない列を選択した場合でも。group byのすべての列を選択してもエラーにはならないのはなぜですか?

私は、グループ化された列と集約された列のみを選択できることを理解しました。

これはなぜ許可されていますか?シーンの後ろに何か特別なことはありますか?ここ

は、SQLのフィドルが http://sqlfiddle.com/#!9/d3a23/5

+1

私は答えが用意できたら、この質問はすでにブロックされていて、重複しているとマークされています。したがって、要するに、SQL標準では、選択されたすべてのフィールドがgroup by節にあるか、機能的にそれに依存しているか、集約されている必要があります。この "機能的に依存する"ものはDBMSを決定するのが難しいので、多くの場合、select節のこれらのフィールドは禁止されています(多くの場合、クエリが非常に面倒です)。 MySQLでは関数の依存関係をチェックするのではなく、任意のフィールドを許可します。フィールドがない場合は、1つの値が任意に選択されます。 –

+0

これはMySQLの(誤った)機能で、正しいパラメータ設定で無効にすることができます。 –

+0

@ThorstenKettnerありがとうございます。それは意味をなさない –

答えて

1

であるMySQLは、この特定の構文を強制しませんが、あなたはGROUP BYの一部ではない、あなたのクエリで列を離れるとき、それは持っていることの影響を理解する必要があります。

+0

はい。私はその効果を認識しています。しかし、それが間違っているように見える場合、なぜこの機能が保持されたのか理解したかったのですか? –

+2

グループ化された列と集約された列のみを許可するDBMSは、古いANSI標準1992に準拠し、後の標準1999年と2003では使用できません。設定します。私はこれがむしろ良い妥協であると思う –

1

MySQLによって提供される拡張機能のためです。 MySQL documentation

毎の選択リスト は、GROUP BY句で指定されていない非集約列を参照できるように、MySQLはGROUP BYの標準SQLの使用を拡張します。

+0

ここで "標準SQL"それはどういう意味ですか? –

+0

@AjinkyaPisal、ANSI SQL標準... – Rahul

+0

ありがとうございます。 MySQLとANSI SQLの相違点を確認します –

関連する問題