De MySQL-ontwerpers hebben hun niet-standaard extensie toegevoegd aan GROUP BY
in een poging om de ontwikkeling gemakkelijker te maken en bepaalde zoekopdrachten efficiënter te maken.
Dit is hun redenering.
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Er is een servermodus genaamd ONLY_FULL_GROUP_BY
die de niet-standaard extensies uitschakelt. U kunt deze modus instellen met behulp van deze verklaring.
SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'
Hier is een citaat van die pagina, met nadruk toegevoegd.
Als
ONLY_FULL_GROUP_BY
is uitgeschakeld, een MySQL-extensie voor het standaard SQL-gebruik vanGROUP BY
staat de selectielijst toe,HAVING
staat, ofORDER BY
lijst om naar niet-geaggregeerde kolommen te verwijzen, zelfs als de kolommen niet functioneel afhankelijk zijn vanGROUP BY
kolommen... In dit geval is de server vrij om elke waarde uit elke groep te kiezen , dus tenzij ze hetzelfde zijn, zijn de gekozen waarden niet-deterministisch , wat waarschijnlijk niet is wat je wilt.
Het belangrijke woord hier is niet-deterministisch. Wat betekent dat? Het betekent willekeurig, maar erger. Als de server willekeurige waarden heeft gekozen, betekent dit dat deze verschillende waarden in verschillende zoekopdrachten zou retourneren, dus u heeft een kans om het probleem op te lossen wanneer u uw software test. Maar niet-deterministisch in deze context betekent dat de server elke keer dezelfde waarde kiest, totdat dit niet het geval is.
Waarom zou het de gekozen waarde kunnen veranderen? Een serverupgrade is een reden. Een verandering in de tafelgrootte kan een andere zijn. Het punt is dat de server vrij is om elke gewenste waarde terug te geven.
Ik zou willen dat mensen die net SQL leren dit ONLY_FULL_GROUP_BY
. zouden instellen modus; ze zouden veel meer voorspelbare resultaten krijgen van hun zoekopdrachten, en de server zou niet-deterministische vragen afwijzen.