sql >> Database teknologi >  >> RDS >> Oracle

Hvorfor Mysql's Group By og Oracle's Group by adfærd er forskellige

MySQL-designerne indsatte deres ikke-standardudvidelse til GROUP BY i et forsøg på at gøre udvikling lettere og visse forespørgsler mere effektive.

Her er deres begrundelse.

https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

Der er en servertilstand kaldet ONLY_FULL_GROUP_BY som deaktiverer ikke-standardudvidelser. Du kan indstille denne tilstand ved hjælp af denne erklæring.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Her er et citat fra den side, med fremhævelse tilføjet.

Hvis ONLY_FULL_GROUP_BY er deaktiveret, en MySQL-udvidelse til standard SQL-brug af GROUP BY tillader valglisten, HAVING condition, eller ORDER BY liste for at henvise til ikke-aggregerede kolonner, selvom kolonnerne ikke er funktionelt afhængige af GROUP BY kolonner... I dette tilfælde kan serveren frit vælge en værdi fra hver gruppe , så medmindre de er ens, er de valgte værdier ikke-deterministiske , hvilket nok ikke er det du ønsker.

Det vigtige ord her er ikke-deterministisk. Hvad betyder det? Det betyder tilfældigt, men værre. Hvis serveren valgte tilfældige værdier, betyder det, at den ville returnere forskellige værdier i forskellige forespørgsler, så du har en chance for at fange problemet, når du tester din software. Men ikke-deterministisk betyder i denne sammenhæng, at serveren vælger den samme værdi hver gang, indtil den ikke gør det.

Hvorfor kan det ændre den værdi, det vælger? En serveropgradering er en af ​​grundene. En ændring af bordstørrelse kan være en anden. Pointen er, at serveren frit kan returnere den værdi, den ønsker.

Jeg ville ønske, at folk, der for nylig har lært SQL, ville indstille denne ONLY_FULL_GROUP_BY mode; de ville få meget mere forudsigelige resultater fra deres forespørgsler, og serveren ville afvise ikke-deterministiske forespørgsler.



  1. Hvorfor returnerer IS NOT NULL NULL-værdier for en Varchar(max) i SQL Server?

  2. Få optælling af poster, der er påvirket af INSERT eller UPDATE i PostgreSQL

  3. Vælg (hent) alle poster fra flere skemaer ved hjælp af Postgres

  4. Beregnet / beregnet / virtuelle / afledte kolonner i PostgreSQL