2012-01-05 15 views
35

¿Cuál es el orden predeterminado de una consulta cuando no se utiliza ORDER BY?SQL: ¿Cuál es el orden por defecto de las consultas?

+2

Creo que depende del motor de almacenamiento y los índices potencialmente. – smp7d

+0

Se pueden encontrar respuestas útiles en preguntas similares, como [la mejor práctica de SQL para manejar el orden de clasificación predeterminado] (http://stackoverflow.com/questions/1793147/sql-best-practice-to-deal-with-default-sort -order) y [orden de fila de MySQL para "SELECT * FROM table_name;"] (http://stackoverflow.com/questions/1949641/mysql-row-order-for-select-from-table-name). – Wiseguy

Respuesta

16

No hay ninguno. Dependiendo de lo que consulte y cómo se optimizó su consulta, puede obtener cualquier orden. Ni siquiera hay garantía de que dos consultas que parezcan iguales devolverán resultados en el mismo orden: si no lo especifica, no puede confiar en él.

+0

, si conoce el motor y los índices existentes, puede predecir el orden =) – newtover

+0

@newtover true, pero agregar 'ORDER BY' es mucho más fácil que predecir el plan de consulta y recordar el diseño físico que sugiero pegar a la primera :) Encantado de conocerte aquí, de todos modos. – alf

+0

predecir el orden es bastante útil cuando un pedido explícito puede dar lugar a tablas temporales y archivos comprimidos, aunque el orden requerido ya está allí. Sin embargo, explícito es mejor que implícito. Encantado de conocerte también :) – newtover

42

No hay tal orden presente. Tomado de http://forums.mysql.com/read.php?21,239471,239688#msg-239688

  • No dependa de orden cuando ORDER BY no se encuentra.

  • Siempre especifique ORDER BY si desea un pedido en particular; en algunas situaciones, el motor puede eliminar el ORDER BY porque hace algún otro paso.

  • GRUPO POR fuerzas ORDENAR POR. (Esta es una violación de la norma Esto puede ser evitado mediante el uso de ORDER BY NULL..)

SELECT * FROM tbl - esto va a hacer un "recorrido de tabla". Si la tabla tiene nunca tuvo DELETE/REPLACE/UPDATEs, los registros serán en el orden de inserción, de ahí lo que observó.

Si hubiera hecho la misma declaración con una tabla InnoDB, se hubieran entregado en orden PRIMARY KEY, no en INSERTAR. De nuevo, esto es un artefacto de la implementación subyacente, no depende de .

+0

Gran respuesta, y está en armonía con http: //dba.stackexchange. com/q/6051/877 ya que no existe garantía entre los motores de almacenamiento y entre versiones de que un pedido esté predeterminado en absoluto. +1 !!! – RolandoMySQLDBA

2

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

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

3

que he encontrado de SQL Server a ser casi al azar en su orden predeterminado (dependiendo de la edad y la complejidad de los datos), lo cual es bueno, ya te obliga a especificar todos los pedidos.

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

MySQL por defecto parece a la orden por la estructura de registro en el disco, (que puede incluir entradas fuera de la secuencia debido a supresiones y optimizaciones), pero a menudo engaña a los desarrolladores para que no se molesten en utilizar cláusulas de orden de compra porque los datos parecen predeterminados para el orden de clave primaria, que es no el caso!

Me sorprendió descubrir hoy, que MySQL 5.6 y 4.1 registros de sub pedidos implícitos que se han ordenado en una columna con una resolución limitada en la dirección opuesta. Algunos de mis resultados tienen valores de orden idénticos y el orden general es impredecible. p.ej. en mi caso, se trataba de 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 condujo a un error de implementación muy molesto.

me encontré have't documentación sobre este cambio, pero encontré notes on on implicit group order in MySQL:

Por defecto, MySQL ordena todo GROUP BY col1, col2, ... consultas, si ha especificado ORDER BY col1, col2, ... en la consulta también.

Sin embargo:

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

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

Cuestiones relacionadas