SlideShare una empresa de Scribd logo
Guía de ejercicios de SQL
Prof. Claudio Gutiérrez, Aux. Mauricio Monsalve
Otoño de 2008
[P1] Corretaje de propiedades
Enunciado Sean las siguientes tablas de una base de datos de una corredora de propiedades:
Arrendatario(RUT,Nombre,Apellido)
Arrienda(RUT,Id_casa,Deuda) Ojo: Deuda >=0 (si es 0, no hay deuda)
Telefonos(RUT,Fono)
Dueño(RUT,Nombre,Apellido)
Casa(Id_casa,RUT,Nro,Calle,Comuna)
Al respecto, conteste las siguientes preguntas:
1. Los arrendatarios que arriendan la casa ubicada en la calle Carrera nº 1024, Santiago.
2. ¿Cuánto le deben a María Pérez?
3. ¿Cuál es la deuda total para cada dueño?
4. Liste todas las personas de la base de datos
5. Indique los dueños que poseen tres o más casas.
6. Liste los dueños que tengan deudores en todas sus casas.
7. Entregue estadísticas sobre los arrendatarios por casa. Entregue:
1. El promedio.
2. La varianza.
3. El máximo.
4. El mínimo.
5. La moda.
6. La mediana.
Solución Recomendación: evite colocar selects en el from. Prefiera no anidar de esa manera;
muchas veces eso se puede escribir dentro de where.
1
1. Este es el tipo más sencillo de consulta posible.
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' ;
2. Se supondrá que María Pérez hay una sola.
SELECT SUM(A.Deuda) FROM Arrienda A, Casa B, Dueño C
WHERE A.Id_casa=B.Id_casa AND B.RUT=C.RUT
AND C.Nombre='María' AND C.Apellido='Pérez' ;
3. Aquí es necesario agrupar la información, así la suma se hará dentro de cada grupo indica-
do. Entregué toda la información necesaria en el SELECT, aunque con el RUT del dueño basta-
ría (si en el trabajo le piden algo así, entregue todo).
SELECT SUM(A.Deuda), C.RUT, C.Nombre, C.Apellido
FROM Arrienda A, Casa B, Dueño C
WHERE A.Id_casa=B.Id_casa AND B.RUT=C.RUT
GROUP BY C.RUT ;
4. Las personas de la BD son los arrendatarios y los dueños. Para entregar ambos, hay que rea-
lizar una unión. Nota: para realizar una unión, los esquemas deben ser compatibles (atributos
con mismo nombre y
dominio). Afortunadamente, éste es el caso.
SELECT * FROM Arrendatario UNION SELECT * FROM Dueño ;
5. Hay dos maneras de hacer esto: con agregación y sin ésta. El caso sin agregación (menos
evidente en general) consiste en hacer un join de tres tablas.
Sin agregación:
SELECT A.RUT, A.Nombre, A.Apellido
FROM Dueño 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 ;
2
Con agregación: en este caso, es necesario utilizar HAVING. HAVING es el WHERE pero
para funciones agregadas. En el HAVING sólo pueden aparecer funciones agregadas y cons-
tantes.
SELECT A.RUT, A.Nombre, A.Apellido
FROM Dueño A, Casa C
WHERE A.RUT=C.RUT
GROUP BY A.RUT
HAVING COUNT(DISTINCT C.Id_casa)>=3 ;
6. Jugando con la semántica vemos que un dueño con deudores en todas sus casas equivale a
un dueño con deuda en todas sus casas. Y el complemento de eso son los dueños con casas sin
deudas.
SELECT D.RUT, D.Nombre, D.Apellido
FROM Dueño D, Casa C
WHERE D.RUT=C.RUT
EXCEPT
SELECT D.RUT, D.Nombre, D.Apellido
FROM Dueño D, Casa C, Arrienda A
WHERE D.RUT=C.RUT AND C.Id_casa=A.Id_casa AND A.Deuda>0
Otra manera consiste en exigir que la deuda de cada casa del dueño sea positiva. En este caso,
una consulta
anidada exigiendo igualdad sobreALL basta.
SELECT D.RUT, D.Nombre, D.Apellido
FROM Dueño 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) ;
Esto es equivalente a lo anterior: que no exista (NOT EXISTS) una casa con deuda para este
dueño. De hecho, es más eficiente.
SELECT D.RUT, D.Nombre, D.Apellido
FROM Dueño D, Casa C
WHERE D.RUT=C.RUT
3
AND NOT EXISTS ( SELECT *
FROM Arrienda A
WHERE C.Id_casa=A.Id_casa AND A.Deuda>0) ;
7. En esta sección veremos cómo calcular estadísticas con SQL estándar. El promedio de arren-
datarios por casa: la manera correcta de hacerlo es considerar todos los arrendatarios que efec-
tivamente arrienden y todas las casas. Así se contarán las casas con 0 arrendatarios, que debe-
rían ser consideras en el promedio.
SELECT DISTINCT COUNT(DISTINCT A.RUT)/COUNT(DISTINCT B.Id_casa)
FROM Arrienda A, Casa B ;
El máximo requiere una consulta anidada sencilla. Hay que contar el número de arrendatarios
por cada grupo y exigir que sea mayor a los de los demás grupos. Esta consulta tiene un error.
¿Cuál es?1
¿Cómo se corrige?
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) ;
El mínimo es análogo. Esta consulta tiene un error. ¿Cuál es? ¿Cómo se corrige?
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) ;
Ahora necesito la siguiente consulta: el número de arrendatarios por casa. Se advierte que la
práctica de realizar consultas anidadas en el FROM se debe evitar si se puede usar IN, NOT IN,
EXISTS, ALL, etc.
(*) =  SELECT Id_casa AS ID, COUNT(DISTINCT RUT) AS N
FROM Arrienda
GROUP BY Id_casa
1 Hint: puede que el error esté cerca del operador de agregación...
4
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 desviación de la media. Puesto que dos operaciones agregadas son necesarias
para resolver esto, forzosamente necesitamos realizar una consulta previa e incluirla en el
FROM.
Fórmula: Var[X]=E[X2
]−E2
[X]
SELECT SUM(N*N)/COUNT(ID)­AVG(N)*AVG(N)
FROM (*);
La moda es la frecuencia más repetida. La frecuencia es el COUNT, por ende aplico la compa-
ración en el HAVING.
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 mediana esla frecuencia central. Se supondrá que es única.
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: ¿Cómo se puede hacer en los casos con, por ejemplo, 4 candidatos? Algo como: 0 0
0 0 1 2 3 3 4 4 4 4 5 5 6 7 8 9 9 11. No es mucho más complicado que la consulta anterior puesto
que hay que hacer una pequeña observación para contestar la pregunta.
5
[P2] Sistema de e-learning
Enunciado Noob Saiborg2
está desarrollando un sistema de evaluación automático como par-
te de un paquete de e-learning comercial. En este sistema, los tests consisten de 1 ó más pre-
guntas con alternativas. Para hacer el sistema flexible, y para aumentar la dificultad de los pro-
blemas, uno de los requerimientos es que las preguntas -de las que consisten los tests- tengan
una o más soluciones. (Por ejemplo, una pregunta del tipo “¿Cuál de las siguientes propiedades
presenta el paradigma OOP?” requiere la selección de varias alternativas.) Actualmente, Noob
S. cuenta con el siguiente modelo de datos relacional para modelar 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)
En este sencillo (primitivo) modelo de datos, Noob S. necesita resolver los siguientes problemas
con SQL:
1. Sobrescribir el test X con otro test Y. (X,Y son tnum)
2. Conocer el número de tests por curso.
3. Conocer los cursos sin tests.
4. Determinar los tests con falencias. Un test tiene falencias si no tiene preguntas, si su
primera pregunta (pnum) no está numerada 1, si las preguntas no son consecutivas (ej.
1,2,4,5,8), si hay preguntas con 1 ó menos alternativas3
, si todas las alternativas son
verdaderas o si todas las alternativas son falsas.
5. Corregir los test cuya única falencia radica en la numeración de las preguntas.
6. Cuántos alumnos hay en cada curso.
7. Qué alumnos han contestado tests que no les corresponden (de cursos que no cursan).
8. Obtener el puntaje no normalizado de cada rendición de test. El puntaje no normaliza-
do ha sido definido (requerimiento) como: P = buenas – malas/4. Si un alumno no con-
testa en una pregunta exactamente lo mismo que se ha definido como correcto, la pre-
gunta cuenta como mala a menos que el alumno haya omitido.
9. Obtener el puntaje normalizado, o sea, de 1,0 a 7,0.
Solución Para resolver este problema es necesario saber cómo escribir consultas y cómo mo-
dificar datos con SQL.
2 Chiste fome MK2. Noob Saibot = Boon Tobias.
3 Esto es semánticamenteincorrecto. Una selección múltiple es, en sí misma, una alternativa. Pero en general se
entiende queuna opción y una alternativa son lo mismo. (Opción es el término correcto.)
6
[1] Sobrescribir el test X con el test Y se hace borrando el test X y copiando los datos del test Y
con el tnum X. Haremos el proceso completo de borrado de un test, considerando si el test fue
contestado, y copiaremos los datos de Y.
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;
[2] El número de tests por curso tiene la forma (curso, número). Es una simple y vil agrupación
con count(*).
select curso, count(*)
from test
group by curso;
[3] Una simple sustracción.
select curso from cursos
except
select curso from test;
[4] Cada exigencia del enunciado puede ser consultada por separado y luego unida para obte-
ner los tnum que corresponden 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
)
7
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.
8

