Ir al contenido
wannacode

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:

SQLbase de datos: tienda

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:

SQLbase de datos: tienda

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 €:

SQLbase de datos: tienda

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.

SQLbase de datos: tienda

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:

SQLbase de datos: tienda

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:

SQLbase de datos: tienda

Cuatro productos, exactamente los correctos. Ahora SELECT … FROM se convierte en UPDATE … SET, y WHERE se queda igual:

SQLbase de datos: tienda

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.

SQLbase de datos: tienda

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):

SQLbase de datos: tienda

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:

SQLbase de datos: tienda

Test

Ponte a prueba

1. ¿Qué hace UPDATE products SET stock = 0; sin WHERE?
2. ¿Cómo sumas 30 a las existencias del producto 4?
3. ¿Cuál es la buena costumbre antes de un UPDATE?
4. ¿Qué cambia con UPDATE orders SET status = 'paid', ordered_at = '2026-10-25' WHERE id = 34;?

Creado por Ivo Gergov como parte de la campaña de Evo Tech por una educación accesible en programación ·