AdSense_BarHorizontal

jueves, 14 de abril de 2016

SQL - Consultas SELECT MultiTabla


Combinaciones internas - INNER JOIN

Las combinaciones internas se realizan mediante la instrucción INNER JOIN. Devuelven únicamente aquellos registros/filas que tienen valores idénticos en los dos campos que se comparan para unir ambas tablas. Es decir aquellas que tienen elementos en las dos tablas, identificados éstos por el campo de relación.

La mejor forma de verlo es con un diagrama de Venn que ilustre en qué parte de la relación deben existir registros:



INNER-JOIN


En este caso se devuelven los registros que tienen nexo de unión en ambas tablas.
Esto puede ocasionar la desaparición del resultado de filas de alguna de las dos tablas, por tener valores nulos, o por tener un valor que no exista en la otra tabla entre los campos/columnas que se están comparando.

Su sintaxis es:

SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 INNER JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
Por ejemplo suponiendo tenemos las siguientes tablas (Carro, Carroceria)

IdCarro
NombreCarro
IdCarroceria
1
Hiunday i35
1
2
Chevrolet Spark GT
2
3
Mazda 3
2
4
Renault Stepway
3
5
Ford Explorer
NULL
6
Nissan Sentra
NULL

IdCarroceria
NombreCarroceria
1
Sedan
2
HastBack
3
Camioneta
4
Convertible
5
Limosina
6
Furgoneta

Al momento de ejecutar la sgte Consulta con INNER JOIN:
SELECT T1. IdCarro, T1. NombreCarro, T1. IdCarroceria, T2. IdCarroceria, T2. NombreCarroceria
FROM Carro T1
INNER JOIN Carroceria T2 ON T1. IdCarroceria= T2. IdCarroceria

 Se obtendrá

INNER JOIN
IdCarro
NombreCarro
IdCarroceria
IdCarroceria
NombreCarroceria
1
Hiunday i35
1
1
Sedan
2
Chevrolet Spark GT
2
2
HastBack
3
Mazda 3
2
2
HastBack
4
Renault Stepway
3
3
Camioneta


Combinaciones externas (OUTER JOIN)

Las combinaciones externas se realizan mediante la instrucción OUTER JOIN. Como enseguida veremos, devuelven todos los valores de la tabla que hemos puesto a la derecha, los de la tabla que hemos puesto a la izquierda o los de ambas tablas según el caso, devolviendo además valores nulos en las columnas de las tablas que no tengan el valor existente en la otra tabla.

Es decir, que nos permite seleccionar algunas filas de una tabla aunque éstas no tengan correspondencia con las filas de la otra tabla con la que se combina. Ahora lo veremos mejor en cada caso concreto, ilustrándolo con un diagrama para una mejor comprensión.

La sintaxis general de las combinaciones externas es:

FROM Tabla1 [LEFT/RIGHT/FULL] [OUTER] JOIN Tabla2 ON Condiciones_Vinculos_Tablas
Como vemos existen tres variantes de las combinaciones externas.

En todas estas combinaciones externas el uso de la palabra OUTER es opcional. Si utilizamos LEFT, RIGHT o FULL y la combinación de columnas, el sistema sobreentiende que estamos haciendo una combinación externa.

Variante LEFT JOIN


Se obtienen todas las filas de la tabla colocada a la izquierda, aunque no tengan correspondencia en la tabla de la derecha.

Así, para seleccionar todas las filas de la Tabla1, aunque no tengan correspondencia con las filas de la Tabla2, suponiendo que se combinan por la columna Col1 de ambas tablas escribiríamos:

SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 LEFT [OUTER] JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
Esto se ilustra gráficamente de la siguiente manera:
  


Volviendo a nuestro ejemplo al momento de ejecutar la sgte Consulta con LEFT JOIN:
SELECT T1. IdCarro, T1. NombreCarro, T1. IdCarroceria, T2. IdCarroceria, T2. NombreCarroceria
FROM Carro T1
LEFT JOIN Carroceria T2 ON T1. IdCarroceria= T2. IdCarroceria

Se obtendrá
IdCarro
NombreCarro
IdCarroceria
IdCarroceria
NombreCarroceria
1
Hiunday i35
1
1
Sedan
2
Chevrolet Spark GT
2
2
HastBack
3
Mazda 3
2
2
HastBack
4
Renault Stepway
3
3
Camioneta
5
Ford Explorer
NULL
NULL
NULL
6
Nissan Sentra
NULL
NULL
NULL



Variante RIGHT JOIN


Análogamente, usando RIGHT JOIN se obtienen todas las filas de la tabla de la derecha, aunque no tengan correspondencia en la tabla de la izquierda.

Así, para seleccionar todas las filas de la Tabla2, aunque no tengan correspondencia con las filas de la Tabla1 podemos utilizar la cláusula RIGHT:

SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 RIGHT [OUTER] JOIN Tabla2 T2 ON T1.Col1 = T2.Col1
El diagrama en este caso es complementario al anterior:



Volviendo a nuestro ejemplo al momento de ejecutar la sgte Consulta con LEFT JOIN:
SELECT T1. IdCarro, T1. NombreCarro, T1. IdCarroceria, T2. IdCarroceria, T2. NombreCarroceria
FROM Carro T1
RIGTH JOIN Carroceria T2 ON T1. IdCarroceria= T2. IdCarroceria

Se obtendrá
IdCarro
NombreCarro
IdCarroceria
IdCarroceria
NombreCarroceria
1
Hiunday i35
1
1
Sedan
2
Chevrolet Spark GT
2
2
HastBack
3
Mazda 3
2
2
HastBack
4
Renault Stepway
3
3
Camioneta
NULL
NULL
NULL
4
Convertible
NULL
NULL
NULL
5
Limosina
NULL
NULL
NULL
6
Furgoneta

 Variante FULL JOIN


Se obtienen todas las filas en ambas tablas, aunque no tengan correspondencia en la otra tabla. Es decir, todos los registros de A y de B aunque no haya correspondencia entre ellos, rellenando con nulos los campos que falten:

FULL-JOIN

Es equivalente a obtener los registros comunes (con un INNER) y luego añadirle los de la tabla A que no tienen correspondencia en la tabla B, con los campos de la tabla vacíos, y los registros de la tabla B que no tienen correspondencia en la tabla A, con los campos de la tabla A vacíos.

Su sintaxis es:

SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 FULL [OUTER] JOIN Tabla2 T2 ON T1.Col1 = T2.Col1



Volviendo a nuestro ejemplo al momento de ejecutar la sgte Consulta con LEFT JOIN:
SELECT T1. IdCarro, T1. NombreCarro, T1. IdCarroceria, T2. IdCarroceria, T2. NombreCarroceria
FROM Carro T1
RIGTH JOIN Carroceria T2 ON T1. IdCarroceria= T2. IdCarroceria

Se obtendrá
IdCarro
NombreCarro
IdCarroceria
IdCarroceria
NombreCarroceria
1
Hiunday i35
1
1
Sedan
2
Chevrolet Spark GT
2
2
HastBack
3
Mazda 3
2
2
HastBack
4
Renault Stepway
3
3
Camioneta
5
Ford Explorer
NULL
NULL
NULL
6
Nissan Sentra
NULL
NULL
NULL
NULL
NULL
NULL
4
Convertible
NULL
NULL
NULL
5
Limosina
NULL
NULL
NULL
6
Furgoneta


No hay comentarios:

Publicar un comentario