fbpx
Wikipedia

Sentencia JOIN en SQL

La sentencia JOIN (unir, combinar) de SQL permite combinar registros de una o más tablas en una base de datos. En el Lenguaje de Consultas Estructurado (SQL) hay tres tipos de JOIN: interno, externo y cruzado. El estándar ANSI del SQL especifica cinco tipos de JOIN: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER y CROSS. Una tabla puede unirse a sí misma, produciendo una auto-combinación, SELF-JOIN.

Joins del SQL y sus representaciones como diagramas de Venn

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 usan las siguientes dos tablas para ilustrar el efecto de diferentes clases de uniones JOIN.

Empleado
Apellido IDDepartamento
Andrade 31
Jordán 33
Steinberg 33
Róbinson 34
Zolano 34
Gaspar 36
Departamento
NombreDepartamento IDDepartamento
Ventas 31
Ingeniería 33
Producción 34
Mercadeo 35

La tabla Empleado contiene los apellidos de los empleados junto al número del departamento al que pertenecen, mientras que la tabla Departamento contiene los nombres de los departamentos de la empresa.

Existen empleados que tienen asignado un número de departamento que no se encuentra en la tabla Departamento (Gaspar). Igualmente, existen departamentos a los cuales no pertenece ningún empleado (Mercadeo). Esto servirá para presentar algunos ejemplos más adelante.

Combinación interna (INNER JOIN)

 
Diagrama de Venn representando el Inner Join, entre las tablas A y B, de una sentencia SQL

Con esta operación cada registro en la tabla A es combinado con los correspondientes de la tabla B que satisfagan las condiciones que se especifiquen en el predicado del JOIN. Cualquier registro de la tabla A o de la tabla B que no tenga uno correspondiente en la otra tabla es excluido, y solo aparecerán los que tengan correspondencia en la otra tabla. 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 junto con las condiciones después de la palabra reservada ON. La segunda es implícita y usa las comas para separar las tablas a combinar en la sentencia FROM, y se usa la sentencia WHERE para establecer las condiciones, la cual entonces es obligatoria para el INNER JOIN pues de lo contrario la sentencia sería un CROSS JOIN (ver más abajo).

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, estas 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 explícita (A) e implícita (B).

Ejemplo de la sentencia INNER JOIN explícita:

 SELECT * FROM empleado INNER JOIN departamento ON empleado.IDDepartamento = departamento.IDDepartamento 

Ejemplo de la sentencia INNER JOIN implícita:

 SELECT * FROM empleado, departamento WHERE empleado.IDDepartamento = departamento.IDDepartamento 

Resultados:

Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
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 estos 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.

Theta Join

A la combinación que utiliza comparaciones dentro del predicado JOIN se le llama theta-join. Se pueden hacer comparaciones de <, <=, =, <>, >= y >.

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 igualdad, naturales y cruzadas.

Equi-join

Es una variedad del theta-join que usa comparaciones de igualdad en el predicado JOIN. Cuando se usan otros operadores de comparación no se puede clasificar en este rango.

Ejemplo de combinación de igualdad:

 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 join

Es una especialización de la combinación de igualdad, anteriormente mencionada, que se representa por el símbolo ⋈. 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.

Ejemplo de combinación natural:

 SELECT * FROM empleado NATURAL JOIN departamento 

El resultado es un poco diferente al del ejemplo de la tabla anterior, ya que esta vez la columna IDDepartamento se muestra sola una vez en la tabla resultante.

Empleado (campo común) Departamento
Apellido IDDepartamento NombreDepartamento
Zolano 34 Producción
Jordán 33 Ingeniería
Róbinson 34 Producción
Steinberg 33 Ingeniería
Andrade 31 Ventas

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.

Combinación externa (OUTER JOIN)

Mediante esta operación no se requiere que un registro en una tabla tenga un registro relacionado en la otra tabla. El registro es mantenido en la tabla combinada aunque no exista el correspondiente en la otra tabla.

Existen tres tipos de combinaciones externas, el Left Join, el Right Join y el Full Join, donde se toman todos los registros de la tabla de la izquierda, o todos los de la tabla derecha, o todos los registros respectivamente.

LEFT JOIN

 
Diagrama de Venn representando el Left Join, entre las tablas A y B, de una sentencia SQL

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), independientemente de si existe un registro correspondiente en la tabla de la derecha.

