Está en la página 1de 9

4.

3 Obtener el padrón y apellido de los alumnos que tienen nota en todas las materias

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT 1 FROM materias m WHERE NOT EXISTS (
SELECT 1 FROM notas n
WHERE a.padron = n.padron
AND m.codigo = n.codigo
AND m.numero = n.numero
)
)

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT m.codigo, m.numero FROM materias m
EXCEPT
SELECT n.codigo, n.numero FROM notas n
WHERE a.padron = n.padron
)

padron apellido

72000 Pérez Alonso

73000 Molina

75000 Onelli
4.4 Obtener el padrón y apellido de los alumnos de intercambio que tienen nota en
todas las materias

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT 1 FROM materias m WHERE NOT EXISTS (
SELECT 1 FROM notas n
WHERE a.padron = n.padron
AND m.codigo = n.codigo
AND m.numero = n.numero
)
)
AND intercambio = TRUE -- o IS TRUE

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT m.codigo, m.numero FROM materias m
EXCEPT
SELECT n.codigo, n.numero FROM notas n
WHERE a.padron = n.padron
)
AND intercambio = TRUE -- o IS TRUE

padron apellido

73000 Molina

4.5 Obtener el padrón y apellido de los alumnos que tienen nota en todas las materias
del departamento 75

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT 1 FROM materias m WHERE NOT EXISTS (
SELECT 1 FROM notas n
WHERE a.padron = n.padron
AND m.codigo = n.codigo
AND m.numero = n.numero
)
AND m.codigo = 75
)
SELECT padron, apellido FROM alumnos a
WHERE NOT EXISTS(
SELECT m.codigo, m.numero FROM materias m
WHERE m.codigo = 75
EXCEPT
SELECT n.codigo, n.numero FROM notas n
WHERE a.padron = n.padron
AND n.codigo = 75
)

padron apellido

71000 Molina

72000 Pérez Alonso

73000 Molina

75000 Onelli

4.6 Obtener el padrón y apellido de los alumnos que aprobaron todas las materias

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT 1 FROM materias m WHERE NOT EXISTS (
SELECT 1 FROM notas n
WHERE a.padron = n.padron
AND m.codigo = n.codigo
AND m.numero = n.numero
AND n.nota >= 4
)
)

SELECT padron, apellido FROM alumnos a


WHERE NOT EXISTS(
SELECT m.codigo, m.numero FROM materias m
EXCEPT
SELECT n.codigo, n.numero FROM notas n
WHERE a.padron = n.padron
AND n.nota >= 4
)

padron apellido

73000 Molina
5.1 Devuelva cuántos alumnos tienen al menos una nota mayor o igual a 7

SELECT COUNT(DISTINCT padron)


FROM notas WHERE nota >= 7

count

5.2 Devuelva el padrón de los alumnos que se hayan sacado la mejor nota en materias
del departamento 75

SELECT DISTINCT padron FROM notas n


WHERE n.codigo = 75 AND n.nota = (
SELECT MAX(n2.nota) FROM notas n2
WHERE n2.codigo = 75)

padron

73000

76000

5.3 Para cada alumno obtenga el padrón y su promedio de notas

SELECT padron, AVG(nota)


FROM notas n GROUP BY padron;

padron apellido

72000 3.83

73000 6.60

71000 4.60

75000 5.20

76000 6.00
5.4 Para cada alumno que tenga un promedio de nota mayor a 5, indicar su padrón,
apellido y cantidad de materias en las que tiene nota

SELECT a.padron, a.apellido, COUNT( DISTINCT


to_char(codigo,'fm00') || '.' ||
to_char(numero,'fm00') )
FROM notas n INNER JOIN alumnos a USING (padron)
GROUP BY a.padron, a.apellido
HAVING AVG(n.nota) > 5;

padron apellido count

73000 Molina 5

75000 Onelli 5

76000 Lecube 1

5.5 Obtener el padrón de los alumnos que aprobaron la mayor cantidad de materias

