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;