La sentencia LEFT JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de la tabla de la derecha correspondientes, si los hay, o retorna un valor nulo NULL en los campos de la tabla derecha cuando no haya correspondencia.

A diferencia del resultado presentado en los ejemplos 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, y adicionalmente se presenta un empleado cuyo departamento no existe.

El empleado que no tiene departamento se encuentra en el área amarilla del diagrama de la derecha, mientras que los empleados con departamento están en el área anaranjada, en la intersección de A y B.

Ejemplo de left join para la combinación externa:

 SELECT * FROM empleado LEFT OUTER JOIN departamento ON empleado.IDDepartamento = departamento.IDDepartamento 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
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

LEFT JOIN excluyendo la intersección

 
Diagrama de Venn representando el Left Join, entre las tablas A y B, agregando una condición donde las claves de B son nulas

Si se quieren mostrar solo los registros de la primera tabla que no tengan correspondientes en la segunda, se puede agregar la condición adecuada en la cláusula WHERE. Esto nos dará los empleados que no estén asignados a ningún departamento, que en el diagrama de la derecha se representan en amarillo.

 SELECT * FROM empleado LEFT OUTER JOIN departamento ON empleado.IDDepartamento = departamento.IDDepartamento WHERE departamento.IDDepartamento IS NULL 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
Gaspar 36 NULL NULL

RIGHT OUTER JOIN o RIGHT JOIN

 
Diagrama de Venn representando el Right Join, entre las tablas A y B, de una sentencia SQL

Esta operación es una imagen refleja de 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), independientemente de si existe o no un registro correspondiente en la tabla de la izquierda.

La sentencia RIGHT OUTER JOIN retorna todos los valores de la tabla derecha con los valores de la tabla de la izquierda correspondientes, si los hay, o retorna un valor nulo NULL en los campos de la tabla izquierda cuando no haya correspondencia.

En el diagrama de la derecha, los departamentos que no tienen empleados están en el área verde mientras que los departamentos con empleados están en el área anaranjada, en la intersección de A y B.

Ejemplo de right join para la combinación externa:

 SELECT * FROM empleado RIGHT OUTER JOIN departamento ON empleado.IDDepartamento = departamento.IDDepartamento 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
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.

RIGHT JOIN excluyendo la intersección

 
Diagrama de Venn representando el Right Join, entre las tablas A y B, agregando una condición donde las claves de A son nulas

Si se quieren mostrar solo los registros de la tabla de Departamento que no tengan correspondientes en la tabla de Empleado, se puede agregar la condición adecuada en la cláusula WHERE. Esto nos dará los departamentos que no tengan asignados ningún empleado. En el diagrama de la derecha, esto se representa en verde.

 SELECT * FROM empleado RIGHT OUTER JOIN departamento ON empleado.IDDepartamento = departamento.IDDepartamento WHERE empleado.IDDepartamento IS NULL 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
NULL NULL Mercadeo 35

Equivalencia entre LEFT JOIN y RIGHT JOIN

 
Left Join equivalente al Right Join anterior

Hay una total equivalencia entre las sentencias que usan LEFT JOIN y las que usan RIGHT JOIN. Todo lo que se puede hacer con uno se puede hacer con el otro. Cambiando la perspectiva de cuál es la tabla izquierda y cuál es la tabla derecha, y teniendo cuidado con las condiciones, se puede hacer la sentencia equivalente.

Por ejemplo, hagamos el RIGHT JOIN anterior pero esta vez usando LEFT JOIN. En el RIGHT JOIN anterior se consideraba la tabla Empleado a la izquierda y la tabla de Departamento a la derecha. Para hacer un LEFT JOIN equivalente cambiamos de perspectiva y "volteamos" las tablas. Consideremos ahora la tabla de Departamento a la izquierda y la tabla de Empleado a la derecha. Podemos obtener exactamente el mismo resultado con la sentencia siguiente:

 SELECT * FROM departamento LEFT OUTER JOIN empleado ON departamento.IDDepartamento = empleado.IDDepartamento WHERE empleado.IDEmpleado IS NULL 
Departamento Empleado
NombreDepartamento IDDepartamento Apellido IDDepartamento
Mercadeo 35 NULL NULL

