Tema 08 - Consultas a Múltiples Tablas
description
Transcript of 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:
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?
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;
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
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');
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.
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';
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.
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;
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;
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
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
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.