Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL 5.7 &only_full_group_by

  1. Ja. Nicht aggregierte Spalten sind alle Spalten, die keine Aggregationsfunktion wie MAX verwenden , COUNT , SUM , GROUP_CONCAT usw.

  2. Spalte a ist funktional abhängig von Spalte b wenn der Wert von b impliziert einen bestimmten Wert von a . Dies bedeutet im Allgemeinen, dass b ist ein eindeutiger Schlüssel für die Tabelle und a ist eine andere Spalte in dieser Tabelle.

  3. Eindeutig bestimmt durch ist dasselbe wie funktionale Abhängigkeit.

  4. Die Alternative wäre, alle nicht aggregierten Spalten im GROUP BY aufzulisten Liste:GROUP BY a.Z, a.Y, a.X .

Der Grund für all dies liegt darin, dass Sie Spalten auswählen, die nicht in GROUP BY enthalten sind Liste, kommen sie aus beliebigen Zeilen in den gruppierten Zeilen. Dies führt zu vielen häufigen Fehlern. Ein häufiger Fehler ist zum Beispiel zu schreiben:

SELECT user_id, MAX(timestamp), ip_address
FROM user_logins
GROUP BY user_id

und erwarten Sie ip_address um die Adresse der letzten Anmeldung für jeden Benutzer zu enthalten. Aber es wird tatsächlich beliebige enthalten der Adressen, von denen sie sich eingeloggt haben, nicht die aus der Zeile mit MAX(timestamp) . Siehe SQL Select only rows with Max Value on a Column für die richtige Vorgehensweise.

Die funktionale Abhängigkeitsausnahme ist normalerweise bei Joins nützlich.

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

Seit user_id ist der Primärschlüssel der users Tabelle bestimmt user_name eindeutig , daher ist es nicht notwendig, dies explizit in GROUP BY aufzulisten .