Está en la página 1de 8

Gua de ejercicios de SQL

Prof. Claudio Gutirrez, Aux. Mauricio Monsalve


Otoo 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 dueo.
+. Liste todas las &ersonas de la %ase de datos
0. 1ndi)ue los dueos )ue &oseen tres o 2-s casas.
3. Liste los dueos )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 dueo %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 dueos. 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 dueo con deudores en todas sus casas e)uivale a
un dueo con deuda en todas sus casas. H el co2&le2ento de eso son los dueos 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 dueo 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
dueo. 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)uea o%servaci7n &ara contestar la &re$unta.
0
[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.@
3
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 from test where tnum=X;
delete from preg where tnum=X;
delete from alt where tnum=X;
delete from contesta where tnum=X;
delete from resp where tnum=X;
insert into 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;
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
)
4
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