Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

fungsi sql min dan kolom lainnya

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);


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Python+MySQLdb masalah aneh

  2. Cara Menginstal MySQL Workbench Di Ubuntu

  3. Bagaimana Fungsi REGEX_REPLACE() Bekerja di MySQL

  4. Kembalikan kunci asing dengan kueri DQL

  5. Memproses hasil MySQL di bash