Trabajo Resuelto Alcoles
Trabajo Resuelto Alcoles
Trabajo Resuelto Alcoles
CAMPUS CIITIC
LICENCIATURA MATERIA
COMITAN
SEMESTRE ASESOR
GRUPO
PRCTICA
ESTUDIANTE
FECHA
24/MAYO/2012
INSTRUCCIONES:
I. RESUELVE LA SIGUIENTE SERIE DE EJERCICIOS EN SQL, ESCRIBE EL SCRIPT UTILIZADO EN LA PARTE DE LAS SOLUCIONES, AS COMO LA SALIDA PRODUCIDA, COMO LO EJEMPLIFICA LA SOLUCIN NMERO 1.
EJERCICIO A RESOLVER Presentamos a continuacin una serie de ejercicios de consulta sobre la base de datos (BDEmpresa) formada por las tablas de PROVEEDORES, COMPONENTES, ARTICULOS y ENVIOS. En dicha base de datos est almacenada la siguiente informacin: PROVEEDORES NUMPROV char(2) P1 P2 P3 P4 P5 COMPONENTES NUMCOMPO char(2) C1 C2 C3 C4 C5 C6 ARTICULOS NUMARTIC char(2) T1 PNOMBRE char(10) CARLOS JUAN JOSE INMA EVA CATEGORIA tynint 20 10 30 20 30 CIUDAD char(20) COMITAN SAN CRISTOBAL COMITAN COMITAN TUXTLA GUTIERREZ PESO tynint 12 17 17 14 12 19 CIUDAD char(20) COMITAN SAN CRISTOBAL LAS MARGARITAS COMITAN SAN CRISTOBAL COMITAN
CNOMBRE char(3) X3A B85 C4B C4B VT8 C30 TNOMBRE char(20) CLASIFICADOR
COLOR char(10) ROJO VERDE AZUL ROJO AZUL ROJO CIUDAD char(20) SAN CRISTOBAL
LAS MARGARITAS TUXTLA GUTIERREZ TUXTLA GUTIERREZ COMITAN LA TRINITARIA COMITAN NUMARTIC char(2) T1 T4 T1 T2 T3 T4 T5 T6 T7 T2 T1 T2 T3 T7 T2 T4 T4 T7 T2 T4 T4 T4 T5 T4 CANTIDAD int 200 700 400 200 200 500 600 400 800 100 200 500 300 300 200 100 500 100 200 100 200 800 400 500
PROVEEDORES .- Representa los datos de proveedores de componentes para la fabricacin de artculos y su ciudad de residencia. COMPONENTES.- Indica la informacin de piezas utilizadas en la fabricacin de diferentes artculos, indicndose el lugar de fabricacin de dichos componentes. ARTICULOS.- Informacin sobre los diferentes artculos que se fabrican y el lugar de montaje del mismo. ENVIOS.- Suministros realizados por los diferentes proveedores de determinadas cantidades de componentes asignadas para la elaboracin del artculo correspondiente. Para resolver cada consulta, debes seguir los siguientes pasos: a) Lee atentamente el enunciado, hasta que hayas credo entender qu se pide. b) Obtn manualmente los resultados para los datos de ejemplo. 2 Fundamentos de Bases de Datos
c) Intenta representar la consulta mediante una expresin algebraica relacional. (Pueden existir numerosas expresiones algebraicas relacionales equivalentes que respondan a la misma consulta). c) Expresa la consulta mediante una sentencia SELECT de SQL. d) Pueden existir distintas formas de escribir una consulta SQL que resuelva el apartado anterior. Se te ocurre alguna otra forma de expresin de la sentencia en SQL para representar la consulta?. No te fes de los datos particulares del ejemplo; puede que obtengas el mismo resultado que la solucin correcta, pero que sea errnea tu consulta para otros datos diferentes. Tu solucin debe trabajar correctamente para cualquier relacin consistente que pueda almacenar nuestra base de datos. Para cada ejercicio se aporta una posible solucin pero es posible que existan varias que sean tambin correctas. SOLUCIONES A LOS EJERCICIOS
CREATE DATA BASE bdempresa; USE bdempresa; -- Estructura de tabla para la tabla `articulos` CREATE TABLE `articulos` ( `tno` varchar(10) NOT NULL default '', `tnombre` varchar(40) default NULL, `ciudad` varchar(40) default NULL, PRIMARY KEY (`tno`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- Volcar la base de datos para la tabla `articulos` INSERT INTO `articulos` (`tno`, `tnombre`, `ciudad`) VALUES ('T1', 'CLASIFICADORA', 'SAN CRISTOBAL'), ('T2', 'PERFORADORA', 'LAS MARGARITAS'), ('T3', 'LECTORA', 'TUXTLA GUTIERREZ'), ('T4', 'CONSOLA', 'TUXTLA GUTIERREZ'), ('T5', 'MEZCLADORA', 'COMITAN'), ('T6', 'TERMINAL', 'LA TRINITARIA'), ('T7', 'CINTA', 'COMITAN'); -- Estructura de tabla para la tabla `componentes` CREATE TABLE `componentes` ( `cno` varchar(10) NOT NULL default '', `cnombre` varchar(20) default NULL, `color` varchar(20) default NULL, `peso` float default NULL, `ciudad` varchar(40) default NULL, PRIMARY KEY (`cno`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- Volcar la base de datos para la tabla `componentes` INSERT ('C1', ('C2', ('C3', ('C4', ('C5', ('C6', INTO `componentes` (`cno`, `cnombre`, `color`, `peso`, `ciudad`) VALUES 'X3A', 'ROJO', 12, 'COMITAN'), 'B85', 'VERDE', 17, 'SAN CRISTOBAL'), 'C4B', 'AZUL', 17, 'LAS MARGARITAS'), 'C4B', 'ROJO', 14, 'COMITAN'), 'VT8', 'AZUL', 12, 'SAN CRISTOBAL'), 'C30', 'ROJO', 19, 'COMITAN');
CREATE TABLE `envios` ( `pno` varchar(10) default NULL, `cno` varchar(10) default NULL, `tno` varchar(10) default NULL, `cantidad` int(11) default NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- Volcar la base de datos para la tabla `envios` INSERT ('P1', ('P1', ('P2', ('P2', ('P2', ('P2', ('P2', ('P2', ('P2', ('P2', ('P3', ('P3', ('P4', ('P4', ('P5', ('P5', ('P5', ('P5', ('P5', ('P5', ('P5', ('P5', ('P5', ('P5', INTO `envios` (`pno`, `cno`, `tno`, `cantidad`) VALUES 'C1', 'T1', 200), 'C1', 'T4', 700), 'C3', 'T1', 400), 'C3', 'T2', 200), 'C3', 'T3', 200), 'C3', 'T4', 500), 'C3', 'T5', 600), 'C3', 'T6', 400), 'C3', 'T7', 800), 'C5', 'T2', 100), 'C3', 'T1', 200), 'C4', 'T2', 500), 'C6', 'T3', 300), 'C6', 'T7', 300), 'C2', 'T2', 200), 'C2', 'T4', 100), 'C5', 'T4', 500), 'C5', 'T7', 100), 'C6', 'T2', 200), 'C1', 'T4', 100), 'C3', 'T4', 200), 'C4', 'T4', 800), 'C6', 'T4', 500), 'C5', 'T5', 400);
-- Estructura de tabla para la tabla `proveedores` CREATE TABLE `proveedores` ( `pno` varchar(20) NOT NULL default '', `pnombre` varchar(20) default NULL, `catergoria` int(11) default NULL, `ciudad` varchar(40) default NULL, PRIMARY KEY (`pno`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- Volcar la base de datos para la tabla `proveedores` INSERT ('P1', ('P2', ('P3', ('P4', ('P5', INTO `proveedores` (`pno`, `pnombre`, `catergoria`, `ciudad`) VALUES 'CARLOS', 20, 'COMITAN'), 'JUAN', 10, 'SAN CRISTOBAL'), 'JOSE', 30, 'COMITAN'), 'INMA', 20, 'COMITAN'), 'EVA', 30, 'TUXTLA GUTIERREZ');
EJERCICIOS SOLUCIONADOS (puedes mejorar la solucin) 1. Obtener todos los detalles de todos los artculos de TUXTLA GUTIERREZ. 4 Fundamentos de Bases de Datos
2. Obtener todos los valores de P# para los proveedores que abastecen el artculo T1.
pno( tno=T1 (envios)) select pno from envios where tno="T1";
3. Obtener la lista de pares de atributos (COLOR, CIUDAD) de la tabla componentes eliminando los pares duplicados.
color, ciudad (componentes) select distinct color, ciudad from componentes;
4. Obtener de la tabla de artculos los valores de T# y CIUDAD donde el nombre de la ciudad acaba en D o contiene al menos una E.
tno, ciudad ( ciudad like %D or ciudad like %E% (articulos)) select tno, ciudad from articulos where ciudad like '%D' or ciudad like '%E%';
5. Obtener los valores de P# para los proveedores que suministran para el artculo T1 el componente C1.
select pno from envios where tno="T1" and cno="C1"; pno( tno=T1 and con=C1 (envios))
6. Obtener los valores de TNOMBRE en orden alfabtico para los artculos abastecidos por el proveedor P1.
select distinct tnombre from articulos, envios where articulos.tno=envios.tno and envios.pno="P1" order by tnombre; tnombre (artculos X ( pno=P1 (envios)))1
7. Obtener los valores de C# para los componentes suministrados para cualquier artculo de SAN CRISTOBAL.
select distinct cno from envios, articulos where envios.tno=articulos.tno AND articulos.ciudad="SAN CRISTOBAL"; con (envios X ( ciudad=SAN CRISTOBAL(articulos)))
8. Obtener todos los valores de C# de los componentes tales que ningn otro componente tenga un valor de peso inferior.
select cno from componentes where peso IN (select min(peso) from componentes); con (compoentes peso=( min(peso) (componentes)))
9. Obtener los valores de P# para los proveedores que suministren los artculos T1 y T2.
select pno from envios where tno="T1" AND where tno="T2" ); pno IN (select pno from envios
10.Obtener los valores de P# para los proveedores que suministran para un artculo de COMITAN o SAN CRISTOBAL un componente ROJO.
select pno from envios , articulos , componentes where envios.tno=articulos.tno AND envios.cno=componentes.cno AND (articulos.ciudad="COMITAN" OR articulos.ciudad="SAN CRISTOBAL") AND componentes.color="ROJO"; pno (envios X ( color=ROJO(componentes))) ciudad=SAN CRISTOBAL(articulos)) and (
11.Obtener, mediante subconsultas, los valores de C# para los componentes suministrados para algn artculo de COMITAN por un proveedor de COMITAN.
select cno from envios e, articulos a, proveedores p where e.tno=a.tno and e.pno=p.pno and a.ciudad="COMITAN" AND p.ciudad="COMITAN"; cno (envios X ciudad=COMITAN(proveedores))) ( ciudad=COMITAN(articulos)) and (
12.Obtener los valores de T# para los artculos que usan al menos un componente que se puede obtener con el proveedor P1.
select e.tno from envios e, articulos a,componentes c, proveedores p where e.tno=a.tno and e.cno=c.cno and e.pno=p.pno and e.pno="P1"; tno (envios, artculos, componentes X ( pno=P1(envios)))
13. Obtener todas las ternas (CIUDAD, C#, CIUDAD) tales que un proveedor de la primera ciudad suministre el componente especificado para un artculo montado en la segunda ciudad. 7 Fundamentos de Bases de Datos
select proveedores.ciudad, envios.cno, articulos.ciudad from envios, proveedores,articulos where envios.pno=proveedores.pno and envios.tno=articulos.tno ; (proveedores(ciudad), proveedores, artculos ) con(envios), ciudad(articulos)) envios X (
14.
Repetir el ejercicio anterior pero sin recuperar las ternas en los que los dos valores de ciudad sean los mismos.
select proveedores.ciudad, envios.cno, articulos.ciudad from envios, proveedores, articulos where envios.pno=proveedores.pno and envios.tno=articulos.tno and proveedores.ciudad != articulos.ciudad;
ciudad
15. Obtener el nmero de suministros, el de artculos distintos suministrados y la cantidad total de artculos suministrados por el proveedor P2.
select count(*), count(distinct tno), sum(cantidad) from envios where count(*) , count(distinct artculos ) tno), sum(articulos)) envios X (
16. Para cada artculo y componente suministrado obtener los valores de C#, T# y la cantidad total correspondiente.
select cno, tno, sum(cantidad) from envios group by cno, tno;
17. Obtener los valores de T# de los artculos abastecidos al menos por un proveedor que no viva en SAN CRISTOBAL y que no est en la misma ciudad en la que se monta el artculo.
select distinct envios.tno from envios, proveedores, articulos where envios.pno=proveedores.pno and envios.tno=articulos.tno and proveedores.ciudad != "SAN CRISTOBAL" AND proveedores.ciudad != articulos.ciudad; tno envios X ( ciudad <>SAN CRISTOBAL (proveedores) AND ciudad <> ciudad (proveedores, artculos))
18. Obtener los valores de P# para los proveedores que suministran al menos un componente suministrado al menos por un proveedor que suministra al menos un componente ROJO.
select distinct pno from envios, componentes where componentes.color="ROJO"; distinct pno envios X ( color =ROJO (componentes))
19. Obtener los identificadores de artculos, T#, para los que se ha suministrado algn componente del que se haya suministrado una media superior a 320 artculos.
select distinct tno from envios where cno in(select cno from envios HAVING AVG(cantidad) > 320); distinct tno (envios) cno= ( GROUP BY tno
20. Seleccionar los identificadores de proveedores que hayan realizado algn envo con Cantidad mayor que la media de los envos realizados para el componente a que corresponda dicho envo.
select distinct pno from envios a where cantidad >(select avg(cantidad) from envios b where b.cno=a.cno); distinct tpo (envios) cantidad > ( avg(cantidad), ( cantidad > 320 (envios)))
21. Seleccionar los identificadores de componentes suministrados para el artculo 'T2' por el proveedor 'P2'.
select cno from envios where tno="T2" AND pno="P2"; distinct cno (envios) ( tno = T2 and pno=P2)
22. Seleccionar todos los datos de los envos realizados de componentes cuyo color no sea 'ROJO'.
select envios.* from envios, componentes where componentes.color !="ROJO"; distinct envios.cno=componentes.cno and
23. Seleccionar los identificadores de componentes que se suministren para los artculos 'T1' y 'T2'.
select distinct cno from envios where tno='T1' where tno='T2'); distinct (envios)) and cno in (select cno from envios con ( tno=T2 (envios))
24. Seleccionar el identificador de proveedor y el nmero de envos de componentes de color 'ROJO' llevados a cabo por cada proveedor.
select distinct pno, count(*) from envios, componentes where envios.cno=componentes.cno and componentes.color="ROJO" GROUP BY pno; distinct pno count(*) envios X ( componentes=ROJO GROUP BY pno)
26. Seleccionar los datos de envo y nombre de ciudad de aquellos envos que cumplan que el artculo, proveedor y componente son de la misma ciudad.
select envios.*, articulos.ciudad from envios, articulos, proveedores, componentes where envios.pno=proveedores.pno and envios.cno=componentes.cno and envios.tno=articulos.tno and articulos.ciudad=proveedores.ciudad and articulos.ciudad=componentes.ciudad and proveedores.ciudad=componentes.ciudad; ( envios*, artculos) envios X ( artculos, proveedores, componentes)
27. Seleccionar los nombres de los componentes que son suministrados en una cantidad total superior a 500.
select distinct cnombre from componentes where cno in (select cno from envios group by cno having sum(cantidad) > 500); distinct cnombre (compoenetes) cno in ( con group by cno having sum(cantidad) >500 (envios)
28. Seleccionar los identificadores de proveedores que residan en COMITAN y no su ministren ms de dos artculos distintos.
select distinct proveedores.pno from proveedores, envios where proveedores.pno=envios.pno and proveedores.ciudad="COMITAN" and envios.cantidad > 2; distinct pno (proveedores) envios X ( ciudad=COMITAN (proveedores) and cantidad >2(envios))
29. Seleccionar los identificadores de artculos para los cuales todos sus componentes se fabrican en una misma ciudad. 13 Fundamentos de Bases de Datos
select distinct tno from envios, componentes where group by tno having count(distinct ciudad)=1;
envios.cno=componentes.cno
distinct tno (envios) coponentes X ( cno=cno (envios, componentes) group by tno having count (distitnct ciudad)=1)
30. Seleccionar los identificadores de artculos para los que se provean envos de todos los componentes existentes en la base de datos.
select tno from envios group by from componentes); distinct tno (componentes) tno having count(distinct cno)=(select count(*)
select pno, tno from envios, componentes where envios.cno=componentes.cno and componentes.color="ROJO" group by pno, tno having count(*) > 1; distinct pno, tno (envios) coponentes X ( cno=cno (envios, componentes) and color=ROJO (componentes) group by pno, tno having count(*)>1)
32. Propn tu mismo consultas que puedan realizarse sobre esta base de datos de ejemplo. Intenta responderla, y si te parece un problema interesante o no ests seguro de su solucin, puedes exponerlos en la clases prcticas para su resolucin en grupo.