Está en la página 1de 97

Capítulo 2 on Lab

SQL – parte 2
Repaso de SQL parte 1
• Lenguaje de Definición de datos
Crear, alterar y descartar tablas
• Integridad
Crear claves, referencias, not null, etc
• Lenguaje de Manupulación de datos
ABM de las tablas y Consultas.
• Consultas nivel basico
• Clasula As, Ordenación, Like, Valores Nulos
• Unión, intersección y diferencia
• Vistas
Consultas como tablas sin ABM
Temas del día
• Agregación
• Reunión
• Subconsultas
• Tablas derivadas
• Actualización usando consultas avanzadas
• Lenguaje de procedimiento SQL (PL/SQL)
• Transacciones
• Expresiones de tabla comun (clausua With)
• Recursión
Agregación en SQL
• Las funciones de agregación operan en un
multiconjunto de valores de una columna de
una relación y retornan un valor.
avg: average value
min: minimum value
max: maximum value
sum: sum of values
count: number of values
Funciones de agregación seguidas de distinct.
Agregación en SQL
• En la cláusula select se usan las funciones de
agregación.
• Encontrar la cantidad de tuplas en la relación
course:
select count (*)
from course;
• Encontrar el número total de instructores que
enseñan un curso en el semestre de primavera de
2010.
select count (distinct ID)
from teaches
where semester = ’Spring’ and year = 2010
Agregación en SQL
• Find the average salary of instructors in each department
– select dept_name, avg (salary)
from instructor
group by dept_name;
– Note: departments with no instructor will not appear in result
Agregación en SQL
• La cláusula group by se usa para formar grupos a los
que se les va a aplicar las funciones de agregación.
• Encontrar el salario promedio de los instructores en
cada departamento.
select dept_name, avg (salary)
from instructor
group by dept_name;
• Los atributos en la cláusula select afuera de las
funciones de agregación deben aparecer en la lista de
atributos de cláusula group by.
-- consulta errada
select dept_name, ID, avg (salary)
from instructor
group by dept_name;
Agregación en SQL
• La cláusula having sirve para filtrar grupos que no cumplen
con una determinada propiedad.
• Una cláusula having tiene un predicado sobre grupos a
chequear.
– Si se cumple entonces el grupo va a tenerse en cuenta para el
resultado, sino el grupo se descarta.
• Encontrar los nombres de departamento y promedio de
salarios de departamento, cuyo salario promedio es mayor
a 42000.
select dept_name, avg (salary)
from instructor
group by dept_name
having avg (salary) > 42000
Agregación en SQL
select dept_name, avg (salary) as avg_salary
from instructor
group by dept_name
having avg (salary) > 42000

¿Cómo va a ser el resultado?


Agregación en SQL
select dept_name, avg (salary) as avg_salary
from instructor
group by dept_name
having avg (salary) > 42000
Agregación en SQL
Sea libro-autor(autor, ISBN)
¿Como se cuantos libros hay?

¿Como se cuantos libros escribio cada autor?

¿Como se cuantos autores hay?


Agregación en SQL
Sea libro-autor(autor, ISBN)
¿Como se cuantos libros hay?
Select * from libro-autor
¿Como se cuantos libros escribio cada autor?

¿Como se cuantos autores hay?


