Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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
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
prereq
course
prereq
course
prereq
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’);
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
• 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