-
Ya. Kolom non-agregat adalah kolom apa pun yang tidak menggunakan fungsi agregasi seperti
MAX
,COUNT
,SUM
,GROUP_CONCAT
, dll. -
Kolom
a
secara fungsional bergantung pada kolomb
jika nilaib
menyiratkan nilai tertentua
. Ini biasanya berarti bahwab
adalah kunci unik untuk tabel, dana
adalah beberapa kolom lain dalam tabel itu. -
Secara unik ditentukan oleh sama dengan ketergantungan fungsional.
-
Alternatifnya adalah membuat daftar semua kolom yang tidak diagregasi di
GROUP BY
daftar:GROUP BY a.Z, a.Y, a.X
.
Alasan untuk semua ini adalah ketika Anda memilih kolom yang tidak ada dalam GROUP BY
list, mereka akan berasal dari baris arbitrer di baris yang dikelompokkan. Hal ini menyebabkan banyak kesalahan umum. Misalnya, kesalahan umum adalah menulis:
SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id
dan mengharapkan ip_address
berisi alamat login terbaru untuk setiap pengguna. Tapi itu benar-benar akan berisi apa saja dari alamat yang mereka masuki, bukan dari baris dengan MAX(timestamp)
. Lihat SQL Pilih hanya baris dengan Nilai Maks pada Kolom
cara yang benar untuk melakukannya.
Pengecualian ketergantungan fungsional biasanya berguna dengan gabungan.
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
Sejak user_id
adalah kunci utama users
tabel, secara unik menentukan user_name
, jadi tidak perlu mencantumkannya secara eksplisit di GROUP BY
.