Tutorial completo de MySQL 8: instalación, administración, tipos de datos y backup (2026)

INSERT añade nuevas filas a una tabla; SELECT las recupera. Son las dos instrucciones que más se usan en el día a día de una aplicación web. En MySQL hay varias formas de INSERT que se adaptan a distintas situaciones: una fila, varias filas, desde otra tabla, o con manejo de duplicados.

En este capítulo cubrimos INSERT en sus distintas formas y las opciones más útiles del SELECT en MySQL: ORDER BY, LIMIT, WHERE con comparaciones de texto y fecha, y LIKE para búsquedas de patrón.

INSERT: añadir filas

-- Insertar una fila (especificando columnas — recomendado)
INSERT INTO clientes (nombre, email, ciudad, fecha_alta)
VALUES ('Ana García', '[email protected]', 'Madrid', '2026-05-09');

-- Insertar varias filas en un solo INSERT (mucho más eficiente)
INSERT INTO productos (nombre, precio, stock, id_categoria) VALUES
    ('Auriculares Bluetooth', 59.99, 120, 1),
    ('Cable USB-C 2m',         8.99, 500, 1),
    ('Camiseta algodón M',    12.50,  80, 2);

-- Obtener el ID generado automáticamente
INSERT INTO pedidos (id_cliente, estado) VALUES (1, 'pendiente');
SELECT LAST_INSERT_ID();  -- devuelve el id del último INSERT

INSERT IGNORE y ON DUPLICATE KEY UPDATE

-- Si el email ya existe, ignorar silenciosamente (no falla)
INSERT IGNORE INTO clientes (nombre, email, ciudad, fecha_alta)
VALUES ('Ana García', '[email protected]', 'Madrid', CURDATE());

-- Si ya existe (por UNIQUE), actualizar el nombre y la ciudad
INSERT INTO clientes (nombre, email, ciudad, fecha_alta)
VALUES ('Ana García Nuevas', '[email protected]', 'Bilbao', CURDATE())
ON DUPLICATE KEY UPDATE nombre = VALUES(nombre), ciudad = VALUES(ciudad);

SELECT: recuperar datos

-- Todos los registros de la tabla
SELECT * FROM clientes;

-- Columnas específicas con alias
SELECT nombre AS cliente, email, ciudad FROM clientes;

-- Filtrar con WHERE
SELECT nombre, precio FROM productos WHERE precio < 20 AND stock > 0;

-- Ordenar por precio descendente, los 10 más caros
SELECT nombre, precio FROM productos ORDER BY precio DESC LIMIT 10;

-- Buscar por patrón (LIKE, case-insensitive con utf8mb4_unicode_ci)
SELECT * FROM productos WHERE nombre LIKE '%cable%';

-- Búsqueda de prefijo (puede usar índice)
SELECT * FROM clientes WHERE nombre LIKE 'Ana%';

-- Filtrar por rango de fechas
SELECT * FROM pedidos
WHERE fecha BETWEEN '2026-01-01' AND '2026-05-09 23:59:59'
ORDER BY fecha DESC;

SELECT con funciones de agregado básicas

-- Contar registros
SELECT COUNT(*) AS total_clientes FROM clientes;
SELECT COUNT(*) AS total_pedidos  FROM pedidos WHERE estado = 'pagado';

-- Suma y promedio
SELECT
    COUNT(*)                AS pedidos,
    ROUND(SUM(total), 2)    AS facturado,
    ROUND(AVG(total), 2)    AS ticket_medio,
    MIN(total)              AS pedido_minimo,
    MAX(total)              AS pedido_maximo
FROM pedidos
WHERE estado IN ('pagado', 'enviado');

SELECT con JOIN básico

-- Pedidos con nombre del cliente
SELECT p.id, c.nombre, p.fecha, p.estado, p.total
FROM pedidos p
JOIN clientes c ON c.id = p.id_cliente
ORDER BY p.fecha DESC
LIMIT 20;

-- Número de pedidos por cliente
SELECT c.nombre, COUNT(p.id) AS pedidos
FROM clientes c
LEFT JOIN pedidos p ON p.id_cliente = c.id
GROUP BY c.id, c.nombre
ORDER BY pedidos DESC;

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP