Anda di halaman 1dari 30

Consultas de tablas múltiples

Consultas
• Es habitual de tablas
que queramos accedermúltiples
a datos que se encuentran en más de
una tabla y mostrar información mezclada de todas ellas como resultado
de una consulta. Para ello tendremos que hacer combinaciones de
columnas de tablas diferentes.
• En SQL es posible hacer esto especificando más de una tabla en la
cláusula FROM de la instrucción SELECT.
Consultas de tablas múltiples
Suele ser muy común confundirse con las distintas
combinaciones que se pueden realizar entre tablas, por
ello vamos a aclarar las diferencias entre cada una.

Hay dos tipos de combinaciones:

• Internas: Devuelven todas las filas que cumplen con la


condición de las tablas, en caso de no encontrarse
coincidencia de valores no muestra nada.

Externas: las filas resultantes no son directamente de


la tabla origen, podría ser de la izquierda, derecha o
completa.
Combinación de tablas Join
• INNER JOIN
Combinaciones JOIN
Internas

• LEFT JOIN
Combinaciones
• RIGHT JOIN
Externas
• FULL JOIN
TenemosConsultas
varias formasde tablasesta
de obtener múltiples
información.
• Una de ellas consiste en crear combinaciones que permiten
mostrar columnas de diferentes tablas como si fuese una sola tabla,
haciendo coincidir los valores de las columnas relacionadas.

• Este último punto es muy importante, ya que si seleccionamos varias


tablas y no hacemos coincidir los valores de las columnas relacionadas,
obtendremos una gran duplicidad de fila.

• Una manera de mostrar información de varias tablas -mucho más


habitual y lógica- es uniendo filas de ambas, para ello es necesario que
las columnas que se van a unir entre las dos tablas sean las mismas y
contengan los mismos tipos de datos, es decir, mediante una clave
externa.
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 operación JOIN o combinación permite mostrar columnas
de variasOperaciones
tablas como side
seunión
tratase- de una sola tabla,
JOIN
combinando entre sí los registros relacionados usando para
ello claves externas.
Operación JOIN o combinación
• Veamos un ejemplo, que selecciona el número de venta, el
código y nombre del cliente y la fecha de venta en una base
de datos

SELECT OrderID, C.CustomerID, CompanyName, OrderDate


FROM Customers C, Orders O
WHERE C.CustomerID = O.CustomerID

Expresamos el vínculo que se establece entre las dos tablas en


la cláusula WHERE. En este caso relacionamos ambas tablas
mediante el identificador del cliente, clave existente en ambas.
Fíjate en como le hemos otorgado un alias a cada tabla (C y O
respectivamente) para no tener que escribir su nombre
completo cada vez que necesitamos usarlas.
• Hay que tener
Operación
en cuentaJOIN
queosicombinación
el nombre de una
columna existe en más de una de las tablas
indicadas en la cláusula FROM, hay que poner,
obligatoriamente, el nombre o alias de la tabla de
la que queremos obtener dicho valor. En caso
contrario nos dará un error de ejecución,
indicando que hay un nombre ambiguo.
• Hay otra formaOperación JOIN
adicional, que o combinación
es más explícita y clara
a la hora de realizar este tipo de combinaciones -y
que se incorpora a partir de ANSI SQL-92- que
permite utilizar una nueva cláusula llamada JOIN en
la cláusula FROM

No hay diferencia, JOIN e INNER JOIN son sinónimos.

JOIN = INNER JOIN


Su sintaxis es el siguiente:
SELECT T1.Col1, T1.Col2, T1.Col3, T2.Col7
FROM Tabla1 T1 INNER JOIN Tabla2 T2
ON T1.Col1 = T2.Col1

• En el caso del ejemplo anterior quedaría de la siguiente


forma:
SELECT OrderID, C.CustomerID, CompanyName, OrderDate
FROM Customers C Inner Join Orders O
On C.CustomerID = O.CustomerID

De esta manera relacionamos de manera explícita ambas


tablas sin necesidad de involucrar la clave externa en las
condiciones del SELECT (o sea, en el WHERE). Es una manera
más clara y limpia de llevar a cabo la relación.
• Esto se puede ir aplicando a cuantas tablas necesitemos
combinar en nuestras consultas.
• Veamos un ejemplo en ambos formatos que involucra más
tablas, en este caso las tablas de empleados, clientes y ventas:

SELECT OrderID, C.CustomerID, CompanyName, OrderDate


FROM Customers C, Orders O, Employees E
WHERE C.CustomerID = O.CustomerID AND O.EmployeeID =
E.EmployeeID

Con Inner Join


SELECT OrderID, C.CustomerID, CompanyName, OrderDate
FROM Customers C INNER JOIN Orders O
ON C.CustomerID = O.CustomerID
INNER JOIN Employees E
ON O.EmployeeID = E.EmployeeID
• Veamos un ejemplo como el anterior, pero ahora además
necesitamos que el cliente sea de España o el vendedor
sea el número 5.
• En el primer formato tendríamos algo como esto:

SELECT OrderID, C.CustomerID, CompanyName, OrderDate


FROM Customers C, Orders O, Employees E
WHERE (C.CustomerID = O.CustomerID
AND O.EmployeeID = E.EmployeeID) AND (C.Country = 'Spain'
OR E.EmployeeID = 5)

Es decir, estamos mezclando en el WHERE las uniones de


tablas, y las condiciones concretas de filtro de la consulta,
quedando todo mucho más complejo.
El segundo formato con INNER JOIN, la consulta es mucho más clara:

SELECT OrderID, C.CustomerID, CompanyName,


OrderDate
FROM Customers C INNER JOIN Orders O
ON C.CustomerID = O.CustomerID
INNER JOIN Employees E
ON O.EmployeeID = E.EmployeeID
WHERE C.Country = 'Spain' OR E.EmployeeID = 5

Aquí se aprecia claramente que la utilización de JOIN


simplifica la lectura y comprensión de la instrucción
Combinaciones externas (OUTER JOIN)

Las combinaciones externas se realizan mediante la


instrucción OUTER JOIN.

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.
Combinaciones externas (OUTER JOIN)

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.
LEFT OUTER JOIN = LEFT JOIN
Combinaciones externas - 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

select CAMPOS from TABLAIZQUIERDA left join TABLADERECHA on


CONDICION
Combinaciones externas - LEFT JOIN
• Esto se ilustra gráficamente de la siguiente manera:
Combinaciones externas - LEFT JOIN
EJEMPLO:

En el siguiente ejemplo solicitamos el título y nombre de la editorial de los libros

SELECT titulo, nombre


FROM editoriales E LEFT JOIN libros as L
ON codigoeditorial = E.codigo

El resultado mostrará el título y nombre de la editorial; las editoriales de las


cuales no hay libros, es decir, cuyo código de editorial no está presente en "libros"
aparece en el resultado, pero con el valor "null" en el campo "titulo".

• Es importante la posición en que se colocan las tablas en un "left join", la tabla


de la izquierda es la que se usa para localizar registros en la tabla de la derecha.
• Entonces, un "left join" se usa para hacer coincidir registros en una tabla
(izquierda) con otra tabla (derecha); si un valor de la tabla de la izquierda no
encuentra coincidencia en la tabla de la derecha, se genera una fila extra (una
por cada valor no encontrado) con todos los campos correspondientes a la
tabla derecha a "null".
En el siguiente ejemplo solicitamos el título y el nombre la editorial, la
sentencia Combinaciones
es similar a la anterior, la diferencia
externas - LEFTestá en el orden de las
JOIN
tablas:

select titulo, nombre


from libros as L left join editoriales as E
on codigoeditorial = E.codigo

El resultado mostrará el título del libro y el nombre de la editorial; los


títulos cuyo código de editorial no está presente en "editoriales"
aparecen en el resultado, pero con el valor "null" en el campo "nombre".
Un "left join" puede tener clausula "where" que restringa el
resultadoCombinaciones externas - LEFT
de la consulta considerando JOIN
solamente los registros
que encuentran coincidencia en la tabla de la derecha, es
decir, cuyo valor de código está presente en "libros":

select titulo, nombre


from editoriales as e left join libros as l
on e.codigo = codigoeditorial
where codigoeditorial is not null;
Combinación externa derecha (right join)
RIGHT OUTER JOIN = RIGHT JOIN

• Una combinación externa derecha ("right outer join" o


"right join") opera del mismo modo que la izquierda sólo
que la tabla derecha es la que localiza los registros en la
tabla izquierda.
Así para Combinación externa
seleccionar todas derecha
las filas de la (right
Tabla2,join)
aunque no
tengan correspondencia con las filas de la Tabla1 podemos
utilizar la cláusula RIGHT:

La sintaxis básica es la siguiente:


select CAMPOS
from TABLAIZQUIERDA right join TABLADERECHA
on CONDICION;
Combinación
En el siguiente ejemploexterna derecha
solicitamos (righty join)
el título nombre de la
editorial de los libros empleando un "right join":

select titulo, nombre


from libros as l right join editoriales as e
on codigoeditorial = e.codigo

El resultado mostrará el título y nombre de la editorial; las


editoriales de las cuales no hay libros, es decir, cuyo código
de editorial no está presente en "libros" aparece en el
resultado, pero con el valor "null" en el campo "titulo".
• Es FUNDAMENTAL tener en cuenta la posición en que se
colocanCombinación
las tablas enexterna derecha
los "outer (right
join". En un join)
"left join" la
primera tabla (izquierda) es la que busca coincidencias en
la segunda tabla (derecha); en el "right join" la segunda
tabla (derecha) es la que busca coincidencias en la primera
tabla (izquierda).
Un "right join" también puede tener cláusula "where" que
restringaCombinación externa
el resultado de derecha
la consulta (right join) solamente
considerando
los registros que encuentran coincidencia en la tabla
izquierda:

select titulo, nombre


from libros as l right join editoriales as e
on e.codigo=codigoeditorial
where codigoeditorial is not null;
• Combinación
Una combinaciónexterna completa
externa (full("full
completa join)outer join" o "full
join") retorna todos los registros de ambas tablas.

• Si un registro de una tabla izquierda no encuentra


coincidencia en la tabla derecha, las columnas
correspondientes a campos de la tabla derecha aparecen
seteadas a "null", y si la tabla de la derecha no encuentra
correspondencia en la tabla izquierda, los campos de esta
última aparecen conteniendo "null".
Combinación externa completa (full join)
• Así con 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:
Combinación externa completa (full join)
Ejemplo:

select titulo, nombre


from editoriales as e full join libros as l
on codigoeditorial = e.codigo

La salida del "full join" precedente muestra todos los


registros de ambas tablas, incluyendo los libros cuyo código
de editorial no existe en la tabla "editoriales" y las editoriales
de las cuales no hay correspondencia en "libros".

Anda mungkin juga menyukai