← Todos los artículos
💻 Informática

SQL básico: SELECT, WHERE y JOIN

Aprende SQL desde cero con una base de datos de ejemplo: SELECT, WHERE, ORDER BY, funciones de agregación, GROUP BY, INNER y LEFT JOIN, y cómo modificar datos con INSERT, UPDATE y DELETE.

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).

idnombrecurso
1Lucía1º Bachillerato
2Pablo2º Bachillerato
3Marta2º Bachillerato
4Daniel1º Bachillerato
5Elena2º Bachillerato
idalumno_idasignaturanota
11Matemáticas8,5
21Física7
32Matemáticas6
43Matemáticas9
53Química8
64Física4,5
72Física5,5
84QuímicaNULL

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;
nombrecurso
Lucía1º Bachillerato
Pablo2º Bachillerato
Marta2º Bachillerato
Daniel1º Bachillerato
Elena2º Bachillerato

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;
asignaturanota
Matemáticas8,5

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%';
nombre
Marta

Devuelve los nombres que empiezan por M.

SELECT alumno_id, asignatura
FROM notas
WHERE nota IS NULL;
alumno_idasignatura
4Química

Notas todavía sin poner.

SELECT asignatura, nota
FROM notas
WHERE nota BETWEEN 5 AND 7;
asignaturanota
Física7
Matemáticas6
Física5,5

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;
alumno_idasignaturanota
3Matemáticas9
1Matemáticas8,5
3Química8

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;
asignaturanotas_puestasmedia
Física35,67
Matemáticas37,83
Química18

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;
asignaturamedia
Matemáticas7,83
Química8

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.

Dos diagramas de Venn: INNER JOIN sombrea solo la intersección de alumnos y notas; LEFT JOIN sombrea todo el círculo de alumnos.

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';
nombreasignaturanota
LucíaMatemáticas8,5
PabloMatemáticas6
MartaMatemáticas9

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';
nombreasignaturanota
PabloFísica5,5
PabloMatemáticas6
MartaMatemáticas9
MartaQuímica8
ElenaNULLNULL

Con LEFT JOIN aparecen todos los alumnos de 2.º; Elena sale con asignatura y nota a NULL porque no tiene ninguna fila en notas.

Piensa en INNER JOIN como «solo si hay pareja en las dos tablas» y en LEFT JOIN como «todos los de la izquierda, tengan pareja o no». Para encontrar los que no tienen pareja, haz un LEFT JOIN y filtra con 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;
nombre
Elena

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;
Si olvidas el 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:

  1. FROM y JOIN: se obtienen y unen las tablas.
  2. WHERE: se filtran las filas.
  3. GROUP BY: se agrupan las filas.
  4. HAVING: se filtran los grupos.
  5. SELECT: se calculan las columnas y los alias.
  6. ORDER BY y por último LIMIT.

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 usa IS NULL o IS 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

  1. SELECT elige columnas, FROM la tabla y WHERE filtra filas.
  2. ORDER BY ordena, LIMIT acota; COUNT, AVG, MIN, MAX y SUM resumen; GROUP BY agrupa y HAVING filtra grupos.
  3. INNER JOIN devuelve solo las filas con pareja; LEFT JOIN conserva todas las de la izquierda.
  4. Los valores vacíos se comprueban con IS NULL, nunca con = NULL.
  5. UPDATE y DELETE sin WHERE afectan a toda la tabla.

Para seguir estudiando

¿Cuánto has aprendido?

1. ¿Qué instrucción selecciona solo las filas que cumplen una condición?

2. ¿Cómo se comprueba correctamente que una columna está vacía?

3. ¿Qué devuelve un INNER JOIN entre alumnos y notas?

4. ¿Qué cláusula se usa para filtrar grupos después de un GROUP BY?

5. ¿Qué ocurre si ejecutas DELETE FROM notas; sin WHERE?

6. En la base de ejemplo, ¿qué devuelve SELECT COUNT(nota) FROM notas;?

7. ¿Cuál es el orden lógico de ejecución correcto?

¿Este tema sigue sin quedarte claro?

Si necesitas una explicación personalizada, puedes contactar con María.

Contactar con María