sql >> Database >  >> RDS >> Oracle

Waarom Mysql's Group By en Oracle's Group by-gedrag verschillend zijn

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 van GROUP BY staat de selectielijst toe, HAVING staat, of ORDER BY lijst om naar niet-geaggregeerde kolommen te verwijzen, zelfs als de kolommen niet functioneel afhankelijk zijn van GROUP 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.



  1. Is er een automatisch wijzigingstijdstempeltype voor Oracle-kolommen?

  2. SQL Server-fout 206:clash van operandtype

  3. Stel lege strings ('') in op NULL in de hele database

  4. Hoe kan ik niet-ASCII-tekens vinden in MySQL?