Agregación en SQL
Sea libro-autor(autor, ISBN)
¿Como se cuantos libros hay?
Select count(*) from libro-autor
¿Como se cuantos libros escribio cada autor?
Select autor, count(*)
from libro-autor
group by autor
¿Como se cuantos autores hay?
Agregación en SQL
Sea libro-autor(autor, ISBN)
¿Como se cuantos libros hay?
Select count(*) from libro-autor
¿Como se cuantos libros escribio cada autor?
Select autor, count(*)
from libro-autor
group by autor
¿Como se cuantos autores hay?
Select count(distinct autor) from libro-autor
Reuniones
• SQL permite expresar una gran variedad de tipos
de reuniones usando la sintaxis:
r1 [natural] <tipo de reunión> r2 on P [using (A1,…,An)]
• Tipo de reunión:
– Definen cómo las tuplas en cada relación que no
cazan con ninguna tupla de la otra relación son
tratadas.
– Puede tomar los valores:
• inner Join (ignorarlas),
• left outer join (ignorar las de la segunda relación),
• right outer join (ignorar las de la primera relación),
• full outer join (no ignorar ninguna).
Reuniones
• Condiciones de la reunión:
– Definen cuáles tuplas en las dos relaciones cazan.
– Indican cuáles atributos están presentes en el
resultado de la reunión.
– Hay 3 casos: natural, on P , y using(A1,…,An).
Reuniones
• on P:
– Cazan 2 tuplas cuando se cumple P.
– Se repiten atributos en común de las dos relaciones
en las columnas del resultado.
Reuniones

course
prereq
● course inner join prereq on
course.course_id = prereq.course_id
Reuniones

course
prereq
● course inner join prereq on
course.course_id = prereq.course_id

● ¿Cuál es la diferencia entre la tabla de arriba y natural join?


Reuniones

course
prereq
● course left outer join prereq on
course.course_id = prereq.course_id
Reuniones

course
prereq
● course left outer join prereq on
course.course_id = prereq.course_id
Reuniones
• Natural:
o cazan tuplas que valen lo mismo en la intersección
de los esquemas de ambas relaciones.
o Los atributos en común de las dos relaciones no se
repiten en las columnas del resultado.
Reuniones

course
prereq

● course natural right outer join prereq


Reuniones

course
prereq

● course natural right outer join prereq


Reuniones
• using (A1,…,An):
o Generalización de natural usando menos atributos.
o Cazan tuplas que valen lo mismo en A1,…,An.
o Atributos A1,…,An no se repiten en columnas del
resultado.
Reuniones

course
prereq

● course full outer join prereq using (course_id)


Reuniones

course
prereq

● course full outer join prereq using (course_id)


Reuniones
• Ejercicio: Expresar todos los tipos de reuniones del AR en
SQL.
• Ejercicio: considerar las tablas
inscriptoEn(DNI, nombreBib)
socio(posición, DNI)
bibliotecario(antigüedad, DNI)
Resolver:
1. Reunión natural de las relaciones socio e inscriptoEn.
2. Reunión externa a la izquierda de las relaciones socio e
inscriptoEn.
Reuniones
• Las reuniones pueden ser usadas dentro de la
cláusula from.
– En caso de ser necesario asociar un esquema al resultado
de la reunión por medio de la cláusula as.
instructor(ID, name, dept name, salary)
teaches(ID, course id, sec id, semester, year)
• Listar los nombres de los instructores junto con el ID
del curso que enseñan.
Reuniones
• Las reuniones pueden ser usadas dentro de la
cláusula from.
– En caso de ser necesario asociar un esquema al resultado
de la reunión por medio de la cláusula as.
instructor(ID, name, dept name, salary)
teaches(ID, course id, sec id, semester, year)
• Listar los nombres de los instructores junto con el ID
del curso que enseñan.
select name, course_id
from instructor natural join teaches
Reuniones
course(course id, title, dept name, credits)
instructor(ID, name, dept name, salary)
teaches(ID, course id, sec id, semester, year)
• Listar los nombres de los instructores junto con los
títulos de los cursos que enseñan.
Reuniones
course(course id, title, dept name, credits)
instructor(ID, name, dept name, salary)
teaches(ID, course id, sec id, semester, year)
• Listar los nombres de los instructores junto con los
títulos de los cursos que enseñan.
select name, title
from (instructor natural join teaches)
join course using(course_id);
Ejemplos:
socio(DNI, posición)
bibliotecario(DNI, antigüedad)
• Encontrar los DNI de las personas que son
bibliotecarios o socios pero no ambos (hint: usar full
outer join).
Ejemplos:
socio(DNI, posición)
bibliotecario(DNI, antigüedad)
• Encontrar los DNI de las personas que son
bibliotecarios o socios pero no ambos (hint: usar full
outer join).
select DNI
from socio natural full outer join bibliotecario
where antigüedad is null or posición is null
– Se asume que siempre se sabe antigüedad de un
bibliotecario y posición de un socio.
Subconsultas anidadas
• Problema: ¿Cómo construir consultas complejas
en SQL?
• Solución 1: usar subconsultas anidadas.
– Subconsultas anidadas significa anidar consultas (p.
ej. de tipo select-from-where) dentro de la cláusula
where o dentro de la cláusula from.
• En la cláusula from se puede usar:
<consulta> as <rel>(<esquema>)
• Usos conocidos de subconsultas anidadas son realizar
pruebas de pertenencia a conjuntos, comparación de
conjuntos y cardinalidad de conjuntos.
Subconsultas anidadas

