SQL: ¿Cuál es el Orden por defecto de las consultas?

Resuelto Vijayan asked hace 13 años • 0 respuestas

¿Cuál es el orden predeterminado de una consulta cuando ORDER BYse utiliza no?

Vijayan avatar Jan 06 '12 00:01 Vijayan
Aceptado

No existe tal orden presente. Tomado de ¿Cuál es el orden de clasificación predeterminado de SELECTS sin cláusula ORDER BY?

  • No dependa del pedido cuando falta ORDER BY.

  • Siempre especifique ORDER BY si desea un orden en particular; en algunas situaciones, el motor puede eliminar ORDER BY debido a cómo realiza algún otro paso.

  • AGRUPAR POR fuerzas ORDENAR POR. (Esto es una violación del estándar. Se puede evitar usando ORDER BY NULL).

SELECT * FROM tbl-- esto hará un "escaneo de tabla". Si la tabla nunca ha tenido ELIMINACIONES/REEMPLAZAR/ACTUALIZACIONES, los registros estarán en el orden de inserción, de ahí lo que observó.

Si hubiera hecho la misma declaración con una tabla InnoDB, se habrían entregado en orden PRIMARY KEY, no en orden INSERT. Nuevamente, esto es un artefacto de la implementación subyacente, no algo de lo que depender.

Rahul avatar Jan 05 '2012 17:01 Rahul

No hay ninguno. Dependiendo de lo que consulte y de cómo se optimizó su consulta, puede obtener cualquier pedido. Ni siquiera hay garantía de que dos consultas que tengan el mismo aspecto arrojen resultados en el mismo orden: si no lo especifica, no puede confiar en ello.

alf avatar Jan 05 '2012 17:01 alf

Descubrí que SQL Server es casi aleatorio en su orden predeterminado (dependiendo de la antigüedad y la complejidad de los datos), lo cual es bueno ya que te obliga a especificar todos los pedidos.

(Recuerdo vagamente que Oracle es similar a SQL Server a este respecto).

MySQL de forma predeterminada parece ordenar según la estructura de registros en el disco (que puede incluir entradas fuera de secuencia debido a eliminaciones y optimizaciones), pero a menudo inicialmente engaña a los desarrolladores para que no se molesten en usar cláusulas de orden por porque los datos parecen estar predeterminados en orden de clave primaria, ¡lo cual no es el caso!

Me sorprendió descubrir hoy que MySQL 5.6 y 4.1 implícitamente subordenan los registros que se han ordenado en una columna con una resolución limitada en la dirección opuesta . Algunos de mis resultados tienen valores de clasificación idénticos y el orden general es impredecible. por ejemplo, en mi caso era un DESC ordenado por una columna de fecha y hora y algunas de las entradas estaban en el mismo segundo, por lo que no se podían ordenar explícitamente. En MySQL 5.6 seleccionan en un orden (el orden de inserción), ¡pero en 4.1 seleccionan al revés! Esto provocó un error de implementación muy molesto.

No encontré documentación sobre este cambio, pero encontré notas sobre el orden de grupo implícito en MySQL :

De forma predeterminada, MySQL ordena todas las consultas GROUP BY col1, col2, ... como si también especificara ORDER BY col1, col2, ... en la consulta.

Sin embargo:

Depender de la clasificación GROUP BY implícita en MySQL 5.5 está en desuso. Para lograr un orden específico de resultados agrupados, es preferible utilizar una cláusula ORDER BY explícita.

Entonces, de acuerdo con las otras respuestas, nunca confíe en el orden predeterminado o implícito en ninguna base de datos.

scipilot avatar May 21 '2014 12:05 scipilot

El orden predeterminado dependerá de los índices utilizados en la consulta y del orden en que se utilicen. Puede cambiar a medida que cambian los datos/estadísticas y el optimizador elige diferentes planes.

Si desea los datos en un orden específico, utilice ORDER BY

 avatar Jan 05 '2012 17:01