Está en la página 1de 8

Gua de ejercicios de SQL

Prof. Claudio Gutirrez, Aux. Mauricio Monsalve Oto o de !""#

[P1] Corretaje de propiedades


Enunciado Sean las si$uientes ta%las de una %ase de datos de una corredora de &ro&iedades'
Arrendatario(RUT,Nombre,Apellido) Arrienda(RUT,Id_casa,Deuda) Ojo: Deuda >=0 (si es 0, no hay deuda) Telefonos(RUT,Fono) Dueo(RUT,Nombre,Apellido) Casa(Id_casa,RUT,Nro,Calle,Comuna)

Al res&ecto, conteste las si$uientes &re$untas' (. Los arrendatarios )ue arriendan la casa u%icada en la calle Carrera n* ("!+, Santia$o. !. ,Cu-nto le de%en a Mara Prez. /. ,Cu-l es la deuda total &ara cada due o. +. Liste todas las &ersonas de la %ase de datos 0. 1ndi)ue los due os )ue &oseen tres o 2-s casas. 3. Liste los due os )ue ten$an deudores en todas sus casas. 4. 5ntre$ue estadsticas so%re los arrendatarios &or casa. 5ntre$ue' (. 5l &ro2edio. !. La varianza. /. 5l 2-xi2o. +. 5l 2ni2o. 0. La 2oda. 3. La 2ediana. Solucin 6eco2endaci7n' evite colocar selects en el fro2. Prefiera no anidar de esa 2anera8 2uc9as veces eso se &uede escri%ir dentro de :9ere.

(. 5ste es el ti&o 2-s sencillo de consulta &osi%le.


SELECT A.RUT, A.Nombre, A.Apellido FROM Arrendatario A, Arrienda B, Casa C WHERE A.RUT=B.RUT AND B.Id_casa=C.Id_casa AND C.Calle='Carrera' AND C.Nro='1024' AND C.Comuna='Santiago' ;

!. Se su&ondr- )ue Mara Prez 9a; una sola.


SELECT SUM(A.Deuda) FROM Arrienda A, Casa B, Dueo C WHERE A.Id_casa=B.Id_casa AND B.RUT=C.RUT AND C.Nombre='Mara' AND C.Apellido='Prez' ;

/. A)u es necesario a$ru&ar la infor2aci7n, as la su2a se 9ar- dentro de cada $ru&o indica< do. 5ntre$u toda la infor2aci7n necesaria en el S5L5C=, aun)ue con el 6>= del due o %asta< ra ?si en el tra%ajo le &iden al$o as, entre$ue todo@.
SELECT SUM(A.Deuda), C.RUT, C.Nombre, C.Apellido FROM Arrienda A, Casa B, Dueo C WHERE A.Id_casa=B.Id_casa AND B.RUT=C.RUT GROUP BY C.RUT ;

+. Las &ersonas de la AB son los arrendatarios ; los due os. Para entre$ar a2%os, 9a; )ue rea< lizar una uni7n. Cota' &ara realizar una uni7n, los es)ue2as de%en ser co2&ati%les ?atri%utos con 2is2o no2%re ; do2inio@. Afortunada2ente, ste es el caso.
SELECT * FROM Arrendatario UNION SELECT * FROM Dueo ;

0. Da; dos 2aneras de 9acer esto' con a$re$aci7n ; sin sta. 5l caso sin a$re$aci7n ?2enos evidente en $eneral@ consiste en 9acer un join de tres ta%las. Sin agregacin:
SELECT A.RUT, A.Nombre, A.Apellido FROM Dueo A, Casa C1, Casa C2, Casa C3 WHERE A.RUT=C1.RUT AND C1.RUT=C2.RUT AND C2.RUT=C3.RUT AND C1.Id_casa<>C2.Id_casa AND C1.Id_casa<>C3.Id_casa AND C2.Id_casa<>C3.Id_casa ;

Con agregacin: en este caso, es necesario utilizar DAE1CG. DAE1CG es el FD565 &ero &ara funciones a$re$adas. 5n el DAE1CG s7lo &ueden a&arecer funciones a$re$adas ; cons< tantes.
SELECT A.RUT, A.Nombre, A.Apellido FROM Dueo A, Casa C WHERE A.RUT=C.RUT GROUP BY A.RUT HAVING COUNT(DISTINCT C.Id_casa)>=3 ;

3. Gu$ando con la se2-ntica ve2os )ue un due o con deudores en todas sus casas e)uivale a un due o con deuda en todas sus casas. H el co2&le2ento de eso son los due os con casas sin deudas.
SELECT D.RUT, D.Nombre, D.Apellido FROM Dueo D, Casa C WHERE D.RUT=C.RUT EXCEPT SELECT D.RUT, D.Nombre, D.Apellido FROM Dueo D, Casa C, Arrienda A WHERE D.RUT=C.RUT AND C.Id_casa=A.Id_casa AND A.Deuda>0

