1-Tema 6 Funciones

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Tema 6

Funciones
1) ¿Cómo se usan las funciones?
2) Funciones numéricas
3) Funciones con cadenas
4) Funciones de trabajo con nulos
5) Funciones de manejo de fechas e intervalos
6) Funciones de conversión
7) Funciones de control de flujo
8) Funciones de listas
9) Funciones de agrupación o de totales
Reconocimiento

1
1. Cómo se usan las funciones
Todos los SGBD implementan funciones para facilitar la creación de consultas
complejas. Las funciones no son más que una extensión de los operadores y por
tanto se usan también para crear expresiones y realizar cálculos a partir de los
datos de la bd. Esas funciones dependen del SGBD que utilicemos, aunque hay
muchas estándar. En estos apuntes se comentan las más significativas tal como
se utilizan con MariaDB.

Información completa de funciones en MariaDB se puede consultar en su


documentación oficial: https://mariadb.com/kb/en/built-in-functions/.

Todas las funciones devuelven un resultado que procede de un determinado


cálculo. La mayoría de funciones precisan que se les envíen datos de entrada,
denominados parámetros, que son los objetos sobre los que se realizarán los
cálculos de la función. Los argumentos pueden ser columnas, expresiones,
variables o constantes. El resultado de la función, que siempre es un valor,
lógicamente depende de los argumentos enviados. Éstos se pasan entre
paréntesis. Por tanto, la forma de invocar a una función es:
nombreFunción([parámetro1, parámetro2,...])
y devuelve el resultado, que es un único valor.

En realidad, hay dos tipos de funciones:


• Funciones que operan con datos de la misma fila.
• Funciones que operan con datos de varias filas diferentes (funciones de
agrupación).

2. Funciones numéricas
Función Descripción
ROUND(n,[decimales]) Redondea el número con los decimales indicados. Si se omiten los
decimales, redondea a entero. Si los decimales son negativos, redondea a
la izquierda de la coma decimal.
Ejem: SELECT ROUND(8.239,2); → Devuelve 8.24
ROUND(8.239); → 8
ROUND(2348.239,-2); → 2300
TRUNCATE(n,decimal En lugar de redondear, corta los decimales para que sólo quede el
es) número de decimales indicado. En este caso no se pueden omitir los
decimales, pero si se indica el valor 0 en este campo, el resultado no tiene
parte fraccionaria (trunca al entero). Si los decimales son negativos,
trunca a la izquierda de la coma decimal.
Ejem: SELECT TRUNCATE(3.57,1) → Devuelve 3.5
TRUNCATE(3.57) → ERROR TRUNCATE(3.57, 0) → 3
TRUNCATE(392.57, -2) → 300 TRUNCATE(-392.57, -2) → -300
CEIL(n) ó CEILING(n) Valor entero más próximo y superior a n
Ejem: SELECT CEIL(2.7); → 3
CEIL(2) → 2 CEIL(-2.3) → -2 CEIL(-2) → -2
FLOOR(n) Valor entero más próximo e inferior a n -- Parte entera
Ejem: FLOOR(2.7) → 2 FLOOR(2) → 2

2
FLOOR(-2.3) → -3 FLOOR(-2) → -2
MOD(n1,n2) Devuelve el resto del resultado de dividir n1 entre n2
Ejem: MOD(11,4) → 3 MOD(2,5) → 2 (2 entre 5=0 y de resto 2)
POWER(valor,exponen Eleva el valor al exponente indicado
te) ó POW(valor, Ejem: SELECT POWER(7, 2); → 49
exponente)
SQRT(n) Calcula la raíz cuadrada de n (n no puede ser negativo)
Ejem: SQRT(9) → 3, SQRT(14) → 3.74…
SIGN(n) Devuelve 1 si n es positivo, cero si vale cero y -1 si es negativo
ABS(n) Calcula el valor absoluto de n
Ejem: ABS(2) → 2 ABS(-2) → 2
EXP(n) Calcula e aumentado al número n, donde e=2.7182818
LN(n) Logaritmo natural de n
LOG10(n) Logaritmo en base 10 de n
SIN(n) COS(n) TAN(n) Trigonométricas
ACOS(n) ASIN(n) Para
ATAN(n) aplicaciones
DEGREES(n) Convierte de radianes a grados matemáticas

RADIANS(n) Convierte de grados a radianes

*** EJERCICIOS – Realiza los ejercicios 1 y 2 ***

