Tema 08 - Consultas a Múltiples Tablas

13
77 Asignatura: Sistemas de Base de Datos TEMA 8 CONSULTAS A MÚLTIPLES TABLAS Introducción En este capítulo aprenderemos a utilizar SQL para recuperar datos a partir de una o más tablas. Consultar múltiples tablas En el capítulo anterior vimos cómo recuperar datos de una sola tabla. Muchas consultas requieren la recuperación de datos de más de una tabla. Para recuperar datos de múltiples tablas, primero tenemos que unir las tablas, y después formular una consulta utilizando los mismos comandos que utilizamos para las consultas a una sola tabla. Nota: En las siguientes consultas los resultados podrían contener las mismas filas, pero podrían estar listadas en un orden diferente. Si el orden es importante, se puede incluir una cláusula ORDER BY en la consulta para asegurar que los resultados están listados en el orden deseado. Unir dos tablas Para recuperar datos de más de una tabla, debemos unir las tablas entre sí encontrando en ellas filas que tengan valores idénticos en columnas coincidentes. Podemos unir tablas utilizando una condición en la cláusula WHERE, como veremos en el ejemplo 1. Ejemplo 1 Liste el código y el nombre de todos los clientes, junto con el código, apellido y nombre del vendedor que los representa. Como los códigos y nombres de los clientes están en la tabla tCliente y códigos y nombres de los vendedores están en la tabla tVendedor, tendremos que incluir ambas tablas en el comando SQL para poder recuperar los datos de ambas tablas. Para unir (relacionar) las tablas, construiremos el comando SQL de esta manera:

description

ni base de datos

Transcript of Tema 08 - Consultas a Múltiples Tablas

Page 1: Tema 08 - Consultas a Múltiples Tablas

77

Asignatura: Sistemas de Base de Datos

TEMA

8 CONSULTAS A MÚLTIPLES TABLAS

Introducción

En este capítulo aprenderemos a utilizar SQL para recuperar datos a partir de una o más

tablas.

Consultar múltiples tablas

En el capítulo anterior vimos cómo recuperar datos de una sola tabla. Muchas consultas requieren

la recuperación de datos de más de una tabla. Para recuperar datos de múltiples tablas, primero

tenemos que unir las tablas, y después formular una consulta utilizando los mismos comandos

que utilizamos para las consultas a una sola tabla.

Nota: En las siguientes consultas los resultados podrían contener las mismas filas, pero podrían

estar listadas en un orden diferente. Si el orden es importante, se puede incluir una cláusula

ORDER BY en la consulta para asegurar que los resultados están listados en el orden deseado.

Unir dos tablas

Para recuperar datos de más de una tabla, debemos unir las tablas entre sí encontrando en ellas

filas que tengan valores idénticos en columnas coincidentes. Podemos unir tablas utilizando una

condición en la cláusula WHERE, como veremos en el ejemplo 1.

Ejemplo 1

Liste el código y el nombre de todos los clientes, junto con el código, apellido y nombre del

vendedor que los representa.

Como los códigos y nombres de los clientes están en la tabla tCliente y códigos y nombres de los

vendedores están en la tabla tVendedor, tendremos que incluir ambas tablas en el comando SQL

para poder recuperar los datos de ambas tablas. Para unir (relacionar) las tablas, construiremos el

comando SQL de esta manera:

Page 2: Tema 08 - Consultas a Múltiples Tablas

78

Asignatura: Sistemas de Base de Datos

1. En la cláusula SELECT, liste todas las columnas que quiera mostrar.

2. En la cláusula FROM, liste todas las tablas implicadas en la consulta.

3. En la cláusula WHERE, liste la condición que restringe los datos a recuperar a sólo las filas

de las dos tablas que coincidan, es decir, restrínjala a las filas que tengan valores comunes

en columnas coincidentes.

Como vimos anteriormente, normalmente es necesario calificar un nombre de columna para

especificar la columna en concreto a la que nos referimos. Calificar nombres de columna es

especialmente importante al unir tablas, porque debemos unir las tablas en columnas

coincidentes que suelen tener nombres de columna idénticos. Para calificar un nombre de

columna, preceda el nombre de la columna con el nombre de la tabla, seguido en un punto. Las

columnas coincidentes en este ejemplo son las que se llaman codiVende: Hay una columna en la

tabla tVendedor llamada codiVende y una columna en la tabla tCliente que también se llama

