JOINS en SQL

Publicado el Miércoles, 12 de septiembre de 2007

Hoy en clase estamos dando "JOINS". Aprovecho para postear sobre el tema.

De Wikipedia:

La sentencia JOIN en SQL permite combinar registros de dos o más tablas en una base de datos relacional. En el Lenguaje de Consultas Estructurado (SQL), hay tres tipo de JOIN: interno, externo, y cruzado.

En casos especiales una tabla puede unirse a sí misma, produciendo una auto-combinación, SELF-JOIN.

Matematicamente, JOIN es composición relacional, la operacion fundamental en el álgebra relacional,y generalizando es una funcion de composicion.

Es una forma de recuperar datos mediante un SELECT uniendo dos o más tablas.

Cuando entré a mi trabajo actual, mi experiencia con SQL era totalmente nula. Sin embargo, tenía que empezar a usar funciones complicadas, vistas, procedimientos almacenados, y selects que en el momento me parecían imposibles.
Una de las cosas más importantes que aprendí fue a hacer los JOINS. Y de esos tiempos me acuerdo del siguiente artículo: JOINS para seres humanos. Ahí están los diagramas de conjuntos para cada tipo de Join y es recomendable leer el post para ver algo más.

En mi caso voy a escribir algo netamente práctico para tratar de sacarle la vuelta. Una vez que se entiende, resulta muy práctico, y se usa mucho. Personalmente el que más uso es el INNER JOIN pero dependiendo de la situación, hay que analizar cuál JOIN viene mejor. Recomiendo visitar la página de WikiPedia que está bastante concreta, y después armarse una base de datos y empezar a probarlo.

EJEMPLO: Tenemos una base de datos con una tabla "Estudiantes", que guarda el Id y Nombre, "Materias" que guarda lo mismo, y una que relaciona las dos mediantes sus respectivos ID:

Diagrama JOINS base de datos

INNER JOIN: Queremos un SELECT que nos devuelva los nombres de cada estudiante que está estudiando una materia, y qué materias está estudiando.

SELECT E.Nombre, M.Nombre FROM Estudiantes AS E
INNER JOIN Estudiantes_Materias AS EM
ON EM.IdEstudiante = E.Id
INNER JOIN Materias AS M
ON M.Id = EM.IdMateria
ORDER BY E.Nombre

Es importante notar que Transact SQL (la versión de SQL que usa MS SQL SERVER) tiene la posibilidad de hacer este tipo de consultas de forma más "sencilla" a simple vista con algo como:

SELECT E.Nombre, M.Nombre
FROM Estudiantes AS E, Materias AS M, Estudiantes_Materias AS EM
WHERE E.Id = EM.IdEstudiante and M.Id = EM.IdMateria

Sin embargo, es más recomendable hacerlo a la manera "ANSI" que es la más estándar, así si cambiáramos de motor de base de datos a Oracle, Postgre o MySQL tendríamos menos dificultad con la sintaxis.

OUTER JOIN: Ahora queremos saber lo mismo, pero además mostrar los estudiantes que no están estudiando ninguna materia:

SELECT E.Nombre, EM.IdMateria
FROM Estudiantes_Materias AS EM
FULL OUTER JOIN Estudiantes AS E
ON E.Id = EM.IdEstudiante

Con eso ya se puede tener una idea de qué significan los joins. Por experiencia puedo decir que se llega a entender bien sólo con la práctica.

Por más información:

4 comentarios en este post

Feed de comentarios
  1. Fernando (fbt) 's status on Friday, 24-Jul-09 17:02:57 UTC - Identi.ca | 24 julio. 2009 - 15:03

    […] SELECT … INNER JOIN … ON … Joins en SQL: https://picandocodigo.net/2007/joins-en-sql/ […]

  2. Brutalidades en el léxico de los informáticos | Picando Código | 14 octubre. 2009 - 05:01

    […] Joinear – Siguiendo con bases de datos, cuando utilizamos joins entre tablas. […]

Dejar un comentario

Toasty!