PDA

View Full Version : sql


Ja]{|e
19-04-2003, 20:39
il testo del mio compito era

Basi di dati
Prova in itinere (14/04/2003):

1. Scrivere le istruzioni SQL per la creazione delle seguenti tabelle rappresentando in particolare i vincoli di
foreign key delle tabelle FILM e RECITA:

FILM (Codice, CodProduttore, Titolo, Anno, Durata, aColori)
ATTORE (Codice, Nome, Cognome, Sesso)
RECITA (Film, Attore, seProtagonista)
PRODUTTORE (Codice, Descrizione, Nazione)

2. Scrivere le interrogazioni SQL che permettono di determinare:

1. i film realizzati tra il 1970 e il 1990;
2. i film prodotti dalla ‘MGM’ che durano almeno 180 minuti;
3. i film a colori con almeno una protagonista femminile;
4. i produttori e i titoli dei film francesi ordinati per anno;
5. la durata massima di film italiani a colori;
6. il numero di attori non protagonisti nel film ‘Le Quattro Piume’;
7. il numero di attori non protagonisti per ciascun film di durata inferiore a 120 minuti.

3. Scrivere le interrogazioni 1 e 2 dell’esercizio 2 in algebra relazionale.

il foreign key l'ho messo tra FILM(CodProduttore) e PRODUTTORE(Codice), FILM(Titolo) e RECITA(Film), ATTORE(Codice) e RECITA(Attore)
sono troppi? e poi ho risolto

2.3. select aColori
from Film join Recita on Titolo = Film
where aColori = 'Y'
and
seProtagonista in ( select seProtagonista
from Attore join Recita on Codice = Attore
where sesso = 'F' and seProtagonista = 'Y' )

mi basta sapere se la logica di questo è giusto perkè i miei colleghi mi hanno fatto venire il dubbio, per il punto 2.6 e 2.7 ho attuato circa la stessa logica.

recoil
20-04-2003, 01:27
la 2.3 è sbagliata, semmai è select Codice (oppure Titolo)from Film, non acolori che è un dato "inutile" se preso da solo.
inoltre non so cosa ne pensano i tuoi prof ma io vedo che da noi l'operatore join non è mai usato in SQL in ambito didattico.
del resto basta mettere Film, Recita where Film.Codice = Recita.Film e risolvi il tutto.

2.6 -> select count(Codice) from Recita where Codice in (select Recita.Attore from Recita,Film where Recita.Film = Film.Codice and Recita.seProtagonista = 'n' and Film.Titolo = 'le 4 piume')

ripensandoci non sono nemmeno d'accordo con la join perché non ha senso farlo sul titolo del film se hai messo un codice come chiave primaria.
ci sono film con titoli uguali... infatti se noti io parlo di Recita join Film on Film = Codice (molto poco leggibile, per questo preferisco evitare il join).

beh per ora è tutto, spero di non aver detto idiozie perché ho un esame di basi tra 10 giorni e se non sono capace adesso di fare sti esercizi c'è da preoccuparsi... :)

recoil
21-04-2003, 14:03
guarda, dato che avevo deciso di esercitarmi un po' con SQL provo a fare il tuo compitino.
intanto faccio un UP e spero che qualcuno molto pratico di SQL dia un'occhiata e mi dica che ho fatto tutto giusto, altrimenti mi preoccupo sul serio :-)

1) SELECT Titolo FROM Film WHERE Anno >1969 OR Anno < 1991

2) SELECT Titolo FROM Film, Produttore WHERE Film.CodProduttore = Produttore.Codice AND Produttore.Nome = 'MGM' AND Film.Durata > 179

3) SELECT Titolo FROM Film,Recita,Attore WHERE Film.Codice = Recita.Film AND Recita.Attore = Attore.Codice AND Film.aColori = 'si' AND Attore.Sesso = 'f'

4) SELECT Produttore.Nome, Film.Titolo FROM Produttore,Film WHERE Produttore.Nazione = 'Francia' ORDER BY Film.Anno

5) SELECT max(Durata) FROM Film WHERE CodProduttore IN
(SELECT Codice FROM Produttore WHERE Nazione = 'Italia')

6) SELECT count(Codice) FROM Attore WHERE Codice IN
(SELECT Recita.Attore FROM Recita,Film WHERE Recita.Film = Film.Codice AND Film.Titolo = 'le 4 piume' AND Recita.seprotagonista = 'no')

7) SELECT count(Recita.Attore) FROM Recita, Film WHERE Recita.Film = Film.Codice AND Film.Durata < 120 GROUP BY Film.Codice

Ja]{|e
22-04-2003, 09:53
Originally posted by "recoil"

la 2.3 è sbagliata, semmai è select Codice (oppure Titolo)from Film, non acolori che è un dato "inutile" se preso da solo.
inoltre non so cosa ne pensano i tuoi prof ma io vedo che da noi l'operatore join non è mai usato in SQL in ambito didattico.
del resto basta mettere Film, Recita where Film.Codice = Recita.Film e risolvi il tutto.

2.6 -> select count(Codice) from Recita where Codice in (select Recita.Attore from Recita,Film where Recita.Film = Film.Codice and Recita.seProtagonista = 'n' and Film.Titolo = 'le 4 piume')

ripensandoci non sono nemmeno d'accordo con la join perché non ha senso farlo sul titolo del film se hai messo un codice come chiave primaria.
ci sono film con titoli uguali... infatti se noti io parlo di Recita join Film on Film = Codice (molto poco leggibile, per questo preferisco evitare il join).

beh per ora è tutto, spero di non aver detto idiozie perché ho un esame di basi tra 10 giorni e se non sono capace adesso di fare sti esercizi c'è da preoccuparsi... :)

ah hai ragione, ma credo ke nel compito ho fatto come dici tu, kmq a prop del join io non ho seguito per nulla le lezioni, ho solo studiato dal libro quindi non so

recoil
22-04-2003, 16:12
beh cmq per il join ho fatto un'osservazione che riguarda i prof della mia università, magari da te la pensano diversamente.
certo che cercando qualche esercizio di SQL con soluzioni (sempre su siti di università) ho notato che l'operatore join è usato raramente.
praticamente lo si usa solo in algebra relazionale...

Ja]{|e
23-04-2003, 13:01
Originally posted by "recoil"

beh cmq per il join ho fatto un'osservazione che riguarda i prof della mia università, magari da te la pensano diversamente.
certo che cercando qualche esercizio di SQL con soluzioni (sempre su siti di università) ho notato che l'operatore join è usato raramente.
praticamente lo si usa solo in algebra relazionale...

beh io mi consolo col fatto ke leggendo le soluzioni delle esercitazioni dell'anno scorso e di quest'anno, il prof fa abbondante uso dell'operatore join, non sempre, ma molto spesso si ;) speriamo bene!!!!!!