codiVende. La columna codiVende de la tabla tVendedor se escribe como tVendedor.codiVende y

la columna codiVende de la tabla tCliente se escribe tCliente.codiVende. En la figura 5.1 vemos la

consulta y sus resultados.

Cuando existe una ambigüedad potencial al listar nombres de columnas, es necesario calificar las

columnas implicadas en la consulta. También se pueden calificar otras columnas, incluso cuando

no hay confusión posible. Algunos usuarios prefieren calificar todos los nombres de columnas,

pero en este libro solo calificaremos nombres de columnas cuando sea necesario.

SELECT codiClien, nombreClien,

tVendedor.codiVende, apeVende, nombreVende

FROM tVendedor, tCliente

WHERE tVendedor.codiVende = tCliente.codiVende;

Figura 5.1. Unir dos tablas con un solo comando SQL.

Preguntas y Respuestas

Pregunta: En la primera fila del resultado de la figura 5.1, el código de cliente es 148, y el

nombre de cliente es Al’s Appliance and Sport. Estos valores representan la primera fila de la

tabla tCliente. ¿Por qué el código de vendedor es 20, el apellido del vendedor Kaiser y su

nombre Valerie?

Page 3: Tema 08 - Consultas a Múltiples Tablas

79

Asignatura: Sistemas de Base de Datos

Respuesta: En la tabla tCliente el código de vendedor para el código de cliente 148 es 20.

(Esto indica que el código de cliente 148 está relacionada con el código de vendedor 20) En la

tabla tVendedor, el apellido del código de Vendedor 20 es Kaiser y su nombre Valerie.

Ejemplo 02

Liste el código y nombre de los clientes cuyo límite de crédito sea 7500, junto con el código,

apellido y nombre del vendedor que representa al cliente.

En el ejemplo 1 utilizamos una condición en la cláusula WHERE sólo para relacionar un cliente con

un vendedor para unir las tablas. Aunque relacionar un cliente con un vendedor es esencial en

este ejemplo también, tenemos que restringir los resultados a solo aquellos clientes cuyo límite

de crédito sea 7500. Podemos restringir las filas utilizando una condición compuesta, como vemos

en la figura 5.2.

SELECT codiClien, nombreClien,

tVendedor.codiVende, apeVende, nombreVende

FROM tVendedor, tCliente

WHERE tVendedor.codiVende = tCliente.codiVende

AND limiCreClien = 7500;

Figura 5.2. Restringir las filas en una unión.

Ejemplo 3

Para cada artículo pedido, liste el código de pedido, el código de artículo, la descripción del

artículo, el número de unidades pedidas, el precio cotizado y el precio unitario.

Un artículo se considera pedido cuando hay una fila en la tabla tDetallePedido en la que aparece

el artículo. Podemos encontrar el código de pedido, el número de unidades pedidas y el precio

cotizado en la tabla tDetallePedido. Sin embargo, para encontrar la descripción del artículo y el

precio unitario, tenemos que buscar en la tabla tArticulo. Después tenemos que buscar filas en la

tabla tDetallePedido y filas en la tabla tArticulo que coincidan (filas que contengan el mismo

código de artículo). En la figura 5.3 vemos la consulta y sus resultados.

SELECT codiPedi, tArticulo.codiArti, descripArti,

cantiArti, precioCoArti, precioUArti

FROM tDetallePedido, tArticulo

WHERE tDetallePedido.codiArti = tArticulo.codiArti;

Page 4: Tema 08 - Consultas a Múltiples Tablas

80

Asignatura: Sistemas de Base de Datos

Figura 5.3. Unir las tablas tDetallePedido y tArticulo.

Preguntas y Respuestas

Pregunta: ¿Se puede utilizar tArticulo.codiArti en lugar de tDetallePedido.codiArti en la

cláusula SELECT?

Respuesta: Sí. Los valores de esas dos columnas coinciden porque han de cumplir la condición

tDetallePedido.codiArti = tArticulo.codiArti.

Comparación de uniones, IN y EXISTS

En SQL unimos tablas incluyendo una condición en la cláusula WHERE para asegurarnos de que las columnas coincidentes contienen valores iguales (por ejemplo, tDetallePedido.codiArti = tArticulo.codiArti). Podemos obtener resultados similares utilizando el operador IN o el operador EXISTS con una subconsulta. La elección entre uno u otro depende de sus preferencias personales, porque con cualquiera de las dos opciones obtendremos los mismos resultados.

