Sunteți pe pagina 1din 30

18-4-2013

TALLER DE BASE DE DATOS


USO DE TCNICAS DE CONSULTAS AVANZADAS PARA EL ACCESO A DATOS

JOSE ALBERTO GONZALEZ FLORES


INTITUTO TECNOLOGICO DE LEON

Nmero de Prctica: 9 Nombre de la Prctica: Uso de tcnicas de consultas avanzadas para el acceso a datos Objetivo Especfico: El alumno conocer, comprender y aplicar la sintaxis de SQL para hacer consultas complejas que involucren varias tablas. Introduccin: Una vez que se conocen y se aplican los fundamentos de consultas que se han visto en prcticas pasadas, hay que aplicar otras caractersticas de la clusula select. Una de ellas es la relacionada con la combinacin de 2 o mas tablas en una misma consulta. Otra, es implementar subconsultas, que son estatutos select anidados dentro de otro select, un insert, un update o un delete. Hay dos tipos de subconsultas: las subconsultas simples y las subconsultas correlacionadas. Las subconsultas simples son consultas anidadas en otras, pero con la caracterstica de que cada una de ellas solamente hace referencia a atributos de la/las tabla/s que hay en su clusula from. Las subconsutas correlacionadas son consultas anidadas en otras, pero con la caracterstica de que la consulta mas anidada hace referencia a algn atributo de la consulta mas externa. Esto hace que el funcionamiento en la ejecucin de sta sea semejante al de dos ciclos anidados. Las subconsultas tambien pueden anidarse en otras subconsultas. Consulte la referencia A, captulo 6, leccin 2, y, referencia B captulo 4.

Metodologa:

Ejercicio 1: Consulta en mltiples tablas 1.- Ejecute ventas el Sql Server Management Studio y seleccione la base de datos

2.- Se desea implementar en SQL, la consulta: Encuentre el nombre del cliente, la fecha en que compr y los nombres de los productos que compr.

3.- Apoyndose en el modelo relacional de la base de datos ventas, se observa que las columnas que se desean mostrar son: de la tabla clientes el nombre del cliente, de la tabla facturas la fecha de la factura, y, de la tabla productos la descripcin del producto. La consulta es:
select A.nombre, B.fecha_fac, D.descripcion from clientes A, facturas B, ren_facturas C, productos D where A.clave_cliente=B.clave_cliente and B.no_factura=C.no_factura and C.clave=D.clave order by B.fecha_fac

Observe que en la clusula from se indican las tablas involucradas. Si bien de la tabla ren_facturas no se va a proyectar ninguna columna, es indispensable incluirla para poder implementar los productos naturales necesarios. Para evitar escribir los nombres de las tablas donde se requieran se utilizan los renombramientos de las tablas indicados de la A a la D, en la clusula from. Puesto que son 4 tablas las indicadas, se requieren 3 productos naturales, que se indican en la clusula where: de la tabla A a la B con los atributos clave_cliente, de la tabla B a la C con los atributos no_factura, y, de la tabla C a la D con el atributo clave.

4.- En este punto se muestra otra sintaxis para implementar la misma consulta anterior. Escriba y ejecute
select A.nombre, B.fecha_fac, D.descripcion from (((clientes A inner join facturas B on A.clave_cliente=B.clave_cliente) inner join ren_facturas C on B.no_factura=C.no_factura) inner join productos D on C.clave=D.clave) order by B.fecha_fac

Observe que se muestran los mismos resultados. En sta consulta se muestra la sintaxis con inner join y con on para implementar los productos naturales. Cabe hacer notar que hay anidamientos de productos naturales indicados con parntesis.

Ejercicio 2: Clusulas inner join, left join, right join y full join 1.- Ejecute ventas el Sql Server Management Studio y seleccione la base de datos

2.- Para mostrar el uso de stas clusulas se crearn las 2 tablas siguientes, que debe escribir y ejecutar.

