Uso de funciones
Al escribir consultas SQL podemos usar funciones integradas. Por ejemplo, si queremos mostrar una cadena en mayúsculas, podemos usar la función UPPER.
MySQL 8.4SELECT UPPER('Hello world') AS upper_string;
¿Qué es una función integrada?
Una función integrada es un fragmento de código implementado en el SGBD que permite transformar datos de texto, numéricos y de otros tipos en las consultas.
Cada función recibe un conjunto de argumentos de un tipo determinado, ejecuta las operaciones que tiene programadas y siempre devuelve uno de los literales posibles. Hay que tener en cuenta que las funciones pueden recibir tanto cero argumentos como varios.
Por ejemplo, la función NOW() recibe cero argumentos y devuelve un literal en formato de fecha, mientras que LENGTH('sql-academy') recibe un argumento de texto y devuelve el literal numérico «11».
Ejemplos de funciones
Hay bastantes funciones, pero las principales siempre las puedes encontrar con el buscador de la cabecera o en la página de funciones de la Referencia SQL.
Estas son algunas de ellas:
-
LOWER
Devuelve una cadena con todos los caracteres en minúsculas
MySQL 8.4SELECT LOWER('SQL Academy') AS lower_string; -
YEAR
Devuelve el año de la fecha indicada
MySQL 8.4SELECT YEAR('2022-06-16') AS year; -
INSTR
Busca una subcadena dentro de una cadena y devuelve la posición de su primer carácter. La cuenta empieza en uno, y no en cero como en la mayoría de los lenguajes de programación.
La función compara carácter a carácter la cadena original con la que se busca. Por ejemplo, en la cadena sql-academy la subcadena academy aparece a partir del quinto carácter.
MySQL 8.4SELECT INSTR('sql-academy', 'academy') AS idx; -
LENGTH
Devuelve la longitud de la cadena indicada.
MySQL 8.4SELECT LENGTH('sql-academy') AS str_length;
-
LOWER
Devuelve una cadena con todos los caracteres en minúsculas
MySQL 8.4SELECT LOWER('SQL Academy') AS lower_string; -
EXTRACT
Extrae una parte de la fecha (año, mes, día, etc.) de la fecha indicada
MySQL 8.4SELECT EXTRACT(YEAR FROM DATE '2022-06-16') AS year; -
POSITION
Busca una subcadena dentro de una cadena y devuelve la posición de su primer carácter. La cuenta empieza en uno, y no en cero como en la mayoría de los lenguajes de programación.
La función compara carácter a carácter la cadena original con la que se busca. Por ejemplo, en la cadena sql-academy la subcadena academy aparece a partir del quinto carácter.
MySQL 8.4SELECT POSITION('academy' IN 'sql-academy') AS idx; -
LENGTH
Devuelve la longitud de la cadena indicada.
MySQL 8.4SELECT LENGTH('sql-academy') AS str_length;
Aplicar funciones a los valores de las columnas de una tabla
Las funciones no solo se pueden aplicar a literales, sino también a valores obtenidos de una tabla. En ese caso, la función hace la transformación para cada fila por separado.
Por ejemplo, volvamos a nuestra base de datos y fijémonos en la tabla FamilyMembers: contiene el nombre, el estatus y la fecha de nacimiento de las personas.
Podemos modificar cada valor de estas columnas al mostrarlo. Así, la siguiente consulta calcula la longitud del nombre completo de cada miembro de la familia.
MySQL 8.4SELECT member_name, LENGTH(member_name) AS fullname_length FROM FamilyMembers;
Operaciones con el resultado de una función
Como sabemos que cada función debe devolver uno de los literales posibles, su resultado también se puede usar en cálculos y transformaciones posteriores.
Por ejemplo, queremos obtener las tres primeras letras de una cadena y pasarlas a mayúsculas. Para ello basta con combinar dos funciones, LEFT y UPPER, de modo que el resultado de una sea el argumento de la otra.
MySQL 8.4SELECT UPPER(LEFT('sql-academy', 3)) AS str;
O queremos calcular la longitud del apellido de una persona a partir de una cadena con el formato nombre<espacio>apellido. Una de las formas posibles de calcularla es usar la función LENGTH y buscar la posición del espacio, con la fórmula <longitud del apellido> = <longitud de toda la cadena> - (<longitud del nombre> + <longitud del espacio>):
- El valor <longitud de toda la cadena> se puede obtener con la función LENGTH
- Para <longitud del nombre> + <longitud del espacio> hay que calcular la posición del carácter en el que termina el nombre y sumarle uno, ya que el espacio tiene longitud «1». Podemos hacerlo usando solo la función INSTR y tomando como referencia el carácter «espacio»
Como ambas funciones devuelven literales numéricos, podemos hacer operaciones aritméticas con ellos. Restemos uno del otro y obtendremos la longitud del apellido (lastname_length):
MySQL 8.4SELECT member_name, LENGTH(member_name) AS full_length, INSTR(member_name, ' ') AS firstname_with_space_length, LENGTH(member_name) - INSTR(member_name, ' ') AS lastname_length FROM FamilyMembers;
- Para <longitud del nombre> + <longitud del espacio> hay que calcular la posición del carácter en el que termina el nombre y sumarle uno, ya que el espacio tiene longitud «1». Podemos hacerlo usando solo la función POSITION y tomando como referencia el carácter «espacio»
Como ambas funciones devuelven literales numéricos, podemos hacer operaciones aritméticas con ellos. Restemos uno del otro y obtendremos la longitud del apellido (lastname_length):
MySQL 8.4SELECT member_name, LENGTH(member_name) AS full_length, POSITION(' ' IN member_name) AS firstname_with_space_length, LENGTH(member_name) - POSITION(' ' IN member_name) AS lastname_length FROM FamilyMembers;