MySQL Funciones: cadena, numérica, definida por el usuario, almacenada

⚡ Resumen inteligente

MySQL Las funciones transforman los datos antes de almacenarlos o recuperarlos, devolviendo un único resultado calculado. Este artículo explica las funciones integradas para cadenas de texto, números y fechas, y luego muestra cómo las funciones almacenadas y definidas por el usuario amplían el motor de la base de datos.

  • 🔤 Funciones de cadena: Las funciones UCase, LCASE y CONCAT modifican el formato del texto en el momento de la consulta; asigne un alias a la columna calculada con AS para que el conjunto de resultados tenga un encabezado legible.
  • 🔢 Numérico Operatores: DIV realiza una división entera, / devuelve un cociente decimal y % (o MOD) devuelve el resto de una división.
  • ???? Funciones de fecha: DATE_FORMAT convierte el valor almacenado YYYY-MM-DD en cualquier patrón de visualización, como %d-%m-%Y, sin modificar ni una sola línea de código de la aplicación.
  • 🛠️ Funciones almacenadas: CREATE FUNCTION registra lógica reutilizable dentro del servidor; declárelo NOT DETERMINISTIC siempre que el cuerpo llame a CURDATE() o NOW().
  • ⚙️ Funciones definidas por el usuario: Rutinas externas escritas en C o C++ se compilan en el servidor y luego se comportan exactamente como funciones nativas.
  • 🚀 Impacto en el rendimiento: Al trasladar los cálculos a la base de datos, se elimina la lógica duplicada de cada aplicación cliente y se reducen los viajes de ida y vuelta de la red.

¿Qué son MySQL ¿Funciones?

MySQL puede hacer mucho más que simplemente almacenar y recuperar datos. También puede realizar manipulaciones en los datos antes de recuperarlo o guardarlo. Ahí es donde MySQL Aquí entran en juego las funciones. Las funciones son simplemente fragmentos de código que realizan una operación y devuelven un resultado. Algunas funciones aceptan parámetros, mientras que otras no.

Veamos brevemente un ejemplo. Por defecto, MySQL guarda los tipos de datos de fecha en el formato “AAAA-MM-DD”. Supongamos que hemos creado una aplicación y nuestros usuarios quieren que la fecha se devuelva en el formato “DD-MM-AAAA”. Podemos usar el MySQL función integrada DATE_FORMAT para lograr esto. DATE_FORMAT es una de las funciones más utilizadas en MySQLy lo analizaremos en detalle más adelante en esta lección.

Cualquiera que sea su tipo, una función siempre devuelve un único valor, puede aceptar cero o más parámetros dentro de paréntesis, y puede utilizarse en cualquier lugar donde se permita una expresión — en una lista SELECT, una cláusula WHERE o una cláusula ORDER BY.

Por qué usar MySQL ¿Funciones?

Ahora que sabemos qué es una función, la siguiente pregunta es por qué deberíamos trasladar este trabajo a la base de datos.

¿Por qué utilizar MySQL Funciones

Como muestra el diagrama anterior, una función toma un valor de entrada, aplica la lógica una sola vez dentro del motor de la base de datos y devuelve un único resultado a cada aplicación que lo solicita.

Los programadores podrían estar pensando: "¿Para qué molestarse con...?" MySQL ¿Funciones? El mismo efecto se puede lograr con un lenguaje de programación o de scripting. Es cierto que podemos lograrlo escribiendo un procedimiento en el programa de aplicación.

Volviendo a nuestro ejemplo de FECHA, para que nuestros usuarios obtengan los datos en el formato deseado, la capa de negocio tendría que realizar el procesamiento necesario por sí misma.

Esto se convierte en un problema cuando la aplicación tiene que integrarse con otros sistemas. cuando usamos MySQL funciones como DATE_FORMAT, esa funcionalidad está integrada en la base de datos, y cualquier aplicación que necesite los datos los obtiene en el formato requerido. Reduce la necesidad de rehacer el trabajo en la lógica de negocio y disminuye las inconsistencias de los datos..

Otra razón para considerar MySQL Su función es ayudar a reducir el tráfico de red en aplicaciones cliente/servidor.La capa de negocio solo necesita llamar a la función almacenada, sin tener que transferir las filas sin procesar a través de la red para manipularlas. En promedio, el uso de funciones puede mejorar considerablemente el rendimiento general del sistema.

Tipos de MySQL Funciones

