## Bloque 3 Tema 3. Lenguajes de interrogación de bases de datos. Estándar ANSI SQL. Procedimientos almacenados. Eventos y disparadores.

Este tema estudia el lenguaje SQL como estándar para interactuar con bases de datos relacionales, y los objetos avanzados de programación en el servidor de base de datos.

---

## 1. SQL y sus sublenguajes

SQL, o Structured Query Language, es el lenguaje estándar para interactuar con bases de datos relacionales. Se divide en cuatro sublenguajes.

El DDL o Data Definition Language define la estructura de la base de datos: sus instrucciones principales son CREATE para crear objetos, ALTER para modificarlos y DROP para eliminarlos.

El DML o Data Manipulation Language manipula los datos almacenados: SELECT para consultar, INSERT para insertar, UPDATE para actualizar y DELETE para eliminar registros.

El DCL o Data Control Language controla los permisos de acceso: GRANT para conceder permisos y REVOKE para revocarlos.

El TCL o Transaction Control Language gestiona las transacciones: COMMIT para confirmar los cambios, ROLLBACK para deshacerlos y SAVEPOINT para establecer puntos de guardado intermedios.

---

## 2. Estándar ANSI SQL

SQL fue normalizado por primera vez en 1986 como SQL-86. Las versiones más importantes son SQL-92, que introdujo los joins y las subconsultas; SQL de 1999, que añadió orientación a objetos, recursividad y tipos complejos; SQL de 2003, que incorporó XML, MERGE y funciones ventana; y SQL de 2016, que añadió soporte para JSON.

El DDL permite crear tablas con sus tipos de datos y restricciones. Las restricciones o constraints más importantes son PRIMARY KEY, que identifica únicamente cada fila e implica NOT NULL y UNIQUE; FOREIGN KEY, que referencia la clave primaria de otra tabla; UNIQUE, que no permite valores duplicados; NOT NULL, que impide valores nulos; DEFAULT, que asigna un valor por defecto; y CHECK, que valida una condición sobre los valores.

El SELECT es la instrucción de consulta más completa. Su estructura tiene un orden obligatorio: SELECT con las columnas, FROM con la tabla, JOIN para unir tablas, WHERE para filtrar filas, GROUP BY para agrupar, HAVING para filtrar grupos y ORDER BY para ordenar. LIMIT y OFFSET limitan el número de resultados.

Los tipos de JOIN son INNER JOIN, que devuelve solo las filas que coinciden en ambas tablas; LEFT JOIN, que devuelve todas las filas de la izquierda más las coincidencias de la derecha; RIGHT JOIN, que hace lo contrario; FULL OUTER JOIN, que devuelve todas las filas de ambas tablas; y CROSS JOIN, que produce el producto cartesiano.

Las funciones de agregación son COUNT para contar filas, SUM para sumar, AVG para calcular la media, MAX para el valor máximo y MIN para el mínimo. GROUP BY agrupa filas por los valores de una columna; HAVING filtra sobre los grupos, a diferencia de WHERE que filtra sobre filas individuales.

Las subconsultas son consultas anidadas dentro de otra consulta y pueden aparecer en la cláusula WHERE, en FROM o en SELECT.

---

## 3. Propiedades ACID y transacciones

Una transacción es un conjunto de operaciones que se tratan como una unidad atómica: todas se realizan o ninguna. Las propiedades ACID son las siguientes.

La Atomicidad garantiza que todas las operaciones de la transacción se ejecuten o ninguna.

La Consistencia garantiza que la base de datos pasa de un estado válido a otro estado válido.

El Aislamiento garantiza que las transacciones concurrentes no interfieren entre sí.

La Durabilidad garantiza que los cambios confirmados con COMMIT persisten aunque ocurra un fallo.

---

## 4. Vistas e índices

Una vista es una consulta almacenada que se comporta como una tabla virtual. No almacena datos propios sino que los recupera de las tablas base al ser consultada. Sus ventajas son la seguridad, ya que puede ocultar columnas o filas sensibles; la simplicidad, ya que encapsula consultas complejas; y la reutilización.

