Guia 16 1 MATERIAL Consultas Multitabla
Guia 16 1 MATERIAL Consultas Multitabla
Guia 16 1 MATERIAL Consultas Multitabla
Introducción
En este tema vamos a estudiar las consultas multitabla llamadas así porque están
basadas en más de una tabla.
El SQL de Microsoft Jet 4.x soporta dos grupos de consultas multitabla:
- la unión de tablas
- la composición de tablas
La unión de tablas
Esta operación se utiliza cuando tenemos dos tablas con las mismas columnas y
queremos obtener una nueva tabla con las filas de la primera y las filas de la segunda.
En este caso la tabla resultante tiene las mismas columnas que la primera tabla (que son
las mismas que las de la segunda tabla).
Por ejemplo tenemos una tabla de libros nuevos y una tabla de libros antiguos y queremos
una lista con todos los libros que tenemos. En este caso las dos tablas tienen las mismas
columnas, lo único que varía son las filas, además queremos obtener una lista de libros
(las columnas de una de las tablas) con las filas que están tanto en libros nuevos como las
que están en libros antiguos, en este caso utilizaremos este tipo de operación.
Cuando hablamos de tablas pueden ser tablas reales almacenadas en la base de datos o
tablas lógicas (resultados de una consulta), esto nos permite utilizar la operación con
más frecuencia ya que pocas veces tenemos en una base de datos tablas idénticas en
cuanto a columnas. El resultado es siempre una tabla lógica.
Por ejemplo queremos en un sólo listado los productos cuyas existencias sean iguales a
cero y también los productos que aparecen en pedidos del año 90. En este caso tenemos
unos productos en la tabla de productos y los otros en la tabla de pedidos, las tablas no
tienen las mismas columnas no se puede hacer una union de ellas pero lo que interesa
realmente es el identificador del producto (idfab,idproducto), luego por una parte sacamos
los códigos de los productos con existencias cero (con una consulta), por otra parte los
códigos de los productos que aparecen en pedidos del año 90 (con otra consulta), y luego
unimos estas dos tablas lógicas.
El operador que permite realizar esta operación es el operador UNION.
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 2 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
La composición de tablas
La composición de tablas consiste en concatenar filas de una tabla con filas de otra. En
este caso obtenemos una tabla con las columnas de la primera tabla unidas a las
columnas de la segunda tabla, y las filas de la tabla resultante son concatenaciones de
filas de la primera tabla con filas de la segunda tabla.
El ejemplo anterior quedaría de la siguiente forma con la composición:
A diferencia de la unión la composición permite obtener una fila con datos de las dos
tablas, esto es muy útil cuando queremos visualizar filas cuyos datos se encuentran en
dos tablas.
Por ejemplo queremos listar los pedidos con el nombre del representante que ha hecho el
pedido, pues los datos del pedido los tenemos en la tabla de pedidos pero el nombre del
representante está en la tabla de empleados y además queremos que aparezcan en la
misma línea; en este caso necesitamos componer las dos tablas (Nota: en el ejemplo
expuesto a continuación, hemos seleccionado las filas que nos interesan).
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 3 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
El operador UNION
Como ya hemos visto en la página anterior, el operador UNION sirve para obtener a partir
de dos tablas con las mismas columnas, una nueva tabla con las filas de la primera y
las filas de la segunda.
La sintaxis es la siguiente:
Consulta puede ser un nombre de tabla, un nombre de consulta (en estos dos casos
el nombre debe estar precedido de la palabra TABLE), o una sentencia SELECT
completa (en este caso no se puede poner TABLE). La sentencia SELECT puede ser
cualquier sentencia SELECT con la única restricción de que no puede contener la cláusula
ORDER BY.
Después de la primera consulta viene la palabra UNION y a continuación la segunda
consulta. La segunda consulta sigue las mismas reglas que la primera consulta.
Las dos consultas deben tener el mismo número de columnas pero las columnas
pueden llamarse de diferente forma y ser de tipos de datos distintos.
Las columnas del resultado se llaman como las de la primera consulta.
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 4 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
Por defecto la unión no incluye filas repetidas, si alguna fila está en las dos tablas,
sólo aparece una vez en el resultado.
Si queremos que aparezcan todas las filas incluso las repeticiones de filas, incluimos la
palabra ALL (todo en inglés).
El empleo de ALL tienen una ventaja, la consulta se ejecutará más rapidamente. Puede
que la diferencia no se note con tablas pequeñas, pero si tenemos tablas con muchos
registros (filas) la diferencia puede ser notable.
Se puede unir más de dos tablas, para ello después de la segunda consulta repetimos
la palabra UNION ... y así sucesivamente.
También podemos indicar que queremos el resultado ordenado por algún criterio, en
este caso se incluye la cláusula ORDER BY que ya vimos en el tema anterior. La cláusula
ORDER BY se escribe después de la última consulta, al final de la sentencia; para
indicar las columnas de ordenación podemos utilizar su número de orden o el nombre
de la columna, en este último caso se deben de utilizar los nombres de columna de la
primera consulta ya que son los que se van a utilizar para nombrar las columnas del
resultado.
Para ilustrar la operación vamos a realizar el ejercicio visto en la página anterior, vamos a
obtener los códigos de los productos que tienen existencias iguales a cero o que
aparezcan en pedidos del año 90.
SELECT idfab,idproducto
FROM productos
WHERE existencias = 0
TABLE [existencias cero]
UNION ALL
UNION ALL
SELECT fab,producto o bien
TABLE [pedidos 90]
FROM pedidos
ORDER BY idproducto
WHERE year(fechapedido) = 1990
ORDER BY idproducto
Se ha incluido la cláusula ALL porque no nos importa que salgan filas repetidas.
Se ha incluido ORDER BY para que el resultado salga ordenado por idproducto, observar
que hemos utilizado el nombre de la columna de la primera SELECT, también podíamos
haber puesto ORDER BY 2 pero no ORDER BY producto (es el nombre de la columna de
la segunda tabla).
Para el 2º caso hemos creado una consulta llamada existencias cero con la primera
SELECT, y una consulta llamada pedidos 90 con la segunda SELECT. Observar que los
nombres de las consultas están entre corchetes porque contienen espacios en blanco, y
que en este caso hay que utilizar TABLE.
El producto cartesiano
El producto cartesiano es un tipo de composición de tablas, aplicando el producto
cartesiano a dos tablas se obtiene una tabla con las columnas de la primera tabla
unidas a las columnas de la segunda tabla, y las filas de la tabla resultante son todas
las posibles concatenaciones de filas de la primera tabla con filas de la segunda
tabla.
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 5 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
La sintaxis es la siguiente:
nbtabla puede ser un nombre de tabla o un nombre de consulta. Si todas las tablas
están en una base de datos externa, añadiremos la cláusula IN basedatosexterna
después de la última tabla. Pero para mejorar el rendimiento y facilitar el uso, se
recomienda utilizar una tabla vinculada en lugar de la cláusula IN.
Hay que tener en cuenta que el producto cartesiano obtiene todas las posibles
combinaciones de filas por lo tanto si tenemos dos tablas de 100 registros cada una, el
resultado tendrá 100x100 filas, si el producto lo hacemos de estas dos tablas con una
tercera de 20 filas, el resultado tendrá 200.000 filas (100x100x20) y estamos hablando
de tablas pequeñas. Se ve claramente que el producto cartesiano es una operación
costosa sobre todo si operamos con más de dos tablas o con tablas voluminosas.
Se puede componer una tabla consigo misma, en este caso es obligatorio utilizar
un nombre de alias por lo menos para una de las dos.
Por ejemplo: SELECT * FROM empleados, empleados emp
En este ejemplo obtenemos el producto cartesiano de la tabla de empleados con ella
misma. Todas las posibles combinaciones de empleados con empleados.
Para ver cómo funciona el producto cartesiano cogemos las consultas [existencias
cero] y [pedidos 90] creadas en la página anterior, y creamos una consulta que halle el
producto cartesiano de las dos.
SELECT * obtenemos
FROM [existencias la
cero],[pedidos 90] siguiente
tabla:
Se observa que tenemos las dos filas de la primera consulta combinadas con las dos filas
de la segunda.
Esta operación no es de las más utilizadas, normalmente cuando queremos componer
dos tablas es para añadir a las filas de una tabla, una fila de la otra tabla, por ejemplo
añadir a los pedidos los datos del cliente correspondiente, o los datos del representante,
esto equivaldría a un producto cartesiano con una selección de filas:
SELECT *
FROM pedidos,clientes
WHERE pedidos.clie=clientes.numclie
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 6 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
Combinamos todos los pedidos con todos los clientes pero luego seleccionamos los que
cumplan que el código de cliente de la tabla de pedidos sea igual al código de cliente de la
tabla de clientes, por lo tanto nos quedamos con los pedidos combinados con los datos
del cliente correspondiente.
Las columnas que aparecen en la cláusula WHERE de nuestra consulta anterior se
denominan columnas de emparejamiento ya que permiten emparejar las filas de las dos
tablas. Las columnas de emparejamiento no tienen por qué estar incluidas en la lista de
selección.
Normalmente emparejamos tablas que están relacionadas entre sí y una de las
columnas de emparejamiento es clave principal, pues en este caso, cuando una de las
columnas de emparejamiento tienen un índice definido es más eficiente utilizar otro tipo
de composición, el INNER JOIN.
El INNER JOIN
El INNER JOIN es otro tipo de composición de tablas, permite emparejar filas de distintas
tablas de forma más eficiente que con el producto cartesiano cuando una de las
columnas de emparejamiento está indexada. Ya que en vez de hacer el producto
cartesiano completo y luego seleccionar la filas que cumplen la condición de
emparejamiento, para cada fila de una de las tablas busca directamente en la otra tabla
las filas que cumplen la condición, con lo cual se emparejan sólo las filas que luego
aparecen en el resultado.
La sintaxis es la siguiente:
Ejemplo:
SELECT *
FROM pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie
tabla1 y tabla2 son especificaciones de tabla (nombre de tabla con alias o no,
nombre de consulta guardada), de las tablas cuyos registros se van a combinar.
Pueden ser las dos la misma tabla, en este caso es obligatorio definir al menos un
alias de tabla.
col1, col2 son las columnas de emparejamiento.
Observar que dentro de la cláusula ON los nombres de columna deben ser nombres
cualificados (llevan delante el nombre de la tabla y un punto).
Las columnas de emparejamiento deben contener la misma clase de datos, las dos
de tipo texto, de tipo fecha etc... los campos numéricos deben ser de tipos similares. Por
ejemplo, se puede combinar campos AutoNumérico y Long puesto que son tipos
similares, sin embargo, no se puede combinar campos de tipo Simple y Doble. Además
las columnas no pueden ser de tipo Memo ni OLE.
comp representa cualquier operador de comparación ( =, <, >, <=, >=, o <> ) y se
utiliza para establecer la condición de emparejamiento.
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 7 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
SELECT *
FROM pedidos INNER JOIN productos ON (pedidos.fab = productos.idfab) AND
(pedidos.producto = productos.idproducto)
Se pueden combinar más de dos tablas
En este caso hay que sustituir en la sintaxis una tabla por un INNER JOIN completo.
Por ejemplo:
SELECT *
FROM (pedidos INNER JOIN clientes ON pedidos.clie = clientes.numclie) INNER JOIN
empleados ON pedidos.rep = empleados.numemp
En vez de tabla1 hemos escrito un INNER JOIN completo, también podemos
escribir:
SELECT *
FROM clientes INNER JOIN (pedidos INNER JOIN empleados ON pedidos.rep =
empleados.numemp) ON pedidos.clie = clientes.numclie
En este caso hemos sustituido tabla2 por un INNER JOIN completo.
Observar que hemos cualificado el nombre de columna oficina ya que ese nombre
aparece en las dos tablas de la FROM.
Con esta sentencia los empleados que no tienen una oficina asignada (un valor nulo
en el campo oficina de la tabla empleados) no aparecen en el resultado ya que la
condición empleados.oficina = oficinas.oficina será siempre nula para esos empleados.
Si utilizamos el INNER JOIN:
SELECT empleados.*, ciudad
FROM empleados INNER JOIN oficinas ON empleados.oficina = oficinas.oficina
Nos pasa lo mismo, el empleado 110 tiene un valor nulo en el campo oficina y no
aparecerá en el resultado.
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 8 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
Pues en los casos en que queremos que también aparezcan las filas que no tienen
una fila coincidente en la otra tabla, utilizaremos el LEFT o RIGHT JOIN.
La sintaxis del LEFT JOIN es la siguiente:
La descripción de la sintaxis es la misma que la del INNER JOIN (ver página anterior), lo
único que cambia es la palabra INNER por LEFT (izquierda en inglés).
Esta operación consiste en añadir al resultado del INNER JOIN las filas de la tabla de
la izquierda que no tienen correspondencia en la otra tabla, y rellenar en esas filas los
campos de la tabla de la derecha con valores nulos.
Ejemplo:
SELECT *
FROM empleados LEFT JOIN oficinas ON empleados.oficina = oficinas.oficina
Con el ejemplo anterior obtenemos una lista de los empleados con los datos de su
oficina, y el empleado 110 que no tiene oficina aparece con sus datos normales y los
datos de su oficina a nulos.
La sintaxis del RIGHT JOIN es la siguiente:
La sintaxis es la misma que la del INNER JOIN (ver página anterior), lo único que cambia
es la palabra INNER por RIGHT (derecha en inglés).
Esta operación consiste en añadir al resultado del INNER JOIN las filas de la tabla de
la derecha que no tienen correspondencia en la otra tabla, y rellenar en esas filas los
campos de la tabla de la izquierda con valores nulos.
Ejemplo:
SELECT *
FROM empleados RIGHT JOIN oficinas ON empleados.oficina = oficinas.oficina
Con el ejemplo anterior obtenemos una lista de los empleados con los datos de su
oficina, y además aparece una fila por cada oficina que no está asignada a ningún
empleado con los datos del empleado a nulos.
Una operación LEFT JOIN o RIGHT JOIN se puede anidar dentro de una operación
INNER JOIN, pero una operación INNER JOIN no se puede anidar dentro de LEFT
JOIN o RIGHT JOIN. Los anidamientos de JOIN de distinta naturaleza no funcionan
siempre, a veces depende del orden en que colocamos las tablas, en estos casos lo
mejor es probar y si no permite el anudamiento, cambiar el orden de las tablas ( y por
tanto de los JOINs) dentro de la cláusula FROM.
Por ejemplo podemos tener:
SELECT *
FROM clientes INNER JOIN (empleados LEFT JOIN oficinas ON empleados.oficina =
oficinas.oficina) ON clientes.repclie = empleados.numclie
Combinamos empleados con oficinas para obtener los datos de la oficina de cada
empleado, y luego añadimos los clientes de cada representante, así obtenemos los
clientes que tienen un representante asignado y los datos de la oficina del representante
asignado.
Regional Distrito Capital Fecha:
Centro De Gestión de Mercados, Logística y Tecnologías de la Mayo de 2010
Información
FORMACIÓN POR COMPETENCIAS LABORALES
Código:
Sistema de PROGRAMACIÓN DE SOFTWARE Página 9 de 9
Gestión de la EJE DE FORMACIÓN:
Calidad BASE DE DATOS
Si hubiéramos puesto INNER en vez de LEFT no saldrían los clientes que tienen el
empleado 110 (porque no tiene oficina y por tanto no aparece en el resultado del LEFT
JOIN y por tanto no entrará en el cálculo del INNER JOIN con clientes).