3. Funciones con cadenas


Función Descripción
LOWER(texto) ó Convierte el texto a minúsculas (según el conjunto de caracteres que se esté
LCASE(texto) usando, por defecto latin1).
Ejem: SELECT LOWER('JESUS'); → jesus

SELECT LOWER(nombre) FROM NOMBRES; → Devuelve los nombres de


la columna “nombre” en minúsculas (pedro, juan, maría…).
UPPER(texto) ó Convierte el texto a mayúsculas
UCASE(texto) Ejem: UPPER(‘jesus’) → JESUS

* UPPER y LOWER son ineficaces cuando se aplican a cadenas binarias


(BINARY, VARBINARY, BLOB). Para realizar una conversión a minúsculas o
mayúsculas, habría previamente que convertir la cadena a una cadena no
binaria con la función CONVERT.
SET @str = BINARY 'North Carolina';
SELECT LOWER(CONVERT(@str USING latin1));
RTRIM(texto) Elimina los espacios blancos a la derecha del texto.
Ejem: RTRIM(‘JESUS ’) → JESUS
LTRIM(texto) Idem que anterior por la izquierda
Ejem: LTRIM(‘ JESUS’) → JESUS
TRIM(texto) Elimina los espacios en blanco a la izquierda y la derecha del texto.
Ejem: SELECT TRIM(' babJESUSaa '); → babJESUSaa
TRIM([{BOTH | Devuelve la cadena str con todos los prefijos remstr eliminados. Si no se
LEADING | especifica ninguno de los especificadores BOTH, LEADING ó TRAILING, se

3
TRAILING} [remstr] asume BOTH. remstr es opcional y, si no se especifica, se eliminan los
FROM] str), espacios.
TRIM([remstr Ejem: SELECT TRIM(‘ jesus ‘); → jesus
FROM] str) SELECT TRIM(LEADING 'x' FROM 'xxxbarxxx'); → barxxx
SELECT TRIM(BOTH 'x' FROM 'xxxbarxxx'); → bar
SELECT TRIM(TRAILING 'xyz' FROM 'barxxyz'); → barx

Sobre un campo de una tabla, ejemplo:


SELECT direc, TRIM('C/' FROM direc) FROM alumnos;

CONCAT(c1, c2,…) Encadena c1 y c2 (y el resto de argumentos, si los hay)


Ejem: SELECT CONCAT('mar', 'ia') maria; → maria
SELECT CONCAT(direc, ' Población: ', pobla) FROM alumnos; → C/ Las
Matas, 3 Población: Madrid
CONCAT_WS(sep, Significa “Concatenate With Separator”, es decir, concatena con separador.
c1, c2,…) El primer argumento es el separador para el resto de los argumentos. El
separador puede ser una cadena, como el resto de argumentos.
Ejem: SELECT CONCAT_WS('---', direc, ' Población ', pobla) FROM
alumnos; → C/ Las Matas, 3 --- Población --- Madrid
SUBSTR ó Sin el parámetro len, la función devuelve una subcadena de la cadena str
SUBSTRING comenzando en la posición pos. Con el parámetro len, devuelve una
Usos: subcadena de len caracteres de la cadena str comenzando en la posición
SUBSTRING(str, pos.
pos) Si pos es un valor negativo, el comienzo de la subcadena es pos caracteres
desde el final de la cadena (en vez de desde el comienzo).
SUBSTRING(str
FROM pos) Ejem: SELECT SUBSTR('Logroño',-3,2); ---> ‘oñ’
SUBSTR(‘maria’, 1, 3); → mar
SUBSTRING(str, SUBSTR(‘maria’, 2); → aria
pos, len) SUBSTR(‘maria’, -2); → ia