Una vez aclarados el "qué" y el "por qué", podemos ahora analizar las tres familias de funciones. MySQL Ofrece: funciones integradas, funciones almacenadas y funciones definidas por el usuario.

Funciones integradas

MySQL viene incluido con una serie de funciones integradas, funciones que ya están implementadas en el MySQL servidor. Nos permiten realizar muchos tipos de manipulación de los datos y se dividen en los siguientes grupos de uso común.

  • Funciones de cadena – operar en tipos de datos de cadena
  • Funciones numéricas – operar con tipos de datos numéricos
  • Funciones de fecha – operar con tipos de datos de fecha
  • Funciones agregadas – operar con todos los tipos de datos anteriores y producir conjuntos de resultados resumidos.
  • Otras funciones – MySQL También admite otros tipos de funciones integradas, pero en esta lección nos limitaremos a los grupos mencionados anteriormente.

Analicemos ahora en detalle cada uno de los grupos mencionados anteriormente. Explicaremos las funciones más utilizadas con nuestra base de datos de ejemplo “Myflixdb”.

Funciones de cadena

Las funciones de cadena operan sobre valores de texto. En nuestra tabla de películas, los títulos se almacenan utilizando una combinación de letras mayúsculas y minúsculas. Supongamos que queremos una consulta que devuelva los títulos en mayúsculas. La función "UCASE" toma una cadena como parámetro y convierte cada letra a mayúscula, como se muestra en el siguiente script.

SELECT `movie_id`, `title`, UCASE(`title`) AS `upper_case_title` FROM `movies`;

AQUÍ

  • UCase(`título`) es la función integrada que toma el título como parámetro y lo devuelve en mayúsculas.
  • COMO `título_en_mayúsculas` Esto asigna un alias a la columna calculada, de modo que el conjunto de resultados contiene un encabezado legible en lugar de la expresión sin procesar.

Ejecutando el script anterior en MySQL La comprobación realizada en Workbench con Myflixdb nos proporciona los resultados que se muestran a continuación.

id_película título título en mayúsculas
16 67% culpable 67% CULPABLES
6 Ángeles y demonios ÁNGELES Y DEMONIOS
4 Code Nombre Negro NOMBRE CLAVE NEGRO
5 Las niñas de papá LAS NIÑAS DE PAPÁ
7 Da Vinci Code CÓDIGO DAVINCI
2 Olvidando a Sarah Marshal OLVIDANDO A SARAH MARSHL
9 Honey moonERS MIEL MOONERS
19 película 3 PELÍCULA 3
1 Piratas del Caribe 4 PIRATAS DEL CARIBE 4
18 película de muestra MUESTRA DE PELÍCULA
17 El gran dictador EL GRAN DICTADOR
3 X-Men X MEN

Dos compañeros merecen ser recordados junto con UCase: LCASO convierte una cadena a minúsculas y CONCAT une dos o más cadenas en una sola. Para obtener la lista completa, consulte la MySQL Referencia a la función de cadena.

Funciones numéricas

Como se mencionó anteriormente, las funciones numéricas operan sobre tipos de datos numéricos. También podemos realizar cálculos matemáticos con datos numéricos directamente en nuestras sentencias SQL.

Operadores aritméticos

MySQL Admite los siguientes operadores aritméticos, que se pueden utilizar para realizar cálculos en sentencias SQL.

Nombre Mareas Ideales para Lecciones
DIV División entera
/ División
Subtracdisrupción
+ Adición
* Multiplicación
% o MOD Módulo

A continuación se muestran ejemplos de cada operador.

División entera (DIV) — DIV descarta la parte fraccionaria y devuelve solo el número entero.

SELECT 23 DIV 6;

Al ejecutar el script anterior obtenemos 3.

Operador de división (/) — a diferencia de DIV, el operador de división conserva la parte decimal del resultado.

SELECT 23 / 6;

Al ejecutar el script anterior obtenemos 3.8333.

Subtracoperador de ción (-)

SELECT 23 - 6;

Al ejecutar el script anterior obtenemos 17.

Operador de suma (+)

SELECT 23 + 6;

Al ejecutar el script anterior obtenemos 29.

Operador de multiplicación (*)

SELECT 23 * 6 AS `multiplication_result`;

Resultado:

resultado_multiplicación
138

Operador módulo (% o MOD)

El operador módulo divide N entre M y nos da el resto. Veamos un ejemplo con el operador módulo, usando los mismos valores que en los ejemplos anteriores.

SELECT 23 % 6;
-- OR, equivalently:
SELECT 23 MOD 6;