• Problema: ¿Cómo chequear pertenencia a un


conjunto/multiconjunto?
• Solución: usar la cláusula in.
– Una cláusula in se puede usar de dos formas:
• … where A in E donde E consulta SQL
• … where (A1, A2) in E, donde E consulta SQL
– Uso de not in para chequear no pertenencia a
conjunto/multiconjunto
Subconsultas anidadas
takes(ID, course id, sec id, semester, year, grade)
teaches(ID, course id, sec id, semester, year)
• Encontrar el número total de estudiantes distintos
que tomaron secciones de curso enseñadas por el
instructor con ID 10101.
Subconsultas anidadas
takes(ID, course id, sec id, semester, year, grade)
teaches(ID, course id, sec id, semester, year)
• Encontrar el número total de estudiantes distintos
que tomaron secciones de curso enseñadas por el
instructor con ID 10101.
select count (distinct ID)
from takes
where (course_id, sec_id, semester, year) in
(select course_id, sec_id, semester, year
from teaches
where teaches.ID= 10101);
Subconsultas anidadas
inscriptoEn(DNI,nombreBib)
trabajaEn(DNI,nombreBib)
socio(posición,DNI)
bibliotecario(antigüedad,DNI)
• Encontrar los DNI de las personas que son tanto
bibliotecarios como socios (usar in).
• Encontrar los DNI de las personas que son socios
pero no bibliotecarios de la biblioteca FaMAF
Subconsultas anidadas

● F <comp> some r ⇔ ∃ t ∈ r such that (F <comp> t )


Where <comp> can be: •, ≤, •, =, ≠

0
(5 < some 5 ) = true
(read: 5 < some tuple in the relation)
6
0
(5 < some 5 ) = false

0
(5 = some 5 ) = true

0
(5 ≠ some 5 ) = true (since 0 ≠ 5)
(= some) ≡ in
However, (≠ some) ≡ not in
Subconsultas anidadas
• Encontrar los nombres de los instructores con salario mayor que el
salario de al menos un instructor en el departamento de Biología.
Subconsultas anidadas
• Encontrar los nombres de los instructores con salario mayor que el
salario de al menos un instructor en el departamento de Biología.
select name
from instructor
where salary > some (select salary from instructor
where dept_name = ’Biology’);
Subconsultas anidadas
• Encontrar los nombres de los instructores con salario mayor que el
salario de al menos un instructor en el departamento de Biología.
select name
from instructor
where salary > some (select salary from instructor
where dept_name = ’Biology’);

ID name dep_name salary


22222 Einstein Physics 95000 salary
83821 Brandt Comp. Sci 92000 Table for 80000
12121 Wu Finance 90000 nested query 72000
33456 Gold Physics 87000
name
98345 Kim Elec. Eng. 80000
Einstein
76543 Singh Biology 80000
Brandt
45565 Katz Comp. Sci 75000
Wu
76766 Crick Biology 72000 Result = Gold
10101 Sirinivasan Comp. Sci. 65000
Kim
58583 Califieri History 62000
Singh
● Subconsultas anidadas
F <comp> all r ⇔ ∀ t ∈ r (F <comp> t)

