Bases de Datos - 2006 SQL - Ejemplos Consideramos la siguiente base de datos relacional: persona(dni,primer-nombre,apellido) biblioteca(nombre-biblioteca,calle,número) libro(título,isbn,editorial,edición) libro-autor(autor,isbn) encargo(fecha,librería,num-encargo,nombre-biblioteca) socio(posición,dni) bibliotecario(antigüedad,dni) libro-biblioteca(num-inventario,isbn,nombre-biblioteca) inscripto-en(dni,nombre-biblioteca) trabaja-en(dni,nombre-biblioteca) incluye(num-encargo,nombre-biblioteca,isbn,num-copias) prestado-a(num-inventario,nombre-biblioteca,dni) 1
Data Definition Language create table persona (DNI integer not null, primer-nombre varchar(20), apellido varchar(20), primary key (DNI), check (DNI > 0)) create table biblioteca (nombre-biblioteca varchar(20) not null, calle varchar(20), numero integer, primary key (nombre-biblioteca), check (numero > 0)) create table libro (titulo varchar(100), ISBN integer not null, editorial varchar(20), edicion smallint, primary key (ISBN), check (ISBN > 0 and edicion > 0)) 2
create table libro-autor (autor varchar(40) not null, ISBN integer not null, primary key (autor,isbn), check (ISBN > 0)) create table encargo (fecha date, libreria varchar(30) not null, num-encargo integer not null, nombre-biblioteca varchar(30) not null, primary key (nombre-biblioteca, num-encargo), check (num-encargo > 0)) create table socio (posicion varchar(20) not null, DNI integer not null, primary key (DNI), check (DNI > 0)) 3
create table bibliotecario (antiguedad smallint not null, DNI integer not null, primary key (DNI), check(dni > 0 and antiguedad between 0 and 50)) create table libro-biblioteca (num-inventario integer not null, ISBN integer not null, nombre-biblioteca varchar(30) not null, primary key (num-inventario,nombre-biblioteca), check (ISBN > 0 and num-inventario > 0)) create table inscripto-en (nombre-biblioteca varchar(30) not null, DNI integer not null, primary key (DNI,nombre-biblioteca), check (DNI > 0)) 4
create table trabaja-en (nombre-biblioteca varchar(30) not null, DNI integer not null, primary key (DNI,nombre-biblioteca), check (DNI > 0)) create table incluye (nombre-biblioteca varchar(30) not null, num-encargo integer not null, ISBN integer not null, num-copias smallint, primary key (ISBN,nombre-biblioteca,num-encargo), check (num-encargo > 0 and ISBN > 0 and num-copias > 0)) create table prestado-a (nombre-biblioteca varchar(30) not null, DNI integer not null, num-inventario not null, primary key (DNI,nombre-biblioteca,num-inventario), check (DNI > 0 and num-inventario > 0) 5
Expresiones select-from-where Obtener primer nombre y DNI de las personas cuyo apellido es Durán : select primer-nombre, DNI from persona where apellido = Duran Obtener los libros cuya editorial es Prenticehall y cuya edición no es la primera: select * from libro where editorial = Prentice-hall and edicion > 1 Encontrar el título e ISBN de todos los libros cuyo autor es Avi Silberschatz: select titulo, libro.isbn from libro, libro-autor where autor = Avi Silberschatz and libro.isbn = libro-autor.isbn 6
Renaming and tuple variables Encontrar todas las personas que son socios de la biblioteca de FaMAF. Renombrar el atributo primer nombre con nombre. select primer-nombre as nombre, apellido, persona.dni from persona, inscripto-en where nombre-biblioteca = FaMAF and persona.dni = inscripto-en.dni Encontrar todas las personas que son socios de alguna biblioteca, indicando en qué biblioteca están: select primer-nombre, apellido, P.DNI, I.nombre-biblioteca from persona as P, inscripto-en as I where and P.DNI = I.DNI 7
Encontrar los DNI de los bibliotecarios de mayor antigüedad que el bibliotecario de DNI 12354666: select distinct B.DNI from bibliotecario as B, bibliotecario as L where B.antiguedad >= L.antiguedad and L.DNI = 12354666 Operaciones de Strings y de Conjuntos Encontrar los títulos e ISBN de los libros tal que en el título aparece la palabra databases : select titulo,isbn from libro where titulo like %databases% 8
Encontrar los DNI de todas las personas que son socios o bibliotecarios: (select DNI from inscripto-en) union (select DNI from trabaja-en) Reemplazar union por intersect para obtener los DNI de las personas que son socios y bibliotecarios. Reemplazar union por except para encontrar los DNI de las personas que son socios pero no bibliotecarios. 9
Funciones de Agregación y Ordenación Encontrar el ISBN y título de todos los libros cuyo autor es Avi Silberschatz ordenado en forma descendente por ISBN: select libro.isbn, titulo from libro, libro-autor where autor = Avi Silberschatz and libro.isbn = libro-autor.isbn ordered by libro.isbn desc Obtener el promedio de las antigüedades de los bibliotecarios que trabajan en cada biblioteca: select nombre-biblioteca, avg antiguedad from bibliotecario, trabaja-en where bibliotecario.dni = antiguedad.dni group by nombre-biblioteca 10
Encontrar la cantidad de los libros en biblioteca de FaMAF tal que en el título aparece la palabra databases : select count (libro.isbn) from libro, libro-biblioteca where titulo like %databases% and nombre-biblioteca = FaMAF and libro-biblioteca.isbn = libro.isbn Obtener los nombres de las bibliotecas tal que el promedio de las antigüedades de los bibliotecarios que trabajan en ellas es de al menos 5 años. select nombre-biblioteca, avg antiguedad from bibliotecario, trabaja-en where bibliotecario.dni = antiguedad.dni group by nombre-biblioteca having avg (antiguedad) >= 5 11
Subconsultas Anidadas Encontrar los DNI de las personas que son tanto bibliotecarios como socios. select DNI from socio where DNI in (select DNI from bibliotecario) Encontrar los DNI de las personas que son socios pero no bibliotecarios de la biblioteca de FaMAF. select DNI from inscripto-en where nombre-biblioteca = FaMAF and DNI not in (select DNI from trabaja-en where nombre-biblioteca = FaMAF ) 12
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, trabaja-en where nombre-biblioteca = FaMAF and bibliotecario.dni = trabaja-en.dni) Encontrar todos los DNI de socios que son socios a lo sumo de una biblioteca. select T.DNI from socio as T where unique (select R.DNI from inscripto-en, socio as R where R.DNI = T.DNI and R.DNI = inscripto-en.dni) 13
Encontrar los ISBN de los libros que no están en ninguna biblioteca: select T.ISBN from libro as T where not exists (select R.ISBN from libro-biblioteca as R where T.ISBN = R.ISBN) Vistas Una vista consistente de todos los nombres de los socios y las bibliotecas donde están inscriptos: create view nombres-socios as select primer-nombre, apellido, nombre-biblioteca from persona, inscripto-en where persona.dni = inscripto-en.dni 14
Encontrar los nombres de los socios de la biblioteca de FaMAF : select primer-nombre, apellido from nombres-socios where nombre-biblioteca = FaMAF 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. select nombre-biblioteca, ant-promedio from (select nombre-biblioteca, avg antigüedad from bibliotecario, trabaja-en where bibliotecario.dni = trabaja-en.dni group by nombre-biblioteca) as resultado(nombre-biblioteca, ant-promedio) where ant-promedio > 4 15
Encontrar el nombre de los bibliotecarios de menor antigüedad: with menor-antigüedad(valor) as select min(antigüedad) from bibliotecario select primer-nombre, apellido from bibliotecario, persona where bibliotecario.dni = persona.dni and antigüedad = menor-antigüedad.valor Modificación de la base de datos Ingresar a Luis Pérez de DNI 14565777 como bibliotecario de la biblioteca de FaMAF: insert into persona values (14565777, Luis, Perez ) insert into biblotecario values (0,14565777) 16
insert into trabaja-en values (14565777, FaMAF ) Crear la biblioteca Yapeyú con dirección fijada a null: insert into biblioteca values ( Yapeyu,null,null) Poner a los bibliotecarios de la biblioteca de FaMAF como socios de la biblioteca de FaMAF: insert into socios select egresado, DNI from trabaja-en where nombre-biblioteca = FaMAF insert into inscripto-en select DNI, FaMAF from trabaja-en where nombre-biblioteca = FaMAF 17
Borrar todos los bibliotecarios que tienen 30 años o más de antigüedad. delete from trabaja-en where DNI in (select DNI from bibliotecario where antigüedad >= 30) delete from bibliotecario where antigüedad >= 30 Incrementar la antigüedad de todos los bibliotecarios en 1. update bibliotecario set antigüedad = antigüedad + 1 Cambiar la dirección de la biblioteca de FaMAF a Colón 2500: 18
update biblioteca set calle = Colon, numero = 2500 where nombre-biblioteca = FaMAF Reuniones de relaciones Reunión natural de las relaciones socio e inscripto-en: socio natural inner join inscripto-en Reunión externa a la izquierda de las relaciones socio e inscripto-en: socio natural left outer join inscripto-en Encontrar los DNI de las personas que son bibliotecarios o socios pero no ambos: select DNI from socio natural full outer join bibliotecario where antiguedad = null or posicion = null 19