Các nhà thiết kế MySQL đã đưa phần mở rộng không chuẩn của họ vào GROUP BY
với nỗ lực làm cho việc phát triển dễ dàng hơn và một số truy vấn nhất định hiệu quả hơn.
Đây là cơ sở lý luận của họ.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Có một chế độ máy chủ được gọi là ONLY_FULL_GROUP_BY
vô hiệu hóa các tiện ích mở rộng không chuẩn. Bạn có thể đặt chế độ này bằng cách sử dụng câu lệnh này.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Đây là trích dẫn từ trang đó, có thêm phần nhấn mạnh.
Nếu
ONLY_FULL_GROUP_BY
bị tắt, một tiện ích mở rộng MySQL cho việc sử dụng SQL tiêu chuẩn củaGROUP BY
cho phép danh sách chọn,HAVING
điều kiện, hoặcORDER BY
danh sách để tham chiếu đến các cột không được tổng hợp ngay cả khi các cột không phụ thuộc về mặt chức năng vàoGROUP BY
cột ... Trong trường hợp này, máy chủ được quyền chọn bất kỳ giá trị nào từ mỗi nhóm , vì vậy, trừ khi chúng giống nhau, các giá trị được chọn là không xác định , mà có lẽ không phải là những gì bạn muốn.
Từ quan trọng ở đây là không xác định. Điều đó nghĩa là gì? Nó có nghĩa là ngẫu nhiên, nhưng tệ hơn. Nếu máy chủ chọn các giá trị ngẫu nhiên, điều đó có nghĩa là nó sẽ trả về các giá trị khác nhau trong các truy vấn khác nhau, vì vậy bạn có cơ hội gặp sự cố khi kiểm tra phần mềm của mình. Nhưng không xác định trong ngữ cảnh này có nghĩa là máy chủ chọn cùng một giá trị mọi lúc, cho đến khi không.
Tại sao nó có thể thay đổi giá trị nó chọn? Nâng cấp máy chủ là một lý do. Một thay đổi đối với kích thước bảng có thể là một thay đổi khác. Vấn đề là, máy chủ có thể tự do trả về bất kỳ giá trị nào nó muốn.
Tôi ước những người mới học SQL sẽ đặt ONLY_FULL_GROUP_BY
này cách thức; họ sẽ nhận được nhiều kết quả dễ đoán hơn từ các truy vấn của họ và máy chủ sẽ từ chối các truy vấn không xác định.