Aprende leyendo en orden

Funciones ③ — Funciones matemáticas (ROUND / FLOOR / CEILING) y COALESCE

El tercero de tres artículos sobre funciones SQL. Cubre las funciones matemáticas ROUND / FLOOR / CEILING / POWER y COALESCE — que devuelve el primer valor no-NULL — usando conjuntos de datos staff y test-score cargados desde CSV.

Datos usados en este artículo — staff y test_score

El último artículo sobre funciones cubre las funciones matemáticas y COALESCE. Con las funciones matemáticas, manejaremos redondeo, suelo, techo y exponenciación en valores numéricos como la columna salary. Con COALESCE, cubriremos el reemplazo de NULL por otro valor.

Este artículo usa dos CSV. La primera mitad (funciones matemáticas) usa la misma tabla staff que antes (10 empleados). La segunda mitad (COALESCE) trae una nueva tabla test_score (8 estudiantes × 3 intentos de prueba, con NULL). En test_score, las columnas score_1 / score_2 / score_3 tienen NULL donde un estudiante estuvo ausente y no hizo esa prueba — perfecto para un escenario realista como «usar la nota de la primera prueba que el estudiante pudo hacer» para aprender cómo funciona COALESCE.

Antes de meterte en los ejercicios, verifiquemos las definiciones de columnas y los datos de muestra de ambas tablas — staff y test_score.

① Ejecuta PRAGMA table_info(staff); y PRAGMA table_info(test_score); para ver las columnas de ambas.

② Ejecuta SELECT * FROM staff LIMIT 5; y SELECT * FROM test_score LIMIT 5; para previsualizar las primeras 5 filas.

Editor SQL

Ejecutar una consulta para ver el resultado

Funciones matemáticas — ROUND / FLOOR / CEILING / POWER

Aquí están las 4 funciones principales para dar forma a valores numéricos:

- ROUND(x, n): redondea a n decimales. Omite n y redondea a entero

- FLOOR(x): suelo (redondea hacia infinito negativo)

- CEILING(x) o CEIL(x): techo (redondea hacia infinito positivo)

- POWER(x, y): exponenciación (x elevado a y)

-- 1) ROUND: redondeo
SELECT ROUND(3.14);          -- 3 (entero)
SELECT ROUND(3.14, 1);       -- 3.1 (1 decimal)

-- 2) FLOOR: suelo
SELECT FLOOR(3.84);          -- 3
-- Nota: CEILING funciona en MySQL / PostgreSQL / Oracle / SQL Server — SELECT CEILING(3.14); → 4

-- 3) POWER: exponenciación
SELECT POWER(3, 4);          -- 81 (3 a la 4)
SELECT POWER(2, 10);         -- 1024

-- 4) En columna — redondea el salario mensual
SELECT name, salary, ROUND(salary / 12.0) AS monthly
FROM staff;
EntradaROUND (redondeo)FLOOR (suelo)CEILING (techo / no disponible en la consola de este curso)
3.14334
3.84434
3.50434
-3.14-3-4 (hacia negativo)-3

Imagina una petición: «divide el salario anual entre 12 para obtener el salario mensual, mostrado como entero redondeado». (Si lo ejecutas correctamente, aparecerá una explicación.)

① Desde la tabla staff, extrae name, salary, y `ROUND(salary / 12.0)` con el alias `monthly` — 3 columnas en total.

② Ordena por monthly descendente.

③ Verifica que el resultado tiene 10 filas y empieza con Frank Tanaka 7,200,000 / 600,000.

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina una petición: «estima el salario anual dentro de 3 años, asumiendo un aumento del 10% cada año». Multiplicar por el mismo factor varias veces se puede escribir en una expresión con `POWER(x, y)` (x elevado a y). Tres aumentos consecutivos de × 1.1 se convierten en salary * POWER(1.1, 3), que es lo mismo que salary * 1.331.

① Desde la tabla staff, extrae name, salary y *`ROUND(salary POWER(1.1, 3)) con el alias salary_after_3y`** — 3 columnas en total (ROUND mantiene el resultado como entero).

② Ordena por salary_after_3y descendente y queda solo con las 5 primeras filas.

③ Verifica que el resultado es 5 filas, empezando con Frank Tanaka 7,200,000 / 9,583,200 y David Sato 6,800,000 / 9,050,800 como fila 2.

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina una petición: «en la visualización del salario mensual, comprueba cómo cambia el resultado entre redondeo y suelo». Coloca las 2 funciones de redondeo lado a lado sobre la misma expresión para ver la diferencia de comportamiento de un vistazo.

① Desde la tabla staff, extrae name, salary, `ROUND(salary / 12.0)` como `round_monthly` y `FLOOR(salary / 12.0)` como `floor_monthly` — 4 columnas en total.

