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

MySQL - Valg af en kolonne, der ikke er i Grupper efter

Det er rigtigt, at denne funktion tillader nogle tvetydige forespørgsler, og uden lyd returnerer et resultatsæt med en vilkårlig værdi valgt fra den kolonne. I praksis plejer det at være værdien fra rækken i gruppen, der fysisk gemmes først.

Disse forespørgsler er ikke tvetydige, hvis du kun vælger kolonner, der er funktionelt afhængige af kolonnen(erne) i GROUP BY-kriterierne. Med andre ord, hvis der kun kan være én distinkt værdi af den "tvetydige" kolonne pr. værdi, der definerer gruppen, er der ikke noget problem. Denne forespørgsel ville være ulovlig i Microsoft SQL Server (og ANSI SQL), selvom den logisk ikke kan resultere i tvetydighed:

SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;

MySQL har også en SQL-tilstand for at få den til at opføre sig efter standarden:ONLY_FULL_GROUP_BY

FWIW, SQLite tillader også disse tvetydige GROUP BY-sætninger, men den vælger værdien fra den sidste række i gruppen.

I hvert fald i den version jeg testede. Hvad det vil sige at være vilkårlig er, at enten MySQL eller SQLite kunne ændre deres implementering i fremtiden og have en anden adfærd. Du bør derfor ikke stole på, at adfærden forbliver som den er i øjeblikket i tvetydige tilfælde som denne. Det er bedre at omskrive dine forespørgsler til at være deterministiske og ikke tvetydige. Det er derfor, MySQL 5.7 nu aktiverer ONLY_FULL_GROUP_BY som standard.



  1. Postgresql ændre kolonnetype fra int til UUID

  2. Fremtiden for Postgres-XL

  3. Hvordan importerer man en Excel-fil til SQL Server?

  4. Forsøg på at genåbne en allerede lukket objekt sqlitedatabase