0
(5 < all 5 ) = false
6
61
(5 < all ) = true
0
4
(5 = all 5 ) = false

4
(5 ≠ all 6 ) = true (since 5 ≠ 4 and 5 ≠ 6)
(≠ all) ≡ not in
However, (= all) ≡ in
Ejemplos
inscriptoEn(DNI,nombreBib)
trabajaEn(DNI,nombreBib)
socio(posición,DNI)
bibliotecario(antigüedad,DNI)
• Encontrar los DNI de todos los bibliotecarios que
tienen más antigüedad que todos los bibliotecarios
de FaMAF.
Ejemplos
inscriptoEn(DNI,nombreBib)
trabajaEn(DNI,nombreBib)
socio(posición,DNI)
bibliotecario(antigüedad,DNI)
• Encontrar los DNI de todos los bibliotecarios que
tienen más antigüedad que todos los bibliotecarios
de FaMAF.
select DNI
from bibliotecario
where antigüedad > all select antigüedad
from bibliotecario, trabajaEn
where nombreBib = ´FaMAF’ and
bibliotecario.DNI = trabajaEN.DNI
Subconsultas anidadas

● Problema: ¿Cómo testear que una tabla es vacía/no


vacía?
● Solución: Usar construcción exists.
➢ exists r ⇔ r ≠ Ø
➢ not exists r ⇔ r = Ø
Subconsultas anidadas
course(course id, title, dept name, credits)
section(course id, sec id, semester, year, building, room number, time slot id)
● Encontrar los cursos enseñados en los semestres Fall
2009 y Spring 2010.
Subconsultas anidadas
course(course id, title, dept name, credits)
section(course id, sec id, semester, year, building, room number, time slot id)
● Encontrar los cursos enseñados en los semestres Fall
2009 y Spring 2010.
● select course_id
from section as S
where semester = ’Fall’ and year= 2009 and
exists (select *
from section as T
where semester = ’Spring’ and year= 2010
and S.course_id= T.course_id);
Subconsultas anidadas
libro(título,ISBN,editorial,edición)
libroBib(numInv,ISBN,nombreBib)
• Encontrar los ISBN de los libros que no están en
ninguna biblioteca.
Subconsultas anidadas
• Problema: Queremos poder expresar la
inclusión de conjuntos
• Solución: Se puede expresar inclusión de
conjuntos de la siguiente manera:
– X ⊆ Y ⇔ X – Y = Ø ⇔ not exists (X except Y)
Subconsultas anidadas
course(course id, title, dept name, credits)
takes(ID, course id, sec id, semester, year, grade)
student(ID, name, dept name, tot cred)
• Encontrar todos los estudiantes quienes tomaron todos los cursos
ofrecidos por el departamento de Biología.
Subconsultas anidadas
course(course id, title, dept name, credits)
takes(ID, course id, sec id, semester, year, grade)
student(ID, name, dept name, tot cred)
• Encontrar todos los estudiantes quienes tomaron todos los cursos
ofrecidos por el departamento de Biología.
select distinct S.ID, S.name
from student as S
where not exists ( (select course_id
from course
where dept_name = ’Biology’)
except
(select T.course_id
from takes as T
where S.ID = T.ID));
Subconsultas anidadas
• SQL permite expresar subconsultas en la cláusula from.
• Encontrar el promedio de salarios de instructores de aquellos
departamentos donde el salario promedio es mayor que
$42000.
Subconsultas anidadas
• SQL permite expresar subconsultas en la cláusula from.
• Encontrar el promedio de salarios de instructores de aquellos
departamentos donde el salario promedio es mayor que
$42000.
• select dept_name, avg_salary
from (select dept_name, avg (salary) as avg_salary
from instructor
group by dept_name)
where avg_salary > 42000;
• Otra forma de escribir la consulta:
• select dept_name, avg_salary
from (select dept_name, avg (salary)
from instructor
group by dept_name)
as dept_avg (dept_name, avg_salary)
where avg_salary > 42000;
Subconsultas Anidadas
trabajaEn(DNI,nombreBib)
socio(posición,DNI)
bibliotecario(antigüedad,DNI)
• Encontrar la antigüedad promedio de los
bibliotecarios de aquellas bibliotecas donde la
antigüedad promedio de los bibliotecarios es
mayor que 4 años.
Subconsultas Anidadas
• Un tipo de subconsulta anidada son las subconsultas
escalares.
– Una subconsulta escalar es una consulta que es usada
donde un valor simple es esperado.
• Ejemplo: obtener el nombre de departamento y la
cantidad de instructores del mismo.
select dept_name,
(select count(*)
from instructor
where department.dept_name = instructor.dept_name)
as num_instructors
from department;
Subconsultas Anidadas
• Ejemplo: Obtener el nombre de los instructores cuyo
salario supera al 10% del presupuesto de sus departamentos.
Subconsultas Anidadas
• Ejemplo: Obtener el nombre de los instructores cuyo
salario supera al 10% del presupuesto de sus departamentos.
select name
from instructor
where salary * 10 > (select budget from department
where department.dept_name = instructor.dept_name)
Tablas derivadas
• Se llaman tablas derivadas a las subconsultas cuando
se les da un nombre y son usadas después de la
cláusula FROM.
• Ejemplo:
SELECT *
FROM (
SELECT * FROM MiTabla
) AS MiTablaDerivada
Tablas derivadas
• Caso mas frecuentes uso de una tabla derivada es para anidar
funciones agregadas.