② Ordena por salary ascendente y queda solo con las 5 primeras filas.

③ Verifica que el resultado es 5 filas en el orden Emi / Carol / Iris / Alice / Bob. Para Alice (cuyo salario se divide exactamente entre 12), round_monthly y floor_monthly deberían ser iguales; para los demás deberían diferir (la parte decimal cambia el comportamiento).

Editor SQL

Ejecutar una consulta para ver el resultado

COALESCE — devuelve el primer valor no-NULL

`COALESCE(valor1, valor2, valor3, ...)` evalúa sus argumentos de izquierda a derecha y devuelve el primero que no sea NULL. Si todos son NULL, devuelve NULL. Úsala cuando quieras un respaldo para NULL: «usa la columna principal si tiene valor, si no la columna de respaldo, si no un valor por defecto».

Este artículo usa la tabla test_score. Para cada student_id, score_1 / score_2 / score_3 contienen las notas de las pruebas 1ª, 2ª y 3ª, con NULL donde el estudiante estuvo ausente. Pasar (score_1, score_2, score_3, 0) a COALESCE te da la nota de la primera prueba que el estudiante pudo hacer, tratada como «nota final». Añadir 0 al final significa «si faltó a las tres, tratarlo como 0».

Cómo funciona COALESCE — devuelve el primer no-NULL desde la izquierda
ArgumentosValor elegidoSignificado(85, 92, 78)85El 1º es no-NULL,devolverlo(NULL, 78, 88)781º es NULL,devolver el 2º(NULL, NULL, 95)951º y 2º NULL,devolver el 3º(NULL, NULL, NULL)NULLTodos NULL,devolver NULL
Los argumentos se evalúan de izquierda a derecha, y se devuelve el primer valor no-NULL. Pon un literal (como 0 o 'unknown') al final para establecer un valor por defecto.
-- 1) Verifica con valores literales
SELECT COALESCE(NULL, NULL, 'C');         -- 'C'
SELECT COALESCE(NULL, NULL, NULL);        -- NULL

-- 2) Saca la nota final de la tabla test_score
SELECT student_id, name, score_1, score_2, score_3,
       COALESCE(score_1, score_2, score_3) AS first_score
FROM test_score;

-- 3) Usa un valor por defecto — «ausente en todas = 0 puntos»
SELECT student_id, name,
       COALESCE(score_1, score_2, score_3, 0) AS final_score
FROM test_score;

La versión de 2 argumentos se puede escribir como IFNULL

Para el caso más simple de 2 argumentos — «si es NULL, usa un valor por defecto; si no, el valor original» — también puedes escribir IFNULL(columna, default) (soportado tanto en la consola de este curso como en MySQL). COALESCE(email, 'no registrado') y IFNULL(email, 'no registrado') son exactamente lo mismo.

Cuando necesitas 3 o más argumentos, usa COALESCE. Como COALESCE es el estándar SQL, la misma forma funciona en PostgreSQL, Oracle, SQL Server, etc. — es la opción más portable.

Imagina una petición: «hicimos 3 pruebas, pero hubo ausencias — usa la nota de la primera prueba que cada estudiante pudo hacer como nota final».

① Desde la tabla test_score, extrae student_id, name, score_1, score_2, score_3 y `COALESCE(score_1, score_2, score_3)` con el alias `first_score` — 6 columnas en total.

② Verifica que el resultado es 8 filas: Alice 85 (score_1 es no-NULL), Bob 78 (score_1 es NULL así que se elige score_2), Carol 95 (score_1 y score_2 son NULL así que score_3), Dave NULL (todos NULL).

Editor SQL

Ejecutar una consulta para ver el resultado

Imagina una petición: «da a cada estudiante una nota final. Trata a los estudiantes consistentemente ausentes como 0, y premia al top 3 por nota final».

① Desde la tabla test_score, extrae student_id, name y `COALESCE(score_1, score_2, score_3, 0)` con el alias `final_score` — 3 columnas en total.

② Ordena por final_score descendente y queda solo con las 3 primeras filas.

③ Verifica que el resultado es 3 filas: Carol 95 / Frank 90 / Grace 88.

Editor SQL

Ejecutar una consulta para ver el resultado
QUIZ

Verificación de conocimientos

Responde cada pregunta una a una.

Pregunta 1¿Cuál de los siguientes es el resultado correcto de SELECT ROUND(3.84);?

Pregunta 2¿Qué devuelve SELECT FLOOR(3.84), CEILING(3.14);?

Pregunta 3¿Qué devuelve SELECT COALESCE(NULL, NULL, 'C', 'D');?