SQL es el lenguaje con el que se consultan y modifican las bases de datos relacionales: lo usan desde los programadores de backend hasta los analistas de datos. Aquí tienes un curso desde cero, un editor para escribir consultas en el navegador, las rarezas del lenguaje, un test y ejemplos para tareas concretas. Todo gira alrededor de la misma base de ejemplo, la de una pequeña tienda, y cada consulta se ejecutó de verdad antes de publicarse.
Curso · 8 leccionesAprende SQL desde cero, en españolConsultar con SELECT y WHERE, agrupar con GROUP BY, unir tablas con JOIN, subconsultas y CTE, crear y modificar datos con transacciones, índices medidos sobre un millón de filas y funciones de ventana, con SQL desde Python y Node. Con esquemas, retos y la salida real de cada consulta.Ir al curso → Editor en líneaPractica SQL en el navegadorEscribe consultas sobre la base de la tienda y mira los resultados al momento, con el esquema de las tablas a la vista. Funciona con SQLite dentro del navegador, sin instalar nada, y la base se puede reiniciar.Abrir el editor → Rarezas · 15 casosConsultas que no hacen lo que pareceNULL = NULL, NOT IN con un NULL, COUNT(*) frente a COUNT(columna), el LEFT JOIN que se vuelve INNER, el JOIN que multiplica sumas o la división entera, con lo que responde cada motor.Ver las rarezas → Test · 24 preguntas¿Qué devuelve esta consulta?24 consultas sobre la base de la tienda y cuatro resultados posibles para cada una. Con la nota, los aciertos por lección y la explicación de cada respuesta.Hacer el test →El motor principal es SQLite, porque funciona en el navegador y en Python sin instalar un servidor. Lo que se enseña es SQL estándar; cuando PostgreSQL 17 o MySQL 8.4 se comportan distinto, cada página lo cuenta con la salida real de los tres motores.
Informes y análisis
- Los N primeros de cada grupoCómo sacar los dos productos más vendidos de cada categoría con ROW_NUMBER y PARTITION BY, qué cambia con RANK y DENSE_RANK cuando hay empates, y…
- Totales acumulados y medias móvilesVentas por mes con su acumulado, la media de los últimos tres meses y el porcentaje del total, con funciones de ventana; el acumulado por cliente con…
- Tabla dinámica: filas a columnasCómo convertir las ventas por categoría y trimestre en una tabla con una columna por trimestre, con SUM(CASE WHEN) o con FILTER, y qué cambia entre…
- Fechas: agrupar por mes y contar díasAgrupar pedidos por mes, contar los días entre dos fechas, filtrar los últimos 90 días y sacar el día de la semana en SQLite, PostgreSQL y MySQL, con…
Mantener los datos
- Buscar y borrar duplicadosCómo encontrar filas duplicadas con GROUP BY y HAVING, por qué hay que normalizar mayúsculas y espacios, cómo borrar las sobrantes conservando una, y…
- Insertar o actualizar (upsert)Cómo insertar una fila o actualizarla si ya existe, en una sola sentencia: ON CONFLICT en SQLite y PostgreSQL, ON DUPLICATE KEY UPDATE en MySQL y…
- Paginación: OFFSET frente a cursorCómo paginar resultados con LIMIT y OFFSET, por qué hace falta un desempate en el ORDER BY y por qué las páginas lejanas se vuelven lentas, y cómo lo…
- Jerarquías con WITH RECURSIVECómo recorrer una jerarquía guardada como «cada fila apunta a su jefe» con una CTE recursiva: el organigrama completo, el equipo de un jefe, la…
Datos que entran y salen
- JSON en SQLCómo convertir un pedido con sus líneas en un documento JSON, leer campos con ->>, expandir arrays a filas y modificar documentos, en SQLite…
- Importar un CSVCómo cargar un archivo CSV en una tabla con la consola de sqlite3, COPY de PostgreSQL y LOAD DATA de MySQL, y cómo usarlo después para actualizar…
SQL desde un programa
- SQLite desde PythonCómo usar una base SQLite desde Python con el módulo sqlite3: consultas con parámetros, filas por nombre, inserciones en lote, transacciones que se…
- SQLite desde Node.jsCómo usar SQLite desde Node.js 24 con el módulo integrado node:sqlite: consultas preparadas con parámetros, inserciones, transacciones con BEGIN y…
Todas las consultas se ejecutaron sobre la misma base de ejemplo en SQLite 3.46, y las diferencias en PostgreSQL 17 y MySQL 8.4, en contenedores con esos motores; los resultados y mensajes que aparecen están copiados de esa ejecución.
