Las funciones
Introducción
Las funciones son muy variadas y a menudo se implementan de manera diferente en cada SGBDR. No vamos a detallar todas las existentes. Abordaremos las más comunes y utilizadas.
Las funciones numéricas
Se pueden utilizar todos los operadores: +, -, *, / y también funciones como el valor absoluto, el coseno, los logaritmos, el módulo, el redondeo, etc.
Consulte la documentación del SGBDR para conocer las funciones que se implementan en la versión de la base de datos utilizada.
No vamos a ser muy exhaustivos en todas las funciones existentes, pero vamos a describir algunas funciones implementadas en los SGBDR.
1. ABS: valor absoluto
Ejemplo
SELECT idTarifa, FechaInicio, Precio, ABS(Precio)
AS Valor Absoluto FROM Tarifas;
idTarifa |
FechaInicio |
Precio |
Valor Absoluto |
1 |
2024-10-01 |
49,99 |
49,99 |
2 |
2024-10-01 |
59,99 |
59,99 |
3 |
2024-10-01 |
68,99 |
68,99 |
4 |
2024-10-01 |
59,99 |
59,99 |
5 |
2024-10-01 |
69,99 |
69,99 |
6 |
2024-10-01 |
79,99 |
79,99 |
7 |
2024-10-01 |
89,99 |
89,99 |
8 |
2024-12-15 |
57,49 |
57,49 |
2. Valor ASCII de un carácter
En este ejemplo vamos a mostrar el código ASCII del primer carácter de la columna Nombre de los hoteles:
SQL Server, MySQL y PostgreSQL
SELECT idHotel, Nombre, ASCII(SUBSTRING(Nombre, 1, 1)) AS Codigo
FROM Hoteles;
Oracle, MySQL y PostgreSQL
SELECT idHotel, Nombre, ASCII(SUBSTR(Nombre, 1, 1)) AS Codigo
FROM Hoteles;
idHotel |
Nombre |
Codigo |
1 |
Ski Hotel |
83 |
2 |
Art Hotel |
65 |
3 |
Rose Hotel |
82 |
4 |
Lions Hotel |
76 |
3. COS: coseno - SIN: seno
En este ejemplo se va a mostrar el coseno del precio para la tabla de Tarifas.
Ejemplo
SELECT idTarifa, FechaInicio, Precio, COS(Precio) AS Coseno
FROM Tarifas;
idTarifa |
FechaInicio |
Precio |
Coseno |
1 |
2024-10-01 |
49,99 |
0,962294075784641 |
2 |
2024-10-01 |
59,99 |
-0,955413415572478 |
3 |
2024-10-01 |
68,99 |
0,992192881610071 |
Para obtener el seno, utilice la misma sintaxis:
SELECT idTarifa, FechaInicio, Precio, SIN(Precio) AS Seno
FROM Tarifas;
4. LOG (<número base>,<columna>): logaritmo de la columna seleccionada en la base indicada
En este ejemplo se va a mostrar el logaritmo en base 2 de las tarifas.
Ejemplo
SELECT idTarifa, FechaInicio, Precio, LOG(2, Precio) AS Log
FROM Tarifas;
idTarifa |
FechaInicio |
Precio |
Log |
1 |
2024-10-01 |
49,99 |
0,177192879928986 |
2 |
2024-10-01 |
59,99 |
0,169300699821586 |
5. MOD(<columna>,<valor>): módulo
El módulo devuelve el resto de la división de una columna por un valor. En este ejemplo se va a mostrar el módulo del precio dividido por 4.
Oracle, MySQL y PostgreSQL
SELECT idTarifa, FechaInicio, Precio, MOD(Precio, 4) AS Modulo
FROM Tarifas;
idTarifa |
FechaInicio... |
Las funciones de gestión de fechas y horas
Existen multitud de formatos de visualización, de utilización y de funciones de cada SGBDR, no podemos describirlas todas aquí. En la sección Los diferentes formatos de visualización de fechas veremos las que se utilizan más comúnmente y el método para manipularlas.
1. Fecha del día: CURRENT_DATE
En Oracle existe CURRENT_DATE y SYSDATE. En MySQL, se puede utilizar CURRENT_DATE, CURDATE y NOW. Para SQL Server, es GETDATE() y SYSDATETIME()
Estas funciones permiten devolver la fecha del día, con precisiones diferentes (milisegundos, nanosegundos, etc.). En función del SGBDR, existen diferentes funciones que realizan lo mismo y son equivalentes.
Una pequeña particularidad en Oracle y SQL Server: SYSDATE y SYSDATETIME() devuelven la fecha del servidor en el que está instalada la base de datos y CURRENT_DATE o GETDATE() retornan la fecha de la sesión del usuario.
Por ejemplo, si la base de datos está instalada en un servidor americano y el usuario está en España, habrá una diferencia de mínimo 6 horas entre las dos fechas.
Oracle
SELECT CURRENT_DATE, SYSDATE FROM DUAL;
MySQL
SELECT CURRENT_DATE,CURRENT_DATE(), CURDATE(), NOW() FROM
DUAL;
SQL Server
SELECT GETDATE() AS fechaSesion, GETUTCDATE() AS fechaUTCSesion,
CURRENT_TIMESTAMP AS fechaSesion, SYSDATETIME() AS fechaSistema,
SYSUTCDATETIME() AS fechaUTCSistema, SYSDATETIMEOFFSET() AS
FechaOffsetSistema;
PostgreSQL
SELECT CURRENT_DATE, CURRENT_TIMESTAMP, LOCALTIMESTAMP, now(),
transaction_timestamp(), statement_timestamp(),
clock_timestamp(), timeofday();
En MySQL, SQL Server y PostgreSQL, el () significa que se trata de una función. Si no hay paréntesis es una variable.
Existen algunas diferencias de visualización entre funciones y variables. NOW, por ejemplo, muestra la fecha y la hora actual y el resto solo la fecha para MySQL. La visualización de estas funciones de tipo de fecha también depende de las opciones y parámetros utilizados por la base de datos (En Oracle NLS_DATE_FORMAT y dateformat para SQL Server).
Ya hemos visto que es preferible proporcionar el formato de fecha que se desea obtener en la consulta con la función TO_CHAR en Oracle o la función DATE_FORMAT en MySQL.
Ejemplo en Oracle
SELECT TO_CHAR(CURRENT_DATE,'DD/MM/YYYY')...
Las funciones con cadenas de caracteres
1. Intercambio entre mayúsculas y minúsculas LOWER / UPPER / UCASE / LCASE
Existen dos funciones para convertir las cadenas de caracteres en minúsculas o en mayúsculas. Los nombres difieren entre cada SGBD.
Para Oracle y SQL Server, se utilizará LOWER y UPPER. Para MySQL se permiten LOWER, UPPER, UCASE y LCASE.
LCASE y LOWER se utilizan para convertir a minúsculas y UCASE y UPPER para convertir a mayúsculas.
Ejemplos en Oracle
SELECT LOWER('Esto es una PRUEBA') AS MINUSCULA FROM DUAL;
MINUSCULA
----------------
esto es una prueba
SELECT UPPER('Esto es una PRUEBA') AS MAYUSCULA FROM DUAL;
MAYUSCULA
----------------
ESTO ES UNA PRUEBA
Ejemplos en MySQL
SELECT LCASE('Esto es una PRUEBA') AS MINUSCULA
+--------------------+
| MINUSCULA |
+--------------------+
| esto es una prueba |
+--------------------+
SELECT UCASE('Esto es una PRUEBA') AS MAYUSCULA
+--------------------+
| MAYUSCULA |
+--------------------+
| ESTO ES UNA PRUEBA |
+--------------------+
Ejemplos para SQL Server y PostgreSQL
SELECT LOWER('Esto es una prueba') AS MINUSCULA;
MINUSCULA
----------------
Esto es una prueba
SELECT UPPER('Esto es una prueba') AS MAYUSCULA;
MAYUSCULA
----------------
ESTO ES UNA PRUEBA
La sintaxis es:
SELECT LOWER o UPPER (<columna o variable>) ... FROM <tabla1>,
<tabla2> ...
con la posibilidad de utilizar LCASE y UCASE en MySQL.
2. Eliminar los espacios a la derecha o izquierda de una cadena de caracteres: TRIM / LTRIM / RTRIM
Para eliminar espacios en una cadena de caracteres, hay que utilizar LTRIM si están a la izquierda (Left) o RTRIM si están a la derecha (Right). Para eliminar espacios a izquierda y derecha, existe TRIM.
Ejemplos en Oracle y PostgreSQL
SELECT '*'||LTRIM(' ELIMINACIÓN DE LOS ESPACIOS A LA IZQUIERDA ')||'*'
AS SUPIZQ FROM DUAL;
SUPIZQ
-----------------------------------------------
*ELIMINACIÓN DE LOS ESPACIOS A LA IZQUIERDA * ...
Las principales funciones de conversión
1. Transformar un numérico o una fecha en texto: TO_CHAR
Se trata de las funciones TO_CHAR en Oracle y CAST en MySQL. Permiten convertir un numérico o una fecha en caracteres.
Ejemplo para Oracle
SELECT TO_CHAR(PRECIO) PRECIO, TO_CHAR(FECHAINICIO,'DD/MM/YY') FechaInicio
FROM Tarifas;
PRECIO |
FECHAINICIO |
69.99 |
16/04/24 |
59.99 |
16/04/24 |
69.99 |
16/04/24 |
79.99 |
16/04/24 |
89.99 |
16/04/24 |
Ejemplo para PostgreSQL, MySQL y SQL Server
SELECT CAST(Precio as char(6)) AS Precio, CAST(FechaInicio as char(10))
AS FechaInicio FROM Tarifas;
Otro ejemplo para SQL Server
SELECT CONVERT(char(6), Precio) AS Precio, CONVERT(char(10),
FechaInicio) AS FechaInicio FROM Tarifas;
Por lo tanto, la sintaxis para Oracle es:
SELECT TO_CHAR(<columna o variable>,[<FORMAT>],<cadena
buscada> ... FROM <tabla1>, <tabla2> ...
Por lo tanto, la sintaxis para PostgreSQL, MySQL y SQL Server es:
SELECT CAST(<columna o variable> as <TYPE>) ... FROM <tabla1>,
<tabla2> ...
Otra sintaxis para SQL Server es:
SELECT CONVERT(<TYPE>, <columna o variable>) ... FROM <tabla1>,
<tabla2> ...
2. Cambiar el tipo de una columna: CAST o CONVERT
Estas funciones permiten cambiar el tipo de una columna durante la sentencia SQL; por ejemplo, cambiar una columna que inicialmente era VARCHAR a INTEGER, para hacer un cálculo...
Las funciones de paginación
Las funciones de paginación permiten ordenar las filas o realizar cálculos sobre subgrupos después de haber particionado los registros.
1. Numeración secuencial y ordenación de filas
Estas son las funciones que permiten ordenar filas. RANK permite numerar filas en un orden determinado. DENSE_RANK permite numerar las filas en un orden con números consecutivos. ROW_NUMBER permite numerar filas con números consecutivos, como una serie. La numeración se puede realizar sobre subgrupos de registros.
A continuación se muestran ejemplos de numeración de la tabla tarifas por precio, con y sin partición por tipo de habitación.
Ejemplos para SQL Server, Oracle y PostgreSQL
SELECT Hotel, tipoHabitacion, Precio, RANK() OVER(ORDER BY Precio DESC)
AS Numero, DENSE_RANK() OVER(ORDER BY Precio DESC) AS NumeroConsecutivo,
ROW_NUMBER() OVER(ORDER BY Precio DESC) AS Consecutivo FROM Tarifas;
Hotel |
tipoHabitacion |
Precio |
Numero |
Numero Consecutivo |
Consecutivo |
2 |
7 |
103,49 |
1 |
1 |
1 |
3 |
7 |
103,49 |
1 |
1 |
2 |
1 |
7 |
103,49 |
1 |
1 |
3 |
4 |
7 |
103,49 |
1 |
1 |
4 |
4 |
6 |
91,99 |
5 |
2 |
5 |
1 |
6 |
91,99 |
5 |
2 |
6 |
SELECT Hotel, tipoHabitacion, Precio
, RANK() OVER(PARTITION BY TipoHabitacion ORDER BY Precio DESC) AS Numero
, DENSE_RANK() OVER(PARTITION BY TipoHabitacion ORDER BY Precio DESC) AS
NumeroConsecutivo
, ROW_NUMBER() OVER(PARTITION BY TipoHabitacion ORDER BY Precio DESC) AS
Consecutivo
FROM Tarifas;
Hotel |
tipoHabitacion |
Precio |
Numero |
Numero Consecutivo |
Consecutivo |
1 |
1 |
58,49 |
1 |
1 |
1 |
2 |
1 |
57,49 |
2 |
2 |
2 |
3 |
1 |
57,49 |
2 |
2 |
3 |
1 |
1 |
57,49 |
2 |
2 |
4 |
4 |
1 |
57,49 |
2 |
2 |
5 |
2 |
1 |
49,99 |
6 |
3 |
6 |
3 |
1 |
49,99 |
6 |
3 |
7 |
4 |
1 |
49,99 |
6 |
3 |
8 |
1 |
1 |
49,99 |
6 |
3 |
9 |
1 |
2 |
69,99 |
1 |
1 |
1 |
2 |
2 |
68,99 |
2 |
2 |
2 |
3 |
2 |
68,99 |
2 |
2 |
3 |
4 |
2 |
68,99 |
2 |
2 |
4 |
En este ejemplo, hay dos tipos de habitaciones que clasificamos por precio. El primer tipo tiene tres precios diferentes. Vemos la diferencia entre Numero y NumeroConsecutivo en el tercer precio, donde el número (función RANK) retoma la posición de la tarifa, es decir, 6, mientras que NumeroConsecutivo (función DENSE_RANK) continúa la numeración. La secuencia se basa en un paso de 1. La numeración vuelve a ser de 1 sobre el segundo tipo de habitación porque la partición se basa en el campo TipoHabitacion.
2. Distribución de filas en grupos numerados
La función NTILE permite distribuir y numerar filas en un número...
Otras funciones
1. NVL: comprobar si una columna es null
NVL por « Null Value » permite saber si una columna tiene datos o no y asignarle un valor en caso de que esté a nulos. La función correspondiente en SQL Server es ISNULL.
Sintaxis
SELECT NVL(<nombre columna>,<valor asignado>), ...
El valor asignado debe ser del mismo tipo que la columna.
Ejemplo Oracle
SELECT NumHabitacion, Comentario, NVL(Comentario, 'Vistas al jardín') AS
Comentarios FROM Habitaciones;
Ejemplo SQL Server
SELECT NumHabitacion, Comentario, ISNULL(Comentario, 'Vistas al jardín')
AS Comentarios FROM Habitaciones;
Resultado
NumHabitacion |
Comentario |
Comentarios |
1 |
Vistas agradables |
Vistas agradables |
2 |
|
|
3 |
NULL |
Vistas al jardín |
4 |
NULL |
Vistas al jardín |
Comprobamos que las habitaciones que tienen la columna Comentario a NULL se sustituyen por el valor «Vistas al jardín». La segunda fila contiene un espacio, que no se considera como NULL.
2. Comprobar varios valores: COALESCE
Esta función permite comprobar varios valores NULL de columnas en una misma función evitando así funciones « IF » « THEN », etc.
Comprueba cada columna y asigna el resultado de izquierda a derecha. Se asigna la primera columna no nula. Si todas las columnas son NULL, la función tomará el valor por defecto que debe ser el último parámetro.
Sintaxis
COALESCE(<columna1>, <columna2>,... <valor por defecto>);
Ejemplo
Si se tienen los siguientes datos en la tabla Tarifas:
idTarifa |
Hotel |
tipoHabitacion |
FechaInicio |
FechaFin |
Precio |
60 |
1 |
4 |
2025-04-15 |
2025-09-30 |
69,99 |
61 |
1 |
5 |
NULL |
2025-09-30 |
81,49 |
62 |
1 |
6 |
NULL |
NULL |
NULL |
Queremos tipar...
Ejercicios
Estos ejercicios se basan en las tablas indicadas en la sección La selección de datos - Ejercicios sobre la selección de datos del capítulo anterior.
Primer ejercicio
Recuperar la fecha del día en formato DD-MM-YYYY.
Segundo ejercicio
Convertir la siguiente cadena en mayúsculas y a continuación buscar la posición de la cadena ’GOL’.
’En el partido Málaga - Barcelona se marcó el primer gol en el minuto 69’
Tercer ejercicio
Eliminar los espacios a la izquierda y agregar ’-’ a la siguiente cadena hasta obtener una cadena de 50 caracteres.
’ El tiempo no permite realizar el trabajo’
Cuarto ejercicio
Seleccionar las películas cuyo realizador se llame ’LUC’ y que se hayan estrenado entre el ’01/01/85’ y el ’30/05/1995’.
Quinto ejercicio
Mostrar la fecha y la hora del día en el formato:
Hoy es Viernes 25 de septiembre de 2024 y son las 16 horas 26 minutos
Sexto ejercicio
Calcular el número de días que han pasado desde el estreno de cada película de la tabla PELICULAS.
A continuación mostrar estas cifras expresadas en meses.
Séptimo ejercicio
¿Cuál es la recaudación mundial, redondeada al segundo decimal, por día de proyección de cada película?
Octavo ejercicio
Ordene las películas...
Soluciones de los ejercicios
Primer ejercicio
Recuperar la fecha del día en formato DD-MM-YYYY.
SELECT TO_CHAR(CURRENT_DATE,'DD/MM/YYYY') FROM DUAL;
(Oracle y MySQL)
SELECT TO_CHAR(CURRENT_DATE,'DD-MM-YYYY'); (PostgreSQL y MySQL)
SELECT CONVERT(CHAR(10),GETDATE(),105); (SQL Server)
Segundo ejercicio
Convertir la siguiente cadena en mayúsculas y a continuación buscar la posición de la cadena ’GOL’.
’En el partido Málaga - Barcelona se marcó el primer gol en el minuto 69’
SELECT INSTR(UPPER('En el partido Málaga - Barcelona se marcó el primer
gol en el minuto 69'),'GOL') AS POSICION FROM DUAL;
(Oracle y MySQL)
SELECT POSITION('BUT' IN UPPER('En el partido Málaga /
Barcelona se marcó el primer
gol en el minuto 69')) AS POSITION;
(PostgreSQL)
SELECT CHARINDEX('BUT',UPPER('En el partido Málaga /
Barcelona se marcó el primer
gol en el minuto 69')) AS POSITION;
(SQL Server)
POSICION
----------
52
Tercer ejercicio
Eliminar los espacios a la izquierda y agregar ’-’ a la siguiente cadena hasta obtener una cadena de 50 caracteres.
’ El tiempo no permite realizar el trabajo’
SELECT RPAD(LTRIM(' El tiempo no permite realizar
el trabajo'),50,'-') AS MEF FROM DUAL;
(Oracle y MySQL)
SELECT RPAD(LTRIM(' El tiempo no permite realizar
el trabajo'),50,'-') AS MEF; (MySQL y PostgreSQL)
SELECT LTRIM(' El tiempo no permite realizar
el trabajo') + REPLICATE('-','50') AS MEF; (SQL Server)
MEF
---
El tiempo no permite realizar el trabajo---
Cuarto ejercicio
Seleccionar las películas cuyo realizador se llame ’LUC’ y que se hayan estrenado entre el ’01/01/85’ y el ’30/05/1995’.
SELECT * FROM PELICULA...