lección 1
SQL y DuckDB: tu laboratorio de datos
Qué es SQL, qué es DuckDB, y por qué puedes empezar a practicar ahora mismo sin instalar nada.
⏱ 45 min
Estás a punto de aprender el lenguaje más longevo y más demandado del mundo de los datos. SQL — Structured Query Language — nació en los años 70, sobrevivió a la revolución de internet, al auge del NoSQL, al Big Data, a la inteligencia artificial y a cada "nueva revolución" que prometía reemplazarlo. Y aquí sigue, más fuerte que nunca. Si aprendes UN solo lenguaje técnico en tu vida profesional, que sea SQL. Te acompañará toda tu carrera sin importar si trabajas en una startup de 3 personas o en un banco con 50.000 empleados.
Y lo mejor: no necesitas instalar absolutamente nada para empezar. En esta plataforma ejecutas SQL directamente en tu navegador gracias a DuckDB-WASM, un motor de base de datos analítico que corre dentro de tu pestaña. Pulsa [Ejecutar ▶] en cualquier ejercicio y verás resultados reales al instante. Sin Docker, sin servidores, sin configuración.
### El mundo antes de SQL: el caos de los datos
Imagina que trabajas en un banco en 1968. Los datos de los clientes están en cintas magnéticas. Para buscar la cuenta de un cliente, un programador tiene que escribir un programa completo en COBOL que recorre la cinta secuencialmente, registro por registro, hasta encontrar lo que busca. Si mañana el jefe pide "los clientes con saldo mayor a 10.000 pesetas", hay que escribir OTRO programa desde cero. Cada pregunta nueva = un programa nuevo = días de trabajo.
El acceso a los datos estaba atado a la estructura física del almacenamiento. Si los datos estaban en una cinta, tenías que saber que estaban en la cinta 47, posición 3.200, bloque 8. Si alguien reorganizaba las cintas, todos los programas se rompían. Era como si para buscar una palabra en un libro necesitaras saber su posición exacta en centímetros desde la esquina superior izquierda.
### Edgar F. Codd y el modelo relacional (1970)
En 1970, un matemático británico llamado Edgar F. Codd, que trabajaba en IBM, publicó un paper que cambiaría la historia: "A Relational Model of Data for Large Shared Data Banks". Su idea era revolucionaria en su simplicidad: ¿y si organizamos los datos en tablas (filas y columnas) y dejamos que un lenguaje declarativo se encargue de buscarlos? En vez de decir "ve a la cinta 47, bloque 8, lee bytes 200 a 250", simplemente dices "dame todos los clientes de Madrid con saldo mayor a 10.000".
Codd propuso separar el QUÉ del CÓMO. Tú dices QUÉ datos quieres, y el sistema se encarga de CÓMO encontrarlos. Es la misma diferencia entre decirle a un taxista "llévame al aeropuerto" (declarativo) vs darle instrucciones giro a giro (imperativo). SQL es declarativo: describes el resultado que quieres, no los pasos para obtenerlo.
### ¿Qué es DuckDB y por qué lo usamos aquí?
DuckDB es un motor de base de datos analítico creado en 2019 en el CWI (Centrum Wiskunde & Informatica) de Ámsterdam. A diferencia de PostgreSQL o MySQL — que necesitan un servidor corriendo, puertos abiertos, usuarios configurados — DuckDB es embebido: se ejecuta dentro de tu proceso. Cero configuración, cero servidor, cero dolores de cabeza. En esta plataforma, se ejecuta directamente en tu navegador gracias a WebAssembly.
¿Por qué no empezamos con PostgreSQL, como hace todo el mundo? Porque PostgreSQL es un motor transaccional (OLTP): está optimizado para que un cajero registre una venta, no para que un analista procese millones de filas. DuckDB es un motor analítico (OLAP): está optimizado exactamente para lo que tú vas a hacer — explorar datos, agregar, filtrar, cruzar tablas. Y habla el mismo SQL. Lo que aprendas aquí funciona igual en PostgreSQL, BigQuery, Redshift o cualquier otro motor.
En esta plataforma ya tienes tablas cargadas con datos realistas: 5.000 clientes, 20.000 pedidos, 200 productos, 100 empleados y más. No necesitas crear ni cargar nada — solo escribe SQL y pulsa Ejecutar. Más adelante aprenderás a instalar DuckDB en tu portátil y a trabajar con tus propios datos.
### Tu primer SELECT: SQL como calculadora
SQL no necesita tablas para funcionar. Puedes usar SELECT como una calculadora, para manipular texto o para obtener información del sistema. Esto es útil para probar expresiones antes de aplicarlas a datos reales:
1-- SQL como calculadora2SELECT 1 + 1 AS resultado;34-- Manipular texto5SELECT 'Hola' || ' ' || 'mundo' AS saludo;67-- Fecha actual8SELECT CURRENT_DATE AS hoy;910-- Expresiones complejas11SELECT12 42 * 3.14 AS pi_por_42,13 ROUND(100.0 / 3, 2) AS un_tercio,14 LENGTH('BigDataStack') AS longitud;
SELECT sin FROM: una calculadora con superpoderes
### Explorar las tablas disponibles
Cuando llegas a una base de datos nueva — ya sea en un trabajo nuevo o en esta plataforma — lo primero que haces es explorar: ¿qué tablas hay? ¿qué columnas tienen? ¿cuántos datos hay? DuckDB tiene comandos para eso:
1-- Ver todas las tablas disponibles2SHOW TABLES;34-- Ver la estructura de una tabla (columnas y tipos)5DESCRIBE clientes;67-- También funciona con esta sintaxis:8DESCRIBE pedidos;
SHOW TABLES y DESCRIBE: tus primeras herramientas de exploración
### Tu primer SELECT * FROM
Ahora sí — vamos a consultar datos reales. SELECT * FROM tabla LIMIT n te da las primeras n filas de una tabla. Es tu forma de "echar un vistazo" a los datos:
1-- Las primeras 5 filas de la tabla clientes2SELECT * FROM clientes LIMIT 5;34-- Las primeras 5 filas de pedidos5SELECT * FROM pedidos LIMIT 5;67-- Solo columnas específicas8SELECT nombre, ciudad, es_vip9FROM clientes10LIMIT 10;1112-- ¿Cuántas filas tiene una tabla?13SELECT COUNT(*) AS total_filas FROM pedidos;
SELECT * con LIMIT y COUNT(*): explorar sin inundar la pantalla
Consejo de senior: SELECT * es para explorar. En código que va a producción, siempre lista las columnas explícitamente. He visto pipelines romperse porque alguien añadió una columna de 10MB y el SELECT * empezó a devolver gigas de datos inesperados.
### Declarativo vs imperativo: la clave de SQL
La diferencia fundamental entre SQL y lenguajes como Python es que SQL es declarativo: dices QUÉ quieres, no CÓMO obtenerlo. En Python, para encontrar clientes de Madrid escribirías un bucle que recorre cada fila y comprueba la condición. En SQL, simplemente describes el resultado:
1-- IMPERATIVO (pseudocódigo Python):2-- resultado = []3-- for fila in clientes:4-- if fila.ciudad == 'Madrid':5-- resultado.append(fila.nombre)67-- DECLARATIVO (SQL):8SELECT nombre9FROM clientes10WHERE ciudad = 'Madrid';
SQL: describes el resultado. El motor decide CÓMO encontrarlo.
Esta es la magia de SQL: tú no le dices al motor "recorre las filas de izquierda a derecha, compara cada una...". Le dices "quiero los nombres de los clientes de Madrid". El motor decide internamente si usa un índice, si escanea la tabla completa, si paraleliza la lectura. Y lo hace mucho mejor que tú — tiene 50 años de optimizaciones acumuladas.
### Crear tablas y meter datos: DDL y DML
Hasta ahora has consultado tablas que ya existían. Pero en tu trabajo vas a necesitar crear tablas propias — para pruebas, para transformaciones intermedias, para cargar datos nuevos. SQL separa dos lenguajes: DDL (Data Definition Language) para definir estructuras, y DML (Data Manipulation Language) para meter, modificar y borrar datos dentro de esas estructuras.
1-- DDL: crear una tabla con 3 columnas2CREATE TABLE paises (3 id INTEGER PRIMARY KEY, -- identificador único de cada fila4 nombre VARCHAR, -- texto de longitud variable5 continente VARCHAR6);78-- DML: insertar varias filas de una vez9INSERT INTO paises (id, nombre, continente) VALUES10 (1, 'España', 'Europa'),11 (2, 'Portugal', 'Europa'),12 (3, 'México', 'América');1314-- Comprobar que los datos están ahí15SELECT * FROM paises;
CREATE TABLE + INSERT: el ciclo completo de definir y llenar
Error típico que verás al principio: poner comillas dobles en un texto ("Madrid" en vez de 'Madrid'). SQL interpreta las dobles como un nombre de columna, y el mensaje de error dice «Referenced column "Madrid" was not found». Si ves eso, revisa las comillas.
### ¿Qué es una base de datos relacional?
Una base de datos relacional organiza la información en tablas. Cada tabla tiene columnas (los campos — nombre, email, edad) y filas (los registros — cada cliente individual). Las tablas se relacionan entre sí mediante claves. Piénsalo como un Excel con superpoderes: cada pestaña es una tabla, cada columna tiene un tipo fijo (texto, número, fecha) y puedes cruzar pestañas instantáneamente.
- 01.Tabla: una colección de datos sobre un tema (clientes, pedidos, productos).
- 02.Fila (registro): un elemento individual. Un cliente concreto, un pedido concreto.
- 03.Columna (campo): una propiedad. El nombre del cliente, la fecha del pedido.
- 04.Clave primaria (PK): el identificador único de cada fila. Nunca se repite.
- 05.Clave foránea (FK): una columna que apunta a la PK de otra tabla. Es el enlace entre tablas.
### Lo que vas a aprender en esta skill
- 01.SQL y DuckDB: tu laboratorio de datos — esta lección
- 02.Tu entorno de práctica: DuckDB en local y en la nube (lección 2)
- 03.Tu primera consulta: SELECT, FROM y WHERE (lección 3)
- 04.Ordenar, limitar y filtrar con precisión (lección 4)
- 05.Funciones de agregación: COUNT, SUM, AVG (lección 5)
- 06.Agrupar datos con GROUP BY y HAVING (lección 6)
- 07.Cruzar tablas con JOINs (lecciones 7 y 8)
- 08.Consultas modulares con subqueries y CTEs (lección 9)
- 09.Modificar datos: INSERT, UPDATE, DELETE (lección 10)
- 10.NULLs y trampas comunes (lección 11)
SQL se aprende escribiendo SQL. Leer teoría sin practicar es como leer un libro de natación sin meterte en la piscina. En cada lección tendrás ejercicios prácticos — hazlos todos. No copies la solución hasta haberlo intentado al menos 5 minutos.
Estás a punto de aprender un lenguaje que lleva 50 años siendo relevante y que seguirá siéndolo otros 50. No hay prisa — dedica el tiempo que necesites a cada lección. Cuando termines esta skill, serás capaz de extraer información valiosa de cualquier base de datos relacional. Eso es un superpoder profesional.
## ejercicios
Tu primer SELECT: SQL como calculadora
SQL no necesita tablas para funcionar. Puedes usar SELECT como una calculadora o para obtener información del sistema. Escribe tres consultas: una que sume 1+1, otra que devuelva el texto "Hola mundo" (usando || para concatenar), y otra que use typeof() para averiguar de qué tipo es CURRENT_DATE.
Explorar las tablas del e-commerce
Acabas de llegar a un proyecto nuevo. Lo primero: explorar. Usa SHOW TABLES para ver qué tablas hay, luego DESCRIBE pedidos para ver su estructura, y finalmente cuenta cuántas filas tiene la tabla pedidos.
De pseudocódigo imperativo a SQL declarativo
Abajo tienes un pseudocódigo imperativo que recorre una lista de empleados paso a paso para encontrar los que ganan más de 50000. Tu tarea: escribe la consulta SQL equivalente (declarativa). Recuerda: en SQL dices QUÉ quieres, no CÓMO buscarlo.
Crear, insertar y consultar: el ciclo completo
Crea una tabla llamada "ciudades" con tres columnas: id (INTEGER PRIMARY KEY), nombre (VARCHAR) y pais (VARCHAR). Inserta 3 ciudades (Madrid/España, Lisboa/Portugal, París/Francia) y haz un SELECT para ver todas las filas.
💡 Resultado esperado
┌───────┬─────────┬──────────┐ │ id │ nombre │ pais │ ├───────┼─────────┼──────────┤ │ 1 │ Madrid │ España │
Regístrate para guardar tu progreso.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...