create table tabla1 (campo1 campo2 campo3 integer, integer, integer)

insert into tabla1 values(10,100,1000) insert into tabla1 values(20,200,2000) insert into tabla1 values(30,300,3000) insert into tabla1 values(40,300,4000) insert into tabla1 values(50,400,5000)

Esto crea la tabla tabla1 y le inserta algunas tuplas


create table tabla2 (campo10 campo20 integer, integer)

insert into tabla2 values(20,111) insert into tabla2 values(25,222) insert into tabla2 values(30,333) insert into tabla2 values(40,444) insert into tabla2 values(60,555)

Esto crea la tabla tabla2 y le inserta algunas tuplas 3.- Escriba y ejecute
select campo1, campo2, campo3, campo10, campo20 from tabla1 inner join tabla2 on tabla1.campo1=tabla2.campo10

Este estatuto mostrar las tuplas que estn en la interseccin de las tablas tabla1 y tabla2, tomando como atributos para implementar el producto natural al campo1 de tabla1, y, a campo10 de tabla2. Como se muestra:
campo1 campo2 campo3 campo10 campo20

20 30 40

200 300 300

2000 3000 4000

20 30 40

111 333 444

Observe que solo muestra las tuplas en donde coinciden los valores de las columnas: campo1 y campo10. No aparecen tuplas con valores nulos. 4.- Escriba y ejecute
select campo1, campo2, campo3, campo10, campo20 from tabla1 left join tabla2 on tabla1.campo1=tabla2.campo10

Este estatuto mostrar las tuplas que estn en la interseccin de las tablas tabla1 y tabla2 (tuplas con valores en todas las columnas) , tomando como atributos para implementar el producto natural al campo1 de tabla1, y, a campo10 de tabla2. Y, las tuplas que pertenecen a tabla1 y que no estn en tabla2 (tuplas que aparecen con valores nulos), como se muestra:
campo1 campo2 campo3 campo10 campo20

10 20 30 40 50

100 200 300 300 400

1000 2000 3000 4000 5000

NULL 20 30 40 NULL

NULL 111 333 444 NULL

5.- Escriba y ejecute


select campo1, campo2, campo3, campo10, campo20 from tabla1 right join tabla2 on tabla1.campo1=tabla2.campo10

Este estatuto mostrar las tuplas que estn en la interseccin de las tablas tabla1 y tabla2 (tuplas con valores en todas las columnas) , tomando como atributos para implementar el producto natural al campo1 de tabla1, y, a campo10 de tabla2. Y, las tuplas que pertenecen a tabla2 y que no estn en tabla1 (tuplas que aparecen con valores nulos), como se muestra:
campo1 campo2 campo3 campo10 campo20

20

200

2000

20

111 222 333 444 555

NULL NULL NULL 25 30 40 300 300 3000 4000 30 40

NULL NULL NULL 60

6.- Escriba y ejecute


select campo1, campo2, campo3, campo10, campo20 from tabla1 full join tabla2 on tabla1.campo1=tabla2.campo10

Este estatuto mostrar las tuplas que estn en la interseccin de las tablas tabla1 y tabla2 (tuplas con valores en todas las columnas) , tomando como atributos para implementar el producto natural al campo1 de tabla1, y, a campo10 de tabla2. Tambien las tuplas que pertenecen a tabla1 y que no estn en tabla1 (tuplas que aparecen con valores nulos en campo10 y campo20). Y tambien, las tuplas que pertenecen a tabla2 y que no estn en tabla1 (tuplas que aparecen con valores nulos en campo1, campo2 y campo3). Como se muestra:
campo1 campo2 campo3 campo10 campo20

10 20 30 40 50

100 200 300 300 400

1000 2000 3000 4000 5000

NULL 20 30 40 NULL

NULL 111 333 444 NULL 555 222

NULL NULL NULL 60 NULL NULL NULL 25