En los siguientes ejemplos veremos el uso de cada operador.

Ejemplo 4 Busque la descripción de los artículos que estén incluidas en el código de pedido 21610.

Como la consulta también implica recuperar datos de las tablas tDetallePedido y tArticulo (como vimos en el ejemplo 3), podemos hacerlo de manera similar. Sin embargo, hay dos diferencias básicas entre los ejemplos 3 y 4. En primer lugar, la consulta del ejemplo 4 no requiere tantas columnas, y en segundo lugar, sólo interviene el código de pedido 21610. Al tener menos columnas que recuperar habrá menos columnas listadas en la cláusula SELECT. Podemos restringir la consulta a un solo pedido añadiendo la condición codiPedi=’21610’ a la cláusula WHERE. En la figura 5.4 vemos la consulta y sus resultados. Observe que la tabla tDetallePedido está listada en la cláusula FROM, aunque no sea necesario mostrar ninguna columna de la tabla tDetallePedido. La cláusula WHERE contiene columnas de la tabla tDetallePedido, por tanto es necesario incluir la tabla en la cláusula FROM.

Operador IN

Otra manera de recuperar datos de múltiples tablas en una consulta es utilizando el operador IN con una subconsulta. En el ejemplo 4, primero, podríamos utilizar una subconsulta para encontrar todos los códigos de artículo en la tabla tDetallePedido que aparecen en todas las filas en las que

Page 5: Tema 08 - Consultas a Múltiples Tablas

81

Asignatura: Sistemas de Base de Datos

el código de Pedido sea 21610. Después podemos encontrar la descripción del artículo de todos los artículos cuyo código esté en la lista. En la figura 5.5 vemos la consulta y sus resultados.

SELECT descripArti

FROM tArticulo, tDetallePedido

WHERE tArticulo.codiArti = tDetallePedido.codiArti

AND codiPedi = '21610';

Figura 5.4. Restringir las filas al unir las tablas tDetallePedido y tArticulo.

SELECT descripArti

FROM tArticulo

WHERE codiArti IN

(SELECT codiArti

FROM tDetallePedido

WHERE codiPedi = '21610');

Figura 5.5. Utilizar el operador IN en lugar de unir dos tablas para consultarlas.

En la figura 5.5, al evaluar la subconsulta se produce una tabla temporal que consiste en los códigos de artículo (DR93 y DW11) que están presentes en el código de pedido 21610. Al ejecutar el resto de la consulta se producen las descripciones del artículo para cada artículo cuyo código está en la tabla temporal, en este caso, Gas Range (DR93) y Washer (DW11).

Operador EXISTS

También podemos utilizar el operador EXISTS para recuperar datos desde más de una tabla, como vemos en el ejemplo 5. El operador EXISTS comprueba la existencia de filas que cumplan algunos criterios.

Ejemplo 5 Busque el código de pedido y la fecha de todos los pedidos que contengan el código de artículo DR93.

Esta consulta es similar a la del ejemplo 4, pero esta vez implica a la tabla tPedido en lugar de la tabla tArticulo. En este caso, podemos escribir la consulta de cualquiera de las dos maneras que hemos visto. Por ejemplo, podríamos utilizar el operador IN con una subconsulta, como vemos en la figura 5.6.

SELECT codiPedi, fechaPedi

FROM tPedido

WHERE codiPedi IN

(SELECT codiPedi

FROM tDetallePedido

WHERE codiArti = 'DR93');

Page 6: Tema 08 - Consultas a Múltiples Tablas

82

Asignatura: Sistemas de Base de Datos

Figura 5.6. Operador IN para seleccionar información del pedido.

Otro método de resolver el ejemplo 5 es con el operador EXISTS, como vemos en la figura 5.7.

SELECT codiPedi, fechaPedi

FROM tPedido

WHERE EXISTS

(SELECT *

FROM tDetallePedido

WHERE tPedido.codiPedi = tDetallePedido.codiPedi

AND codiArti = 'DR93');

Figura 5.7. Operador EXISTS para seleccionar información del pedido.

La subconsulta de la figura 5.7 es la primera que hemos visto que implica a una tabla listada en la

consulta exterior. Este tipo de consulta se denomina subconsulta correlacionada. En este caso se

utiliza en la subconsulta la tabla tPedido, que está listada en la cláusula FROM de la consulta

