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.4
SELECT UPPER('Hello world') AS upper_string;
upper_string
HELLO WORLD

¿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.4
    SELECT LOWER('SQL Academy') AS lower_string;
    
    lower_string
    sql academy
  • YEAR

    Devuelve el año de la fecha indicada

    MySQL 8.4
    SELECT YEAR('2022-06-16') AS year;
    
    year
    2022
  • 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.4
    SELECT INSTR('sql-academy', 'academy') AS idx;
    
    idx
    5
  • LENGTH

    Devuelve la longitud de la cadena indicada.

    MySQL 8.4
    SELECT LENGTH('sql-academy') AS str_length;
    
    str_length
    11
  • LOWER

    Devuelve una cadena con todos los caracteres en minúsculas

    MySQL 8.4
    SELECT LOWER('SQL Academy') AS lower_string;
    
    lower_string
    sql academy
  • EXTRACT

    Extrae una parte de la fecha (año, mes, día, etc.) de la fecha indicada

    MySQL 8.4
    SELECT EXTRACT(YEAR FROM DATE '2022-06-16') AS year;
    
    year
    2022
  • 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.4
    SELECT POSITION('academy' IN 'sql-academy') AS idx;
    
    idx
    5
  • LENGTH

    Devuelve la longitud de la cadena indicada.

    MySQL 8.4
    SELECT LENGTH('sql-academy') AS str_length;
    
    str_length
    11

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.4
SELECT member_name,
	LENGTH(member_name) AS fullname_length
FROM FamilyMembers;
member_namefullname_length
Headley Quincey15
Flavia Quincey14
Andie Quincey13
Lela Quincey12
Annie Quincey13
Ernest Forrest14
Constance Forrest17
Wednesday Addams16

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.4
SELECT UPPER(LEFT('sql-academy', 3)) AS str;
str
SQL

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.4
SELECT 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.4
SELECT 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;
member_namefull_lengthfirstname_with_space_lengthlastname_length
Headley Quincey1587
Flavia Quincey1477
Andie Quincey1367
Lela Quincey1257
Annie Quincey1367
Ernest Forrest1477
Constance Forrest17107
Wednesday Addams16106