Ejercicio 3: Subconsultas con operadores de comparacin 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas 2.- Escriba y ejecute
select clave,descripcion,precio from productos where precio = ( select precio from productos where descripcion='Caja de tornillos')

Observe que un estatuto select se encuentra anidado en otro estatuto select, el estatuto mas interno puede ejecutarse independientemente, marque solamente el estatuto select que est entre parntesis y ejectelo, y observe el resultado que es el precio del producto Caja de tornillos. Este precio sustituye al select y se compara (con el operador =) con el operando del where del estatuto select mas externo, el cual despliega informacin de los productos que tienen el mismo precio que el producto Caja de tornillos.

3.- Escriba y ejecute


select clave,descripcion,precio from productos where precio >= ( select precio from productos where descripcion='Caja de tornillos')

Observe que es la misma consulta del punto anterior excepto que el operador de comparacin es ahora mayor o igual que. En ste caso, despliega todos los libros cuyo precio es mayor o igual al del precio del producto 'Caja de tornillos'. De manera similar, se pueden usar subconsultas que comparen con los operadores conocidos.

Ejercicio 4: Subconsultas con clusulas in y not in 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas

2.- Escriba y ejecute


select clave, descripcio from productos where clave in ( select clave from ren_facturas )

Observe que la consulta muestra la consulta encuentre las claves y descripciones de los productos que se han vendido. Esto es, en la consulta mas interna saca una lista de todas las claves de productos que se han vendido y que aparecen en la tabla ren_facturas, esta lista sustituye a la consulta mas interna y la consulta mas externa la recibe con la clusula in, por ello, la consulta mas externa despliega las claves existentes en el archivo productos que existen ah y que se han vendido.

3.- Escriba y ejecute


select clave, descripcion from productos where clave not in ( select clave from ren_facturas )

Observe que la consulta muestra la consulta encuentre las claves y descripciones

de los productos que no se han vendido. Esto es, en la consulta mas interna saca una lista de todas las claves de productos que se han vendido y que aparecen en la tabla ren_facturas, esta lista sustituye a la consulta mas interna y la consulta mas externa la recibe con la clusula in, por ello, la consulta mas externa despliega las claves existentes en el archivo productos que existen ah y que no se han vendido.

Ejercicio 5:Subconsultas con clusulas any y all 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas 2.- Escriba y ejecute
select * from ren_facturas order by clave

Observe que de la clave CL120 hay 3 tuplas en donde hubo ventas, la menor venta fue de 6 unidades.

3.- Se desean identificar a todas las facturas en donde la venta en unidades del producto CL120 sea mayor a la menor de las ventas en unidades. Para ello, escriba y ejecute
select no_factura, cantidad from ren_facturas where clave='CL120' and cantidad > any (select cantidad from ren_facturas where clave='CL120')

Observe que la consulta mas interna despliega las cantidades vendidas del producto CL120 de todos los renglones de facturas, la consulta mas externa muestra los nmeros de factura y la cantidad vendida de todos aquellos renglones de facturas de la clave CL120 y con cantidad mayor a cualquiera de la lista recibida de la consulta mas interna, esto se obtiene con >any.

4.- Escriba y ejecute


select * from productos where precio > all (select precio from ren_facturas)

Observe que la consulta mas interna saca una lista de los precios de los productos que se han vendido y que aparecen en la tabla ren_facturas, la consulta mas externa recibe esa lista y despliega la informacin de todos los productos cuyo precio sea mayor a todos los productos que devolvi la consulta mas interna.

Ejercicio 6: Subconsultas con clusulas exists y not exists 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas 2.- Escriba y ejecute
select clave_cliente, nombre from clientes where clave_cliente=50 and exists ( select * from facturas where clave_cliente=50 )