SELECT padron
FROM notas n
WHERE nota >= 4
GROUP BY padron
HAVING COUNT( DISTINCT
to_char(codigo,'fm00') || '.' ||
to_char(numero,'fm00') )
>= ALL (SELECT COUNT( DISTINCT
to_char(codigo,'fm00') || '.' ||
to_char(numero,'fm00') )
FROM notas
GROUP BY padron)

padron

73000
5.6 Alumnos que tienen notas en todas las materias (hecho con GROUP BY)

SELECT padron FROM notas n GROUP BY padron


HAVING COUNT( DISTINCT
to_char(codigo,'fm00') || '.' ||
to_char(numero,'fm00') )
= (SELECT COUNT(*) FROM materias)

padron apellido

72000 Pérez Alonso

73000 Molina

75000 Onelli
VISTAS
CREATE VIEW notas_75
AS SELECT numero, padron, fecha, nota
FROM notas WHERE codigo = 75;

No permite inserción:

INSERT INTO notas_75 (numero, padron, fecha, nota)


VALUES (15, 74000, '2016-01-01', 4);

Si se incluye el código

CREATE VIEW notas_75i


AS SELECT numero, padron, fecha, nota, codigo
FROM notas WHERE codigo = 75;

Permite inserción

INSERT INTO notas_75i (numero, padron, fecha, nota


, codigo)
VALUES (15, 74000, '2016-01-01', 4, 75);

Pero también permite con otro departamento

INSERT INTO notas_75i (numero, padron, fecha, nota


, codigo)
VALUES (14, 74000, '2016-01-01', 4, 71);

Lo mejor: usar WITH CHECK OPTION

CREATE VIEW notas_75i2


AS SELECT numero, padron, fecha, nota, codigo
FROM notas WHERE codigo = 75
WITH CHECK OPTION;

Rechaza otro departamento

INSERT INTO notas_75i2 (numero, padron, fecha, nota


, codigo)
VALUES (15, 74000, '2016-01-02', 4, 71);

Importante: Hacer DROP VIEW nombre_vista; si se quiere en algún momento hacer DROP de
las tablas que la usan
ABM
Crear un nuevo departamento de computación de código 95 que tenga las mismas
materias:

1 – Crear el nuevo departamento (para que se pueda referenciar en las materias)

INSERT INTO departamentos (codigo, nombre)


VALUES (95,'Computación');

2 – Crear las nuevas materias que surgen de una consulta

INSERT INTO materias (codigo, numero, nombre)


SELECT 95, numero, nombre
FROM materias WHERE codigo = 75;

Valores nulos
1.1 Actualice el sueldo un 10% a los empleados del sector de código 2 y un 15% al
resto.

UPDATE empleados SET sueldo = sueldo * 1.1


WHERE sector_supervisor = 2;

UPDATE empleados SET sueldo = sueldo * 1.15


WHERE sector_supervisor <> 2
OR sector_supervisor IS NULL;

1.2 Obtenga el código y nombre de aquellos sectores que no tienen empleados


supervisándolos

SELECT codigo, nombre FROM sectores s


WHERE NOT EXISTS (SELECT 1 FROM empleados e
WHERE e.sector_supervisor = s.codigo);

SELECT codigo, nombre FROM sectores s


WHERE s.codigo NOT IN (SELECT e.sector_supervisor
FROM empleados e
WHERE e.sector_supervisor IS NOT NULL
);
1.3 Obtenga el legajo, nombre y sector del que es supervisor para cada empleado,
incluyendo aquellos que no supervisan ningún sector. Ordenar el listado por
código de sector ascendente, con aquellos empleados que no supervisan ningún
sector primero

SELECT legajo, nombre, sector_supervisor


FROM empleados ORDER BY 3 NULLS FIRST;

1.4 Para cada sector índice su código, nombre y cantidad de empleados que lo
supervisa. Incluya sectores que no tienen empleados supervisándolos

SELECT s.codigo, s.nombre


, COUNT(e.sector_supervisor)
FROM sectores s LEFT OUTER JOIN empleados e
ON (s.codigo = e.sector_supervisor)
GROUP BY s.codigo, s.nombre;

También podría gustarte