- Uso de REPLACE IN TO
La sentencia REPLACE INTO opera de forma similar a INSERT INTO, pero con una diferencia clave. Primero, intenta insertar un nuevo registro en la tabla. Si la inserción viola una restricción de clave primaria o índice único (es decir, el registro ya existe), el motor de base de datos eliminará el registro conflictivo existente e insertará el nuevo. Si no hay conflicto, la inserción se realiza normalmente.
Es crucial entender que la tabla objetivo debe poseer una clave primaria o un índice único definido. De lo contrario, REPLACE INTO se comportará exactamente como INSERT INTO, lo que podría generar registros duplicados no deseados.
-- Contraste con INSERT INTO, que fallaría si 'PED-001' ya existiera. INSERT INTO pedidos (codigo_pedido, cliente_id, monto) VALUES ('PED-001', 45, 250.00); -- Devolvería un error por violación de unicidad.
</div>2. Uso de EXISTS en subconsultas
--------------------------------
El operador `EXISTS` se utiliza para verificar si una subconsulta produce algún resultado. Funciona como un predicado booleano: si la subconsulta retorna al menos una fila, la condición es verdadera y se procede a evaluar el resto de la consulta externa. Si la subconsulta no devuelve nada, la condición es falsa y, en consecuencia, la consulta completa no producirá ningún conjunto de resultados.
3. Optimización de consultas con paginación
-------------------------------------------
Para manejar grandes volúmenes de datos de manera eficiente, una técnica común es realizar la paginación en dos pasos. Primero, se obtienen únicamente los identificadores de los registros deseados. Luego, estos IDs se utilizan para recuperar el resto de las columnas de la tabla principal, lo cual puede ser significativamente más rápido, especialmente si los campos están indexados.
<div class="code-example">```
-- Consulta optimizada para paginación.
SELECT p.*
FROM productos p
INNER JOIN (
-- Subconsulta que solo obtiene los IDs de la página actual.
SELECT id FROM productos WHERE categoria = 'electronica' ORDER BY fecha_creacion DESC LIMIT 10 OFFSET 20
) AS ids_pagina ON p.id = ids_pagina.id
ORDER BY p.fecha_creacion DESC;
Las vistas (VIEW) son objetos de base de datos que almacenan una consulta definida. A diferencia de las tablas físicas, las vistas no contienen datos por sí mismas, sino que presentan datos derivados de otras tablas. Su principal ventaja no es el rendimiento, sino la abstracción y simplificación. Permiten encapsular consultas complejas (que involucran múltiples uniones, filtros y agregaciones) detrás de un nombre simple, facilitando así su reutilización.
-- Luego, consultar la vista es sencillo. SELECT * FROM vista_resumen_ventas WHERE gasto_total > 500;
</div>5. Distinción entre NULL y cadena vacía
---------------------------------------
En MySQL, existe una diferencia fundamental entre un valor `NULL` y una cadena de caracteres vacía (`''`). Un valor `NULL` representa la ausencia de un valor o un dato desconocido, y ocupa espacio de almacenamiento adicional. Una cadena vacía es un valor de longitud cero, que representa una cadena conocida pero sin contenido.
Las cláusulas `IS NULL` e `IS NOT NULL` solo son aplicables para buscar valores `NULL`. Para identiifcar cadenas vacías, se debe utilizar el operador de igualdad (`= ''`). Esto afecta a funciones agregadas como `COUNT(columna)`, que ignora los valores `NULL` pero sí cuenta las cadenas vacías.
6. Procedimientos almacenados
-----------------------------
Un procedimiento almacenado es un conjunto de sentencias SQL precompiladas que se guardan en el servidor de base de datos bajo un nombre específico. Estos programados ofrecen varias ventajas: mejoran el rendimiento al evitar recompilaciones repetidas, reducen el tráfico de red al ejecutarse en el servidor, y proporcionan una capa de abstracción y control de acceso.
<div class="code-example">```
-- Definir un delimitador personalizado para el cuerpo del procedimiento.
DELIMITER //
-- Crear un procedimiento que busca un producto por su código de barras.
CREATE PROCEDURE sp_buscar_producto(IN codigo_barras VARCHAR(50))
BEGIN
SELECT nombre, precio, stock
FROM inventario
WHERE codigo_barras = codigo_barras;
END //
DELIMITER ;
-- Invocar el procedimiento.
CALL sp_buscar_producto('7501234567890');
-- Verificar la definición del procedimiento.
SHOW CREATE PROCEDURE sp_buscar_producto;
Los índices B-Tree son la estructura de índice predetreminada y más común en InnoDB. Permiten búsquedas, ordenamientos y consultas por rango de manera muy eficiente. Se pueden crear tres tipos principales:
- Índice de clave primaria: Define la columna identificadora única de la tabla.
- Índice único: Garantiza que todos los valores en la columna (o combinación de columnas) sean distintos.
- Índice normal: Mejora la velocidad de búsqueda sin imponer una restricción de unicidad.
Al definir una tabla, es crucial especificar el motor de almacenamiento y el conjunto de caracteres. El motor InnoDB es la opción estándar y recomendada por sus características ACID, soporte para claves foráneas y bloqueo a nivel de fila. El conjunto de caracteres utf8mb4 es la codificación preferida, ya que soporta completamente el estándar Unicode, incluyendo caracteres y emojis de cuatro bytes, y es compatible con el anterior utf8.