UPDATE: cambiar valores
En resumen: UPDATE … SET … WHERE cambia columnas en las filas que cumplen la condición, con una expresión que puede usar el valor anterior; sin WHERE cambia todas las filas.
Problema
Una subida de precios
El proveedor de lácteos sube los precios un 10 %. Desde hoy la tienda también tiene que vender todo lo de la categoría «Lácteos» un 10 % más caro.
Son cinco productos. Podrías cambiar los precios a mano, uno por uno. Pero mañana será una categoría con 200 productos, y copiar a mano seguro sale mal.
La idea
UPDATE … SET … WHERE
UPDATE dice qué tabla, SET dice qué columna y en qué se convierte, y WHERE dice en qué filas:
price * 1.1 se calcula para cada fila por separado, con el precio de esa fila. La leche fresca costaba 1,60 € y ahora cuesta 1,76 €. ROUND(…, 2) redondea al céntimo, porque el precio está en euros y céntimos. Encima del resultado ves cuántas filas cambió la sentencia: cinco.
Más precisamente, para curiosos
Sin ROUND la pantalla también muestra 1.76. Pero para la computadora 1.6 × 1.1 es 1.7600000000000002, porque los decimales se guardan en binario y no siempre con exactitud. Entonces una búsqueda del precio 1.76 no encuentra la leche fresca:
Por eso hay que redondear el dinero cuando se guarda. Las tiendas reales suelen guardar los precios en céntimos enteros (176) o en una columna con un tipo decimal exacto, que PostgreSQL y MySQL tienen (DECIMAL). SQLite no tiene un tipo así.
SET puede llevar varias columnas, separadas por comas. Llegan 30 banitsas, y su precio pasa a ser 2,60 €:
stock + 30 toma las existencias anteriores y suma 30. En la expresión a la derecha de =, las columnas tienen los valores anteriores de la fila.
Pruébalo
Un pedido enviado
El pedido 59 está pagado y hoy salió con el mensajero. Cambia su estado a shipped.
Solución
UPDATE orders SET status = 'shipped' WHERE id = 59;UPDATE orders SET status = 'shipped' WHERE id = 59. La comprobación mira todos los pedidos pagados y enviados. Así se nota si cambiaste también otro pedido.
Míralo
UPDATE sin WHERE
La gerencia quiere una promoción: té de menta a 0,99 €. Alguien escribe con prisa y se olvida de WHERE:
Los 25 productos cuestan ahora 0,99 €, hasta el juego de cuchillos que costaba 39 €. La base de datos no pregunta «¿seguro?». Sin WHERE la sentencia es para todas las filas.
Aquí el botón «Base nueva» lo arregla todo. Una base de datos real no tiene ese botón. Lo que queda son las copias de seguridad y las transacciones: con una transacción un cambio se puede deshacer antes de confirmarlo. Las conocerás más adelante en el curso.
La idea
Primero SELECT
La costumbre que te protege de esto: antes de un UPDATE, ejecuta un SELECT con el mismo WHERE. Ves exactamente qué filas cambiarán, y no cambia nada.
Las bebidas suben un 5 %. La categoría se conoce por el nombre, y una subconsulta da su número:
Cuatro productos, exactamente los correctos. Ahora SELECT … FROM se convierte en UPDATE … SET, y WHERE se queda igual:
Aquí ROUND marca una diferencia visible: 0,90 × 1,05 es 0,945, y 14,90 × 1,05 es 15,645. Los precios pasan a ser 0,95 € y 15,65 €.
Una subconsulta en WHERE funciona en UPDATE igual que en SELECT.
Pruébalo
Los pedidos olvidados
Hay pedidos con el estado new de antes de 2026 que nadie ha pagado. Cancélalos: su estado pasa a ser cancelled.
Solución
UPDATE orders SET status = 'cancelled'
WHERE status = 'new' AND ordered_at < '2026-01-01';UPDATE orders SET status = 'cancelled' WHERE status = 'new' AND ordered_at < '2026-01-01'. Dos pedidos, el 4 y el 10. Si ejecutas antes un SELECT con el mismo WHERE, verás exactamente esos.
Ejercicio
Dos tareas
1. Una promoción para los productos de los que la tienda tiene de sobra: todo producto con más de 50 en existencias se abarata un 20 %, redondeado al céntimo. La tarjeta de regalo no tiene categoría y no entra en la promoción.
La promoción (se comprueba toda la tabla products):
Solución
UPDATE products
SET price = ROUND(price * 0.8, 2)
WHERE stock > 50 AND category_id IS NOT NULL;UPDATE products SET price = ROUND(price * 0.8, 2) WHERE stock > 50 AND category_id IS NOT NULL. Cinco productos: el bollo de mantequilla, las manzanas, las papas, el agua y las esponjas de limpieza. El bollo de mantequilla pasa a costar 0,64 €. Sin la segunda condición la tarjeta de regalo de 20 € se vendería por 16 €.
2. Maria Ivanova (maria.ivanova@example.com) pagó todos sus pedidos nuevos de golpe. Cambia su estado a paid. Encuentra a la clienta por el correo, con una subconsulta.
Los pedidos nuevos de Maria pasan a pagados:
Solución
UPDATE orders SET status = 'paid'
WHERE status = 'new'
AND customer_id = (SELECT id FROM customers WHERE email = 'maria.ivanova@example.com');UPDATE orders SET status = 'paid' WHERE status = 'new' AND customer_id = (SELECT id FROM customers WHERE email = 'maria.ivanova@example.com'). Los pedidos 34 y 46. El correo es único, así que la subconsulta devuelve exactamente un cliente.
Test
Ponte a prueba
Lecciones relacionadas
Sección «Lecciones relacionadas»- Se basa en: NULL: sin valor · Aritmética en una consulta · Subconsultas · INSERT: insertar filas
- Continúa en: DELETE: borrar filas · Upsert: insertar o cambiar · Vistas · Normalización
- Ejercicios sobre el tema: Cambiar los datos