Cuando necesitas realizar subconsultas y composiciones en órdenes de edición (UPDATE
, DELETE
, INSERT
), puedes usar subconsultas (SELECT
dentro de otra consulta) para modificar datos de manera dinámica y eficiente.
A continuación, te explico cómo hacerlo en cada operación:
UPDATE
Puedes usar subconsultas en UPDATE
para asignar valores dinámicos desde otra tabla.
Supongamos que tienes dos tablas:
productos
: contiene los productos y sus precios.historial_precios
: contiene los precios actualizados.UPDATE productos
SET precio = (
SELECT nuevo_precio
FROM historial_precios
WHERE historial_precios.id_producto = productos.id_producto
)
WHERE id_producto IN (
SELECT id_producto FROM historial_precios
);
💡 Explicación:
nuevo_precio
desde historial_precios
con una subconsulta.historial_precios
.✅ Alternativa con JOIN
(más eficiente en algunos casos):
UPDATE productos p
JOIN historial_precios h ON p.id_producto = h.id_producto
SET p.precio = h.nuevo_precio;
DELETE
Puedes usar subconsultas en DELETE
para eliminar registros basados en condiciones de otra tabla.
DELETE FROM pedidos
WHERE id_cliente IN (
SELECT id_cliente FROM clientes WHERE estado = 'INACTIVO'
);
💡 Explicación:
id_cliente
inactivos con una subconsulta.✅ Alternativa con JOIN
(más eficiente en bases de datos como MySQL y PostgreSQL):
DELETE p FROM pedidos p
JOIN clientes c ON p.id_cliente = c.id_cliente
WHERE c.estado = 'INACTIVO';
INSERT
Puedes insertar datos en una tabla usando valores obtenidos de otra con una subconsulta.
INSERT INTO clientes_vip (id_cliente, nombre, total_compras)
SELECT id_cliente, nombre, SUM(total)
FROM clientes c
JOIN pedidos p ON c.id_cliente = p.id_cliente
GROUP BY c.id_cliente, c.nombre
HAVING SUM(total) > 1000;
💡 Explicación:
SUM(total)
) de cada cliente.HAVING SUM(total) > 1000
).✅ Alternativa sin JOIN
usando subconsulta en WHERE
:
INSERT INTO clientes_vip (id_cliente, nombre, total_compras)
SELECT id_cliente, nombre, (SELECT SUM(total) FROM pedidos WHERE pedidos.id_cliente = clientes.id_cliente)
FROM clientes
WHERE id_cliente IN (SELECT id_cliente FROM pedidos GROUP BY id_cliente HAVING SUM(total) > 1000);
UPDATE
y DELETE
solo si no puedes usar JOIN
, ya que los JOIN
suelen ser más eficientes.INSERT
para filtrar datos antes de insertarlos.SELECT
antes de ejecutarlas en UPDATE
o DELETE
.