exterior. Por este motivo tenemos que calificar la columna codiPedi en la subconsulta

(tPedido.codiPedi). En las consultas anteriores con el operador IN no era necesario calificar las

columnas.

La consulta que vemos en la figura 5.7 funciona de esta manera: para cada fila de la tabla tPedido,

la subconsulta se ejecuta utilizando el valor de tPedido.codiPedi que ocurre en esa fila. La

consulta interior produce una lista de todas las filas de la tabla tDetallePedido en las que

tDetallePedido.codiPedi coincida con este valor y en las que codiArti sea igual a DR93. Podemos

preceder una subconsulta del operador EXISTS para crear una condición que será verdadera si se

obtienen una o más filas cuando se ejecuta la subconsulta o de lo contrario la condición será falsa.

Para comprender mejor el proceso, considere los códigos de pedido 21610 y 21613 de la tabla

tPedido. El código de pedido 21610 se incluye porque existe una fila en la tabla tDetallePedido

con este código de pedido y el código de artículo DR93. Cuando se ejecuta la subconsulta, habrá al

menos una fila en los resultados, que a su vez hacen que la condición EXISTS sea verdadera. Sin

embargo, el código de pedido 21613 no se incluirá, porque no existe ninguna fila en la tabla

tDetallePedido con este código de pedido y el código de artículo DR93. No habrá ninguna fila en

los resultados de la subconsulta, lo que a su vez hace que la condición EXISTS sea falsa.

Subconsulta dentro de subconsulta

Podemos utilizar SQL para crear una subconsulta anidada (una subconsulta dentro de otra

subconsulta), como vemos en el ejemplo 6.

Page 7: Tema 08 - Consultas a Múltiples Tablas

83

Asignatura: Sistemas de Base de Datos

Ejemplo 6

Busque el código y la fecha de los pedidos que incluyan un artículo situado en el almacén 3.

Una manera de solucionar este problema es primeramente determinado la lista de códigos de

artículo en la tabla tArticulo de los artículos situados en el almacén 3. Después obtendremos una

lista de códigos de pedido de la tabla tDetallePedido con un código de artículo correspondiente en

la lista de códigos de artículo. Por último, recuperaremos esos números y fechas de pedido de la

tabla tPedido para los que el código de pedido esté en la lista de códigos de pedido obtenidos

durante el segundo paso. La consulta y sus resultados aparecen en la figura 5.8.

SELECT codiPedi, fechaPedi

FROM tPedido

WHERE codiPedi IN

(SELECT codiPedi

FROM tDetallePedido

WHERE codiArti IN

(SELECT codiArti

FROM tArticulo

WHERE almaArti = '3'));

Figura 5.8. Subconsultas anidadas (una subconsulta dentro de otra).

Como se puede esperar, SQL evalúa las consultas desde la más interior hasta la más exterior. La

consulta de este ejemplo se evalúa en tres pasos:

1. La subconsulta interior es la primera que se evalúa, produciendo una tabla temporal de

códigos de artículo para aquellos artículos situados en el almacén 3.

2. Después se evalúa la siguiente subconsulta (intermedia), produciendo una segunda tabla temporal con una lista de códigos de pedido. Cada código de pedido de este conjunto tiene una fila en la tabla tDetallePedido para la que el código de artículo está en la tabla temporal producida en el paso 1.

3. La consulta exterior se evalúa en último lugar, produciendo la lista deseada de códigos y fechas de pedido. Sólo se incluyen en los resultados los pedidos cuyos códigos estén en la tabla temporal producida en el paso 2.

Otra manera de resolver el ejemplo 6 sería uniendo las tablas tPedido, tDetallePedido y tArticulo. En la figura 5.9 vemos la consulta y sus resultados.

SELECT tPedido.codiPedi, fechaPedi

FROM tPedido, tDetallePedido, tArticulo

WHERE tPedido.codiPedi = tDetallePedido.codiPedi

AND tDetallePedido.codiArti = tArticulo.codiArti

AND almaArti = '3';

Page 8: Tema 08 - Consultas a Múltiples Tablas

84

Asignatura: Sistemas de Base de Datos

Figura 5.9. Unir tres tablas.

En esta consulta las tablas se unen con las siguientes condiciones:

tDetallePedido.codiPedi = tPedido.codiPedi

tDetallePedido.codiArti = tArticulo.codiArti

