Sei sulla pagina 1di 28

Esercizi

(ci sono alcuni problemi con i font)

Algebra Relazionale
suppliers(sid, sname, address)
parts(pid, pname, color)
catalog(sid, pid, cost)
trovare i nomi dei fornitori che forniscono
parti rosse
psname(psid(ppid(s color=red(parts))catalog)
suppliers)
1

Algebra Relazionale
trovare gli identificativi dei fornitori che forniscono
parti rosse o verdi
psid(ppid(s color = rosso color = verde(parts)) catalog)
trovare gli identificativi dei fornitori che forniscono
parti rosse oppure che stanno in piazza Garibaldi
(psid(ppid(s color = rosso(parts)) catalog))[(psid(s address
= p.zza Garibaldi(suppliers)))

Relational Algebra
trovare gli identificativi dei fornitori che forniscono
ogni parte
psid(catalog) - psid((psid(catalog) parts) catalog)
trovare gli identificativi dei pezzi forniti da almeno
due fornitori diversi
pR1.pid(s R1.pid=R2.pidR1.sidR2.sid
(r (R1,catalog)r (R2,catalog)))
3

Algebra Relazionale
trovare le coppie di identificativi di fornitori
tali che il primo ha almeno un pezzo con
prezzo maggiore del secondo
pR1.pid, R2.pid(s R1.pid=R2.pidR1.sidR2.sid
r1.cost>R2.cost

(r (R1,catalog)r (R2,catalog)))

schema di riferimento
flights(fnum, from, to, distance, departs,
arrive)
aircraft(aid, aname, cruisingrange)
certified(eid, aid)
employees(eid, ename, salary)

trovare gli identificativi dei piloti certificati per


aerei Boeing
peid(s aname=Boeing(certifiedaircraft))
{c.eid | c(certified), a(aircraft) | a.aid=c.aid
a.aname=Boeing}
select
from
where

certified.eid
certified, aircraft
certified.aid = aircraft.aid and
aircraft.aname =Boeing

trovare i nomi dei piloti certificati per aerei


Boeing
pename(s aname=Boeing(certifiedaircraft
employees))
{e.ename | c(certified), a(aircraft),
e(employees) | a.aid=c.aid e.eid = c.eid
a.aname=Boeing}
select
from
where

certified.ename
certified, aircraft, employees
certified.eid = aircraft.eid and
employees.eid = certified.eid and
aircraft.aname =Boeing
7

trovare gli identificativi di tutti gli aerei che


possono fare voli da NY a LA
paid(s cruisingrange>distance(aircraft
s from = NY to = LA(flights)))
{a.aid | a(aircraft), f(flights) | f.from = NY
f.to=LA a.cruisingrange>f.distance}
select
from
where

aircraft.aid
aircraft, flights
flights.to = NY and
flights.from = LA and
aircraft.cruisingrange >
flights.distance
8

trovare gli identificativi dei voli che possono


essere effettuati da piloti con stipendio
maggiore di 100K $
pflno(s distance<cruisingrange salary > 100k
(fligths aircraft certified employees))
select f.flno
from aircraft a, certified c, employees e,
flights f
where a.aid = c.aid and e.eid = c.eid and
distance<cruisingrange and salary>100k

trovare i nomi dei piloti che possono pilotare aerei


con autonomia maggiore di 3000 km ma non sono
certificati per aerei Boeing
pename(employees (peid(s cruisingrange>3000(aircraft
certified))-peid(s aname=Boeing(aircraft certified))))
{e.ename | e(employees), c(certified), a(aircraft),
c2(certified), a2(aircraft) | (a.aid=c.aid
e.eid=c.eid
a.cruisingrange>3000)(a2.aname=Boeing
c2.aid=a2.aid c2.eid=e.eid)}
select e.ename
from certified c, employees e, aircraft a
where a.aid=c.aid and e.eid=c.eid and
a.cruisingrange>3000 and
e.eid not in (select c2.eid
from certified c2, aircraft a2
where c2.aid=a2.aid and
a2.aname=boeing)

10

trovare gli impiegati con il salario pi alto


r (e1, employees), peid(employees)pe1.eid(employees employees.salary>e1.salary e1)
{e.eid | e(employees),e1(employees) |
(e1.salary>e.salary)}
select
from
where

e.eid
employees e
e.salary =(select max (e1.salary)
from employees e1)

11

SQL
Si consideri il seguente schema relazionale:
Emp(eid:integer, ename:string, age:integer,
salary:real)
Works(eid:integer, did:integer,
pct_time:integer)
Dept(did:integer, dname:string, budget:real,
managerid:integer)

12

SQL
Dare un esempio di chiave esterna che
coinvolge la relazione Dept
Lattributo did in Works si riferisce allattributo did in Dept

13

SQL
Si scrivano le istruzioni SQL per definire le
relazioni Emp, Works e Dept
Create table Emp (eid integer,
ename char(10),
age integer,
salary real,
primary key (eid))

14

SQL
create table Works (eid integer,
did integer,
pct_time integer,
primary key (eid, did),
foreign key (did) references Dept,
foreign key (eid) references Emp,
on delete cascade)

15

SQL
Create table Dept (did integer,
budget real,
managerid integer,
primary key (did),
foreign key (managerid) references Emp.eid,
on delete set null)

16

SQL
Definire Dept in modo che ogni dipartimento
abbia un manager
Create table Dept (did integer,
budget real,
managerid integer not null,
primary key (did),
foreign key (managerid) references Emp,
on delete set null)

17

SQL
In riferimento agli schemi di relazione
appena definiti, si esprima in SQL la
seguente interrogazione:
Trovare i nomi e let di tutti gli impiegati
che lavorano nel dipartimento 2
Select E.ename, E.age
From Emp E, works W1
Where E.eid=W1.eid and W1.did=2

18

SQL
In riferimento agli schemi di relazione
appena definiti, si esprima in SQL la
seguente interrogazione:
Trovare i nomi e let di tutti gli impiegati
che lavorano sia nel dipartimento 1 che nel
dipartimento 2
Select E.ename, E.age
From Emp E, works W1, Works W2
Where E.eid=W1.eid and W1.did= 1 and
E.eid=W2.eid and W2.did= 2

19

SQL
Si consideri il seguente schema di database:
Studente(snum, nome, et, anno)
Classe(nome, aula, ora, pid)
Iscritto(snum, nome)
Professore(pid, nome, did)

20

SQL
trovare nome ed et degli studenti iscritti al
corso di paleontologia
Select S.nome, S.et
From studente S, iscritto I
Where S.snum=I.snum
and I.nome=paleontologia

21

SQL
In alternativa:
Select studente.nome, studente.et
From studente S
Where S.snum in (select I.snum
from I
where I.nome=paleontologia)

22

SQL
Trovare i nomi di tutti gli studenti del primo
anno iscritti ad un corso tenuto dal prof.
Rossi
Select distinct S.nome
From
studente S, corso C, iscritto I, professore P
Where
S.snum=I.snum and I.nome=C.nome and
C.pid=P.pid and P.nome=Rossi and S.anno=1

23

SQL
Oppure
Select distinct S.nome
From
studente S
Where
S.anno=1 and S.snum in (select I.snum
from iscritto I
where I.nome in (select C.nome
from corso C
where C.pid in (select P.pid
from professore P
where P.nome = Rossi)))

24

SQL
Trovare let media degli studenti, suddivisi
per anno
Select
anno, avg(et)
From
studente S
Group by anno

25

SQL
Trovare gli studenti che non sono iscritti ad
alcun corso
Select S.nome
From studente S
Where S.snum not in (select I.snum
from iscritto I)

26

SQL
Trovare let degli studenti piu anziani che
sono iscritti al secondo anno oppure che
seguono un corso tenuto dal prof. Rossi
Select max(S.age)
From studente S
Where S.anno=2 or S.snum in (select I.snum
from iscritto I, corso C, Professore P
where I.nome=C.nome and C.pid=P.pid and
P.nome=Rossi)

27