Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Los JOINs en SQL sirven para combinar filas de dos o más tablas basándose
en un campo común entre ellas, devolviendo por tanto datos de diferentes
tablas. Un JOIN se produce cuando dos o más tablas se juntan en una
sentencia SQL.
Existen más tipos de joins en SQL que los que aquí se explican,
como CROSS JOIN, O SELF JOIN, pero no todos ellos están soportados por
todos los sistemas de bases de datos. Los más importantes son los
siguientes:
1. INNER JOIN: Devuelve todas las filas cuando hay al menos una
coincidencia en ambas tablas.
2. LEFT JOIN: Devuelve todas las filas de la tabla de la izquierda, y las
filas coincidentes de la tabla de la derecha.
3. RIGHT JOIN: Devuelve todas las filas de la tabla de la derecha, y las
filas coincidentes de la tabla de la izquierda.
4. OUTER JOIN: Devuelve todas las filas de las dos tablas, la izquierda y
la derecha. También se llama FULL OUTER JOIN.
5. Vamos a verlo también con un ejemplo, mediante las tablas Cliente
y Pedido:
Cliente:
1. INNER JOIN
INNER JOIN selecciona todas las filas de las dos columnas siempre y cuando
haya una coincidencia entre las columnas en ambas tablas. Es el tipo de
JOIN más común.
SELECT nombreColumna(s)
FROM tabla1
INNER JOIN tabla2
ON tabla1.nombreColumna=table2.nombreColumna;
La siguiente sentencia SQL devolverá todos los clientes con pedidos:
2. LEFT JOIN
LEFT JOIN mantiene todas las filas de la tabla izquierda (la tabla1). Las filas
de la tabla derecha se mostrarán si hay una coincidencia con las de la
izquierda. Si existen valores en la tabla izquierda pero no en la tabla
derecha, ésta mostrará null.
SELECT nombreColumna(s)
FROM tabla1
LEFT JOIN tabla2
ON tabla1.nombreColumna=tabla2.nombreColumna;
Ahora vemos que se muestran todas las filas de la tabla Clientes, que es la tabla
de la izquierda, tantas veces como haya coincidencias con el lado derecho. Marco
Lambert no ha realizado ningún pedido, por lo que se muestra null.
3. RIGHT JOIN
Es igual que LEFT JOIN pero al revés. Ahora se mantienen todas las filas de
la tabla derecha (tabla2). Las filas de la tabla izquierda se mostrarán si hay
una coincidencia con las de la derecha. Si existen valores en la tabla
derecha pero no en la tabla izquierda, ésta se mostrará null.
SELECT nombreColumna(s)
FROM tabla1
RIGHT JOIN tabla2
ON tabla1.nombreColumna=tabla2.nombreColumna;
:
4. OUTER JOIN
OUTER JOIN o FULL OUTER JOIN devuelve todas las filas de la tabla
izquierda (tabla1) y de la tabla derecha (tabla2). Combina el resultado de
los joins LEFT y RIGHT. Aparecerá null en cada una de las tablas
alternativamente cuando no haya una coincidencia.
SELECT nombreColumna(s)
FROM tabla1
OUTER JOIN tabla2
ON tabla1.nombreColumna=tabla2.nombreColumna;
Concepto de JOIN
Un JOIN se utiliza para consultar datos de más de una tabla
S.Q.L.
Ejemplo de Equijoin
SELECT emp.empno,emp.ename,emp.DEPTNO,dept.deptno,dept.loc
From emp,dept
Where emp.deptno=dept.deptno
Ya que la columna DEPTNO es igual en ambas tablas, ésta debe ir prefijada por el
nombre de la tabla para evitar la ambigüedad.
S.Q.L.
Ejemplo de Non-Equijoins
Select e.ename,e.sal,s.grade
From emp e,salgrade s
Where e.sal BETWEEN s.losal and s.hisal
En este ejemplo se han usado alias de tablas (e para la tabla emp y s para la tabla
salgrade).
S.Q.L.
Ejemplo de Outer Join
Select e.ename,d.DEPTNO,d.dname
From emp e,dept d
Where e.DEPTNO (+)=d.DEPTNO
Order by d.DEPTNO
En este ejemplo se muestran los números y nombres de todos los
departamentos, incluidos aquellos que no tienen empleado.
Si se le añade: AND emp.deptno is null, sólo se mostrarían las no coincidencias.
S.Q.L.
Ejemplo de Self Join
Select trabajador.ename as empleado,jefe.ename as jefe
From emp trabajador, emp jefe
Where trabajador.mgr=jefe.empno
Los conceptos que vamos a revisar hoy, aplican en general para las bases de datos
relacionales.
Sin embargo, por esta vez, usaremos de forma específica SQL Server.
Una tabla fuerte representa una entidad independiente, y una tabla débil
representa una entidad que depende de otra.
Estas relaciones (dependencias entre tablas) consisten en columnas que
tienen un mismo tipo de dato.
Entonces, la cláusula JOIN nos permite asociar 2 o más tablas, en base a una
columna que tengan en comúnv.
EJEMPLO SQLSERVER
Pero primero, empecemos definiendo 2 tablas, que serán la base para nuestros
ejemplos posteriores.
Por un lado vamos a tener una tabla Empleados (que almacenará una lista de
empleados y el id del departamento al que pertenecen):
Nombre DepartamentoId
Rafferty 31
Jones 33
Heisenberg 33
Robinson 34
Smith 34
Williams NULL
Y por otro lado, una tabla Departamentos (con la lista de departamentos que existen
en la empresa).
Id Nombre
31 Sales
33 Engineering
34 Clerical
Id Nombre
35 Marketing
Entonces, si quieres seguir el tutorial, puedes ejecutar el siguiente script SQL para dar
origen a las tablas y sus datos correspondientes:
USE TestJoin
GO
Ten en cuenta que podrías usar otro nombre para la base de datos, si así lo prefieres.
Hasta este punto, puedes confirmar que todo haya salido bien, consultando las 2
tablas correspondientes:
Esta cláusula busca coincidencias entre 2 tablas, en función a una columna que
tienen en común. De tal modo que sólo la intersección se mostrará en los
resultados.
Por ejemplo, si queremos listar a los empleados e indicar el nombre del departamento
al que pertenecen, podemos hacer lo siguiente:
SELECT *
FROM Empleados E
JOIN Departamentos D
ON E.DepartamentoId = D.Id
Con esto, nuestro resultado será:
Rafferty 31 31 Sales
Jones 33 33 Engineering
Heisenberg 33 33 Engineering
Robinson 34 34 Clerical
Smith 34 34 Clerical
¿Por qué ocurre esto? Porque JOIN muestra como resultado la intersección de ambas
tablas.
También hay que tener en cuenta que, en los resultados vemos 4 columnas. Las 2
primeras se corresponden con la tabla Empleados y las últimas con Departamentos.
SELECT
E.Nombre as 'Empleado',
D.Nombre as 'Departamento'
FROM Empleados E
JOIN Departamentos D
ON E.DepartamentoId = D.Id
Y así obtener:
Empleado Departamento
Rafferty Sales
Jones Engineering
Heisenberg Engineering
Robinson Clerical
Smith Clerical
SELECT
E.Nombre as 'Empleado',
D.Nombre as 'Departamento'
FROM Empleados E
LEFT JOIN Departamentos D
ON E.DepartamentoId = D.Id
Empleado Departamento
Rafferty Sales
Jones Engineering
Heisenberg Engineering
Robinson Clerical
Smith Clerical
Empleado Departamento
Williams NULL
De tal modo que si usamos la siguiente consulta, estaremos mostrando todas las
filas de la tabla de la derecha:
SELECT
E.Nombre as 'Empleado',
D.Nombre as 'Departamento'
FROM Empleados E
RIGHT JOIN Departamentos D
ON E.DepartamentoId = D.Id
La tabla de la izquierda es Empleados, mientras que Departamentos es la tabla de la
derecha.
La tabla asociada al FROM será siempre la tabla LEFT, y la tabla que viene después
del JOIN será la tabla RIGHT.
Empleado Departamento
Empleado Departamento
Rafferty Sales
Jones Engineering
Heisenberg Engineering
Robinson Clerical
Smith Clerical
NULL Marketing
SELECT
E.Nombre as 'Empleado',
D.Nombre as 'Departamento'
FROM Empleados E
FULL JOIN Departamentos D
ON E.DepartamentoId = D.Id
Se muestra el empleado "Williams" a pesasr que no está asignado a ningún
departamento, y se muestra el departamento de "Marketing" a pesar que aún nadie
está trabajando allí:
Empleado Departamento
Rafferty Sales
Jones Engineering
Heisenberg Engineering
Robinson Clerical
Smith Clerical
Williams NULL
NULL Marketing
Más variantes
Si prestamos atención a los diagramas de Venn, vamos a notar que es posible formar
incluso más combinaciones, al momento de seleccionar datos.
Por ejemplo, tenemos el siguiente caso, conocido como Left Excluding JOIN:
Por ejemplo, siguiendo el ejemplo que estamos viendo (donde Empleados es la tabla
izquierda y Departamentos la tabla derecha):