Combinación completa (FULL OUTER JOIN)

 
Diagrama de Venn representando el Full Join, entre las tablas A y B, de una sentencia SQL

Esta operación presenta los resultados de tabla izquierda y tabla derecha aunque alguna 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.

En el diagrama de la derecha, el área anaranjada representa los empleados que están asociados a un departamento, el área amarilla son los empleados que no están en ningún departamento, y el área verde son los departamentos que no tienen empleados.

Ejemplo de combinación externa completa:

 SELECT * FROM empleado FULL OUTER JOIN departamento  ON empleado.IDDepartamento = departamento.IDDepartamento 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
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.

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 

FULL JOIN excluyendo la intersección

 
Diagrama de Venn representando el Full Join, entre las tablas A y B, agregando condiciones donde la clave de A o la de B son nulas

Si se quieren mostrar solo los registros de las tablas que no tengan correspondencia en la otra, se pueden agregar las condiciones adecuadas en la cláusula WHERE.

En el diagrama de la derecha, el área amarilla representa los empleados que no están asignados a ningún departamento, mientras que el área verde representa los departamentos que no tienen empleados.

 SELECT * FROM empleado FULL OUTER JOIN departamento  ON empleado.IDDepartamento = departamento.IDDepartamento WHERE (empleado.IDDepartamento IS NULL) OR (departamento.IDDepartamento is NULL) 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
Gaspar 36 NULL NULL
NULL NULL Mercadeo 35

Cruzada (Cross join)

 
Representación como producto cartesiano del Cross Join, entre las tablas A y B, de una sentencia SQL

El CROSS JOIN presenta el producto cartesiano de los registros de las dos tablas. La tabla resultante tendrá todos los registros de la tabla izquierda combinados con cada uno de los registros de la tabla derecha.

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.

Ejemplo de combinación cruzada explícita:

 SELECT * FROM empleado CROSS JOIN departamento 

Ejemplo de combinación cruzada implícita:

 SELECT * FROM empleado, departamento; 
Empleado Departamento
Apellido IDDepartamento NombreDepartamento IDDepartamento
Andrade 31 Ventas 31
Jordán 33 Ventas 31
Steinberg 33 Ventas 31
Zolano 34 Ventas 31
Róbinson 34 Ventas 31
Gaspar 36 Ventas 31
Andrade 31 Ingeniería 33
Jordán 33 Ingeniería 33
Steinberg 33 Ingeniería 33
Zolano 34 Ingeniería 33
Róbinson 34 Ingeniería 33
Gaspar 36 Ingeniería 33
Andrade 31 Producción 34
Jordán 33 Producción 34
Steinberg 33 Producción 34
Zolano 34 Producción 34
Róbinson 34 Producción 34
Gaspar 36 Producción 34
Andrade 31 Mercadeo 35
Jordán 33 Mercadeo 35
Steinberg 33 Mercadeo 35
Zolano 34 Mercadeo 35
Róbinson 34 Mercadeo 35
Gaspar 36 Mercadeo 35

Esta clase de combinaciones son usadas pocas veces; generalmente se les agregan condiciones de filtrado con la sentencia WHERE para hallar resultados específicos.

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 decisión la toma el optimizador de consultas, que 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 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 algoritmos 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   and  :

 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 Entonces agregar la tupla <r,s> a la salida 

La complejidad computacional del algoritmo es de   operaciones de entrada/salida, donde   y   son la cantidad de tuplas en   y   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  . En lugar de leer las dos relaciones tupla por tupla, se lee la relación   en bloques, llenando toda la memoria disponible, excepto dos páginas. Por cada bloque de   se realiza una iteración sobre  , leyendo una página por vez, y por cada página leída de  , la tupla de la página es comparada con las del bloque de  , y cada par de tuplas que satisfacen la condición de combinación se agrega a la página de salida.

El algoritmo de bucles anidados en bloque tiene una complejidad computacional de   operaciones de entrada/salida, donde   es el número de páginas de memoria disponibles y   y   son el tamaño en páginas de   y de   respectivamente. Notar que la complejidad computacional es de   operaciones de entrada/salida si   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 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 solo 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.

Véase también

Enlaces externos

  • Expresiones de tablas en PostgreSQL 8.4 (Inglés)
  • Curso de SQL (JOIN)
  •   Datos: Q2003535

