Cómo Ordenar en MySQL Ignorando Ceros y NULLs para un Orden Ascendente Perfectopost-template-default single single-post postid-46 single-format-standard et_pb_button_helper_class et_fixed_nav et_show_nav et_secondary_nav_enabled et_primary_nav_dropdown_animation_fade et_secondary_nav_dropdown_animation_fade et_header_style_left et_pb_footer_columns4 et_cover_background et_pb_gutter et_pb_gutters3 et_right_sidebar et_divi_theme et-db
771 715 4434

El comando ORDER BY en MySQL se utiliza para ordenar los resultados de una consulta SQL en orden ascendente o descendente. ORDER BY ordena el resultado final de una consulta. La clasificación de registros se puede realizar en función de una o más columnas. El comando ORDER BY es extremadamente útil cuando necesita organizar datos en un orden específico, ya sea alfabético, numérico, cronológico, etc. Por ejemplo, es posible que desee enumerar todos sus clientes en orden alfabético o ver todas sus ventas por fecha.

Para utilizar el comando ORDER BY, debe especificar el nombre de la columna por la que desea ordenar después del comando. De forma predeterminada, el comando ORDER BY ordenará los resultados en orden ascendente. ASC (ascendente): de menor a mayor / de A a Z / de antiguo a reciente. Si desea ordenar los resultados en orden descendente, puede utilizar la palabra clave DESC después del nombre de la columna. DESC (descendente): de mayor a menor / de Z a A / de reciente a antiguo.

También puedes ordenar por más de una columna. Por ejemplo, es posible que desee ordenar a sus clientes primero por "apellido" y luego por "nombre". En este caso, MySQL primero ordenará los resultados por "apellido". Además, puede especificar una dirección de clasificación diferente para cada columna. Por ejemplo, es posible que desee ordenar por "apellido" en orden ascendente y por "nombre" en orden descendente.

El Problema: Ceros y NULLs al Principio en Orden Ascendente

A menudo surge una necesidad específica al ordenar en MySQL: los registros no ordenados (NULL o con valor 0) se colocan los primeros cuando se aplica un ORDER BY ASC. Esto es lo contrario de lo que muchos usuarios desean. Al igual que SQLite, MySQL considera que los valores NULL son inferiores a cualquier valor no NULL; por lo tanto, por defecto, pone estos valores en primer lugar cuando se ordena de forma ascendente y en último lugar cuando se ordena de forma descendente.

Verás los valores NULL primeros cuando una columna esté ordenada de manera ascendente y últimos cuando la columna está ordenada de manera descendente. La pregunta es: ¿hay alguna forma simple de ordenar los registros 1,2,3,4 y que el 0 lo ponga al final en vez de al principio?

Lea también: descubre los temas principales de Niña Bonita

Comportamiento de Ordenamiento de NULLs en Diferentes Bases de Datos

El estándar SQL no define el ordenamiento predeterminado de valores NULL. Si aplicas la cláusula ORDER BY a una columna con valores NULL, los valores NULL se colocarán en primer o último lugar en el conjunto de resultados. El resultado depende del tipo de base de datos.

  • De manera predeterminada, PostgreSQL considera los valores NULL mayores que cualquier valor no NULL. Si ordenas tu salida en orden ascendente, añadiendo la palabra clave ASC o por defecto (es decir, sin especificar el orden), todos los valores NULL se mostrarán últimos en la salida.
  • Oracle trata los valores NULL de la misma manera que PostgreSQL. En concreto, la documentación de Oracle indica que "si no se especifica el ordenamiento de los valores nulos, el manejo de los valores nulos es NULLS LAST (nulos al final) si el ordenamiento es ASC, y NULLS FIRST (nulos al principio) si el ordenamiento es DESC".
  • A diferencia de los tipos de bases de datos anteriores, SQLite considera que los NULL son menores que cualquier otro valor. Si ordenas una columna con valores NULL en orden ascendente, los NULL irán primero.
  • Al igual que SQLite, MySQL considera que los valores NULL son inferiores a cualquier valor no NULL.
  • SQL Server también trata los valores NULL como menores que cualquier valor no NULL.

Ahora que conoces el comportamiento predeterminado de varias bases de datos en la ordenación de los valores NULL, quizás te preguntes si es posible cambiarlo. La respuesta varía según el tipo de base de datos. El estándar SQL ofrece las opciones NULLS FIRST / NULLS LAST (nulos al principio/nulos al final) que cambian el ordenamiento de los valores NULL cuando se añaden a ORDER BY. Desafortunadamente, no todas las bases de datos aceptan este estándar.

  • Como hemos visto, PostgreSQL y Oracle tratan los valores NULL como mayores, y los ponen al final de un ordenamiento ascendente y al principio de un ordenamiento descendente.
  • A diferencia de PostgreSQL y Oracle, SQLite trata los valores NULL como valores pequeños, y los pone primeros en una ordenación ascendente y últimos en una ordenación descendente.

Soluciones para Ordenar Ceros y NULLs al Final en MySQL

En MySQL, existen varias estrategias para modificar este comportamiento y lograr que los ceros o valores NULL aparezcan al final de una ordenación ascendente.

1. Usando una Expresión Booleana en ORDER BY (para Ceros)

