sql >> Database >  >> RDS >> Mysql

MySQL - Een kolom selecteren die niet in Group By is

Het is waar dat deze functie een aantal dubbelzinnige zoekopdrachten toestaat en stilletjes een resultatenset retourneert met een willekeurige waarde die uit die kolom is gekozen. In de praktijk is het meestal de waarde uit de rij binnen de groep die het eerst fysiek wordt opgeslagen.

Deze zoekopdrachten zijn niet dubbelzinnig als u alleen kolommen kiest die functioneel afhankelijk zijn van de kolom(men) in de GROUP BY-criteria. Met andere woorden, als er slechts één afzonderlijke waarde van de "dubbelzinnige" kolom per waarde kan zijn die de groep definieert, is er geen probleem. Deze query zou illegaal zijn in Microsoft SQL Server (en ANSI SQL), ook al kan het logischerwijs niet leiden tot dubbelzinnigheid:

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

MySQL heeft ook een SQL-modus om het zich te laten gedragen volgens de standaard:ONLY_FULL_GROUP_BY

FWIW, SQLite staat deze dubbelzinnige GROUP BY-clausules ook toe, maar kiest de waarde uit de laatste rij in de groep.

Tenminste in de versie die ik heb getest. Wat het betekent om willekeurig te zijn is dat MySQL of SQLite hun implementatie in de toekomst zou kunnen veranderen en een ander gedrag zou kunnen vertonen. Je moet er daarom niet op vertrouwen dat het gedrag blijft zoals het momenteel is in ambigue gevallen zoals deze. Het is beter om uw zoekopdrachten te herschrijven om deterministisch en niet dubbelzinnig te zijn. Daarom schakelt MySQL 5.7 nu standaard ONLY_FULL_GROUP_BY in.



  1. Tabelkolomnamen ophalen in MySQL?

  2. ORA-00911:ongeldig teken

  3. probleem ORA-00001:unieke beperking geschonden komt in INSERT/UPDATE

  4. Traceervlag 2389 en de nieuwe kardinaliteitsschatter