sql >> Databáze >  >> RDS >> Oracle

Proč se chování Mysql Group By a Oracle Group podle chování liší

Návrháři MySQL vložili své nestandardní rozšíření na GROUP BY ve snaze usnadnit vývoj a zefektivnit některé dotazy.

Tady je jejich zdůvodnění.

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

Existuje serverový režim nazvaný ONLY_FULL_GROUP_BY který zakáže nestandardní rozšíření. Tento režim můžete nastavit pomocí tohoto příkazu.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Zde je citát z této stránky s přidaným důrazem.

Pokud ONLY_FULL_GROUP_BY je zakázáno, rozšíření MySQL ke standardnímu použití SQL GROUP BY povoluje výběrový seznam HAVING podmínkou nebo ORDER BY seznam odkazovat na neagregované sloupce, i když sloupce nejsou funkčně závislé na GROUP BY sloupce... V tomto případě si server může volně vybrat libovolnou hodnotu z každé skupiny , takže pokud nejsou stejné, zvolené hodnoty jsou nedeterministické , což pravděpodobně není to, co chcete.

Zde je důležité slovo nedeterministický. Co to znamená? Znamená to náhodné, ale horší. Pokud server zvolil náhodné hodnoty, znamená to, že by v různých dotazech vrátil různé hodnoty, takže máte šanci zachytit problém při testování softwaru. Ale nedeterministický v tomto kontextu to znamená, že server pokaždé zvolí stejnou hodnotu, dokud tak neučiní.

Proč může změnit hodnotu, kterou si zvolí? Upgrade serveru je jedním z důvodů. Změna velikosti tabulky může být další. Jde o to, že server může vrátit jakoukoli hodnotu, kterou chce.

Přál bych si, aby lidé, kteří se nově učí SQL, nastavili toto ONLY_FULL_GROUP_BY režim; ze svých dotazů by získali mnohem předvídatelnější výsledky a server by odmítal nedeterministické dotazy.



  1. Načtěte data CSV do MySQL v Pythonu

  2. Jak monitorovat ProxySQL pomocí Prometheus a ClusterControl

  3. Zjistěte, do kterého čtvrtletí v Oracle patří datum

  4. Správa vysoké dostupnosti v PostgreSQL – Část II:Správce replikací