Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL GROUP BY hành vi

MySQL chọn một hàng tùy ý. Trong thực tế, các công cụ lưu trữ MySQL thường được sử dụng trả về các giá trị từ đầu tiên hàng trong nhóm, liên quan đến bộ nhớ vật lý.

create table foo (id serial primary key, category varchar(10));

insert into foo (category) values 
  ('foo'), ('foo'), ('foo'), ('bar'), ('bar'), ('bar');

select * from foo group by category;

+----+----------+
| id | category |
+----+----------+
|  4 | bar      |
|  1 | foo      |
+----+----------+

Những người khác nói đúng rằng MySQL cho phép bạn chạy truy vấn này mặc dù nó có kết quả tùy ý và có khả năng gây hiểu lầm. Tiêu chuẩn SQL và hầu hết các nhà cung cấp RDBMS khác không cho phép loại truy vấn GROUP BY không rõ ràng này. Đây được gọi là Quy tắc giá trị đơn :tất cả các cột trong danh sách chọn phải là một phần rõ ràng của tiêu chí GROUP BY hoặc bên trong một hàm tổng hợp, ví dụ:COUNT() , MAX() , v.v.

MySQL hỗ trợ chế độ SQL ONLY_FULL_GROUP_BY điều đó khiến MySQL trả về lỗi nếu bạn cố chạy một truy vấn vi phạm ngữ nghĩa chuẩn SQL.

AFAIK, SQLite là RDBMS duy nhất khác cho phép các cột không rõ ràng trong một truy vấn được nhóm. SQLite trả về các giá trị từ cuối cùng hàng trong nhóm:

select * from foo group by category;

6|bar
3|foo

Chúng ta có thể tưởng tượng các truy vấn sẽ không mơ hồ nhưng vẫn vi phạm ngữ nghĩa chuẩn SQL.

SELECT foo.*, parent_of_foo.* 
FROM foo JOIN parent_of_foo 
  ON (foo.parent_id = parent_of_foo.parent_id) 
GROUP BY foo_id;

Không có cách hợp lý nào mà điều này có thể tạo ra kết quả mơ hồ. Mỗi hàng trong foo có một nhóm riêng, nếu chúng ta NHÓM THEO khóa chính của foo. Vì vậy, bất kỳ cột nào từ foo chỉ có thể có một giá trị trong nhóm. Ngay cả việc tham gia vào một bảng khác được tham chiếu bằng khóa ngoại trong foo có thể chỉ có một giá trị cho mỗi nhóm, nếu các nhóm được xác định bằng khóa chính của foo.

MySQL và SQLite tin tưởng bạn thiết kế các truy vấn rõ ràng một cách hợp lý. Về mặt hình thức, mọi cột trong danh sách chọn phải là phụ thuộc hàm của các cột trong tiêu chí GROUP BY. Nếu bạn không tuân thủ điều này, đó là lỗi của bạn. :-)

SQL tiêu chuẩn nghiêm ngặt hơn và không cho phép một số truy vấn có thể rõ ràng - có thể vì nó quá phức tạp để RDBMS nói chung chắc chắn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mẹo nâng cấp Percona XtraDB Cluster lên 8.0

  2. Cách đơn giản để tính giá trị trung bình với MySQL

  3. Hướng dẫn thiết kế cơ sở dữ liệu cho trình quản lý tác vụ trong MySQL

  4. Kết nối với vùng chứa Docker MySQL từ localhost?

  5. Truy vấn Mysql để chuyển đổi động các hàng thành cột trên cơ sở hai cột