La definición de una expresión como n1 = 0 devolverá un valor booleano (verdadero o falso) al comparar el valor de n1 para cada fila con el valor constante de cero. MySQL trata FALSE como 0 y TRUE como 1 en contextos numéricos.

Cuando se utiliza ORDER BY n1 = 0, n1, la base de datos ordena primero por el resultado de la expresión n1 = 0. Los valores donde n1 no es cero harán que la expresión sea FALSE (0), y los valores donde n1 es cero harán que la expresión sea TRUE (1). Dado que 0 se ordena antes que 1 en orden ascendente, esto provoca que los registros no-cero se ordenen primero, y luego los registros con cero.

Lea también: guía para ordenar los eventos de un relato infantil

Consideremos el siguiente ejemplo:

CREATE TABLE mynumbers (n1 INTEGER UNSIGNED);INSERT INTO mynumbers (n1) VALUES(4),(2),(0),(3),(1);

Si ejecutamos una consulta para ver cómo se comporta la expresión:

SELECT n1 = 0 AS nn, n1 FROM mynumbers ORDER BY n1 = 0, n1;

El resultado sería:

+----+----+¦ nn ¦ n1 ¦+----+----+¦ 0 ¦ 1 ¦¦ 0 ¦ 2 ¦¦ 0 ¦ 3 ¦¦ 0 ¦ 4 ¦¦ 1 ¦ 0 ¦+----+----+

Aquí se ve cómo la expresión n1 = 0 devuelve 0 (falso) para los valores 1, 2, 3, 4 y 1 (verdadero) para el valor 0. El ordenamiento ORDER BY n1 = 0, n1 primero ordena por la columna nn (0s antes que 1s), y luego por n1. La primera columna se ordena en orden, falso (o ceros) primero, seguido de verdadero (o 1s) y luego la segunda parte de su expresión ORDER BY se aplica, que es el valor real de n1. Esto logra el efecto deseado de poner el cero al final.

2. Usar el Operador IS (NOT) NULL (para NULLs)

Este truco funciona para todos los tipos de datos. Con esta técnica, podemos confiar en el hecho de que IS NULL devuelve un 1 para todas las expresiones NULL y un 0 en caso contrario. Para ordenar los valores NULL al final en orden ascendente, se puede usar:

Lea también: Actividades de lectura: ordenar cuentos populares para niños

ORDER BY (columna IS NULL) ASC, columna ASC

De esta misma manera, también podemos ordenar la salida en orden descendente y hacer que los valores NULL aparezcan en primer lugar si se ajusta la lógica.

3. Usar la Función COALESCE (para NULLs)

La función COALESCE también funciona para todos los tipos de datos y es una solución efectiva para manejar NULLs. Si no estás familiarizado con esta función, permite reemplazar los valores NULL con un valor especificado. Para que los NULLs aparezcan al final en un ordenamiento ascendente, puedes reemplazarlos con un valor muy grande que se ordenará después de todos los demás datos:

ORDER BY COALESCE(columna, valor_muy_grande) ASC

Al igual que MySQL, SQL Server no admite las opciones NULLS FIRST / NULLS LAST. Sin embargo, los trucos con el operador menos (aunque menos aplicable aquí para el problema específico de cero al final) y la función COALESCE funcionan en SQL Server de la misma manera que en MySQL.

Consideraciones de Rendimiento y Buenas Prácticas

Es importante recordar que el orden de los resultados puede tener un impacto significativo en el rendimiento de la consulta. Por lo tanto, siempre es una buena idea pensar detenidamente cómo y cuándo utilizar el comando ORDER BY.

  • Una función en el ORDER BY, como las expresiones booleanas o COALESCE, generalmente resulta en "adiós índice" (salvo índices funcionales), lo que puede afectar el rendimiento en tablas muy grandes.
  • La paginación profunda: OFFSET grandes fuerzan a leer y descartar filas hasta llegar al offset, lo que puede hacer que la paginación sea lenta con OFFSET altos.
  • JOIN + ORDER BY: indexamos tanto las claves de unión como las columnas del ORDER BY para optimizar.
  • No determinismo: ORDER BY solo por una columna con muchos empates puede llevar a un orden relativo que parezca azaroso. Cuando hay empates en la primera columna, el orden relativo entre filas empatadas puede parecer azaroso. Siempre se debe diseñar un desempate.
  • Confiar en el "orden natural": ningún SGBD garantiza orden sin ORDER BY.
  • Collation incorrecta: listados con tildes/ñ mal ordenados. Si el proyecto sirve a varios países, alineamos la collation con la regla de negocio del listado.

Como práctica estándar, tratamos ORDER BY como un contrato con el frontend y con el usuario: siempre estable, alineado con negocio y eficiente gracias a índices que lo soporten. En resumen, la instrucción ORDER BY en MySQL es una poderosa herramienta que le permite ordenar los resultados de sus consultas SQL de varias maneras. En algunos casos, puede resultar más eficaz ordenar los datos en la aplicación cliente que en la base de datos. La declaración ORDER BY es, por lo tanto, una parte esencial de SQL y una herramienta valiosa para cualquier desarrollador de bases de datos.

tags: #cómo #ordenar #asc #mysql #sin #tomar