まず、いいえ、
SELECT user_id, MAX(salary) FROM users;
標準に準拠していません。集計関数( MAX
)を使用しています ) GROUP BY
なし 句。そうすることで、すべてのレコードを1つの結果行に集約するようにDBMSに指示します。では、DBMSにこの結果行に何を表示するように指示しますか?表にある最大給与( MAX(salary)
)および user_id
。ただし、はありません。 user_id
;おそらく多くの異なるuser_id
があります テーブルで。これはSQL標準に違反しています。 MySQLは、集約されていない user_id
を自由に解釈します。 any user_id
(任意に選択)
したがって、クエリが実行されても、その結果は通常、目的の結果ではありません。
このクエリ:
SELECT user_id, name, MAX(salary) FROM users GROUP BY user_id;
一方、標準に準拠しています。このクエリの機能をもう一度見てみましょう。今回はGROUPBY
があります。 user_id
ごとに1つの結果行が必要であることをDBMSに指示する句 。 user_id
ごとに 表示したい: user_id
、 名前コード> 、および最大の
給与
。これらはすべて有効な式です。 user_id
user_id
です それ自体、 nameは、 user_id
に関連付けられた1つのユーザー名です。 、および最大の給与
ユーザーの最高給与です。集約されていない列のname
グループ化されたuser_id
に機能的に依存しているため、許可されます 。ただし、式が機能的にグループに依存しているかどうかを判断するのは非常に複雑になる可能性があるため、多くのDBMSはこれをサポートしていません。
最大給与でユーザーレコードを表示する方法については、制限条項が必要です。 MySQLはLIMIT
を提供します このため、最初のn行を取得できます。ただし、同点は扱いません。
SELECT * FROM users ORDER BY salary DESC LIMIT 1;
SELECT * FROM users ORDER BY salary FETCH FIRST ROW ONLY;
標準SQLで。
ただし、同点に対処するために、
SELECT * FROM users ORDER BY salary FETCH FIRST ROW WITH TIES;
LIMIT
のため、MySQLでサブクエリが必要です これをサポートしていません:
SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users);