La clusula exists prueba la existencia de tuplas de la subconsulta involucrada. Marque y ejecute la subconsulta que est entre parntesis. Esta despliega las facturas que tiene el cliente 50. La consulta mas externa despliega la clave del cliente y el nombre del cliente 50 y del cual al menos exista una tupla devuelta por la consulta mas interna.

3.- Escriba y ejecute


select clave_cliente, nombre from clientes where clave_cliente=10 and not exists ( select * from facturas where clave_cliente=10 )

La clusula not exists determina el complemento de la clusula exists. Para este ejemplo marque y ejecute la subconsulta que est entre parntesis. Esta intenta sacar las tuplas de facturas del cliente 10, pero no hay, por lo que se concluye que este cliente aun no ha comprado productos. La subconsulta entonces no manda tuplas a la consulta mas externa, esta a su vez, despliega la clave y el nombre del cliente 10 debido a que al no haber tuplas el not exists se convierte en verdadero.

Ejercicio 7: Subconsultas correlacionadas 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas 2.- Esta subconsulta correlacionada va dirigida a implementar una usando la clusula exists. Escriba y ejecute
select nombre from clientes where exists ( select * from facturas where facturas.clave_cliente = clientes.clave_cliente )

Esta subconsulta despliega los nombres de los clientes que tienen al menos una factura. Se hace notar que en la subconsulta mas interna se hace referencia al atributo clientes.clave_cliente que pertenece a la tabla de la consulta mas externa. Observe el funcionamiento de la consulta correlacionada, se ejecuta como si

fueran 2 ciclos anidados. Esto es, toma una tupla de la consulta mas externa y hace la comparacin indicada en el where de la consulta mas interna, para todas y cada una de las tuplas de la misma. Despus, toma la siguiente tupla de la consulta mas externa y repite la operacin de comparacin con todas las tuplas de la consulta mas interna; y as sucesivamente. Obviamente de acuerdo a la comparacin la prueba de existencia con la clusula exists se cumple o no y se despliega o no la informacin indicada en la consulta mas externa.

3.- Esta subconsulta va dirigida a implementar una utilizando la clusula in. Escriba y ejecute
select clave_cliente, nombre from clientes where 6480.00 in ( select monto from facturas where facturas.clave_cliente = clientes.clave_cliente )

Esta consulta despliega la clave de los clientes y el nombre de los mismos que tengan al menos una factura donde el monto sea igual a 6480.00. Observe que es una correlacin porque en la consulta mas interna se hace referencia a un atributo de la tabla de la consulta mas externa.

4.- Esta subconsulta va dirigida a implementar una utilizando la clusula not in. Escriba y ejecute
select clave_cliente, nombre from clientes where 6480.00 not in ( select monto from facturas where facturas.clave_cliente = clientes.clave_cliente )

Observe que en los resultados aparecen los clientes que no tuvieron facturas (10,20,70,90), stos salen por que no estn en la lista. Por otra parte, no sale el 50 debido a que si bien tiene 3 ventas, una cumple con la condicin de que es de monto 6480.00 5.- Esta ejemplo va dirigido a implementar una subconsulta correlacionada en donde se hace referencia en las 2 consultas a la misma tabla. Escriba y ejecute
select clave_cliente,nombre,ciudad from clientes order by ciudad

En el resultado desplegado se muestra que hay 2 clientes que viven en Celaya, 2 en Guadalajara y 4 en Len, 1 en Quertaro y 1 en Monterrey.

La siguiente consulta despliega las ciudades en donde viven 2 o mas clientes:


select distinct A.ciudad from clientes A where A.ciudad in ( select B.ciudad from clientes B where B.clave_cliente <> A.clave_cliente )

En el resultado se observa que aparecen solamente: Celaya, Guadalajara y Len lo cual concuerda con lo anterior. Observe que en la clusula where de la consulta mas interna el operador de comparacin es diferente que lo cual evita que aparezcan las tuplas de la comparacin de un cliente de la consulta mas externa con el mismo cliente de la mas interna. 6.- La siguiente subconsulta correlacionada muestra un agrupamiento y una comparacin de grupos. Escriba y ejecute

