Programación · n.º 2 entre los lenguajes más usados

Aprende SQL desde cero

El idioma para guardar, consultar y cruzar datos en una base de datos.

  • 10 lecciones
  • 10 ejercicios interactivos
  • 9 conceptos clave
  • 58,4 % lo usa*

Qué es SQL y para qué sirve

SQL es el lenguaje con el que se habla con las bases de datos relacionales, las que guardan la información en tablas: clientes, pedidos, inventarios… Casi cualquier aplicación lo usa por debajo. Los ejemplos siguen el estándar y funcionan en SQLite; en PostgreSQL o MySQL cambian pocos detalles.

  • Consultar y analizar datos
  • Guardar los datos de webs y aplicaciones
  • Informes y cuadros de mando

Para empezar: Instala SQLite (gratuito) o usa la base de datos de tu proyecto y ve ejecutando los ejemplos en orden.

Nivel 1 Básico

Lección 1 · Básico

Qué es una base de datos y tu primera consulta

Una base de datos relacional guarda la información en tablas, como una hoja de cálculo: cada fila es un registro (un cliente) y cada columna un dato (su nombre, su correo). SQL es el lenguaje para pedirle cosas.

La orden más usada es SELECT, que devuelve datos. Las palabras clave se suelen escribir en mayúsculas para distinguirlas, aunque SQL no lo exige, y cada sentencia termina en punto y coma.

Ejemplo práctico
-- Una consulta que no necesita ninguna tabla
SELECT 'Hola, SQL' AS saludo, 2 + 3 AS suma;

-- Resultado:
-- saludo     | suma
-- Hola, SQL  | 5

Ejercicio

En una tabla de clientes, ¿qué representa cada fila?

Ver la solución

Respuesta: Un cliente con todos sus datos. Cada fila es un registro completo; cada columna, un dato concreto de todos los registros.

Lección 2 · Básico

Crear una tabla e insertar datos

CREATE TABLE define una tabla con sus columnas y el tipo de dato de cada una. La clave primaria (PRIMARY KEY) identifica cada fila sin repetirse.

INSERT INTO añade filas. Los textos van entre comillas simples y los números sin comillas.

Ejemplo práctico
CREATE TABLE productos (
  id INTEGER PRIMARY KEY,
  nombre TEXT NOT NULL,
  precio REAL,
  stock INTEGER DEFAULT 0
);

INSERT INTO productos (nombre, precio, stock) VALUES
  ('Teclado', 25.90, 10),
  ('Ratón', 12.50, 0),
  ('Monitor', 149.00, 3);

Ejercicio

Completa la orden que añade una fila nueva.

 INTO productos (nombre, precio) VALUES ('Cable', 4.99);
Ver la solución

Respuesta: INSERT. INSERT INTO tabla (columnas) VALUES (valores) añade una fila.

Lección 3 · Básico

Filtrar y ordenar: WHERE y ORDER BY

WHERE se queda solo con las filas que cumplen una condición; puedes combinar varias con AND y OR. ORDER BY ordena el resultado, de menor a mayor por defecto o al revés con DESC.

En vez de * (todas las columnas), nombra las que necesitas: la consulta es más clara y más rápida.

Ejemplo práctico
SELECT nombre, precio
FROM productos
WHERE precio < 100 AND stock > 0
ORDER BY precio DESC;

-- nombre   | precio
-- Teclado  | 25.9

Ejercicio

Completa para ver solo los productos de menos de 10 €.

SELECT * FROM productos  precio < 10;
Ver la solución

Respuesta: WHERE. WHERE filtra las filas según la condición que escribas después.

Conceptos clave

Lección 4 · Básico

Modificar y borrar: UPDATE y DELETE

UPDATE cambia valores de filas existentes y DELETE las elimina. Los dos aceptan WHERE para decir a qué filas afectan.

Si olvidas el WHERE, la orden se aplica a toda la tabla. Antes de un UPDATE o un DELETE, prueba la misma condición con un SELECT para ver qué filas vas a tocar.

Ejemplo práctico
-- Sube un 10 % el precio del monitor
UPDATE productos SET precio = precio * 1.10 WHERE nombre = 'Monitor';

-- Primero comprueba qué vas a borrar…
SELECT * FROM productos WHERE stock = 0;
-- …y después bórralo
DELETE FROM productos WHERE stock = 0;

Ejercicio

¿Qué hace DELETE FROM clientes; sin WHERE?

Ver la solución

Respuesta: Borra todas las filas de la tabla. Sin condición, DELETE afecta a todas las filas. La tabla queda vacía (pero sigue existiendo).

Conceptos clave

Nivel 2 Intermedio

Lección 5 · Intermedio

Contar y agrupar: GROUP BY

Las funciones de agregado resumen muchas filas en un número: COUNT() cuenta, SUM() suma, AVG() hace la media, MIN() y MAX() buscan los extremos.

GROUP BY calcula esos resúmenes por grupos, por ejemplo por categoría. Para filtrar grupos (no filas) se usa HAVING.

Ejemplo práctico
CREATE TABLE ventas (producto TEXT, categoria TEXT, importe REAL);
INSERT INTO ventas VALUES
  ('Teclado', 'Periféricos', 25.90),
  ('Ratón', 'Periféricos', 12.50),
  ('Monitor', 'Pantallas', 149.00);

SELECT categoria, COUNT(*) AS ventas, SUM(importe) AS total
FROM ventas
GROUP BY categoria
HAVING SUM(importe) > 30;

-- categoria    | ventas | total
-- Pantallas    | 1      | 149.0
-- Periféricos  | 2      | 38.4

Ejercicio

¿Qué función calcula la media de una columna?

Ver la solución

Respuesta: AVG(). AVG() (de average) devuelve la media de los valores.

Conceptos clave

Lección 6 · Intermedio

Cruzar tablas: JOIN

Los datos se reparten en varias tablas para no repetirlos: los pedidos guardan el id del cliente, no su nombre. Esa columna que apunta a otra tabla es una clave foránea.

JOIN une las tablas en una consulta. INNER JOIN solo devuelve las filas con pareja en las dos; LEFT JOIN devuelve todas las de la izquierda, aunque no tengan pareja.

Ejemplo práctico
CREATE TABLE clientes (id INTEGER PRIMARY KEY, nombre TEXT);
CREATE TABLE pedidos (
  id INTEGER PRIMARY KEY,
  cliente_id INTEGER REFERENCES clientes(id),
  total REAL
);
INSERT INTO clientes VALUES (1, 'Ana'), (2, 'Luis');
INSERT INTO pedidos VALUES (1, 1, 30.0), (2, 1, 12.5);

SELECT c.nombre, COUNT(p.id) AS pedidos
FROM clientes AS c
LEFT JOIN pedidos AS p ON p.cliente_id = c.id
GROUP BY c.id;

-- Ana  | 2
-- Luis | 0   (con INNER JOIN, Luis no aparecería)

Ejercicio

Quieres ver todos los clientes, también los que nunca han comprado. ¿Qué JOIN usas?

Ver la solución

Respuesta: LEFT JOIN. LEFT JOIN conserva todas las filas de la tabla de la izquierda aunque no tengan pedidos.

Lección 7 · Intermedio

Subconsultas

Una subconsulta es un SELECT dentro de otro, entre paréntesis. Sirve para usar un resultado calculado como parte de la condición.

Por ejemplo, para ver los productos más caros que la media, primero se calcula la media y luego se compara cada precio con ella.

Ejemplo práctico
SELECT nombre, precio
FROM productos
WHERE precio > (SELECT AVG(precio) FROM productos);

Ejercicio

¿Dónde se escribe una subconsulta?

Ver la solución

Respuesta: Entre paréntesis dentro de otra consulta. La subconsulta va entre paréntesis y se ejecuta para dar un valor (o una lista) a la consulta principal.

Conceptos clave

Nivel 3 Avanzado

Lección 8 · Avanzado

Índices: consultas rápidas