sentencia, join, este, artículo, sección, necesita, wikificado, favor, edítalo, para, cumpla, convenciones, estilo, puedes, avisar, redactor, principal, pegando, siguiente, página, discusión, sust, aviso, wikificar, esta, plantilla, wikificar, sust, currenttim. Este articulo o seccion necesita ser wikificado por favor editalo para que cumpla con las convenciones de estilo Puedes avisar al redactor principal pegando lo siguiente en su pagina de discusion sust Aviso wikificar Sentencia JOIN en SQL Uso de esta plantilla Wikificar t sust CURRENTTIMESTAMP La sentencia JOIN unir combinar de SQL permite combinar registros de una o mas tablas en una base de datos En el Lenguaje de Consultas Estructurado SQL hay tres tipos de JOIN interno externo y cruzado El estandar ANSI del SQL especifica cinco tipos de JOIN INNER LEFT OUTER RIGHT OUTER FULL OUTER y CROSS Una tabla puede unirse a si misma produciendo una auto combinacion SELF JOIN Joins del SQL y sus representaciones como diagramas de Venn Matematicamente JOIN es composicion relacional la operacion fundamental en el algebra relacional y generalizando es una funcion de composicion Indice 1 Tablas de ejemplo 2 Combinacion interna INNER JOIN 2 1 Theta Join 2 1 1 Equi join 2 1 2 Natural join 3 Combinacion externa OUTER JOIN 3 1 LEFT JOIN 3 1 1 LEFT JOIN excluyendo la interseccion 3 2 RIGHT OUTER JOIN o RIGHT JOIN 3 2 1 RIGHT JOIN excluyendo la interseccion 3 3 Equivalencia entre LEFT JOIN y RIGHT JOIN 3 4 Combinacion completa FULL OUTER JOIN 3 4 1 FULL JOIN excluyendo la interseccion 4 Cruzada Cross join 5 Implementacion 5 1 Algoritmos de combinacion 5 1 1 Bucles anidados 5 1 2 Combinacion por fusion 5 1 3 Combinacion Hash 5 2 Optimizacion de la combinacion 5 2 1 Semi combinacion 6 Vease tambien 7 Enlaces externosTablas de ejemplo EditarTodas las explicaciones que estan a continuacion usan las siguientes dos tablas para ilustrar el efecto de diferentes clases de uniones JOIN EmpleadoApellido IDDepartamentoAndrade 31Jordan 33Steinberg 33Robinson 34Zolano 34Gaspar 36DepartamentoNombreDepartamento IDDepartamentoVentas 31Ingenieria 33Produccion 34Mercadeo 35 La tabla Empleado contiene los apellidos de los empleados junto al numero del departamento al que pertenecen mientras que la tabla Departamento contiene los nombres de los departamentos de la empresa Existen empleados que tienen asignado un numero de departamento que no se encuentra en la tabla Departamento Gaspar Igualmente existen departamentos a los cuales no pertenece ningun empleado Mercadeo Esto servira para presentar algunos ejemplos mas adelante Combinacion interna INNER JOIN Editar Diagrama de Venn representando el Inner Join entre las tablas A y B de una sentencia SQL Con esta operacion cada registro en la tabla A es combinado con los correspondientes de la tabla B que satisfagan las condiciones que se especifiquen en el predicado del JOIN Cualquier registro de la tabla A o de la tabla B que no tenga uno correspondiente en la otra tabla es excluido y solo apareceran los que tengan correspondencia en la otra tabla Este es el tipo de JOIN mas utilizado por lo que es considerado el tipo de combinacion predeterminado SQL 2003 especifica dos formas diferentes para expresar estas combinaciones La primera conocida como explicita usa la palabra JOIN junto con las condiciones despues de la palabra reservada ON La segunda es implicita y usa las comas para separar las tablas a combinar en la sentencia FROM y se usa la sentencia WHERE para establecer las condiciones la cual entonces es obligatoria para el INNER JOIN pues de lo contrario la sentencia seria un CROSS JOIN ver mas abajo 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 estas no se muestran es decir que si el numero de departamento de un empleado no coincide con los numeros de departamento de la tabla Departamento no se mostrara el empleado con su respectivo departamento en la tabla resultante Las dos consultas siguientes son similares y se realizan de manera explicita A e implicita B Ejemplo de la sentencia INNER JOIN explicita SELECT FROM empleado INNER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento Ejemplo de la sentencia INNER JOIN implicita SELECT FROM empleado departamento WHERE empleado IDDepartamento departamento IDDepartamento Resultados Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoZolano 34 Produccion 34Jordan 33 Ingenieria 33Robinson 34 Produccion 34Steinberg 33 Ingenieria 33Andrade 31 Ventas 31El empleado Gaspar y el departamento de Mercadeo no son presentados en los resultados ya que ninguno de estos tiene registros correspondientes en la otra tabla No existe un departamento con numero 36 ni existe un empleado con numero de departamento 35 Theta Join Editar A la combinacion que utiliza comparaciones dentro del predicado JOIN se le llama theta join Se pueden hacer comparaciones de lt lt lt gt gt y gt Ejemplo de combinacion tipo theta SELECT FROM empleado INNER JOIN departamento ON empleado IDDepartamento lt departamento IDDepartamento Las operaciones INNER JOIN puede ser clasificadas como de igualdad naturales y cruzadas Equi join Editar Es una variedad del theta join que usa comparaciones de igualdad en el predicado JOIN Cuando se usan otros operadores de comparacion no se puede clasificar en este rango Ejemplo de combinacion de igualdad 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 especifica para esta clase de combinaciones Natural join Editar Es una especializacion de la combinacion de igualdad anteriormente mencionada que se representa por el simbolo En este caso se comparan todas las columnas que tengan el mismo nombre en ambas tablas La tabla resultante contiene solo una columna por cada par de columnas con el mismo nombre Ejemplo de combinacion natural SELECT FROM empleado NATURAL JOIN departamento El resultado es un poco diferente al del ejemplo de la tabla anterior ya que esta vez la columna IDDepartamento se muestra sola una vez en la tabla resultante Empleado campo comun DepartamentoApellido IDDepartamento NombreDepartamentoZolano 34 ProduccionJordan 33 IngenieriaRobinson 34 ProduccionSteinberg 33 IngenieriaAndrade 31 VentasEl uso de esta sentencia NATURAL puede producir resultados ambiguos y generar problemas si la base de datos cambia porque al anadir quitar o renombrar las columnas puede perder el sentido la sentencia por esta razon es preferible expresar el predicado usando las otras expresiones nombradas anteriormente Combinacion externa OUTER JOIN EditarMediante esta operacion no se requiere que un registro en una tabla tenga un registro relacionado en la otra tabla El registro es mantenido en la tabla combinada aunque no exista el correspondiente en la otra tabla Existen tres tipos de combinaciones externas el Left Join el Right Join y el Full Join donde se toman todos los registros de la tabla de la izquierda o todos los de la tabla derecha o todos los registros respectivamente LEFT JOIN Editar Diagrama de Venn representando el Left Join entre las tablas A y B de una sentencia SQL El resultado de esta operacion siempre contiene todos los registros de la tabla de la izquierda la primera tabla que se menciona en la consulta independientemente de si existe un registro correspondiente en la tabla de la derecha La sentencia LEFT JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de la tabla de la derecha correspondientes si los hay o retorna un valor nulo NULL en los campos de la tabla derecha cuando no haya correspondencia A diferencia del resultado presentado en los ejemplos de combinacion interna donde no se mostraba el empleado cuyo departamento no existia en el siguiente ejemplo se presentaran los empleados con su respectivo departamento y adicionalmente se presenta un empleado cuyo departamento no existe El empleado que no tiene departamento se encuentra en el area amarilla del diagrama de la derecha mientras que los empleados con departamento estan en el area anaranjada en la interseccion de A y B Ejemplo de left join para la combinacion externa SELECT FROM empleado LEFT OUTER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoJordan 33 Ingenieria 33Andrade 31 Ventas 31Robinson 34 Produccion 34Zolano 34 Produccion 34Gaspar 36 NULL NULLSteinberg 33 Ingenieria 33LEFT JOIN excluyendo la interseccion Editar Diagrama de Venn representando el Left Join entre las tablas A y B agregando una condicion donde las claves de B son nulas Si se quieren mostrar solo los registros de la primera tabla que no tengan correspondientes en la segunda se puede agregar la condicion adecuada en la clausula WHERE Esto nos dara los empleados que no esten asignados a ningun departamento que en el diagrama de la derecha se representan en amarillo SELECT FROM empleado LEFT OUTER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento WHERE departamento IDDepartamento IS NULL Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoGaspar 36 NULL NULLRIGHT OUTER JOIN o RIGHT JOIN Editar Diagrama de Venn representando el Right Join entre las tablas A y B de una sentencia SQL Esta operacion es una imagen refleja de la anterior el resultado de esta operacion siempre contiene todos los registros de la tabla de la derecha la segunda tabla que se menciona en la consulta independientemente de si existe o no un registro correspondiente en la tabla de la izquierda La sentencia RIGHT OUTER JOIN retorna todos los valores de la tabla derecha con los valores de la tabla de la izquierda correspondientes si los hay o retorna un valor nulo NULL en los campos de la tabla izquierda cuando no haya correspondencia En el diagrama de la derecha los departamentos que no tienen empleados estan en el area verde mientras que los departamentos con empleados estan en el area anaranjada en la interseccion de A y B Ejemplo de right join para la combinacion externa SELECT FROM empleado RIGHT OUTER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoZolano 34 Produccion 34Jordan 33 Ingenieria 33Robinson 34 Produccion 34Steinberg 33 Ingenieria 33Andrade 31 Ventas 31NULL NULL Mercadeo 35En este caso el area de Mercadeo fue presentada en los resultados aunque aun no hay empleados registrados en dicha area RIGHT JOIN excluyendo la interseccion Editar Diagrama de Venn representando el Right Join entre las tablas A y B agregando una condicion donde las claves de A son nulas Si se quieren mostrar solo los registros de la tabla de Departamento que no tengan correspondientes en la tabla de Empleado se puede agregar la condicion adecuada en la clausula WHERE Esto nos dara los departamentos que no tengan asignados ningun empleado En el diagrama de la derecha esto se representa en verde SELECT FROM empleado RIGHT OUTER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento WHERE empleado IDDepartamento IS NULL Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoNULL NULL Mercadeo 35Equivalencia entre LEFT JOIN y RIGHT JOIN Editar Left Join equivalente al Right Join anterior Hay una total equivalencia entre las sentencias que usan LEFT JOIN y las que usan RIGHT JOIN Todo lo que se puede hacer con uno se puede hacer con el otro Cambiando la perspectiva de cual es la tabla izquierda y cual es la tabla derecha y teniendo cuidado con las condiciones se puede hacer la sentencia equivalente Por ejemplo hagamos el RIGHT JOIN anterior pero esta vez usando LEFT JOIN En el RIGHT JOIN anterior se consideraba la tabla Empleado a la izquierda y la tabla de Departamento a la derecha Para hacer un LEFT JOIN equivalente cambiamos de perspectiva y volteamos las tablas Consideremos ahora la tabla de Departamento a la izquierda y la tabla de Empleado a la derecha Podemos obtener exactamente el mismo resultado con la sentencia siguiente SELECT FROM departamento LEFT OUTER JOIN empleado ON departamento IDDepartamento empleado IDDepartamento WHERE empleado IDEmpleado IS NULL Departamento EmpleadoNombreDepartamento IDDepartamento Apellido IDDepartamentoMercadeo 35 NULL NULLCombinacion completa FULL OUTER JOIN Editar Diagrama de Venn representando el Full Join entre las tablas A y B de una sentencia SQL Esta operacion presenta los resultados de tabla izquierda y tabla derecha aunque alguna no tengan correspondencia en la otra tabla La tabla combinada contendra entonces todos los registros de ambas tablas y presentara valores nulos NULLs para registros sin pareja En el diagrama de la derecha el area anaranjada representa los empleados que estan asociados a un departamento el area amarilla son los empleados que no estan en ningun departamento y el area verde son los departamentos que no tienen empleados Ejemplo de combinacion externa completa SELECT FROM empleado FULL OUTER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoZolano 34 Produccion 34Jordan 33 Ingenieria 33Robinson 34 Produccion 34Gaspar 36 NULL NULLSteinberg 33 Ingenieria 33Andrade 31 Ventas 31NULL NULL Mercadeo 35Como se puede notar en este caso se encuentra el empleado Gaspar con valor nulo en su area correspondiente y se muestra ademas el departamento de Mercadeo con valor nulo en los empleados de esa area Algunos sistemas de bases de datos no soportan esta funcionalidad pero esta puede ser emulada a traves de las combinaciones de tabla izquierda tabla derecha y de la sentencia de union union El mismo ejemplo puede expresarse asi SELECT FROM empleado LEFT JOIN departamento ON empleado IDDepartamento departamento IDDepartamento UNION SELECT FROM empleado RIGHT JOIN departamento ON empleado IDDepartamento departamento IDDepartamento FULL JOIN excluyendo la interseccion Editar Diagrama de Venn representando el Full Join entre las tablas A y B agregando condiciones donde la clave de A o la de B son nulas Si se quieren mostrar solo los registros de las tablas que no tengan correspondencia en la otra se pueden agregar las condiciones adecuadas en la clausula WHERE En el diagrama de la derecha el area amarilla representa los empleados que no estan asignados a ningun departamento mientras que el area verde representa los departamentos que no tienen empleados SELECT FROM empleado FULL OUTER JOIN departamento ON empleado IDDepartamento departamento IDDepartamento WHERE empleado IDDepartamento IS NULL OR departamento IDDepartamento is NULL Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoGaspar 36 NULL NULLNULL NULL Mercadeo 35Cruzada Cross join Editar Representacion como producto cartesiano del Cross Join entre las tablas A y B de una sentencia SQL El CROSS JOIN presenta el producto cartesiano de los registros de las dos tablas La tabla resultante tendra todos los registros de la tabla izquierda combinados con cada uno de los registros de la tabla derecha El codigo SQL para realizar este producto cartesiano enuncia las tablas que seran combinadas pero no incluye algun predicado que filtre el resultado Ejemplo de combinacion cruzada explicita SELECT FROM empleado CROSS JOIN departamento Ejemplo de combinacion cruzada implicita SELECT FROM empleado departamento Empleado DepartamentoApellido IDDepartamento NombreDepartamento IDDepartamentoAndrade 31 Ventas 31Jordan 33 Ventas 31Steinberg 33 Ventas 31Zolano 34 Ventas 31Robinson 34 Ventas 31Gaspar 36 Ventas 31Andrade 31 Ingenieria 33Jordan 33 Ingenieria 33Steinberg 33 Ingenieria 33Zolano 34 Ingenieria 33Robinson 34 Ingenieria 33Gaspar 36 Ingenieria 33Andrade 31 Produccion 34Jordan 33 Produccion 34Steinberg 33 Produccion 34Zolano 34 Produccion 34Robinson 34 Produccion 34Gaspar 36 Produccion 34Andrade 31 Mercadeo 35Jordan 33 Mercadeo 35Steinberg 33 Mercadeo 35Zolano 34 Mercadeo 35Robinson 34 Mercadeo 35Gaspar 36 Mercadeo 35Esta clase de combinaciones son usadas pocas veces generalmente se les agregan condiciones de filtrado con la sentencia WHERE para hallar resultados especificos Implementacion EditarLa implementacion 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 dificiles de ejecutar eficientemente La combinacion interna de tablas se puede hacer con propiedad conmutativa y asociativa asi que el usuario solo crea la consulta y el sistema de base de datos determina la manera mas eficiente de realizar la operacion Esta decision la toma el optimizador de consultas que 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 si tiene un gran impacto sobre el costo de la operacion de manera que elegir el mejor orden de combinaciones es muy importante El metodo de la combinacion dadas dos tablas y una condicion de combinacion existen unos cuantos algoritmos que devuelven el resultado de la combinacion Cual algoritmo es el mas eficiente dependera de los tamanos de las tablas de entrada la cantidad de filas de cada una que satisfacen la condicion de combinacion 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 combinacion 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 relacion interna sera completamente recorrida por cada fila de la relacion externa Los planes de ejecucion que incluyen combinaciones pueden clasificarse en Profundo a la izquierda El operando interno de cada combinacion del plan es una tabla base Profundo a la derecha El operando externo de cada combinacion del plan es una tabla base Denso Ambas entradas son combinaciones Estos nombres derivan de la apariencia de la representacion grafica del plan de ejecucion como un arbol con la relacion externa a la izquierda y la interna a la derecha por convencion Algoritmos de combinacion Editar Existen tres algoritmos fundamentales para ejecutar una operacion de combinacion Bucles anidados Editar Este es el mas simple de los algoritmos de combinacion Por cada tupla de la relacion externa se recorre completamente la relacion interna y toda tupla que verifique la condicion de combinacion se anade al resultado El algoritmo puede ser facilmente generalizado para cualquier numero de relaciones Pseudocodigo para la combinacion de las relaciones R displaystyle R and S displaystyle S Por cada tupla en R llamada r Por cada tupla en S llamada s Si la tupla lt r s gt satisface la condicion de combinacion Entonces agregar la tupla lt r s gt a la salida La complejidad computacional del algoritmo es de O R S displaystyle O R S operaciones de entrada salida donde R displaystyle R y S displaystyle S son la cantidad de tuplas en R displaystyle R y S displaystyle S respectivamente Naturalmente este algoritmo tiene un desempeno pobre si alguna de las relaciones es muy grande El desempeno puede mejorarse si la relacion interna tiene un indice sobre las columnas del predicado de combinacion Existe una variacion del algoritmo de bucles anidados llamada bucles anidados en bloque Sea R lt S displaystyle R lt S En lugar de leer las dos relaciones tupla por tupla se lee la relacion R displaystyle R en bloques llenando toda la memoria disponible excepto dos paginas Por cada bloque de R displaystyle R se realiza una iteracion sobre S displaystyle S leyendo una pagina por vez y por cada pagina leida de S displaystyle S la tupla de la pagina es comparada con las del bloque de R displaystyle R y cada par de tuplas que satisfacen la condicion de combinacion se agrega a la pagina de salida El algoritmo de bucles anidados en bloque tiene una complejidad computacional de O P r P s M displaystyle O frac P r P s M operaciones de entrada salida donde M displaystyle M es el numero de paginas de memoria disponibles y P r displaystyle P r y P s displaystyle P s son el tamano en paginas de R displaystyle R y de S displaystyle S respectivamente Notar que la complejidad computacional es de O P r P s displaystyle O P r P s operaciones de entrada salida si R displaystyle R cabe en la memoria disponible Combinacion por fusion Editar Si ambas relaciones estan ordenadas por los atributos de combinacion la operacion es trivial Por cada tupla de la relacion externa Se toma el grupo de tuplas actual de la relacion interna un grupo esta formado por un conjunto de tuplas contiguas con el mismo valor en el atributo de combinacion Por cada tupla del grupo interno actual que satisfaga la condicion de combinacion se agrega una tupla al resultado Una vez agotado el grupo interno ambas busquedas la interna y la externa pueden avanzar al siguiente grupo Por esta razon muchos optimizadores guardan pista del ordenamiento en los nodos del plan si uno o ambos operandos ya estan ordenados en funcion del atributo de combinacion no hace falta otro ordenamiento De lo contrario el sistema de gestion de base de datos debera realizarlo generalmente utilizando un ordenamiento externo para evitar consumir demasiada memoria Combinacion Hash Editar 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 combinacion La busqueda en tabla hash es mucho mas rapida que a traves de arboles de indice pero solo puede realizarse una busqueda por la condicion de igualdad Optimizacion de la combinacion Editar Semi combinacion Editar Es una optimizacion tecnica para las combinaciones en bases de datos distribuidas El predicado JOIN es aplicado en diferentes fases comenzando con la mas temprana Esto puede reducir el tamano de los resultados inmediatos que deben ser intercambiados con nodos remotos asi reduce el trafico de red entre nodos esto puede mejorarse con un filtro Bloom Vease tambien EditarSQL Bases de datos relacionalesEnlaces externos EditarSentencia Join en MySQL 5 0 Expresiones de tablas en PostgreSQL 8 4 Ingles Combinar tablas JOIN Curso de SQL JOIN Datos Q2003535Obtenido de https es wikipedia org w index php title Sentencia JOIN en SQL amp oldid 136405003, wikipedia, wiki, leyendo, leer, libro, biblioteca,

español

, española, descargar, gratis, descargar gratis, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, imagen, música, canción, película, libro, juego, juegos