Más contenido relacionado

PDF
Break even point 2x2 math model
PDF
3. prob multiplicativos
PDF
1. num y sist_de_numeracion
PDF
Algebra word pr sd2020 e1
PPTX
Nada de no
PDF
Escuela superior politecnica de chimborazo copia
PDF
Acerca de los algoritmos de mezcla en cajeros automáticos
Break even point 2x2 math model
3. prob multiplicativos
1. num y sist_de_numeracion
Algebra word pr sd2020 e1
Nada de no
Escuela superior politecnica de chimborazo copia
Acerca de los algoritmos de mezcla en cajeros automáticos

La actualidad más candente (18)

PPT
1.tipos de datos
PDF
Break even point two linear equations system
DOCX
PDF
Template 2 1 the stright line 2020 - solved
PPT
jaisan
 
DOCX
Actividad nro 2 (parte a y b)
PPTX
1. vers. cap-3_tipos_dedatos
PPT
Arreglos
PDF
Estructura de datos s14
PPT
Lógica de la Programación Naturaleza de los Datos II
PDF
Tema 7: Funciones de orden superior en Haskell
PDF
Break even point two linear equations system
PDF
Suma de imagenes
PDF
Exercise 3 3 - two linear eq two unk
PDF
Tema 11: Aplicaciones de la programación funcional con Haskell
PPT
ALGEBRA
PPT
Multiplicación de un monomio y polinomio tarea 22
1.tipos de datos
Break even point two linear equations system
Template 2 1 the stright line 2020 - solved
jaisan
 
