Excel es una herramienta estupenda. Lo digo yo, que trabajo con datos todos los días. Para un cálculo rápido o una lista que solo usas tú, no hay nada mejor. El problema llega cuando esa lista se convierte en el sitio donde vive toda la información del negocio.
Para verlo, imagina que tienes una tienda online. Es pequeña y ficticia: vendes tazas, camisetas y mochilas. Necesitas apuntar tres cosas: quién te compra (clientes), qué vendes (productos) y qué ha comprado cada uno (pedidos).
## Tu tienda en una hoja de cálculo
Una hoja de cálculo es un programa con una cuadrícula: Excel y Google Sheets son los más conocidos. Cada línea horizontal es una fila. Cada línea vertical es una columna. Donde se cruzan, tienes una celda. Un bloque de filas y columnas sobre un mismo tema se llama tabla.
Lo normal es empezar con una sola hoja de pedidos. Cada fila es un pedido. Las columnas son: cliente, ciudad, producto, cantidad, precio y total (cantidad por precio). Aquí van las tres primeras:
| Cliente | Ciudad | Producto |
|---|---|---|
| Lucía Ramos | Sevilla | Taza |
| Lucía Ramos | Sevilla | Mochila |
| Lucía Ramos | Sevilla | Camiseta |
| Marcos Gil | Bilbao | Camiseta |
Fíjate en Lucía. Sus datos están copiados en cada pedido. Con cuatro filas no pasa nada. Con cuatro mil, cada cliente que repite añade otra copia.
Ahora Lucía se muda a Madrid. Tienes que cambiar su ciudad en todas sus filas. Si te dejas una, tu hoja dice a la vez que Lucía vive en Sevilla y en Madrid. Nadie te avisa. Lo descubrirás cuando un paquete llegue a la ciudad equivocada.
## La misma tienda en una base de datos
Una base de datos es un sitio donde se guardan datos de forma ordenada y donde varias personas y programas pueden leerlos y cambiarlos. Una base de datos relacional los guarda en tablas, igual que la hoja, pero cada tabla habla de una sola cosa y las tablas se enlazan entre sí.
En nuestra tienda salen tres: clientes, productos y pedidos. Los datos de Lucía viven una sola vez, en clientes. El enlace lo hace una clave primaria: una columna cuyo valor identifica una fila sin confusión. El cliente 1 es Lucía y ningún otro cliente tiene el 1. El pedido guarda ese número en una columna propia, la clave foránea, para decir de quién es.
Decidir qué tablas necesitas y cómo se conectan se llama modelado de datos, un término habitual en las ofertas de empleo de datos. Acabas de hacerlo con la tienda.
Para hablar con la base de datos se usa SQL, siglas de Structured Query Language, «lenguaje de consulta estructurado». Es un idioma pequeño que se lee casi como frases en inglés. CREATE TABLE crea una tabla con sus columnas, y cada columna lleva un tipo: INTEGER es un número entero, TEXT es texto y DATE es una fecha. INSERT INTO ... VALUES añade filas. Así se crean las tres tablas de la tienda y se meten unos datos:
1CREATE TABLE clientes (2 id INTEGER PRIMARY KEY,3 nombre TEXT,4 ciudad TEXT5);67CREATE TABLE productos (8 id INTEGER PRIMARY KEY,9 nombre TEXT,10 precio INTEGER11);1213CREATE TABLE pedidos (14 id INTEGER PRIMARY KEY,15 cliente_id INTEGER REFERENCES clientes(id),16 producto_id INTEGER REFERENCES productos(id),17 cantidad INTEGER,18 fecha DATE19);2021INSERT INTO clientes VALUES (1, 'Lucía Ramos', 'Sevilla'), (2, 'Marcos Gil', 'Bilbao');22INSERT INTO productos VALUES (1, 'Taza', 9), (2, 'Camiseta', 15), (3, 'Mochila', 32);23INSERT INTO pedidos VALUES24 (1, 1, 1, 2, '2026-10-01'),25 (2, 1, 3, 1, '2026-10-05'),26 (3, 1, 2, 3, '2026-10-20'),27 (4, 2, 2, 1, '2026-10-22');
PRIMARY KEY marca la clave primaria de cada tabla. REFERENCES pide que cliente_id sea un cliente que existe, si el motor (el programa que gestiona la base de datos) lo aplica: PostgreSQL y DuckDB sí. Los precios van en euros enteros para simplificar.
Lucía se muda a Madrid. En la hoja eran tres filas y un descuido posible. Aquí es una orden: UPDATE dice qué tabla cambias, SET qué columna y WHERE qué fila.
1UPDATE clientes2SET ciudad = 'Madrid'3WHERE id = 1;
Cambias la ciudad en un único sitio. Sus tres pedidos ya cuelgan de la Lucía de Madrid.
No te dejes el WHERE. Sin él, UPDATE cambia la ciudad de TODOS los clientes, y la base de datos obedece sin preguntar. Es como pedir «cambia todo» por error y que te hagan caso.
## Dos personas editando a la vez
Ana lleva los pedidos y Luis atiende a los clientes. Cada uno trabaja con su propia copia del fichero: una enviada por correo, otra abierta en su ordenador. Ana corrige la cantidad de un pedido de Lucía. Luis cambia la ciudad de Lucía. Cada uno guarda su fichero. El que guarda el último pisa al otro, y el cambio del primero desaparece sin aviso.
Google Sheets y la coautoría de Excel en la nube permiten editar a la vez y evitan las copias. Lo que no traen son reglas firmes sobre los datos (quién puede tocar qué, qué valores son válidos), y si dos personas tocan la misma celda, gana el último.
En una base de datos, Ana y Luis se conectan al mismo sitio. Ana modifica una fila de pedidos y Luis una fila de clientes. Son filas distintas y ningún cambio pisa al otro. Si coincidieran en la misma fila, el motor decide cómo ordenarlos: PostgreSQL, por ejemplo, hace esperar al segundo hasta que termina el primero. Además, puedes dar permisos distintos a cada persona.
## ¿Cuánto ha comprado cada cliente?
Esta es la pregunta de cualquier jefe de tienda. Excel tiene una herramienta para esto: la tabla dinámica, que suma por cliente sin escribir una fórmula por cada uno. Funciona bien. Lo que no te quita es el trabajo de alrededor: la hoja necesita una columna auxiliar con el total de cada pedido, y el precio tiene que estar en cada fila (copiado, o traído de otra hoja con una búsqueda), así que cada cambio de precio hay que mantenerlo. Y si los datos vienen de varias fuentes, por ejemplo la web y la caja de la tienda, hay que copiarlos todos a la misma hoja antes de empezar.
1F2: =D2*E22Total de Lucía: =SUMAR.SI(A:A; "Lucía Ramos"; F:F)
Columnas de la hoja: A cliente, D cantidad, E precio (copiado de la lista de productos) y F total del pedido. SUMAR.SI suma la columna F de las filas cuyo cliente sea Lucía. En Excel en inglés se llama SUMIF.
En SQL le pides a la base de datos la lista completa de una vez. JOIN une tablas por su clave, GROUP BY agrupa las filas por cliente y SUM suma. Las letras p, c y pr son apodos cortos para pedidos, clientes y productos, para no escribir los nombres enteros:
1SELECT c.nombre,2 SUM(p.cantidad * pr.precio) AS total3FROM pedidos p4JOIN clientes c ON c.id = p.cliente_id5JOIN productos pr ON pr.id = p.producto_id6GROUP BY c.nombre7ORDER BY total DESC;
Una consulta: una fila por cliente, ordenada de más a menos gasto. El precio sale de la tabla productos, donde está una sola vez. Si mañana tienes 10.000 clientes, el SQL es el mismo.
| nombre | total |
|---|---|
| Lucía Ramos | 95 |
| Marcos Gil | 15 |
Esto lo practicamos en profundidad en la plataforma, con un editor donde escribes y ejecutas SQL en el navegador. Para entender los JOIN, lo mejor es pasarlos por la tienda: cambia un dato y mira cómo cambia el resultado.
## Dónde se queda corta la hoja
Mi opinión es que una hoja de cálculo es perfecta para tus propios cálculos y se queda corta cuando es el sitio donde vive la información de todo el negocio. Resumen de lo que hemos visto, más un límite que no depende de cómo la uses:
| Situación | Hoja de cálculo | Base de datos |
|---|---|---|
| Dato del cliente | Copiado en cada pedido | Guardado una vez |
| Cambiar una ciudad | Varias filas | Una fila |
| Dos personas a la vez | Con copias, gana la última | Un solo sitio, con permisos |
| Total por cliente | Tabla dinámica y columnas extra | Una consulta SQL |
| Tamaño | Máx. 1.048.576 filas por hoja | Mucho más margen |
Una tienda pequeña no llega a un millón de pedidos mañana. Pero el límite de filas es el último problema. Los datos repetidos y los cambios que se pisan te llegan mucho antes.
## Qué hacer con esto
Una hoja es ideal para cálculos rápidos y para datos que solo usas tú. Cuando varias personas dependen de los mismos datos, o cuando ves el mismo valor copiado una y otra vez, necesitas una base de datos y SQL.
Un ejercicio para hoy: abre una hoja tuya con más de un par de columnas. Busca un dato que se repita fila tras fila, como un nombre, una ciudad o una categoría. Ese dato pide su propia tabla. Dibuja las dos tablas en un papel y une con una flecha lo que se enlaza. Ya estás haciendo modelado de datos.