Un índice acelera las consultas a costa de mayor espacio en disco y mayor lentitud en las escrituras. El tipo más común es el índice B-Tree. Los índices son útiles en columnas muy consultadas en WHERE, JOIN u ORDER BY. Deben evitarse en tablas pequeñas o en columnas con poca selectividad como los booleanos.

---

## 5. Procedimientos almacenados y funciones

Un procedimiento almacenado es un bloque de código SQL con lógica de control que se guarda en la propia base de datos y se invoca mediante la instrucción CALL. Sus ventajas son la reutilización de código, el rendimiento porque se compilan una vez, la seguridad porque solo se expone el nombre y no las tablas, la reducción del tráfico de red y la centralización de la lógica de negocio. Sus inconvenientes son la dificultad de depuración, la dependencia del sistema gestor y la mayor complejidad de mantenimiento.

Los tipos de parámetros son IN para la entrada, donde el llamador pasa un valor que no se modifica externamente; OUT para la salida, donde el procedimiento devuelve un valor; e INOUT para ambos casos.

Las estructuras de control disponibles dentro de los procedimientos son IF, CASE, el bucle WHILE, el bucle LOOP con la instrucción LEAVE, y los cursores para recorrer filas de un resultado.

Una función de usuario es similar al procedimiento pero devuelve un valor y puede usarse dentro de consultas SELECT. La diferencia fundamental es que el procedimiento no devuelve valor directamente y se llama con CALL, mientras que la función devuelve un valor y puede usarse en expresiones.

---

## 6. Disparadores o Triggers

Un disparador o trigger es un bloque de código que se ejecuta automáticamente cuando ocurre un evento concreto, que puede ser INSERT, UPDATE o DELETE, sobre una tabla. No se invoca directamente sino que se activa de forma implícita.

La sintaxis define el nombre del trigger, si se ejecuta BEFORE o AFTER del evento, el tipo de evento, la tabla sobre la que actúa y el cuerpo del trigger con la cláusula FOR EACH ROW.

Dentro del trigger se puede acceder a la fila afectada mediante las referencias NEW y OLD. NEW contiene la fila nueva en operaciones INSERT y UPDATE. OLD contiene la fila anterior en operaciones UPDATE y DELETE.

La diferencia entre BEFORE y AFTER es importante. El trigger BEFORE se ejecuta antes de la operación, puede cancelarla lanzando un error con SIGNAL, y se usa para validaciones o para modificar valores antes de insertar. El trigger AFTER se ejecuta después de la operación, no puede cancelarla y se usa para auditoría o para actualizar tablas relacionadas.

Los usos habituales de los triggers son la auditoría para registrar automáticamente quién cambió qué y cuándo, la validación de integridad compleja, la sincronización de datos derivados como contadores o totales, el borrado lógico o soft delete, y el mantenimiento de historial de versiones.

---

## 7. Eventos

Un evento en MySQL y MariaDB es una tarea programada que se ejecuta automáticamente en un momento concreto o de forma periódica dentro del propio sistema gestor de base de datos. Es equivalente a un cron job pero integrado en la BD. Para que funcione debe estar habilitado el planificador de eventos mediante la variable global event_scheduler.

La sintaxis de CREATE EVENT define el nombre del evento, la programación con AT para una fecha concreta o EVERY para una periodicidad, la cláusula ON COMPLETION PRESERVE para que el evento no se elimine automáticamente tras ejecutarse, y la sentencia SQL a ejecutar.

---

## Miniresumen final del tema

SQL tiene cuatro sublenguajes: DDL para definir estructura, DML para manipular datos, DCL para controlar permisos y TCL para gestionar transacciones. Las propiedades ACID son Atomicidad, Consistencia, Aislamiento y Durabilidad. Los procedimientos almacenados son bloques SQL guardados en la BD con parámetros IN, OUT e INOUT. Los triggers se activan automáticamente ante INSERT, UPDATE o DELETE; los BEFORE pueden cancelar la operación, los AFTER no. Los eventos son tareas programadas dentro del sistema gestor.
