Torna alla pagina di Basi di Dati
:: Basi di Dati: temi d'Esame
16 febbraio 2007
NAVE(Nome,IDArmatore, Lunghezza, NumPasseggeri, NumPiani, NumCFComandante)
ARMATORE(ID, Nome, Cognome)
COMANDANTE(CF, Nome, Cognome, DataNascita)
SQL
Determinare il numero di navi che possono ospitare più di 2500 passeggeri comandate da un comandante nato prima del 20 agosto 1968
SELECT COUNT(DISTINCT Nome)
FROM Nave JOIN Comandante ON CFComandante=CF
WHERE DataNascita<= 20/08/1968 AND
NumPasseggeri>2500
Determinare l'ID, nome e cognome dell'armatore con il maggior numero di navi
SELECT A.ID, A.Nome, A.Cognome
FROM Armatore AS A JOIN Nave AS N ON CF=CFComandante
GROUP BY A.ID
HAVING COUNT(N.Nome) >= ALL
SELECT COUNT(Nome)
FROM Nave
GROUP BY IDArmatore
ALGEBRA
Determinare tutte le coppie IDArmatore-CFComandante che non sono mai stati in relazione (il comandante non ha mai prestato servizio su una nave dell'armatore)
Proietto tutte le coppie POSSIBILI
TUTTI:=πID,CF(ARMATORE X COMANDANTE)
Li rinomino
T:=ρIDArmatore, CFComandante <- ID,CF (TUTTI)
Ora proietto solo le reali coppie
R:=πIDArmatore, CFComandante(NAVE)
Tutti i possibili - i reali = quelli mai incontrati
RIS:= T - R
Determinare il CF dei comandanti che hanno comandato solo una nave in tutta la loro carriera
Proietto i comandanti e le loro navi
T:=πCFComandante, Nome(NAVE)
Ne faccio una copia
T2:=ρCFC,N <- CFComandante, Nome(T)
Trovo coloro che hanno comandato almeno 2 navi
NO:=πCFComandante, Nome(T |X|CFC=CFComandante ^ Nome <>N T2)
Tutti - quelli che hanno comandato almeno 2 navi (non è T-NO????)
RIS:=πCFComandante(TUTTI - NO)