La condición almaArti = ‘3’ restringe el resultado a solo aquellas partidas situadas en el almacén 3.

Los resultados de las consultas son correctos, independientemente de qué comando utilicemos.

Podemos utilizar el método que prefiramos. Pero, ¿hay alguno que sea más eficaz que el otro?

SQL lleva a cabo muchas optimizaciones predefinidas que analizan las consultas para determinar

la mejor manera de satisfacerlas. Con un buen optimizador, en principio la manera de formular

una consulta no debería ser muy relevante, en este caso las subconsultas anidadas pueden llevar

algo más de tiempo que la unión de tablas. Sin embargo, si utilizamos un DBMS sin optimizador, la

manera de escribir una consulta puede suponer una diferencia importante en la velocidad a la

que el DBMS ejecuta la consulta. Cuando trabajamos con una base de datos muy grande y la

eficiencia es fundamental, es recomendable consultar el manual del DBMS o probar algunos

tiempos. Intente ejecutar la misma consulta de las dos maneras para ver si observa diferencias en

velocidad de ejecución. En base de datos pequeñas no debería haber una diferencia significativa

de tiempo entre los dos métodos.

Ejemplo práctico

En la consulta del ejemplo 7 intervienen varias de las funciones que ya hemos visto. Aparecen en

ella las principales cláusulas que se pueden utilizar en un comando SELECT. También se ve el

orden en que las cláusulas han de aparecer.

Ejemplo 7

Liste el código de cliente, código de pedido, fecha de pedido y total de todos los pedidos que

excedan de 1000. Asigne el nombre de columna TotalPedido a la columna que muestre los totales

del pedido.

En la figura 5.10 vemos la consulta y sus resultados. En esta consulta, las tablas tPedido y

tDetallePedido se unen al listarlas en la cláusula FROM y relacionarlas en la cláusula WHERE. Los

datos seleccionados están ordenados por código de pedido utilizando la cláusula ORDER BY. La

cláusula GROUP BY indica que los datos se deben agrupar por código de pedido, código de cliente

y fecha de pedido. Para cada grupo, la cláusula SELECT muestra el código de cliente, el código de

pedido, la fecha de pedido y el total (SUM(cantiArti*PrecioCoArti)). Además, el total se ha

renombrado como TotalPedido. Sin embargo, no se mostrarán todos los grupos. La cláusula

HAVING muestra solo los grupos cuyo (SUM(cantiArti*PrecioCoArti)) es mayor que 1000.

Page 9: Tema 08 - Consultas a Múltiples Tablas

85

Asignatura: Sistemas de Base de Datos

SELECT codiClien, tPedido.codiPedi, fechaPedi,

SUM(cantiArti * precioCoArti) AS TotalPedido

FROM tPedido, tDetallePedido

WHERE tPedido.codiPedi = tDetallePedido.codiPedi

GROUP BY codiClien, tPedido.codiPedi, fechaPedi

HAVING SUM(cantiArti*precioCoArti) > 1000;

Figura 5.10. Ejemplo práctico.

El código de pedido, nombre de cliente y fecha de pedido son únicos para cada pedido. Por tanto,

podría parecer que simplemente agrupando por código de pedido será suficiente. SQL requiere

que tanto el código de cliente como la fecha de pedido estén listados en la cláusula GROUP BY.

Recuerde que una cláusula SELECT puede incluir estadísticas calculadas para sólo los grupos o

columnas cuyos valores sean idénticos en cada fila de un grupo. Estableciendo que los datos se

agrupen por código de pedido, nombre de cliente y fecha de pedido, estamos indicando a SQL

que los valores de esas columnas deben ser iguales en cada fila de un grupo.

Alias

Cuando se listan las tablas en la cláusula FROM, podemos asignar a cada tabla un alias, o nombre

alternativo, que podemos utilizar en el resto de la declaración. Un alias se crea escribiendo el

nombre de la tabla, pulsando la barra espaciadora y después escribiendo el nombre del alias. No

es necesario separar ambos nombres con comas ni puntos.

Los alias se utilizan a efectos de simplificar. En el ejemplo 8 asignaremos a la tabla tVendedor el

alias V y a la tabla tCliente el alias C. De esta manera, podemos escribir el resto de la consulta V en

lugar de tVendedor y C en lugar de tCliente.

La consulta de este ejemplo es muy sencilla y, por tanto, las ventajas no son obvias, pero cuando