Actividad nro 2 (parte a y b)
1. vers. cap-3_tipos_dedatos
Arreglos
Estructura de datos s14
Lógica de la Programación Naturaleza de los Datos II
Tema 7: Funciones de orden superior en Haskell
Break even point two linear equations system
Suma de imagenes
Exercise 3 3 - two linear eq two unk
Tema 11: Aplicaciones de la programación funcional con Haskell
ALGEBRA
Multiplicación de un monomio y polinomio tarea 22
Publicidad

Destacado (6)

DOCX
Ejercicios sql
PDF
El Amaranto: prodigioso alimento para la longevidad y la vida
PPT
Alvaro González/Amaranto
PPT
Administración y programación en sql server
PPT
Consultas base de datos en SQL
PPT
diapositiva de slide share
Ejercicios sql
El Amaranto: prodigioso alimento para la longevidad y la vida
Alvaro González/Amaranto
Administración y programación en sql server
Consultas base de datos en SQL
diapositiva de slide share
Publicidad

Similar a Guia sql (20)

PDF
Algebra y calculo relacional
PDF
Consultas condicionales en sq server
PDF
Manipulación avanzada de datos con sql
PDF
Manipulación avanzada de datos con sql parte1
DOC
Ejercicios sql (1)
PDF
Laboratorio
PDF
Consultas-SQL.pdf
PDF
Consultas sql
PDF
bd2-teorico02.pdf
PPTX
Tarea sql
PDF
Guía 05. Consultas resumen con MySQL - José J Sánchez H
PDF
Práctica sql server [fbdr]
PDF
Base de datos ti09313
DOCX
Actividad 4 ayudantía
PPTX
14 structure query language
PDF
Dokumen.site ejercicios resueltos-sqlpdf
DOCX
Trabajo 2. ayudantía. elmar alarcón namuncura
PPT
Bases de Datos Cap VI:SQL: SQL-Definición de datos
DOC
Primer Informe sistemas
Algebra y calculo relacional
Consultas condicionales en sq server
Manipulación avanzada de datos con sql
Manipulación avanzada de datos con sql parte1
Ejercicios sql (1)
Laboratorio
Consultas-SQL.pdf
Consultas sql
bd2-teorico02.pdf
Tarea sql
Guía 05. Consultas resumen con MySQL - José J Sánchez H
Práctica sql server [fbdr]
Base de datos ti09313
Actividad 4 ayudantía
14 structure query language
Dokumen.site ejercicios resueltos-sqlpdf
Trabajo 2. ayudantía. elmar alarcón namuncura
Bases de Datos Cap VI:SQL: SQL-Definición de datos
Primer Informe sistemas

