Để bắt đầu với:Không,
SELECT user_id, MAX(salary) FROM users;
không tuân thủ tiêu chuẩn. Bạn đang sử dụng một hàm tổng hợp (MAX
) không có GROUP BY
mệnh đề. Bằng cách đó, bạn yêu cầu DBMS tổng hợp tất cả các bản ghi vào một hàng kết quả duy nhất. Bây giờ bạn yêu cầu DBMS hiển thị điều gì trong hàng kết quả này? Mức lương tối đa được tìm thấy trong bảng (MAX(salary)
) và the user_id
. Tuy nhiên, không có the user_id
; có thể có nhiều user_id
khác nhau trong bàn. Điều này vi phạm tiêu chuẩn SQL. MySQL có quyền tự do diễn giải user_id
không tổng hợp như bất kỳ user_id
(tự ý chọn).
Vì vậy, ngay cả khi truy vấn chạy, kết quả của nó thường không phải là kết quả mong muốn.
Truy vấn này:
SELECT user_id, name, MAX(salary) FROM users GROUP BY user_id;
mặt khác là tuân thủ tiêu chuẩn. Hãy xem lại truy vấn này làm gì:Lần này có GROUP BY
mệnh đề cho DBMS biết bạn muốn một hàng kết quả cho mỗi user_id
. Đối với mỗi user_id
bạn muốn hiển thị: the user_id
, the name
và salary
tối đa . Tất cả những điều này là biểu thức hợp lệ; the user_id
là user_id
chính nó, the tên là một tên người dùng được liên kết với user_id
và salary
tối đa là mức lương tối đa của người dùng. Cột chưa được tổng hợp name
được cho phép, vì nó phụ thuộc về mặt chức năng vào user_id
được nhóm theo nhóm . Tuy nhiên, nhiều DBMS không hỗ trợ điều này bởi vì việc xác định một biểu thức có phụ thuộc vào nhóm về mặt chức năng hay không sẽ trở nên vô cùng phức tạp.
Để làm thế nào để hiển thị hồ sơ người dùng với mức lương tối đa, bạn cần một điều khoản giới hạn. MySQL cung cấp LIMIT
đối với điều này, có thể giúp bạn có được n hàng đầu tiên. Tuy nhiên, nó không liên quan đến các mối quan hệ.
SELECT * FROM users ORDER BY salary DESC LIMIT 1;
là
SELECT * FROM users ORDER BY salary FETCH FIRST ROW ONLY;
trong SQL chuẩn.
Tuy nhiên, để đối phó với các ràng buộc, như trong
SELECT * FROM users ORDER BY salary FETCH FIRST ROW WITH TIES;
bạn cần một truy vấn con trong MySQL, bởi vì LIMIT
không hỗ trợ điều này:
SELECT * FROM users WHERE salary = (SELECT MAX(salary) FROM users);