SUBSTRING(str SELECT SUBSTR(fecha_alt, 6, 2) AS Mes FROM emple; → Del campo


FROM pos FOR len) fecha_alt (1990-01-20 0000:00), está extrayendo el mes de alta en la
empresa (a partir del sexto carácter, los dos siguientes).
LEFT(str, len) Devuelve los len caracteres de la cadena str, empezando por la izquierda /
derecha.
RIGHT(str, len)
Ejem: SELECT LEFT('MariaDB', 5); → Maria
SELECT RIGHT('MariaDB', 2); → DB
LENGTH(texto) Obtiene la longitud de la cadena texto medida en bytes (para un carácter
multi-byte, habría que multiplicar la cadena por el número de bytes de cada
carácter; es decir, una cadena con 5 caracteres donde cada carácter ocupa
2 bytes, devolverá 10 (con CHAR_LENGTH devolvería 5). Si texto no es una
cadena, el parámetro se convierte a cadena automáticamente.
Ejem: SELECT LENGTH('JESUS '); → 6

SELECT LENGTH(direc) FROM alumnos; → Devuelve las longitudes de las


direcciones almacenadas en alumnos.

4
SELECT LENGTH(emp_no) FROM emple; → Devuelve 4 (longitud del
campo emp_no)
CHAR_LENGTH(tex Devuelve la longitud de la cadena texto, medida en caracteres, ocupen estos
to) uno o múltiples bytes. Si texto no es una cadena, el parámetro se convierte
a cadena automáticamente.
INSTR(str, substr) Devuelve la posición de la primera ocurrencia de substr dentro de str.
Realiza la búsqueda sin tener en cuenta las mayúsculas. Si no la encuentra,
devuelve 0.

Ejem: SELECT INSTR('JESUS', 'S'); → 3

SELECT INSTR(titulo, 'quijote') FROM libro; → Devolvería la posición de la


cadena quijote (sin distinguir mayúsculas o no) en cada una de las filas de la
tabla libro → 5, 5, 0, 0 (en la primera y segunda filas empieza en la posición
5, en la tercera y cuarta no existe).
STRCMP(expr1, Devuelve 0 si las cadenas son iguales; -1 si el primer argumento es más
expr2) pequeño que el segundo según un orden alfabético y 1 en caso contrario.

Ejem: SELECT STRCMP('text', 'text2'); → -1


SELECT STRCMP('text2', 'text'); → 1
SELECT STRCMP('text', 'text'); → 0
LOCATE(substr, str) Sin pos, devuelve la posición de la primera ocurrencia de la subcadena
substr en la cadena str. Con pos, devuelve la posición de la primera
LOCATE(substr, str, ocurrencia de la subcadena substr en la cadena str a partir de la posición
pos) pos. Devuelve 0 si substr no está en str. No diferencia mayúsculas y
minúsculas.
POSITION(substr IN
str) Ejem: SELECT LOCATE('bar', 'foobarbar'); → 4
SELECT LOCATE('My', 'Maria'); → 0
SELECT LOCATE('bar', 'foobarbar', 5); → 7
REPLACE(str, Devuelve la cadena str con todas las ocurrencias de la cadena from_str
from_str, to_str) reemplazadas por la cadena to_str. Esta función sí tiene en cuenta
mayúsculas/minúsculas.

Ejem: SELECT REPLACE('JESUS', 'S', 'B'); → JEBUB

SELECT REPLACE(titulo, 'Quijote', '***') FROM libro; → Cambia los Quijote


(escrito la 1ª con mayúsculas) por *** en las filas de la columna título.
REVERSE(texto) Invierte el texto (le da la vuelta)
Ejem: SELECT REVERSE ('ROMA PARIS'); → SIRAP AMOR

SELECT REVERSE(editorial) FROM libro;


LPAD(str, len Rellena el texto str a la izquierda (LPAD) o a la derecha (RPAD) con el
[,padstr]) carácter indicado en padstr para ocupar la anchura indicada en len.
Si el texto es más grande que la anchura indicada, el texto se recorta.
RPAD(str, len Si no se indica carácter de relleno, se rellenará el espacio marcado con
[,padstr]) espacios en blanco.
Ejem: SELECT LPAD('Hola',10,'-'); → Da como resultado ------Hola
LPAD('LUCIA', 9, '.'); → .…LUCIA
LPAD(‘LUCIA’, 9); → ‘ LUCIA’
RPAD(‘LUCIA’, 9, ’.’); → LUCIA….

5
RPAD(‘LUCIA’, 9) → ‘LUCIA ’
SELECT LPAD(numpag, 6, '---') FROM libro; → ---240, ---327

ASCII(carácter) Devuelve el código ASCII del carácter indicado

Ejem: SELECT ASCII('a'); → 97.


CHR(número) Devuelve el carácter correspondiente al código ASCII indicado.

Ejem: SELECT CHR(67); → C.


SOUNDEX(texto) Devuelve el valor fonético del texto. Busca textos de los que se no se sabe
con exactitud su escritura.

Ejem: SELECT * FROM EMPLE WHERE


SOUNDEX(apellido)=SOUNDEX('RE'); → Busca a los empleados cuyo
apellido suena como RE → REY
SOUNDEX('Hello'); → H400

4. Funciones de trabajo con nulos


Permiten definir valores a utilizar en el caso de que las expresiones tomen el valor
nulo.

Función Descripción
NVL(valor,sustituto) Si el valor es NULL, devuelve el valor sustituto; de otro modo,
devuelve valor
Ejem: SELECT apellido, salario+NVL(comision,0) FROM emple;
NVL2(valor,sustituto1, Variante de la anterior, devuelve el valor sustituto1 si valor no es nulo.
sustituto2) Si valor es nulo devuelve el sustituto2
Ejem: SELECT apellido, salario+NVL2(comision,10000,0) FROM
emple;
COALESCE(listaExpresion Permite comprobar varios valores NULL de columnas en una misma
es) función evitando así funciones IF-THEN. Comprueba cada columna y
devuelve la primera de las expresiones que no es nula. Si todas las
columnas fueran NULL, la función tomará el valor por defecto que se
le pasa como último parámetro. Ejemplo:
CREATE TABLE test ( col1 VARCHAR(1), col2 VARCHAR(1), col3
VARCHAR(1));
INSERT INTO test VALUES (NULL, 'B', 'C');
INSERT INTO test VALUES ('A', NULL, 'C');
INSERT INTO test VALUES (NULL, NULL, 'C');
INSERT INTO test VALUES ('A', 'B', 'C');
SELECT COALESCE(col1, col2, col3) FROM test;
El resultado es: B A C A
NULLIF(valor1,valor2) Devuelve nulo si valor1 es igual a valor2. De otro modo devuelve
valor1
Ejem: SELECT apellido, NULLIF(salario, comision) FROM emple;

6
IFNULL(expr1, expr2) Si expr1 no es nulo, IFNULL() devuelve expr1; si no, devuelve expr2.
Ejem: SELECT apellido, salario, comision, IFNULL(comision, 0)
FROM emple;

*** EJERCICIOS – Realiza el ejercicio 3 ***

5. Funciones de manejo de fechas e intervalos


Hay que tener en cuenta que para que los nombres de los meses y las
abreviaciones aparezcan en español, hay que configurar la variable global
lc_time_names. Esta variable afecta al resultado de las funciones
DATE_FORMAT, DAYNAME y MONTHNAME.

Para configurar la variable global a nuestro idioma hay que hacer lo siguiente:
SET lc_time_names = ‘es_ES’;
Una vez hecho esto, se puede consultar su valor indicando:
SELECT @@lc_time_names;

Función Descripción
SYSDATE([precisión]) Obtiene la fecha y hora actuales del servidor en el que está
instalada la base de datos. Precisión determina la precisión en
microsegundos.

Ejem: SELECT SYSDATE();

SELECT SYSDATE(4);

NOW([precisión]) ó Como SYSDATE, obtiene la fecha y hora actuales del servidor en


CURRENT_TIMESTAMP([pre el que está instalada la base de datos.
cisión])
La diferencia respecto a SYSDATE es que SYSDATE devuelve el
tiempo en el cual la función se ejecuta, mientras que NOW
devuelve el tiempo en el cual comenzó a ejecutarse la sentencia
que incluya a dicha función. A esto se le puede ver más sentido
cuando se usan estas funciones en procedimientos almacenados y
en triggers.

Ejem: SELECT NOW(), SLEEP(2), NOW();

7
SELECT SYSDATE(), SLEEP(2), SYSDATE();

CURRENT_DATE() ó Obtiene la fecha actual en formato ‘YYYY-MM-DD’ ó ‘YYYYMMDD’


CURDATE() dependiendo de si la función es utilizada en un contexto de cadena
o numérico.

Ejem: SELECT CURDATE(); → 2021-01-16


CURRENT_TIME([precisión]) Devuelve la hora actual en formato ‘HH:MM:SS’ ó
ó CURTIME([precisión]) ‘HHMMSS.uuuuuu’ dependiendo de si la función es utilizada en un
contexto de cadena o numérico.

Ejem: SELECT CURTIME(); → 18:20:51


SELECT CURTIME(3); → 18:21:20:633
DATE(expr) Extrae la parte de la fecha de una expresión en formato fecha ó
fecha/hora.

EJEM: SELECT DATE('2020-12-29 12:21:32'); → 2020-12-29


TIME(expr) Extra la parte de la hora de una expresión en formato hora ó
fecha/hora.

EJEM: SELECT TIME('2020-12-31 01:02:03'); → 01:02:03


DATE_ADD(date,INTERVAL Realiza operaciones aritméticas con fechas. El argumento date
expr unit) y especifica la fecha (o fecha/hora) de comienzo. Expr es una
expresión que especifica el intervalo a ser añadido o sustraído de
DATE_SUB(date,INTERVAL la fecha de comienzo. Expr es una cadena; puede comenzar por “-“
expr unit) para intervalos negativos. Unit es una palabra reservada que indica
las unidades en la cual la expresión debería ser interpretada.

Ejem: SELECT '2020-12-31 23:59:59' + INTERVAL 1 SECOND; →


2021-01-01 00:00:00
SELECT INTERVAL 1 DAY + '2020-12-31'; → 2021-01-01
SELECT '2021-01-01' - INTERVAL 1 SECOND; → 2020-12-31
23:59:59
SELECT DATE_ADD('2020-12-31 23:59:59', INTERVAL 1
SECOND); → 2021-01-01 00:00:00
SELECT DATE_ADD('2020-12-31 23:59:59', INTERVAL 1 DAY); →
2021-01-01 23:59:59
SELECT DATE_ADD('2020-12-31 23:59:59', INTERVAL '1:1'
MINUTE_SECOND); → 2021-01-01 00:01:00
SELECT DATE_ADD('2021-01-01 00:00:00', INTERVAL '-1 10'
DAY_HOUR); → 2020-12-30 14:00:00
SELECT DATE_SUB('2021-01-02', INTERVAL 31 DAY); → 2020-
12-02
SELECT DATE_SUB('2021-01-01 00:00:00', INTERVAL '1 1:1:1'
DAY_SECOND); → 2020-12-30 22:58:59
ADDDATE(date, Cuando se utiliza la sintaxis con INTERVAL en el segundo
INTERVAL expr unit) ó argumento, ADDDATE es sinónimo de DATE_ADD.
ADDDATE(expr, days) Ejem: SELECT DATE_ADD('2021-01-02', INTERVAL 31 DAY); →
2021-02-02

8
Cuando se utiliza la sintaxis con days, este argumento referencia el
número de días a ser añadido a expr.
Ejem: SELECT ADDDATE('2021-01-02', 31); → 2021-02-02
ADDTIME(expr1, expr2) Añade expr2 a expr1 y devuelve el resultado. Expr1 es una
expresión en formato hora o fecha/hora y expr2 es una expresión
en formato hora.

Ejem: SELECT ADDTIME('2020-12-31 23:59:59.999999', '1


1:1:1.000002'); → 2021-01-02 01:01:01.000001
SELECT ADDTIME('01:00:00.999999', '02:00:00.999998'); →
03:00:01:999997
PERIOD_ADD(p, n) Añade n meses al período p (expresado en formato YYMM ó
YYYYMM).

Ejem: SELECT PERIOD_ADD(202101,2); → 202103


DATEDIFF(expr1, expr2) Devuelve (expr1-expr2) expresado como un valor de días entre
una fecha y otra. Expr1 y expr2 son expresiones de fecha o
fecha/hora.

Ejem: SELECT DATEDIFF('2020-12-31 23:59:59','2020-12-30'); →


1
SELECT DATEDIFF('2020-11-30 23:59:59','2020-12-31'); → -31
PERIOD_DIFF(p1, p2) Devuelve el número de meses entre los períodos p1 y p2
(expresados en formato YYMM ó YYYYMM).

Ejem: SELECT PERIOD_DIFF(202002,202103); → -13

DATE_FORMAT(date, Formatea la fecha según el formato especificado. El lenguaje


format[, locale]) utilizado depende del valor de la variable del Sistema
lc_time_names. Se pueden utilizar varios modificadores de format,
entre los que se incluyen:
- %a → Nombre corto del día de la semana.
- %b → Nombre corto del mes.
- %c → Mes con 1 ó 2 dígitos.
- %d → Día con 2 dígitos.
- %e → Día con 1 ó 2 dígitos.
- %H → Hora con 2 dígitos entre 00-23.
- %h → Hora con 2 dígitos entre 01-12.
- %i → Minuto con 2 dígitos.
- %j → Día del año (001-366).
- %M → Nombre completo del mes.
- %m → mes con 2 dígitos.
- %r → Hora en formato de 12 horas seguido por AM/PM.
- %S → Segundos con 2 dígiitos.
- %T → Hora en formato 24 horas.
- %v → Número de semana (01-53) empezando en lunes.
- %W → Nombre completo del día de la semana
- %w → Día de la semana (0=domingo, 6=sábado).
- %x → Año con 4 dígitos (primer día de la semana lunes).
- %Y → Año con 4 dígitos.
- %y → Año con 2 dígitos.

9
Ejem: SELECT DATE_FORMAT('2021-02-16 22:23:00', '%W %M
%Y'); → martes febrero 2021
SELECT DATE_FORMAT('2021-02-16 22:23:00', '%d %y %a %m
%b %j'); → 16 21 mar 02 feb 047
SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H %r %T %S
%w'); → 22 10:23:00 PM 22:23:00 00 6
STR_TO_DATE(str, format) Es la inversa de la función DATE_FORMAT(). Toma una cadena
str y un formato de cadena format y devuelve un valor DATETIME
si el formato de cadena contiene partes de fecha y hora, o un TIME
si contiene solo horas, o un DATE si contiene solo fechas. Se
utilizan modificadores iguales que el caso anterior.

Ejem: SELECT STR_TO_DATE('Wednesday, June 2, 2014', '%W,


%M %e, %Y'); → 2014-06-02
DAY(date) ó Devuelve el día del mes de la fecha pasada.
DAYOFMONTH(date)
Ejem: SELECT DAYOFMONTH('2021-03-26'); → 26
DAYNAME(date) Devuelve el día de la semana de la fecha pasada.

Ejem: SELECT DAYNAME('2021-03-26'); → viernes


DAYOFWEEK(date) y Devuelve el número del día de la semana (1=domingo...
WEEKDAY(date) 7=sábado). Esto contrasta con la función WEEKDAY, que tiene
índices diferentes (0=lunes… 6=domingo).

Ejem: SELECT DAYOFWEEK('2021-03-26'); → 6


SELECT WEEKDAY('2021-03-26'); → 4
DAYOFYEAR(date) Devuelve el día del año, entre 1 y 366.

Ejem: SELECT DAYOFYEAR('2021-03-26'); → 85


HOUR(time) / Extrae la hora, los minutos ó segundos de una hora dada.
MINUTE(time) /
SECOND(time) Ejem: SELECT HOUR(sysdate()); → 19
MONTHNAME(date) Devuelve el nombre completo del mes de la fecha pasada

Ejem: SELECT MONTHNAME('2021-02-03'); → febrero


YEAR(date) Devuelve el año de una fecha dada.

Ejem: SELECT YEAR('1987-01-01'); → 1987


LAST_DAY(date) Obtiene el último día del mes al que pertenece la fecha. Devuelve
un valor DATE
Ejem: SELECT LAST_DAY(sysdate()); → 2021-01-31
EXTRACT(unit FROM date) Extrae un valor numérico de una fecha concreta. El valor puede ser
day (día), month (mes), year (año), etc.

Ejem: SELECT EXTRACT (MONTH FROM SYSDATE()); →


Devuelve 1.
SELECT EXTRACT(YEAR_MONTH FROM '2020-07-02 01:02:03');
→ 202007

10
6. Funciones de conversión
CONVERT y CAST

Sintaxis:
• CONVERT (expr, type)
• CAST (expr AS type)

• CONVERT (expr USING transcoding_name)

Las funciones CONVERT y CAST toman un valor de un tipo y lo convierten a otro.

La principal diferencia entre CONVERT y CAST es que CONVERT(expr, type)


cumple con la sintaxis ODBC mientras que CAST (expr AS type) y CONVERT( …
USING…) son sintaxis SQL92.

CONVERT con USING se utiliza para convertir datos entre diferentes conjuntos de
caracteres (se puede consultar más información sobre conjuntos de caracteres en
https://mariadb.com/kb/en/character-set-and-collation-overview). Por ejemplo, la
instrucción SELECT CONVERT('abc' USING utf8); convierte la cadena ‘abc’ del
conjunto de caracteres por defecto al conjunto de caracteres utf8.

Ejem:
SET @x = BINARY 'AardVark';
SELECT LOWER(@x), LOWER(CONVERT (@x USING latin1));
--Se convierte un dato binario a cadena para poder pasarlo a minúsculas

Ejem:
SELECT CAST(2.345 AS DECIMAL(7,6)); → 2.345000

Para convertir una cadena a un valor numérico, normalmente no hay que hacer
nada; sencillamente se usa el valor de la cadena como si se tratase de un número.
Ejem: SELECT 1+'1'; → 2

De igual forma, si se usa un número en un contexto de cadena, el número se


convertirá automáticamente a cadena binary.
Ejem: SELECT CONCAT('hello you ',2); → hello you 2

7. Funciones de control de flujo

OPERADOR CASE

Sintaxis:
CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN
result ...] [ELSE result] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result ...]
11
[ELSE result] END

La primera versión devuelve el resultado si value=compare_value. La segunda


versión devuelve el resultado de la primera condición que sea verdadera. Si no hay
ningún resultado coincidente, se devuelve el resultado especificado tras ELSE o
NULL si no hay parte ELSE.

Ejem:
SELECT CASE 1 WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'more' END; →
one

SELECT CASE WHEN 1>0 THEN 'true' ELSE 'false' END; → true

FUNCIÓN IF

Sintaxis: IF(expr1, expr2, expr3);

Si expr1 es verdadero (expr1 <> 0 y expr1 <> NULL) entonces la función devuelve
expr2; si no, devuelve expr3. La función devuelve un valor numérico o cadena,
dependiendo del contexto en el que se use.

Ejem: SELECT IF(1>2,2,3); → 3

*** EJERCICIOS – Realiza el ejercicio 4 ***

8. Funciones de listas
Las funciones de listas trabajan sobre un grupo de columnas dentro de una misma
fila. Comparan los valores de varias columnas de la misma fila, para obtener el
mayor o el menor. Su formato es:

GREATEST(valor1,valor2, … ) → Obtiene el valor mayor


LEAST(valor1,valor2, … ) → Obtiene el valor menor

Ejem: SELECT GREATEST(34.0,3.0,5.0,767.0); → 767.0

Ejem: Salario, comisión y valores mayor y menor de los cuatro de los empleados
que no tienen la comisión nula:
SELECT salario, comision, GREATEST(salario, comision), LEAST(salario,
comision) FROM emple WHERE comision IS NOT NULL;

*** EJERCICIOS – Realiza el ejercicio 5 y 6 ***

12
9. Funciones de agrupación o de totales
Hasta ahora se han visto funciones que trabajan con valores simples, pero hay
otras funciones estadísticas que actúan sobre un grupo de filas para obtener un
valor, como, por ejemplo, el salario medio, el número de departamentos que hay
en una ciudad, el empleado más antiguo, etc. Los valores nulos son ignorados y se
realizan los cálculos sin contar con ellos.

Son muy interesantes en conjunción con agrupaciones (GROUP BY, que se verá
en el siguiente tema) pues en estos casos ofrece muchas más posibilidades.

Función Significado
COUNT(expresión) Cuenta las filas no nulas de la expresión. Se utiliza el
COUNT (DISTINCT expr, [expre…]) asterisco para contar las filas.
Puede anteponerse a la expresión DISTINCT, para que no
cuente valores repetidos. Por defecto, cuanta los repetidos.

Ejem: SELECT COUNT(*) FROM emple WHERE comision


IS NOT NULL; → 4
SUM(expresión) Suma los valores de la expresión

Ejem: SELECT SUM(SALARIO) FROM emple WHERE


comision IS NOT NULL; → 6075
AVG(expresión) Calcula la media aritmética sobre la expresión indicada

Ejem: SELECT AVG(SALARIO) FROM emple WHERE


comision IS NOT NULL; → 1518.7500
MIN(expresión) Mínimo valor que toma la expresión indicada

Ejem: SELECT MIN(salario) FROM emple WHERE comision


IS NOT NULL; → 1350
MAX(expresión) Máximo valor que toma la expresión indicada

SELECT MAX(salario) FROM emple WHERE comision IS


NOT NULL; → 1625

*** EJERCICIOS – Realiza el ejercicio 7-16 ***

*** EJERCICIOS – Realiza el ejercicio 17-35 ***

Reconocimiento
La base de estos apuntes ha sido desarrollada por la profesora Lidia Aisa Melgosa.

Adaptados al SGBD MariaDB por José Luis De Cáceres García, con aportaciones
(texto e imágenes) del profesor José Juan Sánchez, cuya obra tiene los permisos
.

13

También podría gustarte