una consulta es completa y requiere que califiquemos los nombres, el uso de alias puede

simplificar el proceso considerablemente.

Ejemplo 8

Liste el código, apellido y nombre de todos los vendedores junto con el código y nombre de los

clientes a los que representa.

En la figura 5.11 vemos la consulta y su resultado utilizando alias.

SELECT V.codiVende, apeVende, nombreVende,

codiClien, nombreClien

FROM tVendedor V, tCliente C

WHERE V.codiVende = C.codiVende;

Page 10: Tema 08 - Consultas a Múltiples Tablas

86

Asignatura: Sistemas de Base de Datos

Figura 5.11. Alias en una consulta.

Nota: Técnicamente, no es necesario calificar codiClien, porque solamente se incluye en la tabla tCliente. En la figura 5.11 la calificamos solamente para demostrar el efecto.

Unir una tabla así misma

Una segunda situación para utilizar un alias es unir una tabla así misma, lo que se denomina una auto unión, como vemos en el ejemplo 9.

Ejemplo 9 Para cada par de clientes situados en la misma ciudad, muestre el código de cliente, el nombre de cliente y la ciudad.

Si tuviéramos dos tablas separadas para clientes y la consulta solicitara clientes de la primera tabla que tuvieran la misma ciudad que clientes de la segunda tabla, podríamos utilizar una operación de unión normal para encontrar la respuesta. Sin embargo, en este caso solamente hay una tabla (tCliente) que almacena toda la información de los clientes.

Para la consulta, podemos tratar a la tabla tCliente como si fueran dos tablas, creando un alias, como vemos en el ejemplo 8. En este caso, podemos utilizar la siguiente cláusula FROM.

FROM tCliente P, tCliente S

SQL trata a esta cláusula como una consulta de dos tablas: una que tiene el alias P (Primero) y otra con el alias S (Segundo). El hecho de que ambas tablas sean realmente la misma tabla tCliente no supone ningún problema. En la figura 5.12 vemos la consulta y sus resultados.

SELECT P.codiClien, P.nombreClien,

S.codiClien, S.nombreClien, P.ciudadClien

FROM tCliente P, tCliente S

WHERE P.ciudadClien = S.ciudadClien

AND P.codiClien < S.codiClien

ORDER BY P.codiClien, S.codiClien;

Page 11: Tema 08 - Consultas a Múltiples Tablas

87

Asignatura: Sistemas de Base de Datos

Figura 5.12. Utilizar alias para una auto-unión.

Estamos solicitando un código de cliente y un nombre a la tabla P, seguidos de un código de

cliente y un nombre a la tabla S, y después la ciudad. (Puesto que la ciudad en la primera tabla

debe coincidir con la ciudad de la segunda, podemos seleccionar la ciudad de cualquiera de las

dos tablas.)

La cláusula WHERE contiene dos condiciones: las ciudades han de coincidir, el código de cliente de

la primera tabla debe ser menor que el código de cliente de la segunda tabla. Además, la cláusula

ORDER BY asegura que los datos queden ordenados por el primer código de cliente. En las filas

con el mismo primer código de cliente, los datos se ordenan además por el segundo código de

cliente.

Unir varias tablas

Se pueden unir varias tablas, como vemos en el ejemplo 10. Para cada una de las tablas que

unimos, debemos incluir una condición indicando cómo están relacionadas las columnas.

Ejemplo 10

Para cada artículo pedido, liste el código de artículo, la cantidad pedida, el código de pedido, la

fecha de pedido, el código de cliente y el nombre de cliente, junto con el apellido del vendedor

que representa a cada cliente.

Un artículo está pedido cuando aparece en cualquier fila de la tabla tDetallePedido. El código de

artículo, cantidad pedida y el código de pedido aparecen en la tabla tDetallePedido. Si estos

fueran todos los requisitos de la consulta, la escribiríamos así:

SELECT codiArti, cantiArti, codiPedi

FROM tDetallePedido;

Sin embargo, esta consulta no es suficiente. También necesitamos la fecha de pedido, que está en la tabla tPedido; el código y nombre del cliente, que están en la tabla tCliente; y el apellido del vendedor, que está en la tabla tVendedor. Así, tenemos que unir cuatro tablas: tDetallePedido, tPedido, tCliente y tVendedor. El procedimiento para unir más de dos tablas es esencialmente el mismo que se utiliza para unir dos tablas. La diferencia radica en que la condición en la cláusula WHERE será un condición compuesta. En este caso, tendríamos que escribir la cláusula WHERE de esta manera:

WHERE tPedido.codiPedi = tDetallePedido.codiPedi AND tCliente.codiClien = tPedido.codiClien AND tVendedor.codiVende = tCliente.codiVende

Page 12: Tema 08 - Consultas a Múltiples Tablas

88

Asignatura: Sistemas de Base de Datos

La primera condición relaciona un pedido a una línea de pedido con un código de pedido correspondiente. La segunda condición relaciona el cliente con el pedido con el código de cliente correspondiente. La condición final relaciona el vendedor a un cliente con un código de vendedor coincidente. Para la consulta completa, listaremos todas las columnas deseadas en la cláusula SELECT y calificaremos las columnas que aparezcan en más de una tabla. En la cláusula FROM, listaremos las tablas implicadas en la consulta. En la figura 5.16 vemos la consulta y sus resultados.

SELECT codiArti, cantiArti, tPedido.codiPedi, fechaPedi,

tCliente.codiClien, nombreClien, apeVende

FROM tVendedor, tCliente, tPedido, tDetallePedido

WHERE tVendedor.codiVende = tCliente.codiVende

AND tCliente.codiClien = tPedido.codiClien

AND tPedido.codiPedi = tDetallePedido.codiPedi;

Figura 5.16. Unir cuatro tablas en una consulta.

Preguntas y respuestas

Pregunta: ¿Por qué la columna codiArti, que aparece en las tablas tArticulo y tDetallePedido,

no está calificada en la cláusula SELECT?

Respuesta: Entre las tablas listadas en la consulta, sólo una de ellas contiene una columna

llamada codiArti, por tanto no es necesario calificar la tabla. Si la tabla tArticulo también

apareciera en la cláusula FROM, tendríamos que calificar codiArti para evitar confusiones

entre las columnas codiArti en las tablas tArticulo y tDetallePedido.

La consulta que vimos en la figura 5.16 es la más compleja de las que hemos examinado. Esto

podría hacerle pensar que, después de todo, SQL no es un lenguaje tan sencillo. Sin embargo, si

vamos paso a paso, la consulta del ejemplo 10 no es tan difícil. Para construir una consulta

detallada paso a paso, haga lo siguiente:

1. Liste en la cláusula SELECT todas las columnas que quiera mostrar. Si el nombre de una

columna aparece en más de una tabla, precédalo del nombre de la tabla (para calificar el

nombre de la columna).

2. Liste en la cláusula FROM todas las tablas que intervendrán en la consulta. Normalmente

se incluyen las tablas que contienen las columnas listadas en la cláusula SELECT. Sin

embargo, alguna vez puede haber una tabla que no contenga ninguna de las columnas

utilizadas en la cláusula SELECT pero que sí contiene columnas utilizadas en la cláusula

Page 13: Tema 08 - Consultas a Múltiples Tablas

89

Asignatura: Sistemas de Base de Datos

WHERE. En este caso, también tenemos que listar la tabla en la cláusula FROM. Por

ejemplo, si no necesitamos listar el código y nombre del cliente, pero sí tenemos que

listar el nombre de vendedor, no incluiríamos ninguna columna de la tabla tCliente en la

cláusula SELECT. Sin embargo, la tabla tCliente sigue siendo necesaria, porque hay que

incluir una columna suya en la cláusula WHERE.

3. Tome un par de tabla relacionadas a la vez e indique en la cláusula WHERE la condición

que relaciona a las tablas. Una esas condiciones con el operador AND. Si hay alguna otra

condición, inclúyala en la cláusula WHERE y conéctelas con las otras condiciones con el

operador AND. Por ejemplo, si quiere ver artículos presentes en pedidos ordenados por

solo aquellos clientes con límites de crédito de 10000, tendría que añadir una condición

adicional a la cláusula WHERE, como vemos en la figura 5.17.

SELECT codiArti, cantiArti, tPedido.codiPedi, fechaPedi,

tCliente.codiClien, nombreClien, apeVende

FROM tVendedor, tCliente, tPedido, tDetallePedido

WHERE tVendedor.codiVende = tCliente.codiVende

AND tCliente.codiClien = tPedido.codiClien

AND tPedido.codiPedi = tDetallePedido.codiPedi

AND limiCreClien = 10000;

Figura 5.17. Restringir las filas al unir cuatro tablas.