まず、いいえ、
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);