Último (20)

PDF
LIBRO UNIVERSITARIO SOFTWARE PARA INGENIERIA BN.pdf
PDF
FUNCION CUADRATICA FUNCIONES RAIZ CUADRADA
PPTX
Logging While Drilling Ingenieria Petrolera.pptx
PDF
UD3 -Producción, distribución del aire MA.pdf
PPTX
CNE-Tx-ZyD_Comite_2020-12-02-Consolidado-Version-Final.pptx
PPTX
Introduccion quimica del fuego.ffffffffffpptx
PPTX
Software para la educación instituciones superiores
PPT
357161027-seguridad-industrial-diapositivas-ppt.ppt
PPTX
Manual ISO9001_2015_IATF_16949_2016.pptx
PPTX
MANEJO DE QUIMICOS Y SGA GRUPO Mnsr Aleman.pptx
PDF
S15 Protección de redes electricas 2025-1_removed.pdf
PPTX
Cómo Elaborar e Implementar el IPERC_ 2023.pptx
PPTX
Presentacion ppt rx en soldadura tp 231 vladimir Osuna 7114958 20241.pptx
PPTX
DEBL Presentación PG 23.pptx [Autoguardado].pptx
PPTX
1 CONTAMINACION AMBIENTAL EN EL PLANETA.pptx
PDF
SESION 10 SEGURIDAD EN TRABAJOS CON ELECTRICIDAD.pdf
PPTX
A8B08CED-D3D9-415C-B4A3-2A6CA6409A48.1.1Presentación Dirección 2022 unidade...
PPTX
MARITIMO Y LESGILACION DEL MACO TRANSPORTE
PPTX
PRESENTACION DIAPOSITIVA PARA UN PROYECTO .pptx
PPTX
376060032-Diapositivas-de-Ingenieria-ESTRUCTURAL.pptx
LIBRO UNIVERSITARIO SOFTWARE PARA INGENIERIA BN.pdf
FUNCION CUADRATICA FUNCIONES RAIZ CUADRADA
Logging While Drilling Ingenieria Petrolera.pptx
UD3 -Producción, distribución del aire MA.pdf
CNE-Tx-ZyD_Comite_2020-12-02-Consolidado-Version-Final.pptx
Introduccion quimica del fuego.ffffffffffpptx
Software para la educación instituciones superiores
357161027-seguridad-industrial-diapositivas-ppt.ppt
Manual ISO9001_2015_IATF_16949_2016.pptx
MANEJO DE QUIMICOS Y SGA GRUPO Mnsr Aleman.pptx
S15 Protección de redes electricas 2025-1_removed.pdf
Cómo Elaborar e Implementar el IPERC_ 2023.pptx
Presentacion ppt rx en soldadura tp 231 vladimir Osuna 7114958 20241.pptx
DEBL Presentación PG 23.pptx [Autoguardado].pptx
1 CONTAMINACION AMBIENTAL EN EL PLANETA.pptx
SESION 10 SEGURIDAD EN TRABAJOS CON ELECTRICIDAD.pdf
A8B08CED-D3D9-415C-B4A3-2A6CA6409A48.1.1Presentación Dirección 2022 unidade...
MARITIMO Y LESGILACION DEL MACO TRANSPORTE
PRESENTACION DIAPOSITIVA PARA UN PROYECTO .pptx
376060032-Diapositivas-de-Ingenieria-ESTRUCTURAL.pptx