Otra 2anera consiste en exi$ir )ue la deuda de cada casa del due o sea &ositiva. 5n este caso, una consulta anidada exi$iendo i$ualdad so%re ALL %asta.
SELECT D.RUT, D.Nombre, D.Apellido FROM Dueo D, Casa C WHERE D.RUT=C.RUT AND 0 = ALL ( SELECT A.Deuda FROM Arrienda A WHERE C.Id_casa=A.Id_casa) OR NOT EXISTS ( SELECT * FROM Arrienda A WHERE C.Id_casa=A.Id_casa) ;

5sto es e)uivalente a lo anterior' )ue no exista ?CO= 5I1S=S@ una casa con deuda &ara este due o. Be 9ec9o, es 2-s eficiente.
SELECT D.RUT, D.Nombre, D.Apellido FROM Dueo D, Casa C WHERE D.RUT=C.RUT

AND NOT EXISTS ( SELECT * FROM Arrienda A WHERE C.Id_casa=A.Id_casa AND A.Deuda>0) ;

4. 5n esta secci7n vere2os c72o calcular estadsticas con SQL est-ndar. 5l &ro2edio de arren< datarios &or casa' la 2anera correcta de 9acerlo es considerar todos los arrendatarios )ue efec< tiva2ente arrienden ; todas las casas. As se contar-n las casas con " arrendatarios, )ue de%e< ran ser consideras en el &ro2edio.
SELECT DISTINCT COUNT(DISTINCT A.RUT)/COUNT(DISTINCT B.Id_casa) FROM Arrienda A, Casa B ;

5l 2-xi2o re)uiere una consulta anidada sencilla. Da; )ue contar el nJ2ero de arrendatarios &or cada $ru&o ; exi$ir )ue sea 2a;or a los de los de2-s $ru&os. 5sta consulta tiene un error. ,Cu-l es.( ,C72o se corri$e.
SELECT COUNT(A.RUT) FROM Arrienda A GROUP BY A.Id_casa HAVING COUNT(A.RUT) >= ALL( SELECT COUNT(B.RUT) FROM Arrienda B GROUP BY B.Id_casa) ;

5l 2ni2o es an-lo$o. 5sta consulta tiene un error. ,Cu-l es. ,C72o se corri$e.
SELECT COUNT(A.RUT) FROM Arrienda A GROUP BY A.Id_casa HAVING COUNT(A.RUT) <= ALL( SELECT COUNT(B.RUT) FROM Arrienda B GROUP BY B.Id_casa) ;

A9ora necesito la si$uiente consulta' el nJ2ero de arrendatarios &or casa. Se advierte )ue la &r-ctica de realizar consultas anidadas en el K6OM se de%e evitar si se &uede usar 1C, CO= 1C, 5I1S=S, ALL, etc.
(*) = SELECT Id_casa AS ID, COUNT(DISTINCT RUT) AS N FROM Arrienda GROUP BY Id_casa
( Dint' &uede )ue el error est cerca del o&erador de a$re$aci7n...

UNION SELECT Id_casa AS ID, 0 AS N FROM Casa WHERE Id_casa NOT IN ( SELECT X.Id_casa FROM Arrienda X) ;

La varianza es la desviaci7n de la 2edia. Puesto )ue dos o&eraciones a$re$adas son necesarias &ara resolver esto, forzosa2ente necesita2os realizar una consulta &revia e incluirla en el K6OM. K7r2ula' EarLIMN5LI!MO5!LIM
SELECT SUM(N*N)/COUNT(ID)-AVG(N)*AVG(N) FROM (*);

La 2oda es la frecuencia 2-s re&etida. La frecuencia es el CO>C=, &or ende a&lico la co2&a< raci7n en el DAE1CG.
SELECT X.N FROM (*) X GROUP BY X.N HAVING COUNT(DISTINCT X.ID) >= ALL ( SELECT COUNT(DISTINCT Y.ID) FROM (*) Y GROUP BY Y.N) ;

La 2ediana es la frecuencia central. Se su&ondr- )ue es Jnica.


SELECT DISTICT X.N FROM (*) X, (*) Y, (*) Z WHERE X.N > Y.N AND X.N < Z.N GROUP BY X.N HAVING COUNT(DISTINCT Y.ID) = COUNT(DISTINCT Z.ID) ;

Propuesto: ,C72o se &uede 9acer en los casos con, &or eje2&lo, + candidatos. Al$o co2o' " " " " ( ! / / + + + + 0 0 3 4 # P P ((. Co es 2uc9o 2-s co2&licado )ue la consulta anterior &uesto )ue 9a; )ue 9acer una &e)ue a o%servaci7n &ara contestar la &re$unta.

[P2] Sistema de e-learning


