2

製品テーブルに名前とブランドの 2 つの列があります。データは次のとおりです。

NAME               BRAND
'Ruby Axe Guitar', 'Guitar''s & Co'
'TV'             , 'LG' 

このクエリを試してみたところ、うまくいきました。

select name,brand, sum(1000) as sum,'Test' as name1
from products
group by name,brand

group byしかし、句にブランドを含めなくても、クエリが正常に機能していることに驚きました..

select name,brand, sum(1000) as sum,'Test' as name1
from products
group by name

誰か説明できますか?

4

4 に答える 4

0

MySQLは、私見よりもはるかに厳格ではありません。実際のSQL仕様によれば、グループ化されていない列には、句を含むクエリに集計関数が必要です。GROUP BY

MySQLでは、このような集計関数を使用せずにグループ化されていない列を取得して、任意の値を返すことができます。彼らは彼らのドキュメンテーションでこの選択の説明を持っています:

MySQLはGROUPBYの使用を拡張して、選択リストがGROUPBY句で指定されていない非集計列を参照できるようにします。これは、前述のクエリがMySQLで有効であることを意味します。この機能を使用すると、不要な列の並べ替えやグループ化を回避して、パフォーマンスを向上させることができます。ただし、これは主に、GROUPBYで指定されていない各非集計列のすべての値が各グループで同じである場合に役立ちます。サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。

于 2012-10-03T11:05:55.400 に答える
0

集計関数なしでグループ化されていない行を選択することはできません-MySQLはランダムな値を提供します。私はあなたがこの2番目のクエリで幸運だと思います

于 2012-10-03T11:01:50.277 に答える
0

無視された見落としとして意図されていると思います。通常、集計ではない列を「GROUP BY」句に含める必要があります。ただし、MySQL は基本的に、検出した集計の一部ではなく、列の最初のエントリを取得します。

対応するグループ内のレコード数に関係なく変更されないことがわかっているテーブル/列に対してクエリを実行するなど、これは問題ありません。例えば。顧客とその合計注文のリストが必要です。注文テーブルには、顧客テーブルに結合する顧客 ID があります。したがって、SUM( Orders.Amount ) を実行しても、顧客 ID、名前、住所、電話番号を取得できます。参加は顧客 ID で行われるため、対応する名前、住所などは変更されず、グループ内では重要ではありません。顧客 ID でグループ化するだけです。

そのため、誤って列を省略しても、MySQL は窒息しません...

于 2012-10-03T11:09:42.800 に答える
0

NAMEはデータに対してすでに一意であるため、はGROUP BY NAMEと同じGROUP BY NAME, OTHER_FIELDです。

NAMEが一意である場合、他の列との組み合わせも一意です。

于 2012-10-03T11:03:45.527 に答える