Guia sql

  • 1. Guía de ejercicios de SQL Prof. Claudio Gutiérrez, Aux. Mauricio Monsalve Otoño de 2008 [P1] Corretaje de propiedades Enunciado Sean las siguientes tablas de una base de datos de una corredora de propiedades: Arrendatario(RUT,Nombre,Apellido) Arrienda(RUT,Id_casa,Deuda) Ojo: Deuda >=0 (si es 0, no hay deuda) Telefonos(RUT,Fono) Dueño(RUT,Nombre,Apellido) Casa(Id_casa,RUT,Nro,Calle,Comuna) Al respecto, conteste las siguientes preguntas: 1. Los arrendatarios que arriendan la casa ubicada en la calle Carrera nº 1024, Santiago. 2. ¿Cuánto le deben a María Pérez? 3. ¿Cuál es la deuda total para cada dueño? 4. Liste todas las personas de la base de datos 5. Indique los dueños que poseen tres o más casas. 6. Liste los dueños que tengan deudores en todas sus casas. 7. Entregue estadísticas sobre los arrendatarios por casa. Entregue: 1. El promedio. 2. La varianza. 3. El máximo. 4. El mínimo. 5. La moda. 6. La mediana. Solución Recomendación: evite colocar selects en el from. Prefiera no anidar de esa manera; muchas veces eso se puede escribir dentro de where. 1
  • 2. 1. Este es el tipo más sencillo de consulta posible. 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' ; 2. Se supondrá que María Pérez hay una sola. SELECT SUM(A.Deuda) FROM Arrienda A, Casa B, Dueño C WHERE A.Id_casa=B.Id_casa AND B.RUT=C.RUT AND C.Nombre='María' AND C.Apellido='Pérez' ; 3. Aquí es necesario agrupar la información, así la suma se hará dentro de cada grupo indica- do. Entregué toda la información necesaria en el SELECT, aunque con el RUT del dueño basta- ría (si en el trabajo le piden algo así, entregue todo). SELECT SUM(A.Deuda), C.RUT, C.Nombre, C.Apellido FROM Arrienda A, Casa B, Dueño C WHERE A.Id_casa=B.Id_casa AND B.RUT=C.RUT GROUP BY C.RUT ; 4. Las personas de la BD son los arrendatarios y los dueños. Para entregar ambos, hay que rea- lizar una unión. Nota: para realizar una unión, los esquemas deben ser compatibles (atributos con mismo nombre y dominio). Afortunadamente, éste es el caso. SELECT * FROM Arrendatario UNION SELECT * FROM Dueño ; 5. Hay dos maneras de hacer esto: con agregación y sin ésta. El caso sin agregación (menos evidente en general) consiste en hacer un join de tres tablas. Sin agregación: SELECT A.RUT, A.Nombre, A.Apellido FROM Dueño 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 ; 2
  • 3. Con agregación: en este caso, es necesario utilizar HAVING. HAVING es el WHERE pero para funciones agregadas. En el HAVING sólo pueden aparecer funciones agregadas y cons- tantes. SELECT A.RUT, A.Nombre, A.Apellido FROM Dueño A, Casa C WHERE A.RUT=C.RUT GROUP BY A.RUT HAVING COUNT(DISTINCT C.Id_casa)>=3 ; 6. Jugando con la semántica vemos que un dueño con deudores en todas sus casas equivale a un dueño con deuda en todas sus casas. Y el complemento de eso son los dueños con casas sin deudas. SELECT D.RUT, D.Nombre, D.Apellido FROM Dueño D, Casa C WHERE D.RUT=C.RUT EXCEPT SELECT D.RUT, D.Nombre, D.Apellido FROM Dueño D, Casa C, Arrienda A WHERE D.RUT=C.RUT AND C.Id_casa=A.Id_casa AND A.Deuda>0 Otra manera consiste en exigir que la deuda de cada casa del dueño sea positiva. En este caso, una consulta anidada exigiendo igualdad sobreALL basta. SELECT D.RUT, D.Nombre, D.Apellido FROM Dueño 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) ; Esto es equivalente a lo anterior: que no exista (NOT EXISTS) una casa con deuda para este dueño. De hecho, es más eficiente. SELECT D.RUT, D.Nombre, D.Apellido FROM Dueño D, Casa C WHERE D.RUT=C.RUT 3
  • 4. AND NOT EXISTS ( SELECT * FROM Arrienda A WHERE C.Id_casa=A.Id_casa AND A.Deuda>0) ; 7. En esta sección veremos cómo calcular estadísticas con SQL estándar. El promedio de arren- datarios por casa: la manera correcta de hacerlo es considerar todos los arrendatarios que efec- tivamente arrienden y todas las casas. Así se contarán las casas con 0 arrendatarios, que debe- rían ser consideras en el promedio. SELECT DISTINCT COUNT(DISTINCT A.RUT)/COUNT(DISTINCT B.Id_casa) FROM Arrienda A, Casa B ; El máximo requiere una consulta anidada sencilla. Hay que contar el número de arrendatarios por cada grupo y exigir que sea mayor a los de los demás grupos. Esta consulta tiene un error. ¿Cuál es?1 ¿Cómo se corrige? 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) ; El mínimo es análogo. Esta consulta tiene un error. ¿Cuál es? ¿Cómo se corrige? 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) ; Ahora necesito la siguiente consulta: el número de arrendatarios por casa. Se advierte que la práctica de realizar consultas anidadas en el FROM se debe evitar si se puede usar IN, NOT IN, EXISTS, ALL, etc. (*) =  SELECT Id_casa AS ID, COUNT(DISTINCT RUT) AS N FROM Arrienda GROUP BY Id_casa 1 Hint: puede que el error esté cerca del operador de agregación... 4
  • 5. 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 desviación de la media. Puesto que dos operaciones agregadas son necesarias para resolver esto, forzosamente necesitamos realizar una consulta previa e incluirla en el FROM. Fórmula: Var[X]=E[X2 ]−E2 [X] SELECT SUM(N*N)/COUNT(ID)­AVG(N)*AVG(N) FROM (*); La moda es la frecuencia más repetida. La frecuencia es el COUNT, por ende aplico la compa- ración en el HAVING. 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 mediana esla frecuencia central. Se supondrá que es única. 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: ¿Cómo se puede hacer en los casos con, por ejemplo, 4 candidatos? Algo como: 0 0 0 0 1 2 3 3 4 4 4 4 5 5 6 7 8 9 9 11. No es mucho más complicado que la consulta anterior puesto que hay que hacer una pequeña observación para contestar la pregunta. 5
  • 6. [P2] Sistema de e-learning Enunciado Noob Saiborg2 está desarrollando un sistema de evaluación automático como par- te de un paquete de e-learning comercial. En este sistema, los tests consisten de 1 ó más pre- guntas con alternativas. Para hacer el sistema flexible, y para aumentar la dificultad de los pro- blemas, uno de los requerimientos es que las preguntas -de las que consisten los tests- tengan una o más soluciones. (Por ejemplo, una pregunta del tipo “¿Cuál de las siguientes propiedades presenta el paradigma OOP?” requiere la selección de varias alternativas.) Actualmente, Noob S. cuenta con el siguiente modelo de datos relacional para modelar 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) En este sencillo (primitivo) modelo de datos, Noob S. necesita resolver los siguientes problemas con SQL: 1. Sobrescribir el test X con otro test Y. (X,Y son tnum) 2. Conocer el número de tests por curso. 3. Conocer los cursos sin tests. 4. Determinar los tests con falencias. Un test tiene falencias si no tiene preguntas, si su primera pregunta (pnum) no está numerada 1, si las preguntas no son consecutivas (ej. 1,2,4,5,8), si hay preguntas con 1 ó menos alternativas3 , si todas las alternativas son verdaderas o si todas las alternativas son falsas. 5. Corregir los test cuya única falencia radica en la numeración de las preguntas. 6. Cuántos alumnos hay en cada curso. 7. Qué alumnos han contestado tests que no les corresponden (de cursos que no cursan). 8. Obtener el puntaje no normalizado de cada rendición de test. El puntaje no normaliza- do ha sido definido (requerimiento) como: P = buenas – malas/4. Si un alumno no con- testa en una pregunta exactamente lo mismo que se ha definido como correcto, la pre- gunta cuenta como mala a menos que el alumno haya omitido. 9. Obtener el puntaje normalizado, o sea, de 1,0 a 7,0. Solución Para resolver este problema es necesario saber cómo escribir consultas y cómo mo- dificar datos con SQL. 2 Chiste fome MK2. Noob Saibot = Boon Tobias. 3 Esto es semánticamenteincorrecto. Una selección múltiple es, en sí misma, una alternativa. Pero en general se entiende queuna opción y una alternativa son lo mismo. (Opción es el término correcto.) 6
  • 7. [1] Sobrescribir el test X con el test Y se hace borrando el test X y copiando los datos del test Y con el tnum X. Haremos el proceso completo de borrado de un test, considerando si el test fue contestado, y copiaremos los datos de Y. 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; [2] El número de tests por curso tiene la forma (curso, número). Es una simple y vil agrupación con count(*). select curso, count(*) from test group by curso; [3] Una simple sustracción. select curso from cursos except select curso from test; [4] Cada exigencia del enunciado puede ser consultada por separado y luego unida para obte- ner los tnum que corresponden 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 ) 7