Enunciado Noob Saiborg! est- desarrollando un siste2a de evaluaci7n auto2-tico co2o &ar< te de un &a)uete de e<learnin$ co2ercial. 5n este siste2a, los tests consisten de ( 7 2-s &re< $untas con alternativas. Para 9acer el siste2a flexi%le, ; &ara au2entar la dificultad de los &ro< %le2as, uno de los re)ueri2ientos es )ue las &re$untas <de las )ue consisten los tests< ten$an una o 2-s soluciones. ?Por eje2&lo, una &re$unta del ti&o Q,Cu-l de las si$uientes &ro&iedades &resenta el &aradi$2a OOP.R re)uiere la selecci7n de varias alternativas.@ Actual2ente, Coo% S. cuenta con el si$uiente 2odelo de datos relacional &ara 2odelar los tests'
test(tnum,titulo,curso,descripcion,autor) preg(tnum,pnum,enunciado) pregalt(tnum,pnum,alt,texto,correcta) //correcta es booleana resp(user,tnum,pnum,alt) alumno(user,nombre,apellido) cursa(user,curso) contesta(user,tnum) cursos(curso,nombre)

5n este sencillo ?&ri2itivo@ 2odelo de datos, Coo% S. necesita resolver los si$uientes &ro%le2as con SQL' (. So%rescri%ir el test I con otro test H. ?I,H son tnu2@ !. Conocer el nJ2ero de tests &or curso. /. Conocer los cursos sin tests. +. Beter2inar los tests con falencias. >n test tiene falencias si no tiene &re$untas, si su &ri2era &re$unta ?&nu2@ no est- nu2erada (, si las &re$untas no son consecutivas ?ej. (,!,+,0,#@, si 9a; &re$untas con ( 7 2enos alternativas/, si todas las alternativas son verdaderas o si todas las alternativas son falsas. 0. Corre$ir los test cu;a Jnica falencia radica en la nu2eraci7n de las &re$untas. 3. Cu-ntos alu2nos 9a; en cada curso. 4. Qu alu2nos 9an contestado tests )ue no les corres&onden ?de cursos )ue no cursan@. #. O%tener el &untaje no nor2alizado de cada rendici7n de test. 5l &untaje no nor2aliza< do 9a sido definido ?re)ueri2iento@ co2o' P N %uenas S 2alasT+. Si un alu2no no con< testa en una &re$unta exacta2ente lo 2is2o )ue se 9a definido co2o correcto, la &re< $unta cuenta co2o 2ala a 2enos )ue el alu2no 9a;a o2itido. P. O%tener el &untaje nor2alizado, o sea, de (," a 4,". Solucin Para resolver este &ro%le2a es necesario sa%er c72o escri%ir consultas ; c72o 2o< dificar datos con SQL.
! C9iste fo2e MU!. Coo% Sai%ot N Aoon =o%ias. / 5sto es se2-ntica2ente incorrecto. >na selecci7n 2Jlti&le es, en s 2is2a, una alternativa. Pero en $eneral se entiende )ue una o&ci7n ; una alternativa son lo 2is2o. ?O&ci7n es el tr2ino correcto.@

L(M So%rescri%ir el test I con el test H se 9ace %orrando el test I ; co&iando los datos del test H con el tnu2 I. Dare2os el &roceso co2&leto de %orrado de un test, considerando si el test fue contestado, ; co&iare2os los datos de H.
delete delete delete delete delete insert test where tnum=X; preg where tnum=X; alt where tnum=X; contesta where tnum=X; resp where tnum=X; test select X, titulo, curso, descripcion, autor from test where tnum=Y; insert into preg select X, pnum, enunciado from preg where tnum=Y; insert into pregalt select X, pnum, alt, texto, correcta from pregalt where tnum=Y; from from from from from into

L!M 5l nJ2ero de tests &or curso tiene la for2a ?curso, nJ2ero@. 5s una si2&le ; vil a$ru&aci7n con count?V@.
select curso, count(*) from test group by curso;

L/M >na si2&le sustracci7n.


select curso from cursos except select curso from test;

L+M Cada exi$encia del enunciado &uede ser consultada &or se&arado ; lue$o unida &ara o%te< ner los tnu2 )ue corres&onden a tests inv-lidos.
( select tnum from test EXCEPT select tnum from preg ) UNION ( select tnum from preg group by tnum having min(pnum)<1 )

UNION ( select tnum from preg group by tnum having max(pnum)<>count(pnum) ) UNION ( select tnum from pregalt group by tnum,pnum having count(alt)=1 ) UNION ( select tnum from (select tnum,preg from preg EXCEPT select tnum,preg from pregalt) ) UNION ( select tnum from pregalt group by tnum,alt having count(distinct cierta)=1 );

El resto de las preguntas se dejan como ejercicios propuestos.

También podría gustarte