-
Đúng. Cột không được tổng hợp là bất kỳ cột nào không sử dụng hàm tổng hợp như
MAX
,COUNT
,SUM
,GROUP_CONCAT
, v.v. -
Cột
a
phụ thuộc về mặt chức năng vào cộtb
nếu giá trị củab
ngụ ý một giá trị cụ thể củaa
. Điều này thường có nghĩa làb
là khóa duy nhất cho bảng vàa
là một số cột khác trong bảng đó. -
Được xác định duy nhất bởi giống như phụ thuộc hàm.
-
Cách thay thế sẽ là liệt kê tất cả các cột không được tổng hợp trong
GROUP BY
danh sách:GROUP BY a.Z, a.Y, a.X
.
Lý do cho tất cả điều này là khi bạn chọn các cột không nằm trong GROUP BY
danh sách, chúng sẽ đến từ các hàng tùy ý trong các hàng được nhóm. Điều này dẫn đến nhiều lỗi phổ biến. Ví dụ, một lỗi phổ biến là viết:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
và mong đợi ip_address
để chứa địa chỉ của lần đăng nhập gần đây nhất cho mỗi người dùng. Nhưng nó thực sự sẽ chứa bất kỳ địa chỉ mà họ đã đăng nhập, không phải địa chỉ từ hàng có MAX(timestamp)
. Xem SQL Chỉ chọn các hàng có Giá trị tối đa trên một cột
để biết cách chính xác để làm điều đó.
Ngoại lệ phụ thuộc hàm thường hữu ích với các phép nối.
SELECT u.user_id, u.user_name, MAX(l.timestamp)
FROM users AS u
JOIN user_logins AS l ON u.user_id = l.user_id
GROUP BY u.user_id
Kể từ user_id
là khóa chính của users
bảng, nó xác định duy nhất user_name
, vì vậy không cần thiết phải liệt kê rõ ràng trong GROUP BY
.