select A.clave_cliente, max(A.monto) from facturas A group by A.clave_cliente having max(monto) > ( select avg(B.monto) from facturas B where B.clave_cliente=A.clave_cliente )

Esta subconsulta determina las claves de cliente y el monto mas alto de todas sus facturas y las agrupa por cliente y compara que el maximo monto de todas las facturas de cada cliente sea mayor al promedio de todas sus facturas. 7.- La siguiente subconsulta correlacionada muestra una comparacin en donde uno de los operandos es una subconsulta. Escriba y ejecute
select clave_cliente, nombre from clientes where ( select count(*) from facturas where facturas.clave_cliente=clientes.clave_cliente ) > 1

Esta subconsulta despliega la informacin de clientes en donde tienen mas de una factura capturada. Los clientes que no tienen facturas capturadas o que tienen una, no salen en la consulta. Ejercicio 8: Subconsultas anidadas en clusulas insert, update y delete 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas 2.- Escriba y ejecute
update productos set precio = precio * 0.8 where clave in (select clave from productos where unidades<100)

Esta consulta anidada extrae la lista de claves de productos que tienen en existencia menos de 100 unidades, y, la devuelve al estatuto mas externo que actualiza los precios de esa lista haciendo un descuento del 20%.

3.- Escriba y ejecute:


update productos set productos.precio=productos.precio * 0.8 from productos, productos B where productos.clave=B.clave and B.unidades < 100

Observe que hace lo mismo que el estatuto anterior, pero utilizando producto natural en lugar de subconsulta. 4.- Escriba y ejecute
insert into clientes select 200, descripcion,'Av. Mariano Escobedo 200','Centro','Len','Gto.',38800 from productos where clave='MM100'

La subconsulta devuelve al insert una tupla que inserta en la tabla clientes. Observe que los datos son hipotticos. Funcionara de la misma manera si la subconsulta devolviera varias tuplas. 5.- Escriba y ejecute
delete from clientes where clave_cliente in ( select clave_cliente from clientes where nombre like 'Mesa' )

Observe que la subconsulta mas interna devuelve una tupla con la clave del cliente de nombre Mesa, el delete borra todas las tuplas de la tabla clientes en donde la clave del cliente est en la lista devuelta por la subconsulta mas interna.

Ejercicio 9: Subconsultas con mltiples niveles de anidamiento 1.- Ejecute el Sql Server Management Studio y posicinese en la base de datos ventas 2.- Esta consulta va dirigida a mostrar varios niveles de anidamientos de subconsultas. Escriba y ejecute
select * from facturas where no_factura in ( select no_factura from ren_facturas where clave in (select clave from productos ))

Observe que se despliega la informacin de todas y cada una de las facturas. La consulta mas interna saca la calve de productos en una lista que recibe la consulta inmediata superior, que a su vez saca una lista de nmeros de facturas, que recibe la consulta mas externa y que a su vez despliega la informacin de facturas.

La siguiente consulta realiza exactamente la misma accin:


select distinct facturas.* from facturas, ren_facturas, productos where facturas.no_factura=ren_facturas.no_factura and ren_facturas.clave=productos.clave

Sugerencias: En general la prctica es clara, sin embargo existen algunos trminos que aun no quedan claros la diferencia entre uno y otro, por ejemplo join y innerJoin pero sera de gran ayuda seguir la lgica de bsqueda a la par del profesor para resolver posibles dudas y adquirir un mejor entendimiento. CONCLUCIONES: En este captulo analizamos el funcionamiento de los comandos join e inner join para el filtrado de datos, al igual del funcionamiento del were y on, demostrando que de cierta manera sirven para lo mismo. Tambin vimos la manera para enlazar una tabla con otra.

S-ar putea să vă placă și