Tipos-de-Join-en-SQL.pdf
-
Upload
ivan-fernando-hurtado -
Category
Documents
-
view
125 -
download
4
Transcript of Tipos-de-Join-en-SQL.pdf
![Page 1: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/1.jpg)
TIPOS DE JOIN EN SQL
9/24/2011 Christian A. Martínez – 0909-07-9353
![Page 2: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/2.jpg)
INTRODUCCIÓN
Dentro de una base de datos relacional es de vital importancia conocer todas las
sentencias y funciones que permitan relacionar, unir y combinar los datos a la
medida que sea necesario, los tipos de JOIN permiten extender estas funciones,
con el objetivo de reutilizar los datos y combinarlos a medida que sea necesario
por el DBA
![Page 3: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/3.jpg)
Tipos de JOIN en SQL
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.
Matemáticamente, JOIN es composición relacional, la operación fundamental en el
álgebra relacional, y generalizando es una función de composición.
Tablas de ejemplo
Todas las explicaciones que están a continuación utilizan las siguientes dos tablas
para ilustrar el efecto de diferentes clases de uniones JOIN.
La tabla Empleado contiene a los empleados con el número del departamento al
que pertenecen; mientras que la tabla Departamento, contiene el nombre de los
departamentos de la empresa, se puede notar que existe un empleado que tiene
asignado un número de departamento que no se encuentra en la tabla
Departamento (Gaspar), igualmente, en la tabla Departamento existe un
![Page 4: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/4.jpg)
departamento al cual no pertenece empleado alguno (Mercadeo). Esto servirá
para presentar algunos ejemplos más adelante.
Combinación interna (INNER JOIN)
Con esta operación se calcula el producto cruzado de todos los registros; así cada
registro en la tabla A es combinado con cada registro de la tabla B; pero sólo
permanecen aquellos registros en la tabla combinada que satisfacen las
condiciones que se especifiquen. Este es el tipo de JOIN más utilizado por lo que
es considerado el tipo de combinación predeterminado.
SQL:2003 especifica dos formas diferentes para expresar estas combinaciones.
La primera, conocida como explícita usa la palabra JOIN, mientras que la segunda
es implícita y usa ',' para separar las tablas a combinar en la sentencia FROM de
la declaración SELECT. Entonces siempre se genera el producto cruzado del cual
se seleccionan las combinaciones que cumplan lo que indica la sentencia
WHERE.
Es necesario tener especial cuidado cuando se combinan columnas con valores
nulos NULL ya que el valor nulo no se combina con otro valor o con otro nulo,
excepto cuando se le agregan predicados tales como IS NULL o IS NOT NULL.
Como ejemplo, la siguiente consulta toma todos los registros de la tabla Empleado
y encuentra todas las combinaciones en la tabla Departamento. La sentencia JOIN
compara los valores en la columna IDDepartamento en ambas tablas. Cuando no
existe esta correspondencia entre algunas combinaciones, éstas no se muestran;
es decir que si el número de departamento de un empleado no coincide con los
números de departamento de la tabla Departamento, no se mostrará el empleado
con su respectivo departamento en la tabla resultante.
Las dos consultas siguientes son similares, y se realizan de manera explicita (A) e
implícita (B).
![Page 5: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/5.jpg)
A. Ejemplo de la sentencia INNER JOIN explícita:
SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
B. Ejemplo de la sentencia INNER JOIN implícita:
SELECT *
FROM empleado, departamento
WHERE empleado.IDDepartamento = departamento.IDDepartamento
Resultados:
Empleado.A
pellido
Empleado.IDdep
artamento
departamento.Nombre
Departamento
departamento.IDDe
partamento
Zolano 34 Producción 34
Jordán 33 Ingeniería 33
Róbinson 34 Producción 34
Steinberg 33 Ingeniería 33
Andrade 31 Ventas 31
El empleado Gaspar y el departamento de Mercadeo no son presentados en los
resultados ya que ninguno de éstos tiene registros correspondientes en la otra
tabla. No existe un departamento con número 36 ni existe un empleado con
número de departamento 35.
![Page 6: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/6.jpg)
A la combinación que utiliza comparaciones dentro del predicado JOIN se le llama
theta-join.
C. Ejemplo de combinación tipo theta:
SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento < departamento.IDDepartamento
Las operaciones INNER JOIN puede ser clasificadas como de equivalencia,
naturales, y cruzadas.
De equivalencia (equi-join)
Es una especie de theta-join que usa comparaciones de igualdad en el predicado
JOIN. Cuando se usan operadores, tales como < o > no se puede clasificar en
este rango.
D. Ejemplo de combinación de equivalencia:
SELECT *
FROM empleado
INNER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
La tabla resultante presenta dos columnas llamadas IDDepartamento, una
proveniente de la tabla Empleado y otra de la tabla Departamento.
SQL:2003 no tiene una sintaxis específica para esta clase de combinaciones.
Natural (Natural join)
Es una especialización de la combinación de equivalencia, anteriormente
mencionada. En este caso se comparan todas las columnas que tengan el mismo
nombre en ambas tablas. La tabla resultante contiene sólo una columna por cada
par de columnas con el mismo nombre.
![Page 7: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/7.jpg)
E. Ejemplo de combinación natural:
SELECT *
FROM empleado NATURAL JOIN departamento
El resultado es un poco diferente al del ejemplo D, ya que esta vez la columna
IDDepartamento se muestra sola una vez en la tabla resultante.
El uso de esta sentencia NATURAL puede producir resultados ambiguos y generar
problemas si la base de datos cambia, porque al añadir, quitar, o renombrar las
columnas, puede perder el sentido la sentencia; por esta razón es preferible
expresar el predicado usando las otras expresiones nombradas anteriormente
(ejemplos A y B).
Cruzada (Cross join)
Presenta el producto cartesiano de todos los registros de las dos tablas.
El código SQL para realizar este producto cartesiano enuncia las tablas que serán
combinadas, pero no incluye algún predicado que filtre el resultado.
![Page 8: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/8.jpg)
F. Ejemplo de combinación cruzada explícita:
SELECT *
FROM empleado CROSS JOIN departamento
G. Ejemplo de combinación cruzada implícita:
SELECT *
FROM empleado, departamento;
Esta clase de combinaciones son usadas pocas veces, generalmente se les
agregan condiciones de filtrado con la sentencia WHERE para hallar resultados
específicos.
Combinación externa (OUTER JOIN)
Mediante esta operación no se requiere que cada registro en las tablas a tratar
tenga un registro equivalente en la otra tabla. El registro es mantenido en la tabla
combinada si no existe otro registro que le corresponda.
En SQL:2003 no existe una notación implícita para las combinaciones externas.
Este tipo de operación se subdivide dependiendo de la tabla a la cual se le
admitirán los registros que no tienen correspondencia, ya sean de tabla izquierda,
de tabla derecha, o combinación completa.
de tabla izquierda (LEFT OUTER JOIN o LEFT JOIN)
El resultado de esta operación siempre contiene todos los registros de la tabla de
la izquierda (la primera tabla que se menciona en la consulta), aun cuando no
exista un registro correspondiente en la tabla de la derecha, para uno de la
izquierda.
La sentencia LEFT OUTER JOIN retorna la pareja de todos los valores de la tabla
izquierda con los valores de la tabla de la derecha correspondientes, o retorna un
valor nulo NULL en caso de no correspondencia.
A diferencia del resultado presentado en los ejemplos A y B (de combinación
interna) donde no se mostraba el empleado cuyo departamento no existía; en el
siguiente ejemplo se presentarán los empleados con su respectivo departamento,
e inclusive se presentará el empleado, cuyo departamento no existe.
![Page 9: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/9.jpg)
H. Ejemplo de tabla izquierda para la combinación externa:
SELECT *
FROM empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.
Apellido
Empleado.IDDep
artamento
Departamento.Nombre
Departamento
Departamento.IDDe
partamento
Jordán 33 Ingeniería 33
Andrade 31 Ventas 31
Róbinson 34 Producción 34
Zolano 34 Producción 34
Gaspar 36 NULL NULL
Steinberg 33 Ingeniería 33
de tabla derecha (RIGHT OUTER JOIN o RIGHT JOIN)
Esta operación es inversa a la anterior; el resultado de esta operación siempre
contiene todos los registros de la tabla de la derecha (la segunda tabla que se
menciona en la consulta), aun cuando no exista un registro correspondiente en la
tabla de la izquierda, para uno de la derecha.
La sentencia RIGHT OUTER JOIN retorna la pareja de todos los valores de la
tabla derecha con los valores de la tabla de la izquierda correspondientes, o
retorna un valor nulo NULL en caso de no correspondencia.
![Page 10: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/10.jpg)
I. Ejemplo de tabla derecha para la combinación externa:
SELECT *
FROM empleado
RIGHT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.
Apellido
Empleado.IDDep
artamento
Departamento.Nombre
Departamento
Departamento.IDDe
partamento
Zolano 34 Producción 34
Jordán 33 Ingeniería 33
Róbinson 34 Producción 34
Steinberg 33 Ingeniería 33
Andrade 31 Ventas 31
NULL NULL Mercadeo 35
En este caso el área de Mercadeo fue presentada en los resultados, aunque aún
no hay empleados registrados en dicha área.
combinación completa (FULL OUTER JOIN)
Esta operación presenta los resultados de tabla izquierda y tabla derecha aunque
no tengan correspondencia en la otra tabla. La tabla combinada contendrá,
entonces, todos los registros de ambas tablas y presentará valores nulos NULLs
para registros sin pareja.
![Page 11: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/11.jpg)
J. Ejemplo de combinación externa completa:
SELECT *
FROM empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.
Apellido
Empleado.IDDep
artamento
Departamento.Nombre
Departamento
Departamento.IDDe
partamento
Zolano 34 Producción 34
Jordán 33 Ingeniería 33
Róbinson 34 Producción 34
Gaspar 36 NULL NULL
Steinberg 33 Ingeniería 33
Andrade 31 Ventas 31
NULL NULL Mercadeo 35
Como se puede notar, en este caso se encuentra el empleado Gaspar con valor
nulo en su área correspondiente, y se muestra además el departamento de
Mercadeo con valor nulo en los empleados de esa área.
Algunos sistemas de bases de datos no soportan esta funcionalidad, pero esta
puede ser emulada a través de las combinaciones de tabla izquierda, tabla
derecha y de la sentencia de unión union.
![Page 12: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/12.jpg)
K. El mismo ejemplo puede expresarse así:
SELECT *
FROM empleado
LEFT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
UNION
SELECT *
FROM empleado
RIGHT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
WHERE empleado.IDDepartamento IS NULL
Implementación
La implementación eficiente de combinaciones ha sido un objetivo de mucho
trabajo en los sistemas de bases de datos, pues aunque sean internas o externas,
son muy comunes y difíciles de ejecutar eficientemente. La combinación interna de
tablas se puede hacer con propiedad conmutativa y asociativa, así que el usuario
sólo crea la consulta y el sistema de base de datos determina la manera más
eficiente de realizar la operación, esta decision la toma el optimizador de consultas
quien tiene en cuenta dos puntos importantes:
El orden de las combinaciones
Como las combinaciones son conmutativas, el orden en el cual son combinadas
las tablas no modifica el resultado final de la consulta. En cambio, sí tiene un gran
impacto sobre el costo de la operación, de manera que elegir el mejor orden de
combinaciones es muy importante.
El método de la combinación
Dadas dos tablas y una condición de combinación, existen unos cuantos
algoritmos que devuelven el resultado de la combinación. Cuál algoritmo es el más
![Page 13: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/13.jpg)
eficiente dependerá de los tamaños de las tablas de entrada, la cantidad de filas
de cada una que satisfacen la condición de combinación, y las operaciones
requeridas por el resto de la consulta.
Los diferentes algoritmos tratan de forma diferente a las entradas. A las entradas
de una combinación se las llama respectivamente "operando externo(outer)" y
"operando interno(inner)", o bien simplemente izquierdo y derecho. En el caso de
bucles anidados, por ejemplo, la relación interna será completamente recorrida por
cada fila de la relación externa.
Los planes de ejecución que incluyen combinaciones pueden clasificarse en:
Profundo a la izquierda
El operando interno de cada combinación del plan es una tabla base.
Profundo a la derecha
El operando externo de cada combinación del plan es una tabla base.
Denso
Ambas entradas son combinaciones.
Estos nombres derivan de la apariencia de la representación gráfica del plan de
ejecución como un árbol, con la relación externa a la izquierda y la interna a la
derecha (por convención).
Algoritmos de combinación
Existen tres algoritmos fundamentales para ejecutar una operación de
combinación.
Bucles anidados
Éste es el más simple de los algortimos de combinación. Por cada tupla de la
relación externa, se recorre completamente la relación interna, y toda tupla que
verifique la condición de combinación se añade al resultado. El algoritmo puede
ser fácilmente generalizado para cualquier número de relaciones.
Pseudocódigo para la combinación de las relaciones R and S:
Por cada tupla en R, llamada r:
Por cada tupla en S, llamada s:
Si la tupla <r,s> satisface la condición de combinación
![Page 14: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/14.jpg)
Entonces agregar la tupla <r,s> a la salida
La complejidad computacional del algoritmo es de O( | R | | S | ) operaciones de
entrada/salida, donde | R | y | S | son la cantidad de tuplas en R y S
respectivamente.
Naturalmente, este algoritmo tiene un desempeño pobre si alguna de las
relaciones es muy grande. El desempeño puede mejorarse si la relación interna
tiene un índice sobre las columnas del predicado de combinación.
Existe una variación del algoritmo de bucles anidados, llamada bucles anidados en
bloque. Sea | R | < | S | . En lugar de leer las dos relaciones tupla por tupla, se lee
la relación R en bloques, llenando toda la memoria disponible, excepto dos
páginas. Por cada bloque de R se realiza una iteración sobre S, leyendo una
página por vez, y por cada página leída de S, la tupla de la página es comparada
con las del bloque de R, y cada par de tuplas que satisfacen la condición de
combinación se agrega a la página de salida.
El algortimo de bucles anidados en bloque tiene una complejidad computacional
de operaciones de entrada/salida, donde M es el número de páginas de
memoria disponibles y Pr y Ps son el tamaño en páginas de R y de S
respectivamente. Notar que la complejidad computacional es de O(Pr + Ps)
operaciones de entrada/salida si R cabe en la memoria disponible.
Combinación por fusión
Si ambas relaciones están ordenadas por los atributos de combinación, la
operación es trivial:
1. Por cada tupla de la relación externa,
1. Se toma el grupo de tuplas actual de la relación interna; un grupo
está formado por un conjunto de tuplas contiguas con el mismo valor
en el atributo de combinación.
2. Por cada tupla del grupo interno actual que satisfaga la condición de
combinación, se agrega una tupla al resultado. Una vez agotado el
grupo interno, ambas búsquedas, la interna y la externa, pueden
avanzar al siguiente grupo.
Por esta razón muchos optimizadores guardan pista del ordenamiento en los
nodos del plan (si uno o ambos operandos ya están ordenados en función del
atributo de combinación, no hace falta otro ordenamiento. De lo contrario, el
![Page 15: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/15.jpg)
sistema de gestión de base de datos deberá realizarlo, generalmente utilizando un
ordenamiento externo para evitar consumir demasiada memoria.
Combinación Hash
Este algoritmo puede ser utilizado para combinaciones "equi-join". El acceso a las
tablas a ser combinadas se realiza construyendo tablas hash sobre los atributos
de combinación. La búsqueda en tabla hash es mucho más rápida que a través de
árboles de índice, pero sólo puede realizarse una búsqueda por la condición de
igualdad.
Optimización de la combinación
Semi-combinación
Es una optimización técnica para las combinaciones en bases de datos
distribuidas. El predicado JOIN es aplicado en diferentes fases, comenzando con
la más temprana. Esto puede reducir el tamaño de los resultados inmediatos que
deben ser intercambiados con nodos remotos, así reduce el tráfico de red entre
nodos, esto puede mejorarse con un filtro Bloom.
![Page 16: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/16.jpg)
CONCLUSIÓN
- Es necesario tener especial cuidado cuando se combinan columnas con
valores nulos NULL ya que el valor nulo no se combina con otro valor o con
otro nulo, excepto cuando se le agregan predicados tales como IS NULL o
IS NOT NULL.
- Algunos sistemas de bases de datos no soportan cobinacion external
completa, pero esta puede ser emulada a través de las combinaciones de
tabla izquierda, tabla derecha y de la sentencia de unión union.
- Es una optimización técnica para las combinaciones en bases de datos
distribuidas. El predicado JOIN es aplicado en diferentes fases,
comenzando con la más temprana. Esto puede reducir el tamaño de los
resultados inmediatos que deben ser intercambiados con nodos remotos,
así reduce el tráfico de red entre nodos, esto puede mejorarse con un filtro
Bloom.
![Page 17: Tipos-de-Join-en-SQL.pdf](https://reader030.fdocuments.ec/reader030/viewer/2022013114/54e105d04a795989268b4568/html5/thumbnails/17.jpg)
BIBLIOGRAFÍA ELECTRÓNICA
- http://es.wikipedia.org/wiki/Join
- http://www.w3schools.com/sql/sql_join.asp
- http://www.devjoker.com/contenidos/Tutorial-SQL-/17/Consultas-combinadas-
JOINS.aspx