Al ejecutar cualquiera de los scripts obtenemos 5.

Veamos ahora algunas de las funciones numéricas comunes en MySQL.

FLOOR Esta función elimina los decimales de un número y lo redondea al número entero más cercano. El siguiente script muestra cómo usarlo.

SELECT FLOOR(23 / 6) AS `floor_result`;

Resultado:

resultado_de_piso
3

REDONDA Esta función redondea un número al entero más cercano. Dado que 23 / 6 da como resultado 3.8333, REDONDEAR devuelve 4, mientras que FLOOR devuelve 3; no son intercambiables.

SELECT ROUND(23 / 6) AS `round_result`;

Resultado:

resultado_de_redondeo
4

RAND Esta función genera un número aleatorio. Su valor cambia cada vez que se llama a la función. El siguiente script muestra cómo usarla.

SELECT RAND() AS `random_result`;

Funciones de fecha

Las funciones de fecha operan con tipos de datos de fecha y fecha y hora. DATE_FORMAT es la función que resuelve el problema de “AAAA-MM-DD frente a DD-MM-AAAA” descrito en la introducción.

FORMATO DE FECHA El script toma dos parámetros: el valor de fecha a formatear y una cadena de formato creada a partir de marcadores de posición. El siguiente script devuelve cada fecha de lanzamiento en el formato día-mes-año que solicitaron nuestros usuarios.

SELECT `title`, DATE_FORMAT(`date_released`, '%d-%m-%Y') AS `formatted_date`
FROM `movies`;

A continuación se enumeran los marcadores de posición de formato más utilizados.

marcador de posición Significado Ejemplo de salida
%d Día del mes, dos dígitos 04
%m Mes, dos dígitos 08
%Y Año, cuatro dígitos 2012
%M Nombre completo del mes Agosto
%Su Hoursminutos, segundos 14:35:09

Otras tres funciones de fecha aparecen constantemente en el trabajo diario:

  • CURDATE() Devuelve la fecha actual como AAAA-MM-DD.
  • AHORA() devuelve la fecha actual y en las transacciones.
  • DATEDIFF(d1, d2) Devuelve el número de días entre dos fechas, que es la base de cualquier informe de alquileres vencidos.

Para ver la lista completa, consulte la MySQL Referencia de la función de fecha y hora.

Funciones almacenadas

Las funciones integradas cubren los casos más comunes. Cuando una regla de negocio es más específica, escribimos la nuestra propia, y para eso sirven las funciones almacenadas.

Las funciones almacenadas se comportan igual que las funciones integradas, con la diferencia de que usted mismo las define. Una vez creada, una función almacenada puede utilizarse en sentencias SQL como cualquier otra función. La sintaxis básica se muestra a continuación.

CREATE FUNCTION sf_name ([parameter(s)])
RETURNS data_type
[DETERMINISTIC | NOT DETERMINISTIC]
BEGIN
    -- procedural statements
END

AQUÍ

  • “CREAR FUNCIÓN sf_name ([parámetro(s)])” es obligatorio y le dice al MySQL El servidor creará una función llamada `sf_name` con parámetros opcionales definidos dentro de los paréntesis.
  • “DEVUELVE tipo_de_dato” Es obligatorio y especifica el tipo de datos que devuelve la función.
  • “DETERMINISTA” Declara que la función devuelve el mismo valor siempre que se le proporcionen los mismos argumentos. “NO DETERMINISTA” declara lo contrario.
  • “COMIENZA… FIN” Envuelve el código procedimental que ejecuta la función.

Supongamos que queremos saber qué películas alquiladas han vencido su fecha de devolución. Podemos crear una función almacenada que acepte la fecha de devolución como parámetro y la compare con la fecha actual del servidor. Si la fecha actual es posterior a la fecha de devolución, la película está vencida y devolvemos "Sí"; de lo contrario, devolvemos "No".

DELIMITER |
CREATE FUNCTION sf_past_movie_return_date (return_date DATE)
RETURNS VARCHAR(3)
NOT DETERMINISTIC
BEGIN
    DECLARE sf_value VARCHAR(3);
    IF CURDATE() > return_date THEN
        SET sf_value = 'Yes';
    ELSEIF CURDATE() <= return_date THEN
        SET sf_value = 'No';
    END IF;
    RETURN sf_value;
END|
DELIMITER ;

