sql >> Base de Datos >  >> RDS >> Oracle

Por qué los comportamientos Group By de Mysql y Group by de Oracle son diferentes

Los diseñadores de MySQL pusieron su extensión no estándar en GROUP BY en un intento de hacer el desarrollo más fácil y ciertas consultas más eficientes.

Aquí está su razón de ser.

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

Hay un modo de servidor llamado ONLY_FULL_GROUP_BY que deshabilita las extensiones no estándar. Puede configurar este modo usando esta declaración.

 SET SESSION SQL_MODE='ONLY_FULL_GROUP_BY'  

Aquí hay una cita de esa página, con énfasis añadido.

Si ONLY_FULL_GROUP_BY está deshabilitado, una extensión de MySQL para el uso estándar de SQL de GROUP BY permite la lista de selección, HAVING condición, o ORDER BY list para hacer referencia a columnas no agregadas incluso si las columnas no dependen funcionalmente de GROUP BY columnas... En este caso, el servidor es libre de elegir cualquier valor de cada grupo , por lo que, a menos que sean iguales, los valores elegidos son no deterministas , que probablemente no es lo que quieres.

La palabra importante aquí es no determinista. ¿Qué significa eso? Significa aleatorio, pero peor. Si el servidor eligió valores aleatorios, eso implica que devolverá diferentes valores en diferentes consultas, por lo que tiene la posibilidad de detectar el problema cuando pruebe su software. Pero no determinista en este contexto significa que el servidor elige el mismo valor cada vez, hasta que no lo hace.

¿Por qué podría cambiar el valor que elige? Una actualización del servidor es una de las razones. Un cambio en el tamaño de la tabla podría ser otro. El punto es que el servidor es libre de devolver el valor que quiera.

Desearía que las personas que recién están aprendiendo SQL establezcan esto ONLY_FULL_GROUP_BY modo; obtendrían resultados mucho más predecibles de sus consultas y el servidor rechazaría las consultas no deterministas.