SELF JOIN en SQL
Un
SELF JOIN
en SQL es un
JOIN
en el que una tabla se une consigo misma
. Se usan alias de tabla distintos (por ejemplo
A
y
B
) para tratar cada aparición como una tabla diferente.
SELF JOIN en SQL es una pieza habitual del flujo SQL: consultar, filtrar, agrupar o modificar datos. Cada ejemplo usa tablas de demostración para que puedas experimentar sin riesgo.
Cómo practicar: ejecuta la consulta tal cual, revisa columnas y tipos, luego cambia un filtro o un alias y vuelve a ejecutar.
SELF JOIN en SQL es una pieza habitual del flujo SQL: consultar, filtrar, agrupar o modificar datos. Cada ejemplo usa tablas de demostración para que puedas experimentar sin riesgo.
Cómo practicar: ejecuta la consulta tal cual, revisa columnas y tipos, luego cambia un filtro o un alias y vuelve a ejecutar.
Sirve para comparar filas dentro de la misma tabla: clientes de la misma ciudad, productos de la misma categoría, empleados del mismo departamento, etc.
Sintaxis SELF JOIN en SQL
La sintaxis indica el orden de argumentos y palabras clave. Copia la plantilla y sustituye nombres de columnas o literales entre comillas simples.
Plantilla con alias
SELECT A.columna, B.columna
FROM tabla AS A
INNER JOIN tabla AS B
ON A.clave_relacion = B.clave_relacion
AND A.id < B.id;
SELF JOIN
la misma tabla física actúa con dos roles lógicos (alias A y B) unidos por una clave.
Ejemplo SELF JOIN en SQL
Pares de clientes distintos que comparten
Ciudad
:
Pares en Madrid, Barcelona…
SELECT A.Nombre_Cliente AS Cliente1,
B.Nombre_Cliente AS Cliente2,
A.Ciudad
FROM Clientes A
INNER JOIN Clientes B
ON A.Ciudad = B.Ciudad
AND A.ID_Cliente < B.ID_Cliente
ORDER BY A.Ciudad, Cliente1;
Resultado: Ana García y Carlos Ruiz comparten Madrid.
| Cliente1 | Cliente2 | Ciudad |
|---|---|---|
| Ana García | Carlos Ruiz | Madrid |
A.ID_Cliente < B.ID_Cliente evita duplicar pares.Tabla demo Clientes para SELF JOIN
Base de datos de demostración: Clientes
Observa qué columnas devuelve la consulta y cómo se nombran con AS. Ese alias es lo que verás en la cuadrícula del editor.
| ID_Cliente | Nombre_Cliente | Ciudad | Pais | N_Ventas |
|---|---|---|---|---|
| 1 | Ana García | Madrid | España | 120 |
| 2 | Luis Pérez | Barcelona | España | 85 |
| 3 | María López | Valencia | España | 200 |
| 4 | Carlos Ruiz | Madrid | España | 45 |
| 5 | Elena Torres | Sevilla | España | 67 |
| 6 | John Smith | London | UK | 150 |
| 7 | Marie Dubois | Paris | Francia | 92 |
| 8 | Hans Müller | Berlin | Alemania | 78 |
| 9 | Luca Rossi | Roma | Italia | 110 |
| 10 | Sofia Anders | Stockholm | Suecia | 55 |
SELF JOIN con varias condiciones
Añade condiciones al
ON
para acotar los pares:
Clientes españoles de ciudades distintas
SELECT A.Nombre_Cliente AS Cliente1,
B.Nombre_Cliente AS Cliente2,
A.Pais
FROM Clientes A
INNER JOIN Clientes B
ON A.Pais = B.Pais
AND A.ID_Cliente < B.ID_Cliente
AND A.Ciudad <> B.Ciudad
ORDER BY A.Pais, Cliente1;
SELF JOIN en la tabla Productos
La misma técnica funciona con cualquier tabla. Aquí, pares de productos de la misma categoría:
Productos de la misma categoría
SELECT A.Nombre_Producto AS Producto1,
B.Nombre_Producto AS Producto2,
A.ID_Categoria
FROM Productos A
INNER JOIN Productos B
ON A.ID_Categoria = B.ID_Categoria
AND A.ID_Producto < B.ID_Producto
ORDER BY A.ID_Categoria, Producto1;
Resumen SELF JOIN
- Une una tabla consigo misma con alias distintos.
-
Usa
A.id < B.idpara evitar duplicar pares y emparejar una fila consigo misma. -
Puedes combinar varias condiciones en
ON. - Siguiente paso: LIMIT / SELECT TOP .
Cómo practicar en el editor
1. Pulsa Pruébalo tú mismo en un ejemplo.
2. Cambia un filtro, columna o literal.
3. Ejecuta y compara el resultado con la tabla de ejemplo.
Practica con ejercicios
Repasa la lección con consultas sobre Clientes (Elena Torres, Valencia…) y Productos (pera, mango, fresa) de nuestra base demo.
Ejercicio: Clientes de la misma ciudad
Practica unir la tabla Clientes consigo misma. Usa la tabla Clientes de la demo (Elena Torres, Valencia…).
Consulta
SELECT A.Nombre_Cliente AS Cliente1, B.Nombre_Cliente AS Cliente2, A.Ciudad
FROM Clientes A
INNER JOIN Clientes B ON A.Ciudad = B.Ciudad AND A.ID_Cliente < B.ID_Cliente
ORDER BY A.Ciudad, Cliente1;
Ejercicio: Mismo país, distinta ciudad
SELF JOIN con condiciones adicionales en WHERE/ON. Usa la tabla Clientes de la demo (Elena Torres, Valencia…).
Consulta
SELECT A.Nombre_Cliente AS Cliente1, B.Nombre_Cliente AS Cliente2, A.Pais
FROM Clientes A
INNER JOIN Clientes B ON A.Pais = B.Pais AND A.ID_Cliente < B.ID_Cliente AND A.Ciudad <> B.Ciudad
ORDER BY A.Pais, Cliente1;
Ejercicio: Productos de la misma categoría
SELF JOIN en Productos por ID_Categoria. Usa la tabla Clientes de la demo (Elena Torres, Valencia…).
Consulta
SELECT A.Nombre_Producto AS Producto1, B.Nombre_Producto AS Producto2, A.ID_Categoria
FROM Productos A
INNER JOIN Productos B ON A.ID_Categoria = B.ID_Categoria AND A.ID_Producto < B.ID_Producto
ORDER BY A.ID_Categoria, Producto1;
Cómo practicar
1. Pulsa Ejecutar aquí en el bloque.
2. Modifica la consulta (filtro, columnas…).
3. O abre el editor para más espacio.
Comprueba lo aprendido
Responde 2–3 preguntas sobre esta lección. Verás ✓ en verde si aciertas o ✗ en rojo si fallas.