⚠️ Advertencia: no etiquete esta función como DETERMINISTA. El cuerpo llama a CURDATE(), por lo que el mismo argumento puede devolver "No" hoy y "Sí" mañana. Declarar una función dependiente del tiempo como DETERMINISTIC engaña al optimizador y no es seguro para la replicación basada en sentencias. NO DETERMINISTA cada vez que el cuerpo llama a CURDATE(), NOW() o RAND().

Al ejecutar el script anterior se crea la función almacenada `sf_past_movie_return_date`. Ahora vamos a probarla.

SELECT `movie_id`, `membership_number`, `return_date`, CURDATE(),
       sf_past_movie_return_date(`return_date`) AS `is_overdue`
FROM `movierentals`;

Ejecutando el script anterior en MySQL Workbench contra myflixdb nos da los siguientes resultados.

id_película número de socio Fecha de regreso CURDATE() está_vencido
1 1 NULL 04-08-2012 NULL
2 1 25-06-2012 04-08-2012 Sí:
2 3 25-06-2012 04-08-2012 Sí:
2 2 25-06-2012 04-08-2012 Sí:
3 3 NULL 04-08-2012 NULL

Observe las dos filas NULL. Cuando `return_date` es NULL, ambas comparaciones se evalúan como NULL en lugar de VERDADERO o FALSO, por lo que ninguna de las ramas IF se ejecuta y la función devuelve NULL, el resultado esperado, ya que una película no devuelta no tiene fecha de devolución con la que compararla.

Funciones definidas por el usuario

Cuando SQL por sí solo no es lo suficientemente rápido, MySQL permite una tercera opción. Las funciones definidas por el usuario (UDF) se escriben en un lenguaje compilado como C or C++Integradas en una biblioteca compartida y registradas en el servidor, una vez añadidas, se invocan como cualquier otra función. Dado que una UDF se ejecuta como código nativo dentro del proceso del servidor, resulta idónea para cálculos complejos; sin embargo, un error en ella puede provocar el bloqueo del servidor, por lo que las UDF se utilizan con mucha menos frecuencia que las funciones almacenadas.

Funciones integradas, almacenadas o definidas por el usuario: ¿Cuál debería usar?

Las tres familias devuelven un único valor y pueden invocarse desde cualquier sentencia SQL, pero difieren en quién las escribe, dónde se ejecutan y el nivel de riesgo que conllevan. La siguiente tabla resume esas diferencias.

Criterio Funciones integradas Funciones almacenadas Funciones definidas por el usuario (UDF)
¿Quién lo escribe? Enviado con MySQL Tú, en SQL Tú, en C o C++
donde vive Dentro del servidor Dentro de la base de datos, creada con CREATE FUNCTION Biblioteca compartida compilada cargada por el servidor
Uso típico Formato, matemáticas, agregación Reglas comerciales reutilizables, como un cheque vencido SQL no puede expresar lógica especializada o que requiera mucha CPU.
Riesgo principal Ninguna Lento si se llama fila por fila sobre una tabla grande. Un fallo en la biblioteca puede provocar la caída del servidor.

Como regla general, empieza con una función integrada. Si ninguna se ajusta a tus necesidades, escribe una función almacenada para que la regla quede centralizada. Utiliza una función definida por el usuario solo cuando una función almacenada sea notablemente lenta.

Preguntas Frecuentes

Una función debe devolver exactamente un valor y puede utilizarse dentro de una expresión SELECT, WHERE u ORDER BY. Un procedimiento almacenado devuelve cero o varios conjuntos de resultados, no puede estar integrado en una expresión y se invoca con la instrucción CALL.

Ejecuta DROP FUNCTION IF EXISTS sf_name; luego vuelve a crearlo. MySQL No tiene función CREATE OR REPLACE, y la función ALTER FUNCTION solo cambia características como el comentario o el tipo de seguridad, nunca el cuerpo.

Pueden hacerlo. Una función que envuelve una columna indexada en una cláusula WHERE lo impide. MySQL Al usar ese índice, se fuerza un escaneo completo. Filtre por la columna sin procesar y aplique la función solo en la lista SELECT.

Sí. Los asistentes de IA pueden generar código CREATE FUNCTION a partir de una regla en lenguaje natural. Siempre revise el cuerpo generado para verificar la característica DETERMINISTIC correcta, el manejo de valores NULL y los tipos de datos de los parámetros antes de ejecutarlo en un servidor de producción.

No. Los modelos de IA pueden inventar nombres de funciones, pasar por alto casos nulos o ignorar diferencias de versión. Pruebe cada función generada con una copia de los datos y confirme los resultados con una consulta que haya escrito y verificado usted mismo.

Resumir este post con: