Introducción
SQL (Structured Query Language) es el lenguaje que se usa para hablar con las bases de datos relacionales. Con unas pocas instrucciones puedes preguntarle a una base con millones de filas cosas como «¿qué alumnos han aprobado Matemáticas?» o «¿cuál es la nota media por asignatura?». Se usa en prácticamente cualquier aplicación con datos, y es una de las habilidades más rentables de la informática.
En este artículo aprenderás las instrucciones esenciales con una pequeña base de datos de ejemplo: SELECT, WHERE, ordenar, agrupar y calcular, unir tablas con JOIN y modificar datos. Todas las consultas y sus resultados están ejecutados de verdad, y funcionan igual en SQLite, PostgreSQL y MySQL. Si no conoces aún los conceptos de tabla y clave, empieza por bases de datos relacionales y no relacionales.
1. Los datos de ejemplo
Usaremos dos tablas relacionadas: alumnos y notas (en notas, la columna alumno_id es la clave foránea que apunta a alumnos.id).
Fíjate en dos detalles que usaremos después: Elena no tiene ninguna nota y la nota de Química de Daniel está vacía (NULL), es decir, todavía no está puesta.
2. SELECT: elegir columnas
SELECT indica qué columnas quieres y FROM de qué tabla. El asterisco significa «todas las columnas».
SELECT nombre, curso FROM alumnos;
3. WHERE: filtrar filas
WHERE deja solo las filas que cumplen una condición. Se pueden combinar condiciones con AND, OR y NOT.
SELECT asignatura, nota FROM notas WHERE alumno_id = 1 AND nota >= 8;
Otros operadores muy útiles:
=,<>(distinto),<,>,<=,>=: comparaciones.BETWEEN a AND b: valor entre dos límites, ambos incluidos.IN (...): el valor está en una lista.LIKE: busca patrones de texto;%significa «cualquier cosa».IS NULL/IS NOT NULL: valor vacío o no. No se escribe= NULL.
SELECT nombre FROM alumnos WHERE nombre LIKE 'M%';
Devuelve los nombres que empiezan por M.
SELECT alumno_id, asignatura FROM notas WHERE nota IS NULL;
Notas todavía sin poner.
SELECT asignatura, nota FROM notas WHERE nota BETWEEN 5 AND 7;
4. ORDER BY y LIMIT: ordenar y acotar
ORDER BY ordena el resultado (ASC de menor a mayor, por defecto; DESC de mayor a menor) y LIMIT corta el número de filas.
SELECT alumno_id, asignatura, nota FROM notas WHERE nota IS NOT NULL ORDER BY nota DESC LIMIT 3;
Las tres mejores notas.
5. Funciones de agregación y GROUP BY
Las funciones COUNT, SUM, AVG, MIN y MAX resumen muchas filas en un solo valor. Con GROUP BY se calculan por grupos. Ten en cuenta que AVG, MIN y MAX ignoran los valores NULL.
SELECT asignatura,
COUNT(nota) AS notas_puestas,
ROUND(AVG(nota), 2) AS media
FROM notas
GROUP BY asignatura;Para filtrar después de agrupar se usa HAVING (no WHERE, que actúa antes de agrupar). Por ejemplo, las asignaturas con media superior a 7:
SELECT asignatura, ROUND(AVG(nota), 2) AS media FROM notas GROUP BY asignatura HAVING AVG(nota) > 7;
6. JOIN: combinar tablas
Los datos de un alumno y sus notas están en tablas distintas. JOIN las une usando la clave foránea: la cláusula ON indica qué columna de una tabla coincide con la clave de la otra.
INNER JOIN devuelve solo las parejas; LEFT JOIN conserva todas las filas de la tabla de la izquierda.
SELECT a.nombre, n.asignatura, n.nota FROM alumnos AS a INNER JOIN notas AS n ON n.alumno_id = a.id WHERE n.asignatura = 'Matemáticas';
INNER JOIN devuelve solo los alumnos que tienen al menos una nota que cumple las condiciones. Elena no aparece porque no tiene ninguna.
SELECT a.nombre, n.asignatura, n.nota FROM alumnos AS a LEFT JOIN notas AS n ON n.alumno_id = a.id WHERE a.curso = '2º Bachillerato';
Con LEFT JOIN aparecen todos los alumnos de 2.º; Elena sale con asignatura y nota a NULL porque no tiene ninguna fila en notas.
WHERE sobre la columna de la derecha IS NULL.SELECT a.nombre FROM alumnos AS a LEFT JOIN notas AS n ON n.alumno_id = a.id WHERE n.id IS NULL;
Alumnos sin ninguna nota registrada.
7. INSERT, UPDATE y DELETE: modificar datos
Estas tres instrucciones cambian los datos. Su forma básica es:
INSERT INTO alumnos (id, nombre, curso) VALUES (6, 'Sara', '1º Bachillerato'); UPDATE notas SET nota = 5 WHERE id = 8; DELETE FROM notas WHERE id = 6;
WHERE en un UPDATE o un DELETE, la instrucción se aplica a todas las filas de la tabla. Antes de ejecutarlos, prueba el mismo WHERE con un SELECT para ver qué filas afectará.8. El orden en que se ejecuta una consulta
Aunque se escribe empezando por SELECT, el sistema evalúa las cláusulas en este orden:
FROMyJOIN: se obtienen y unen las tablas.WHERE: se filtran las filas.GROUP BY: se agrupan las filas.HAVING: se filtran los grupos.SELECT: se calculan las columnas y los alias.ORDER BYy por últimoLIMIT.
Por eso no se puede usar en el WHERE un alias definido en el SELECT: cuando se evalúa el WHERE, ese alias todavía no existe.
9. Errores frecuentes
- ⚠️ Escribir
= NULL. Un valor vacío no es igual a nada, ni siquiera a otro NULL. Se usaIS NULLoIS NOT NULL - ⚠️ Olvidar el WHERE en UPDATE o DELETE. Modifica o borra toda la tabla. Prueba antes con un SELECT
- ⚠️ Confundir WHERE con HAVING. WHERE filtra filas antes de agrupar; HAVING filtra los grupos resultantes, normalmente con una función de agregación
- ⚠️ Olvidar la condición ON en un JOIN. Sin ella se combinan todas las filas con todas (producto cartesiano) y el resultado es enorme y sin sentido
- ⚠️ Usar comillas dobles para el texto. En SQL estándar el texto va con comillas simples:
'Matemáticas'
10. 📌 En 30 segundos
SELECTelige columnas,FROMla tabla yWHEREfiltra filas.ORDER BYordena,LIMITacota;COUNT,AVG,MIN,MAXySUMresumen;GROUP BYagrupa yHAVINGfiltra grupos.INNER JOINdevuelve solo las filas con pareja;LEFT JOINconserva todas las de la izquierda.- Los valores vacíos se comprueban con
IS NULL, nunca con= NULL. UPDATEyDELETEsinWHEREafectan a toda la tabla.