Untuk memulai dengan:Tidak,
SELECT user_id, MAX(salary) FROM users;
tidak memenuhi standar. Anda menggunakan fungsi agregat (MAX
) tanpa GROUP BY
ayat. Dengan melakukan itu, Anda memberi tahu DBMS untuk menggabungkan semua catatan ke satu baris hasil tunggal. Sekarang apa yang Anda katakan kepada DBMS untuk ditampilkan di baris hasil ini? Gaji maksimum yang ada di tabel (MAX(salary)
) dan yang user_id
. Namun, tidak ada yang user_id
; mungkin ada banyak user_id
different yang berbeda di meja. Ini melanggar standar SQL. MySQL mengambil kebebasan untuk menafsirkan user_id
yang tidak teragregasi sebagai apa saja user_id
(dipilih secara sewenang-wenang).
Jadi meskipun kueri berjalan, hasilnya biasanya tidak sesuai dengan yang diinginkan.
Kueri ini:
SELECT user_id, name, MAX(salary) FROM users GROUP BY user_id;
di sisi lain sesuai standar. Mari kita lihat lagi apa yang dilakukan kueri ini:Kali ini ada GROUP BY
klausa yang memberi tahu DBMS bahwa Anda menginginkan satu baris hasil per user_id
. Untuk setiap user_id
Anda ingin menunjukkan:yang user_id
, yang nama
, dan gaji
maksimum . Semua ini adalah ekspresi yang valid; yang user_id
adalah user_id
sendiri, yang name adalah satu nama pengguna yang terkait dengan user_id
, dan gaji
maksimum adalah gaji maksimum pengguna. Kolom name
yang tidak teragregasi diperbolehkan, karena secara fungsional tergantung pada user_id
yang dikelompokkan berdasarkan user_id
. Namun, banyak DBMS tidak mendukung ini, karena dapat menjadi sangat rumit untuk menentukan apakah suatu ekspresi secara fungsional bergantung pada grup atau tidak.
Mengenai cara menampilkan catatan pengguna dengan gaji maksimum, Anda memerlukan klausa pembatas. MySQL menyediakan LIMIT
untuk ini, yang bisa memberi Anda n baris pertama. Namun, itu tidak berhubungan dengan ikatan.
SELECT * FROM users ORDER BY salary DESC LIMIT 1;
adalah
SELECT * FROM users ORDER BY salary FETCH FIRST ROW ONLY;
dalam SQL standar.
Namun, untuk menangani ikatan, seperti dalam
SELECT * FROM users ORDER BY salary FETCH FIRST ROW WITH TIES;
Anda memerlukan subquery di MySQL, karena LIMIT
tidak mendukung ini:
SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users);