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

Perché i comportamenti Group By di Mysql e Group by di Oracle sono diversi

I progettisti MySQL hanno inserito la loro estensione non standard in GROUP BY nel tentativo di rendere lo sviluppo più semplice e alcune query più efficienti.

Ecco la loro logica.

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

Esiste una modalità server chiamata ONLY_FULL_GROUP_BY che disabilita le estensioni non standard. Puoi impostare questa modalità utilizzando questa istruzione.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Ecco una citazione da quella pagina, con l'enfasi aggiunta.

Se ONLY_FULL_GROUP_BY è disabilitato, un'estensione MySQL all'uso SQL standard di GROUP BY permette di selezionare l'elenco, HAVING condizione, o ORDER BY list per fare riferimento a colonne non aggregate anche se le colonne non dipendono funzionalmente da GROUP BY colonne... In questo caso, il server è libero di scegliere qualsiasi valore da ciascun gruppo , quindi, a meno che non siano gli stessi, i valori scelti sono non deterministici , che probabilmente non è quello che vuoi.

La parola importante qui è non deterministico. Cosa significa? Significa casuale, ma peggio. Se il server ha scelto valori casuali, ciò implica che restituirebbe valori diversi in query diverse, quindi hai la possibilità di rilevare il problema quando testi il ​​tuo software. Ma non deterministico in questo contesto significa che il server sceglie ogni volta lo stesso valore, finché non lo fa.

Perché potrebbe cambiare il valore che sceglie? Un aggiornamento del server è uno dei motivi. Una modifica alle dimensioni della tabella potrebbe essere un'altra. Il punto è che il server è libero di restituire qualsiasi valore desideri.

Vorrei che le persone che stanno imparando SQL da poco impostassero questo ONLY_FULL_GROUP_BY modalità; otterrebbero risultati molto più prevedibili dalle loro query e il server rifiuterebbe le query non deterministiche.