sql >> Database teknologi >  >> RDS >> Mysql

MySQL 5.7 &only_full_group_by

  1. Ja. Ikke-aggregerede kolonner er enhver kolonne, der ikke bruger en aggregeringsfunktion såsom MAX , COUNT , SUM , GROUP_CONCAT osv.

  2. Kolonne a er funktionelt afhængig af kolonne b hvis værdien af ​​b indebærer en bestemt værdi af a . Dette betyder generelt, at b er en unik nøgle til tabellen og a er en anden kolonne i den tabel.

  3. Entydigt bestemt af er det samme som funktionel afhængighed.

  4. Alternativet ville være at liste alle ikke-aggregerede kolonner i GROUP BY liste:GROUP BY a.Z, a.Y, a.X .

Grunden til alt dette er, at når du vælger kolonner, der ikke er i GROUP BY liste, vil de komme fra vilkårlige rækker i de grupperede rækker. Dette fører til mange almindelige fejl. For eksempel er en almindelig fejl at skrive:

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

og forventer ip_address til at indeholde adressen på det seneste login for hver bruger. Men den vil faktisk indeholde enhver af de adresser, de loggede ind fra, ikke den fra rækken med MAX(timestamp) . Se SQL Vælg kun rækker med maksimal værdi på en kolonne for den korrekte måde at gøre det på.

Den funktionelle afhængighedsundtagelse er typisk nyttig med joins.

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

Siden user_id er den primære nøgle for users tabel, bestemmer den entydigt user_name , så det er ikke nødvendigt at angive det eksplicit i GROUP BY .




  1. MySQL - hvorfor ikke indeksere hvert felt?

  2. SQL:OPDATERING fra et komplekst udvalg

  3. Hvilken type er denne streng? a:1:{s:2:da;}

  4. Indsæt i fra CTE