• Ejemplo:
SELECT
AVG (CantidadComprada)
FROM
(SELECT CMC_FECHAX
, COUNT(*) AS CantidadComprada
FROM COMPRASCAB
GROUP BY CMC_FECHAX
) AS Compras
Actualización de la BD
• El LMD de SQL provee la habilidad de
consultar información e insertar, borrar y
actualizar tuplas.
Actualización de la BD
• Para borrar tuplas de una tabla se usa la cláusula
delete.
– delete from r where P
• ¿Qué sucede si se omite la cláusula where?
Actualización de la BD
• Para borrar tuplas de una tabla se usa la cláusula
delete.
– delete from r where P
• ¿Qué sucede si se omite la cláusula where?
• Se borran todas las tuplas de r.
Actualización de la BD
instructor(ID, name, dept name, salary)
• Ejemplo: Borrar todos los instructores cuyo salario es
menor que el promedio de los salarios de los
instructores.
Actualización de la BD
instructor(ID, name, dept name, salary)
• Ejemplo: Borrar todos los instructores cuyo salario es
menor que el promedio de los salarios de los
instructores.
delete from instructor
where salary < (select avg (salary) from instructor)
Actualización de la BD
bibliotecario(antigüedad,DNI)
biblioteca(nombreBib,calle,número)
trabajaEn(DNI,nombreBib)
• Borrar todos los bibliotecarios que tienen 30
años o más de antigüedad.
Actualización de la BD
• Para agregar tuplas a una tabla se usa la cláusula insert.
– insert into r values <tuple>
– insert into r <query expression >
– <query expression> puede ser una consulta del tipo select-from-
where
• Semántica: La expresión <query expression> es evaluada
completamente antes de que sus resultados sean
insertados en la relación.
– sino consultas como insert into table1 select * from table1
podrían causar problemas.
Actualización de la BD
course(course id, title, dept name, credits)
student(ID, name, dept name, tot cred)
• Agregar una nueva tupla a course.
Actualización de la BD
course(course id, title, dept name, credits)
student(ID, name, dept name, tot cred)
• Agregar una nueva tupla a course.
insert into course
values (’CS-437’, ’Database Systems’, ’Comp. Sci.’, 4);
• Agregar todos los instructores a la relación student
con tot_creds fijada a 0.
Actualización de la BD
course(course id, title, dept name, credits)
student(ID, name, dept name, tot cred)
• Agregar una nueva tupla a course.
insert into course
values (’CS-437’, ’Database Systems’, ’Comp. Sci.’, 4);
• Agregar todos los instructores a la relación student
con tot_creds fijada a 0.
insert into student
select ID, name, dept_name, 0
from instructor
Ejemplos:
persona(DNI, nombre,apellido)
bibliotecario(antigüedad,DNI)
trabajaEn(DNI,nombreBib)
socio(posición,DNI)
inscriptoEn(DNI,nombreBib)
• Ingresar a Luis Pérez de DNI 14565777 como
bibliotecario de la biblioteca de FaMAF.
• Poner a los bibliotecarios de la biblioteca de
FaMAF como socios de la biblioteca de
FaMAF.
Actualización de la BD
• Para modificar tuplas en una tabla se usa la
cláusula update.
– update r set <lista de asignaciones> where P
– where es para decidir cuáles tuplas se actualizan
• Una expresión update con una asignación es:
– update r set A = <Expression> where P
Actualización de la BD
• Ejemplo: Aumentar los salarios de los instructores cuyo
salario es mayor a $100000 por 3% y todos los otros
instructores reciben un aumento de 5%.
Actualización de la BD
• Ejemplo: Aumentar los salarios de los instructores cuyo
salario es mayor a $100.000 por 3% y todos los otros
instructores reciben un aumento de 5%.
update instructor
set salary = salary * 1.03
where salary > 100000;
update instructor
set salary = salary * 1.05
where salary <= 100000;
– El orden es importante.
Actualización de la BD
• Una expresión update con una asignación un poco más
sofisticada es:
update r set A =
case
when P1 then E1