Un índice es una estructura que la base de datos mantiene aparte para encontrar filas sin recorrer toda la tabla, como el índice de un libro. Acelera mucho las búsquedas por esa columna.

No es gratis: ocupa espacio y hace un poco más lentas las escrituras, porque el índice también se actualiza. Créalos en las columnas por las que buscas o unes tablas a menudo. Con EXPLAIN QUERY PLAN (SQLite) o EXPLAIN (PostgreSQL, MySQL) ves si una consulta lo usa.

Ejemplo práctico
CREATE INDEX idx_pedidos_cliente ON pedidos (cliente_id);

-- SQLite te dice cómo va a ejecutar la consulta
EXPLAIN QUERY PLAN
SELECT * FROM pedidos WHERE cliente_id = 1;
-- SEARCH pedidos USING INDEX idx_pedidos_cliente (cliente_id=?)

Ejercicio

¿Qué inconveniente tiene añadir un índice?

Ver la solución

Respuesta: Ocupa espacio y ralentiza un poco las escrituras. Cada inserción o cambio también actualiza el índice, y este ocupa espacio en disco.

Lección 9 · Avanzado

Transacciones: todo o nada

Una transacción agrupa varias órdenes para que se apliquen todas o ninguna. El ejemplo clásico es una transferencia: restar de una cuenta y sumar a otra tiene que ocurrir junto.

Se empieza con BEGIN, se confirma con COMMIT y, si algo falla, ROLLBACK deshace todo lo hecho desde el BEGIN.

Ejemplo práctico
CREATE TABLE cuentas (id INTEGER PRIMARY KEY, saldo REAL);
INSERT INTO cuentas VALUES (1, 100), (2, 50);

BEGIN;
UPDATE cuentas SET saldo = saldo - 30 WHERE id = 1;
UPDATE cuentas SET saldo = saldo + 30 WHERE id = 2;
COMMIT;   -- o ROLLBACK; para deshacer los dos cambios

Ejercicio

Completa la orden que deshace la transacción.

BEGIN;
UPDATE cuentas SET saldo = 0;
;
Ver la solución

Respuesta: ROLLBACK. ROLLBACK descarta todos los cambios hechos desde BEGIN.

Lección 10 · Avanzado

Consultas seguras: evita la inyección SQL

Si construyes una consulta pegando texto que escribe el usuario, alguien puede colar sus propias órdenes SQL: es la inyección SQL, uno de los fallos de seguridad más graves.

La solución es usar consultas parametrizadas: escribes huecos (?) y pasas los valores aparte, de modo que la base de datos nunca los interpreta como código. Todos los lenguajes tienen esta opción.

Ejemplo práctico
# En Python, con el módulo sqlite3 incluido
import sqlite3

con = sqlite3.connect("tienda.db")
nombre = input("Producto: ")

# MAL: con.execute(f"SELECT * FROM productos WHERE nombre = '{nombre}'")
# BIEN: el valor va aparte, nunca dentro del texto de la consulta
filas = con.execute("SELECT * FROM productos WHERE nombre = ?", (nombre,)).fetchall()
print(filas)

Ejercicio

¿Cuál es la forma correcta de evitar la inyección SQL?

Ver la solución

Respuesta: Usar consultas parametrizadas. Con parámetros, el valor nunca se mezcla con el código SQL, así que no puede alterar la consulta.

¿Has terminado? Sigue practicando

Repasa los conceptos en el diccionario, practica con estas herramientas o prueba otro lenguaje: las ideas que has aprendido (variables, condiciones, funciones, objetos…) te servirán en cualquiera.

  • Texto y programación

    Base64, URL y JSON

    Codifica y decodifica Base64 y URL, y valida o formatea JSON con la línea del error.

  • Texto y programación

    Comparar dos textos

    Encuentra las diferencias entre dos versiones de un texto, línea a línea y palabra a palabra.

Fuentes consultadas

* Porcentaje de personas que dijeron haber usado SQL en la Stack Overflow Developer Survey 2026: Technology (pregunta sobre lenguajes de programación, de scripts y de marcado; todas las respuestas). El progreso de las lecciones se guarda solo en este navegador.