Nataliya Rassadko rassadko@disi.unitn.it SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it.

Slides:



Advertisements
Presentazioni simili
Interrogazioni Semplici Le operazioni di interrogazione vengono specificate per mezzo dellistruzione select select ListaAttributi from ListaTabelle [where.
Advertisements

Ricorsione in SQL-99.
Structured Query Language
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità C1 Il linguaggio SQL.
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
Algebra relazionale Presentazione 12.1
Esercizio zSi vuole realizzare un data warehouse per una azienda che vende mobili allingrosso. zIl data warehouse deve permettere di analizzare i ricavi.
Sistemi per il recupero delle informazioni
Biglietti e Ritardi: schema E/R
SQL92 e XQuery1.0 a confronto1 SQL92 E XQUERY1.0 A CONFRONTO Università degli Studi di Modena e Reggio Emilia Facoltà di Ingegneria - Sede di Modena Corso.
Biglietti e Ritardi: schema E/R
1 Misura Derivata: esempio dei biglietti CostoMedioBiglietto (CMB) calcolato come INCASSO/NUM_BIG. SUM AVG Implementazione in Analysis Services 1. Si definisce.
Biglietti: schema E/R.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
1 Biglietti: schema E/R. 2 Biglietti: albero degli attributi.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
Progettazione ER Un database universitario contiene informazioni riguardanti i professori (identificati dal codice fiscale) e informazioni relative ai.
SQL Dati i seguenti schemi relazionali:
19/01/2014 Viste. 19/01/2014 Viste Le Viste Logiche o Viste o View possono essere definite come delle tabelle virtuali, i cui dati sono riaggregazioni.
Laboratorio di Basi di Dati Introduzione ad Access 2ª Parte.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, 1999
SQL Esercitazione per il corso “Basi di Dati” Gabriel Kuper
SQL: Lezione 7 Nataliya Rassadko
SQL: Lezione 2 Esercitazione per il corso Basi di Dati Gabriel Kuper Nataliya Rassadko
SQL: Lezione 6 Nataliya Rassadko
Esercitazione per il corso “Basi di Dati”
Nataliya Rassadko SQL: Lezione 8 Nataliya Rassadko
SQL: Lezione 10 Nataliya Rassadko
SQL Per la definizione di basi di dati SQL per definire ed amministrare Ogni utente puo definire una base di dati di cui diventa lamministratore potendo.
Esercitazione.
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Partizionamento/accorpamento di concetti
Viste. Cosè una vista? è possibile creare un subset logico di dati o una combinazione di dati una vista è una tabella logica basata su una tabella o su.
Atzeni, Ceri, Paraboschi, Torlone Basi di dati McGraw-Hill, Capitolo 4:SQL 16/10/2002.
Basi di dati Claudia Raibulet
SQL: Structured Query Language
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL OPERATORI INSIEMISTICI IN SQL Siano due tabelle: GiochiSolitari(CodiceGioco, NomeGioco, PrezzoGioco)
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
Esercitazione di Basi di Dati
Progettazione di Database: Esercizi
L’algebra relazionale
Basi di Dati e Sistemi Informativi
Corso di Basi di Dati Il Linguaggio SQL Home page del corso:
Basi di Dati e Sistemi Informativi
Basi di Dati e Sistemi Informativi Il Linguaggio SQL Home page del corso:
Sistemi Informativi Insieme di “strutture” in grado di acquisire, elaborare, trasmettere ed archiviare informazioni in genere ad uso di un’organizzazione.
Informatica II – Basi di Dati (07/08) – Parte 2 Gianluca Torta Dipartimento di Informatica dell’Università di Torino
SEFOC – SETTORE FORMAZIONE CONTINUA DEL PERSONALE CORSO MYSQL AVANZATO ROBERTO PENNOLINO – CARMELO MASSIMO PRIOLO PALERMO – 07 | 06 | 2011.
Basi di dati I Prof.ssa Rosalba Giugno Prof. Alfredo Pulvirenti SQL :Structured Query Language: SELECT (IV) SQL (Slide tratte in parte da da Atzeni, Ceri,
Basi di Dati Esercitazione SQL 17 Novembre Esercitazione Basi di Dati2 Fornitori (CodiceFornitore, Nome, Indirizzo, Città) Prodotti (CodiceProdotto,
Esercitazione 7.
ESERCIZIO PL/SQL e PSP.
Progettazione di una base di dati Progettazione logica (modello relazionale)
SQL, esempi 30/10/2014Basi di dati SQL1. 30/10/2014Basi di dati SQL2 CREATE TABLE, esempi CREATE TABLE corsi( codice numeric NOT NULL PRIMARY KEY, titolo.
Algebra relazionale (III). Esempi di Interrogazioni: 3 Trovare matricola e nome dei capi i cui impiegati guadagnano tutti più di Tutti gli impiegati?
Raggruppamento in SQL Esempio di raggruppamento
Interrogazioni (parte 2)
Esercizio ODBC. Configurare il driver ODBC Start  Control Panel  Administrative Tools Aprire: Data Source(ODBC) User DSN  Add…. Selezionare il driver.
SCHEDA INFORMATIVA DI UNITÀ. PROGETTAZIONE DI UN DATABASE Identificazione delle informazioni salienti Definizione di relazioni fra i dati.
Interrogazioni Le interrogazioni in SQL sono formulate in modo dichiarativo specificando cioè cosa si vuole ottenere e non come lo si vuole ottenere. L’interrogazione.
Raggruppamenti e target list scorretta select padre, avg(f.reddito), p.reddito from persone f join paternita on figlio = nome join persone p on padre =
Lezione 6 - SQL. Linguaggi per DB Per interagire con le basi di dati occorre un linguaggio Linguaggio SQL (Structured Query Language), linguaggio standardizzato.
Corso integrato di Matematica, Informatica e Statistica Informatica di base Linea 1 Daniela Besozzi Dipartimento di Informatica e Comunicazione Università.
Funzionalità del DBMS relazionale l Funzioni per –definizione della base di dati –inserimento / rimozione /aggiornamento di informazioni deve soddisfare.
Approfondimenti SQL.
NORMALIZZAZIONE ESERCIZI. INTRODUZIONE La modellazione E-R ci ha consentito di descrivere schemi relazionali Lo strumento base per la modellizzazione.
Basi di Dati e Sistemi Informativi Esercitazione: Il Linguaggio SQL (DDL+DML) Home page del corso:
Linguaggio SQL prima parte Linguaggio SQL prima parte A. Lorenzi, E. Cavalli INFORMATICA PER SISTEMI INFORMATIVI AZIENDALI Copyright © Istituto Italiano.
E. Tinelli SQL come linguaggio di manipolazione dei dati 1 DML – Data Manipulation Language.
Il linguaggio SQL (Structured Query Language) è il linguaggio standard per creare, manipolare e interrogare database relazionali. SQL non è case-sensitive:
Transcript della presentazione:

Nataliya Rassadko rassadko@disi.unitn.it SQL: Lezione 9 Nataliya Rassadko rassadko@disi.unitn.it

Agenda Esami degli anni precedenti Schema Esempi di compiti per esami

Le domande tipiche 1/2 SQL + algebra relazionale + datalog NULL JOIN Subquery Raggruppamento e operatori aggregati Query recorsivi NULL Operatori aggregati Normalizzazione a partire da functional dependencies BCNF, dependency-preserving decomposizione, 3NF Con spiegazioni ER Correggere gli errori Disegnare dalla descrizione in linguaggio naturale Scrivere SQL espressioni in DDL

Le domande tipiche 2/2 JDBC Transazioni Passi principali Identificare se conflict-serializable Protocollo 2PL Timestamp-based protocollo

Esempi0 1 Decidere se ogni scheduler è serializzabile o meno. r2(B); r1(A);w3(A); r3(C);w3(B);w2(A); r1(A); r2(C) r2(B); r1(A);w3(A); r3(C);w3(B);w2(A); r2(C)

Come testare conflict-serializability? Graf di precedenza T1<ST2 se per azioni A1 di T1 e A2 di T2 A1 occorre prima di A2 A1 e A2 riguardano lo stesso elemento di DB Una delle due azione A1, A2 è write Nodi di graf sono le transazioni dello schema S Tra nodi i e j esiste l’arco se Ti<STj

Soluzione per Esempio 1: Graf di Precedenza S1: r2(B); r1(A);w3(A); r3(C);w3(B);w2(A); r1(A); r2(C) S2: r2(B); r1(A);w3(A); r3(C);w3(B);w2(A); r2(C) 1 1 2 2 3 3

Esempio 2 Descrivere che fa un scheduler con timestamps con le seguente operazioni: S1: st1; st2; r2(A);w2(B);w1(B) S2: st1; st2; r2(A);w2(B);w1(B);Abort2

Timestamp-based scheduler Ogni transazione è associata con timestamp (inizio della transazione) Ogni oggeto è associato con due valori RTM, STM Operazione read(x, ts) è cessata se ts<WTM(x), altrimenti operazione è accetata e RTM(x):=ts Operazione write(x, ts) è cessata se ts<WTM(x) o ts<RTM(x), altrimenti operazione è accetata e WTM(x):=ts

Soluzione per Esempio 2 S1: st1; st2; r2(A);w2(B);w1(B) S2: st1; st2; r2(A);w2(B);w1(B);Abort2 Request Response Value Request Response Value read(A, st2) OK RTM(A)=st2 read(A, st2) OK RTM(A)=st2 write(B, st2) OK WTM(B)=st2 write(B, st2) OK WTM(B)=st2 write(B, st1) NO killed write(B, st1) NO killed Abort2 Possiamo write con st1

Esempio 3 Dire se il programma seguente e’ conflict-serialzable? In caso affermativo, cos’e’ una esecuzione seriale (serial execution) equivalente? In caso negativo, perche no? r4(C); r1(A); r2(B); w2(A); w3(B); w3(A); w4(B); w2(C) r2(C); r1(A); w3(B); w4(A); w1(C); w2(B); w3(A); w2(A)

Esempio 4 Descrivere il comportamento di un timestamp-based scheduler con la sequenza di operazioni: st1; r1(A); st2; w2(B); r2(A); w1(B)

Esempio 4 Inserire dei locks (shared, exclusive o increment locks) nelle seguenti transizioni in conformita’ al 2PL. Descrivere come un’ programmatore trattera’ il programma risultate. r3(C); r1(A); inc2(B); w3(C); w1(B); w2(B) Risposta: xl3(C);r3(C);sl1(A);r1(A);u1(A);xl2(B);inc2(B);w3(C);u3(C);xl1(B);w1(B);u1(B);w2(B);u2(B)

Ricordiamo La transazione è consistente se Lo scheduler è legale se ri(X) occorre dopo sli(X) o xli(X) senza qualsiasi ui(X) interveniente wi(X) occorre dopo xli(x) senza qualsiasi ui(X) interveniente Tutti lock devono occorrere prima di unlock sullo stesso elemento (2PL) Lo scheduler è legale se Dopo xli(X) non può occorrere xlj(X) o slj(X) senza ui(X) interveniente Dopo sli(X) non può occorrere xlj(X) senza ui(X) interveniente

Esercizi su FD ABCD: A->BC, B->C, C->D ABCD B->C BCD AB BCNF Dependency-preserving? Se non è dependency preserving, trovare 3NF ABCD B->C BCD AB C->D CD BC

Dependency Preserving Decomposition A->BC CD BC AB B->C C->D B->C C->D (F1F2F3)+=F+ (CB)+=BCD≠(ABC)+

Non si trova tramite chiusura 3NF: Passo 1 Non si trova tramite chiusura Trovare calnonical cover di FD Tutti FD: nonredundant http://www.cs.nmsu.edu/~ipivkina/cs482/Slides/canonicalCover.pdf repeat Use the union rule to replace dependencies of the form X->B1 and X->B2 with X->B1B2 Find a functional dependency X->Y with an extraneous attribute and delete it from X->Y until F does not change. A is extraneous in X? 􀂃 ({X} – A)+∩A≠ use F to calculate closure A is extraneous in Y? 􀂃 X+∩A≠ use F’ = (F – {X → Y}) ∪ {X →(Y – A)}

Canonical cover nel nostro caso A->BC, B->C, C->D B->C possiamo escludere subito perchè redundant Rimangono A->BC, C->D B o C possono essere extraneous A->BC, C->D F’ = (F – {A → BC}) ∪ {A →(BC – B)}={C->D} ∪{A->C} A+=ACD ACD∩B= B non è extraneous F’ = (F – {A → BC}) ∪ {A →(BC – C)}={C->D} ∪{A->B} A+=AB AB∩C= C non è extraneous

3NF: Passi 2-4 Creare relazione per ogni FD in canonical cover Eliminare la nuove arelazione se è subset di una altra relazione Se nessuna relazione contiene la chiave di R, creare la relazione con attributi di chiave di R Determinare le chiavi di R

Nel nostro caso A->BC, C->D R1=ABC - la chiave della relazione iniziale R2=CD 3NF!

Altri esercizi su FD ABCDE: AB->C, C->E, E->A ABCDEF: A->B, CE->D, CD->A, BC->D, AE->F ABCDEF: A->F, BC->F, AE->D, F->E

ER Esempio Disegnare un modello Entity-relationship per il seguente esempio. Fare delle assunzione ragionevoli per chiavi, cardinalita’ delle relazione, attributi addizionali, etc. e rendere i presupposti espliciti. Il modello e’ il database di una linea aerea. Contiene: 1. Passengers (names, addresses, phone numbers etc) 2. Flights (flight number, origin, destination, etc) 3. Planes (manufacturer, capacity, model number) 4. Pilots (name, salary etc) Le relazioni dovrebbero includere informazioni su 1. Chi e’ prenotato su quale volo 2. Chi e’ il pilota per ciascun volo 3. Quale aereo e’ assegnato a quale volo

Lo schema di creazione Entità con attributi Relazioni Cardinalità 1. Passengers (names, addresses, phone numbers etc) 2. Flights (flight number, origin, destination, date, time, duration etc) 3. Planes (manufacturer, capacity, model number) 4. Pilots (name, salary etc) Relazioni 1. Chi e’ prenotato su quale volo: Passenger-Flight 2. Chi e’ il pilota per ciascun volo: Pilot-Flight 3. Quale aereo e’ assegnato a quale volo: Flight-Plane Cardinalità Passenger-Flight: n-1 Pilot-Flight: n-1 Flight-Plane: 1-1 Chiavi Integrità referenziale Vincoli su dominio Entità debole?

NULL Esempio A B C 1 NULL 2 3 5 (a) SELECT B FROM R WHERE A>C OR A=C (b) SELECT MIN(A),MIN(B),MIN(C) FROM R (c) SELECT MIN(A),AVG(B),MAX(B)

ESERCIZIO Trovare i modelli dei prodotti IBM che sono Notebook o Desktop. Fornitori(CodiceFornitore,Nome,Indirizzo,Città) Prodotti (CodiceProdotto,Nome,Marca,Modello) Catalogo (CodiceFornitore,CodiceProdotto,Costo) SELECT Modello FROM Prodotti WHERE Marca = 'IBM‘ AND ( Nome = ‘Notebook‘ OR Nome = ‘Desktop’ )

ESERCIZIO Considerare il seguente schema SELECT B FROM R where A=C SELECT * FROM A ∩ SELECT * FROM C SELECT MIN(C), MAX(A),AVG(B) FROM R A B C 1 2 NULL 5 4 6 (4) (5) (2,5,4)

ESERCIZIO Visualizzare i titoli dei film in cui hanno recitato attori di sesso femminile per cui non si conosce l’anno di nascita. Movie(title,year,length,inColor,studioName,producerC#)StarsIn(movieTitle,movieYear,starName) MovieStar(name,address,gender,birthdate) MovieExec(name,address,cert#,netWorth) Studio(name,address,presC#) SELECT title FROM Movie,StarsIn WHERE movieTitle=title AND movieYear=year AND starName in (SELECT name FROM MovieStar WHERE gender=‘F’ and birthdate is null)

ESERCIZIO Estrarre per ogni cliente le tasse che devono essere pagate per tutte le moto possedute, ipotizzando che se vi sono più proprietari per una moto, l’ammontare delle tasse viene equamente suddiviso tra i proprietari. (Usare le viste) Moto(Targa,Cilindrata,Marca,Nazione,Tasse) Proprietario(Nome,Targa) Create view TasseInd(Targa,Tassa) as SELECT Targa,Tasse/count(*) FROM Moto join Proprietario on Moto.Targa= Proprietario.Targa GROUP BY Targa Select Nome,SUM(Tassa) FROM Proprietario join TasseInd on Proprietario.Targa=TasseInd.Targa GROUP BY Nome

ESERCIZIO Estrarre i nomi dei proprietari di solo moto giapponesi di almeno due marche differenti Moto(Targa,Cilindrata,Marca,Nazione,Tasse) Proprietario(Nome,Targa) SELECT Nome FROM Proprietario JOIN Moto ON Proprietario.Targa=Moto.Targa WHERE Nome NOT IN (SELECT Nome FROM Proprietario JOIN Moto ON Proprietario.Targa=Moto.Targa WHERE Nazione<>’Giappone’) GROUP BY Nome HAVING COUNT(distinct Marca)>=2

ESERCIZIO Estrarre la città in cui si trova lo stadio in cui la squadra italiana gioca più partite. STADIO(Nome,Città,Capienza) INCONTRO(NomeStadio,Data,Ora,Squadra1,Squadra2) NAZIONALE(Paese,Continente,Categoria) CREATE VIEW StadiItalia(NomeStaio,NroPartite) as SELECT NomeStadio,count(*) FROM Incontro WHERE Squadra1=‘Italia’ or Squadra2=‘Italia’ group by NomeStadio SELECT Città FROM Stadio WHERE NomeStaio in (SELECT NomeStadio FROM StadiItalia WHERE NroPartite=( SELECT max(NroPartite) FROM StadiItalia)

ESERCIZIO Calcolare per ogni dipartimento e per ogni anno il numero di progetti già terminati a cui ha partecipato, escludendo i dipartimenti che hanno partecipato in totale a meno di 3 progetti. DIPARTIMENTI(IDDIP,UNIVERSITA,STATO) PARTECIPANO(IDDIPA,IDPROG) PROGETTI(IDPROG,TITOLO,ANNOINIZIO,ANNOFINE) SELECT id_dip, anno_in, COUNT(*) AS num_progetti FROM Progetti Pr JOIN Partecipano Pa ON Pr.id_prog=Pa.id_prog WHERE anno_fi IS NOT NULL AND id_dip NOT IN (SELECT id_dip FROM Partecipano GROUP BY id_dip HAVING COUNT(*) <3) GROUP BY id_dip, anno_in

ESERCIZIO Elencare le università che non hanno mai partecipato a progetti già terminati. DIPARTIMENTI(IDDIP,UNIVERSITA,STATO) PARTECIPANO(IDDIPA,IDPROG) PROGETTI(IDPROG,TITOLO,ANNOINIZIO,ANNOFINE) SELECT DISTINCT universita FROM Dipartimenti WHERE universita NOT IN (SELECT universita FROM Dipartimenti D JOIN Partecipano Pa ON D.id_dip = Pa.id_dip JOIN Progetti Pr ON Pa.id_prog=Pr.id_prog WHERE anno_fi IS NOT NULL)

ESERCIZIO Per ogni albergo ritornare cognome, nome e città dei clienti che hanno versato un acconto superiore alla media di quell’albergo. Clienti(Cod_cli,Cognome,Nome,Citta,Salario,Eta) Prenot(Cod_cli,Cod_alb,Camera,Giorni,Acconto) Alberghi(Cod_alb,Nome,Citta) Create View acconti as SELECT cod_alb, AVG(acconto) AS media FROM prenot GROUP BY cod_alb; SELECT alberghi.nome,clienti.cognome,clienti.nome, clienti.citta FROM clienti, acconti, prenot, alberghi WHERE clienti.cod_cli=prenot.cod_cli AND prenot.cod_alb=acconti.cod_alb AND prenot.cod_alb=alberghi.cod_alb AND prenot.acconto >= acconti.media;

ESERCIZIO Per ogni albergo ritornare cognome, nome e città dei clienti che hanno versato un acconto superiore alla media; Clienti(Cod_cli,Cognome,Nome,Citta,Salario,Eta) Prenot(Cod_cli,Cod_alb,Camera,Giorni,Acconto) Alberghi(Cod_alb,Nome,Citta) A: SELECT AVG(acconto) FROM prenot; B: SELECT alberghi.nome, clienti.cognome, clienti.nome, clienti.citta FROM clienti, prenot, alberghi WHERE clienti.cod_cli = prenot.cod_cli AND prenot.cod_alb = alberghi.cod_alb AND prenot.acconto>A;

ESERCIZIO Trovare le materie su cui sono stati fatti almeno 6 appelli in un anno. Studenti(Matricola,Nome,Provincia,AnnoNascita) Esami(Materia,Matricola,NumeroAppello,Voto,Anno) SELECT Anno,Materia FROM ( SELECT DISTINCT Anno,Materia,NumeroAppello FROM Esami) GROUP BY Anno,Materia HAVING COUNT(*)>5

ESERCIZIO Determinare per ogni aeroporto italiano il massimo numero di passeggeri che possono arrivare direttamente dalla Francia giovedì. Aeroporto (Città,Nazione,NumPiste) Volo(IdVolo,GiornoSett,CittaPart,OraPart,CittaArr,OraArr,TipoAereo) Aereo(TipoAereo,NumPasseggeri,QtMerci) SELECT CittaArr,sum(numpassegg) FROM VOLO,AEREO WHERE cittaArr in (select citta from AEREOPORTO where nazione=`Italia`) and CittaPart in (select citta from AEREOPORTO where nazione=`Francia`) and giorno sett=`giovedi` and VOLO.TipoAereo=AEREO.TipoAereo group by CittaArr

ESERCIZIO Selezionare le Nazionalita`dei registi che hanno diretto dei film nel 1992 ma non hanno diretto film nel 1993. Regista(Nome, DataNascita, Nazionalita`) Film(Titolo, NomeRegista, Anno) Proiezione(Nomecinema, Nomefilm, Citta`) SELECT DISTINCT nazionalita` FROM Regista WHERE Nome in (SELECT nomeRegista FROM Film WHERE Anno=`1992`) and Nome not in (SELECT NomeRegista FROM Film WHERE Anno=`1993`)

ESERCIZIO Determinare il nome e la data di nascita dei giornalisti che non hanno mai lavorato per un giornale della propria citta, ma che hanno scritto articoli per altri giornali. Giornalista (NOME,DataN,Citta) Articolo (TITOLO,DATA,Autore,Genere,Giornale,Pagina) Giornale (TESTATA,Direttore,CittaSede) SELECT Nome FROM Giornalista AS G JOIN Articolo ON (Autore=Nome) JOIN Giornale ON (Giornale=Testata) WHERE NOME NOT IN (SELECT Autore FROM Articolo JOIN Giornale ON (Giornale=Testata) WHERE G.Citta=CittaSede)

ESERCIZIO Determinare i giornalisti che hanno scritto su un giornale piu` articoli del direttore. Giornalista (NOME,DataN,Citta) Articolo (TITOLO,DATA,Autore,Genere,Giornale,Pagina) Giornale (TESTATA,Direttore,CittaSede) SELECT Nome FROM (Giornalista JOIN Articolo ON (Nome=Autore) JOIN Giornale ON (Testata=Giornale) WHERE Direttore <>Nome GROUP BY Giornale,Autore HAVING COUNT(*)> (SELECT COUNT(*) FROM Giornale JOIN Articolo AS A1 ON (Testata=Giornale) WHERE Direttore=Autore AND A.Giornale=A1.Giornale)

ESERCIZIO Definire una vista che restituisce per ogni giornale il genere di articoli maggiormente pubblicati. Giornalista (NOME,DataN,Citta) Articolo (TITOLO,DATA,Autore,Genere,Giornale,Pagina) Giornale (TESTATA,Direttore,CittaSede) CREATE VIEW GeneriGiornale (Genere,Giornale,Numero) S SELECT Genere,Giornale,COUNT(*) FROM Articolo GROUP BY Genere,Giornale CREATE view GenerePref (Genere,Pref) AS SELECT Giornale,Genere FROM GeneriGiornale AS G WHERE Numero=(select max(Numero) FROM GeneriGiornale WHERE G.Giornale=Giornale))