when Pn then En
else E
End
• Las instrucciones case se pueden usar no solo en update
sino en cualquier lugar donde se espere un valor.
Actualización de la BD
– ¿Otra forma mejor de decir la consulta anterior
usando case cuál es?
Actualización de la BD
– ¿Otra forma mejor de decir la consulta anterior
usando case cuál es?
update instructor
set salary = case
when salary <= 100000 then salary * 1.05
else salary * 1.03
end
Ejemplos:
bibliotecario(antigüedad,DNI)
biblioteca(nombreBib,calle,número)
trabajaEn(DNI,nombreBib)
• Incrementar la antigüedad de todos los
bibliotecarios en 1.
• Cambiar la dirección de la biblioteca de
FaMAF a Colón al 2500.
PL/SQL
• Soporta todas las consultas SQL
• El manejo de variables.
• Estructuras modulares.
• Estructuras de control de flujo y toma de
decisiones.
• Control de excepciones.
PL/SQL
• Declaración de variables:
DECLARE variable_name datatype(size) DEFAULT
default_value;
• Asignación de variables:
SET variable_name = value;
SELECT variable_name = value;
PL/SQL
• Bloque de código
• Ejemplo
IF (@@ERROR <> 0)
BEGIN

END
PL/SQL
• Procedimiento:
CREATE [OR REPLACE] PROCEDURE
nombre_procedimiento [nombre_parametro modo
tipodatos_parametro ] IS | AS bloque de código
• Funciones:
CREATE [OR REPLACE] FUNCTION nombre_función
[nombre_parámetro modo tipodatos_parametro ]
RETURN tipodatos_retorno IS | AS bloque de código
PL/SQL
• Cambio de delimitar para la definición de
procedimientos para el uso de bloque de código
en la definición de procedimiento.
• Problema especifico de MySQL.
• Ejemplo:
DELIMITER //
CREATE PROCEDURE MyProcedure() as
BEGIN
SELECT * FROM products;
END //
DELIMITER ;
Transacciones en SQL
• El estándar de SQL especifica que una transacción
comienza implícitamente cuando una sentencia
SQL es ejecutada.
• Una de las siguientes sentencias debe terminar
una transacción:
– commit work: hace que las actualizaciones realizadas
por la transacción sean permanentes en la BD.
– collback work: causa que la transacción corriente sea
retrocedida.
– La palabra work es opcional.
Transacciones en SQL
• En muchas implementaciones SQL, por default
– a cada sentencia SQL se la considera como una
transacción en si misma y
– se compromete tan pronto como es ejecutada.
• Comprometer automáticamente sentencias SQL
individuales debe ser apagado,
– si una transacción consistente de varias sentencias
SQL necesita ser ejecutada.
– Cómo apagar compromiso automático depende de la
implementación específica de SQL.
Transacciones en SQL
• Una alternativa provista por SQL:1999 es
permitir que varias sentencias SQL se
encierren entre las palabras
begin atomic … end
– Todas las sentencias entre esas palabras clave
forman una transacción.
Cláusulas With
• Problema: ¿Cómo construir consultas complejas
en SQL?
• Solución 2: usar cláusulas with.
– Idea: dividir consultas complejas en partes
manejables dentro de cláusulas with.
– Sintaxis: with <rel> (<esquema>) as <consulta>
– Semántica: La definición de la cláusula with está
disponible solo dentro la consulta en la cual la
cláusula with ocurre.
Cláusulas With
• ¿Cómo se pueden usar las cláusulas with?
– En una consulta compleja se pueden usar varias
cláusulas with.
– En una cláusula with se pueden usar las tablas de las
cláusulas with anteriores.
– En la consulta luego del último with se pueden usar
las tablas de las cláusulas with anteriores.
Cláusulas With
department(dept name, building, budget)
• Encontrar todos los departamentos con el mayor
presupuesto.
Cláusulas With
department(dept name, building, budget)
• Encontrar todos los departamentos con el mayor
presupuesto.
with max_budget (value) as
(select max(budget)
from department)
select dept_name
from department, max_budget
where department.budget = max_budget.value;
Cláusulas With
instructor(ID, name, dept name, salary)
• Ejercicio: encontrar todos los departamentos donde
el salario total es mayor que el promedio de los
salarios totales de todos los departamentos.
Cláusulas With
instructor(ID, name, dept name, salary)
• Ejercicio: encontrar todos los departamentos donde
el salario total es mayor que el promedio de los
salarios totales de todos los departamentos.
with dept _total (dept_name, value) as
(select dept_name, sum(salary)
from instructor
group by dept_name),
with dept_total_avg(value) as
(select avg(value)
from dept_total)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total_avg.value;
Cláusulas With
with dept _total (dept_name, value) as
(select dept_name, sum(salary)
from instructor
group by dept_name),
with dept_total_avg(value) as
(select avg(value)
from dept_total)
select dept_name
from dept_total, dept_total_avg
where dept_total.value >= dept_total_avg.value;
Cláusulas With
with dept _total (dept_name, value) as
(select dept_name, sum(salary)
from instructor
group by dept_name),
with dept_total_avg(value) as
(select avg(value)
from dept_total)
select dept_name
from dept_total, dept_total_avg dept_name value
where dept_total.value >= dept_total_avg.value; Physics 182000
Comp. Sci 232000
dep_name Finance 170000
dept_total
resultado Physics Elec. Eng. 80000
Comp. Sci Biology 72000
Finance value History 122000
dept_total_avg
128285 Music 40000
Cláusulas With
bibliotecario(antigüedad,DNI)
persona(DNI, nombre,apellido)
• Encontrar el nombre de los bibliotecarios de
menor antigüedad.
Cláusulas With
• Ejemplo de recursión:
; WITH Numbers AS
(
SELECT 1 as n
UNION ALL
SELECT n +1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers

También podría gustarte