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

Slides:



Advertisements
Presentazioni simili
Architettura MySQL E Motori MySQL L. Vigliano.
Advertisements

Sicurezza e concorrenza nelle basi di dati
Stored Procedure Function Trigger
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità C1 Il linguaggio SQL.
Structured Query Language (SQL) Presentazione 13.1 Informatica Generale (Prof. Luca A. Ludovico)
1 Basi di dati attive. 2 Sommario Preliminari Approcci architetturali Linguaggi per la specifica di regole – Eventi – Condizioni – Azioni – Ulteriori.
Biglietti e Ritardi: schema E/R
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.
Asserzioni, Viste & Triggers
Basi di dati attive Dispongono di un sottosistema integrato per definire e gestire regole di produzione (regole attive) Regole di tipo: Evento-Condizione-Azione.
Esercitazioni del Corso di Sistemi Informativi Marina Mongiello
1 SQL come linguaggio di definizione di dati Eugenio Di Sciascio.
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 Structured Query Language
La Modifica dei Dati in una Base Dati La modifica dei dati contenuti allinterno di una base dati è unoperazione delicata Infatti, ogni potenziale problema.
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.
Elementi di PL/SQL.
SQL per la modifica di basi di dati. 29/01/2014SQL per la modifica di basi di dati2 Data Manipulation Language Introduciamo ora il Data Manipulation Language.
Laboratorio di Basi di Dati Introduzione ad Access 2ª Parte.
Basi di dati attive Paolo Atzeni.
SQL Esercitazione per il corso “Basi di Dati” Gabriel Kuper
SQL: Lezione 7 Nataliya Rassadko
SQL: Lezione 6 Nataliya Rassadko
Nataliya Rassadko SQL: Lezione 9 Nataliya Rassadko
Esercitazione per il corso “Basi di Dati”
Aspetti sistemistici dellSQL. SQL environment Un SQL environment è un framework dove esistono dati e possono aversi istruzioni SQL eseguite su questi.
SQL Per la modifica di basi di dati
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.
Le transazioni Itis Max Planck.
Duplicati Lalgebra relazionale non ammette duplicati, SQL li ammette. Quindi select Città from Persona where Cognome= Rossi estrae una lista di città in.
Vincoli di integrità generici Con i costrutti visti sinora, non è sempre possibile definire tutti i possibili vincoli di integrità. Per questo esiste listruzione.
Manipolazione dei dati I comandi SQL che permettono di modificare il contenuto di una base di dati sono insertdeleteupdate insert ha la seguente sintassi:
Daniel Stoilov Tesi di Laurea
Transazioni.
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.
Creazione e manipolazione tabelle. TABELLE una tabella può essere creata in qualsiasi momento,anche quando gli utenti stanno usando il database la struttura.
Basi di dati Claudia Raibulet
Corso di INFORMATICA anno scolastico 2009/10 Linguaggio SQL IDENTIFICATORI di tabelle e attributi: stringhe di lunghezza max 18 caratteri, composte da.
Cos’è una transazione? Una transazione è un’unità logica di elaborazione richiesta da un’applicazione che dà luogo a una serie di operazioni fisiche elementari.
Basi di Dati e Sistemi Informativi
BIOINFO3 - Lezione 51 INSERIMENTO DEI DATI Visto come si creano le tabelle (sinora tristemente vuote), cominciamo ad occuparci di come riempirle con dei.
CORSI DI FORMAZIONE - Basi di Dati: MySql - Parte 4 - Dicembre Utenti e privilegi del database - 1 Root è lutente amministratore predefinito, ma.
Pagine ASP parte 3 I data base Stefano Schacherl.
© 2007 SEI-Società Editrice Internazionale, Apogeo Unità D3 Sicurezza e concorrenza nelle basi di dati.
Il Linguaggio SQL. Le interrogazioni in SQL (continua…) La parte di SQL dedicata alla formulazione di interrogazioni fa parte del DML. SQL esprime le.
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.
ATOMICITÀ Il tipo di atomicità di un programma PL/SQL è stabilito dall’ambiente chiamante oppure dal programma Gestione atomicità: –COMMIT –SAVEPOINT nome_punto.
Interazione col DB Per interagire con una base dati da una pagina PHP occorre procedere come segue: Eseguire la connessione al DBMS MySQL in ascolto;
1 Basi di Dati S tructured Q uery L anguage Appunti Matteo Longhi.
SQL (III) Data Definition Language/ Data Manipulation Language.
MySQL Database Management System
Database Elaborato da: Claudio Ciavarella & Marco Salvati.
Nozione ed uso Operazioni eseguite automaticamente ogni volta che avviene un certo evento Uso: –Gestione di vincoli di integrità: Per fallimento Per modifica.
Elementi di PL/SQL. Pl/Sql Il PL/SQL (Procedural Language/Structured Query Language) è un linguaggio di programmazione procedurale di Oracle che costituisce.
Transazioni in MySQL 4 Transazioni in MySQL 4
Vincoli interrelazionali
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 =
Funzionalità del DBMS relazionale l Funzioni per –definizione della base di dati –inserimento / rimozione /aggiornamento di informazioni deve soddisfare.
Approfondimenti SQL.
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.
Basi di Dati attive. Sistemi Informativi DEE - Politecnico di Bari E. TinelliBasi di dati attive2 Definizione Una base di dati si dice attiva quando dispone.
Elementi di statistica con R e i database LEZIONE 2 Rocco De Marco rocco.demarco(a)an.ismar.cnr.it Ancona, 12 Aprile 2012.
Linguaggio SQL. Linguaggi per database La diffusione del modello relazionale ha favorito l’uso prevalente di linguaggi non procedurali: in questo modo.
Esercizi SQL Group by. CREATE TABLE dipendente (codDip CHAR(8) NOT NULL UNIQUE PRIMARY KEY, cognome CHAR(60) NOT NULL, nome CHAR(60) NOT NULL, stipendio.
Transcript della presentazione:

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

Agenda Asserzioni Trigger Transazioni Concorrenza LOCK JDBC

ASSERZIONI Grazie alla clausola check è possibile definire anche un ulteriore componente dello schema di una base di dati: le asserzioni. Le asserzioni rappresentano dei vincoli che non sono associati a nessun attributo o tabella in particolare, ma appartengono direttamente allo schema.

ASSERZIONI La sintassi per la definizione di un asserzione è: Un’asserzione può ad esempio imporre che in un ipotetica tabella IMPIEGATO sia sempre presente almeno una riga La condizione deve essere vera quando viene creata l’asserzione e deve rimanere vera sempre CREATE ASSERTION NomeAsserzione check(condizione) CREATE ASSERTION AlmenoUnImpiegato check ((Select count(*) from Impiegato)>=1)

ASSERZIONI Mediante le asserzioni è possibile esprimere tutti i vincoli che abbiamo specificato nella definizione delle tabelle. Le asserzioni permetono inoltre di esprimere vincoli che non sarebbero altrimenti definibili, come vincoli su più tabelle o vincoli, ad esempio, che richiedono la cardinalità minima di una tabella. Le asserzioni possiedono un nome, tramite il quale è possibile eliminarle esplicitamente dallo schema con l’istruzionde drop

ESERCIZIO Creare un’asserzione che impedisca che esistano presidenti di studi cinematografici che hanno un netWorth inferiore a 100.000 euro. 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#) CREATE ASSERTION "RichPres" CHECK (NOT EXISTS (SELECT * FROM "Studio","MovieExec“ WHERE "presC#"="cert#" AND "netWorth" < 100 000));

ESERCIZIO Creare un’asserzione che impedisca che esistano righe in StarsIn che contengono nomi di attori che non sono presenti nella tabella MovieStar 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#) CREATE ASSERTION “Star" CHECK (NOT EXISTS (SELECT starName FROM “StarIn“ WHERE starName NOT IN (Select name from MovieStar)));

ESERCIZIO Per ciascun reparto, con più di 20 impiegati a tempo pieno, (cioè dove le ore degli impiegati a tempo pieno e di quelli part-time assommano almeno a quel numero di ore per impiegati a tempo pieno), visualizzare il rid insieme al numero di impiegati che lavorano in quel reparto. Imp(iid:integer, inome:string, età:integer, salario:real) Rep(rid:integer, budget:real, direttoreid:integer) Lavora(iid:integer, rid:integer, pct_tempo:integer) SELECT L.rid, COUNT(L.iid) FROM Lavora L GROUP BY L.rid HAVING 3200 < ( SELECT SUM(L1.pct_tempo) FROM Lavora L1 WHERE L1.rid = L.rid)

TRIGGER I Trigger si basano sul paradigma : EVENTO-CONDIZIONE-AZIONE Un trigger rappresenta una serie di azioni che sono associate ad un determinato evento, come l’inserimento, la modifica o la cancellazione.

TRIGGER Funzionamento del trigger si procede in tre passi: I trigger sono attivati solo quando avvengono determinati eventi (inserzione, modifica, cancellazione) Invece di impedire immediatamente un evento, il trigger verifica prima una circostanza, se la circostanza e’ verifica, allora viene eseguita la corrispondente azione dal dbms

TRIGGER L’azione può essere eseguita prima o dopo l’evento (UPDATE, INSERT, DELETE). L’azione può essere riferita sia ai vecchi che ai nuovi valori inseriti, cancellati o modificati durante l’evento. L’evento modifica può essere limitato a un particolare attributo o a un set di attributi

TRIGGER Un trigger puo’ essere speficicato Di tupla (row-level): attivazione per ogni riga coinvolta nell’operazione Di operazione (statemente-level) una sola attivazione per ogni istruzione SQL, con riferimento a tutte le tuple coinvolte Un trigger puo’ innescare un altro trigger e cosi’ via (sara’ compito del programmatore evitare problemi…)

1. Parole chiave CREATE TRIGGER 3. 4. Le tuple prima e dopo modifica TRIGGER: Esempio 1 1. Parole chiave CREATE TRIGGER 2. Evento Supponiamo di voler impedire l’abbassamento del valore netto di un produttore: 3. 4. Le tuple prima e dopo modifica 5. Modalità di trigger FOR EACH STATEMENT 1 CREATE TRIGGER NetWorthTrigger 2 AFTER UPDATE OF netWorth ON MovieExec 3 REFERENCING OLD ROW AS OldTuple 4 NEW ROW AS NewTuple 5 FOR EACH ROW 6 WHEN (Old.netWorth > NewTuple.netWorth) 7 UPDATE MovieExec SET netWorth = OldTuple.netWorth 8 WHERE cert#=NewTuple.cert#; 6. Condizione: quando 7. 8. Azione

TRIGGER: Esempio 2 Prevenire la situazione quando avg(netWorth)<500000 1 CREATE TRIGGER AvgNetWorthTrigger 2 AFTER UPDATE OF netWorth ON MovieExec 3 REFERENCING OLD TABLE AS OldStuff, 4 NEW TABLE AS NewStuff 5 FOR EACH STATEMENT 6 WHEN (500000 > SELECT AVG(netWorth) FROM MovieExec) 7 BEGIN 8 DELETE FROM MovieExec 9 WHERE (name, address, cert#, netWorth) IN NewStuff; 10 INSERT INTO MovieExec 11 (SELECT * FROM OldStuff); 12 END;

INSTEAD OF TRIGGER CREATE VIEW ParamountMovie AS SELECT title, year FROM Movie WHERE studioName=‘Paramount’ 1 CREATE TRIGGER ParamountInsert 2 INSTEAD OF INSERT ON ParamountMovie 3 REFERENCING NEW ROW AS NewRow 5 FOR EACH ROW 6 INSERT INTO Movie (title, year, studioName) 7 VALUES (NewRow.title, NewRow.year, ‘Paramount’)

TRANSAZIONI Una transazione e’ l’esecuzione di un insieme di operazioni di lettura e scrittura di oggetti del db come un tutto indissolubile. Programma di utente in Embedded SQL in C Ovvero CLIENT di DB Esempi: Prelievo di denaro da un Bancomat Verificare un acquisto con carta di credito Prenotare un libro in libreria

TRANSAZIONI BEGIN Inizio del blocco del transazione COMMIT Prima di COMMIT i risultati di operazione possono non essere visibili alle altre transazioni ROLLBACK Le modifiche sulla DB si cancellano fino all’ultimo COMMIT Aiuta a prevenire i’problemi causati di software/hardware failure

CONCORRENZA: Problema di serialization Esistono tre situanzioni indesiderabili che possono accadere quando abbiamo transazioni concorrenti: dirty read Una transazione legge i dati scritti da una transazione simultanea non commitata nonrepeatable read Una transazione rilegge dei dati che ha precedentemente letto e li trova modificati da un’atra transizione. phantom read Una transizione esegue una query che ritorna un set di righe che soddisfano una condizione e trova che le righe soddisfacenti le condizioni sono state cambiate da un’altra transizione

Esempio: dirty read Algoritm di transazione di trasferimento di soldi: Aggiungere soldi su conto-destinatario Controllare il conto-mettente Se i fondi non sono sufficienti, cancellare transazione Se i fondi sono sufficienti, sottrarre la somma dal conto-mittente A1: 100K, A2:200K, A3:300K, Totale:600K T1 (A1150A2), T2 (A2250A3) – transazioni concorrenti T1. A2:200+150=350 T2. A3:300+250=550 T2. A2:250? SI! Fare trasferimento T1. A1:150? NO! Cancellare trasferimento T2. A2:350-250=100 T1. A2:100-150=-50 Totale: 600K

CONCORRENZA Time Airline database User 1 User 2 Il posto S36 e’ libero? - Si Il posto S36 e’ libero? - Si Time Prenota S36 - Attenzione stai prenotando un posto occupato!! Prenota S36 S36 e’ prenotato per U1 Airline database

Esempio: nonrepeatable read Due utenti (U1 e U2) accedono a un database per la gestione dei voli per prenotare il posto 36 (S36): U1 controlla se S36 e’ libero ed ottiene un risultato positivo U2 controlla se S36 e’ libero ed ottiene un risultato positivo U1 prenota S36 – adesso il posto non e’ piu’ libero U2 prova a prenotare S36 – ma il posto e’ gia uccopato

Transazione può scrivere Transazione può leggere i dati non commitati Livello di isolazione Dirty read in applicazione bancario non è accetabile Nonrepeatable read in applicazione di prenotazione dei biglietti è accettabile SET TRANSACTION READ WRITE ISOLATION LEVEL READ UNCOMMITED BEGIN TRAN UPDATE Consultants SET HourlyRate = 150 WHERE ConsultantName = 'jacob' ; SELECT * FROM Consultants ; END Transazione può scrivere Transazione può leggere i dati non commitati Ovvero transazione può essere eseguita con un certo livello di isolazione

CONCORRENZA: Livelli di Isolazione Ci sono 4 livelli di isolazione usati nelle transizioni: Il livello di isolazione delle transizioni e’ definito tramite: SET TRANSACTION <isolation level> Nuova transazione non inizia prima di fine della transazione precedente

LOCK Altra tecnica spesso usata sono i locks (serrature) sui dati condivisi: bloccaggio a livello di comando. tutto il db, una tabella, una tupla, un campo di una tupla. due transazioni non possono tenere due locks in conflitto sulla stessa tabella allo stesso tempo. i lock non conflittuali possono essere tenuti contemporanemante da diverse transizioni.

DEADLOCK Attenzione ai DeadLocks: e.g., transazione T1 pone un lock sulla tabella A e richiede la tabella B. Allo stesso tempo, T2 pone un lock su B e richiede A PostgreSQL risolve automaticamente il deadlock abortendo una delle due transazioni coinvolte

LOCK Sintassi di base: LOCK [TABLE] name [, ...][IN lockmode MODE] lockmode può essere ACCESS SHARE | ROW SHARE | ROW EXCLUSIVE | SHARE UPDATE EXCLUSIVE | SHARE | SHARE ROW EXCLUSIVE | EXCLUSIVE | ACCESS EXCLUSIVE

LOCK Supponiamo di voler incrementare di 100000 euro il valore netto del produttore del film “Meet the Fockers” se il corrente valore e’ minore di 2000000 euro. Per fare questo e’ necessario: Interrogare il db per conoscere il valore del netWorth Controllare se il valore è minore di 2000000 Se la condizione e’ vera, incrementare il valore di 100000,

LOCK Mentre si eseguono i passi 2 e 3, qualsiasi altra transazione potrebbe cambiare il valore di netWorth facendo in modo che che la condizione non sia piu’ vera. Possiamo bloccare la tabella MovieExec in modo EXCLUSIVE perche’ cio’ non accada

LOCK BEGIN WORK; LOCK TABLE imdb."MovieExec" IN EXCLUSIVE MODE; int certNum=SELECT "producerC#" FROM imdb."Movie" WHERE "title"='Meet the Fockers'; int netWorth=SELECT "netWorth" FROM imdb."MovieExec" WHERE "cert#"=certNum; if (netWorth<2000000){ UPDATE imdb."MovieExec" SET "netWorth"="netWorth"+100000 WHERE "cert#"=certNum; } COMMIT WORK;

JDBC Java Database Connectivity (JDBC) è un interfaccia per database che consente l'accesso alle basi di dati da qualsiasi programma scritto con il linguaggio di programmazione JAVA, indipendentemente dal DBMS

JDBC È costituita da una API raggruppata nel package java.sql, che serve ai client per connettersi a un database. Fornisce metodi per interrogare e modificare le basi di dati.

JDBC Passi base per usare JDBC : Caricare l’apposito JDBC driver per il db in uso (PostgreSQL offre differenti driver per diverse versioni del db e di java) Stabilire una connession con il db Creare uno statement Sottomettere le query al database (il risultato delle query puo’ essere letto usando la classe ResultSet)

JDBC Class.forName("org.postgresql.Driver"); //locate PostgreSQL JDBC driver String url = "jdbc:postgresql://" + host + "/" + db; Properties props = new Properties(); props.setProperty("user", user);//setting user name props.setProperty("password", passwrd);//setting password Connection con = DriverManager.getConnection(url, props);//getting connection to the database Statement st = con.createStatement();//creating a statement ResultSet rs = st.executeQuery(“SELECT * FROM imdb.\"MovieExec\" WHERE \"cert#\"=9713;”);//retrieving query results Rs.next();//move to the first result row String name = rs.getString("name");//read name of the producer

Esercizi: Creazione degli schemi Creare gli schemi per Product (maker, model, type) PC(model, speed, ram, hd, rd, price) Laptop(model, speed, ram, hd, screen, price) Printer(model, color, type, price) Classes(class, type, country, numGuns, bore, displacement) Ships(name, class, launched) Battles(name, date) Outcomes(ship, battle, result)

Esercizi: TRIGGER e/o ASSERTION per PC When updating PC, check that there is no lower priced PC with the same speed No manufacturer of a PC’s may also make laptop A manufacturer of a PC must also make a laptop with at least as great as a processor speed When inserting a new printer, check that the model number exists in Product table When making any modification to Laptop relation, check that the average price of laptops for each manufacturer is at least $2000 When updating RAM or hard disk of any PC, check that the updated PC has at least 100 times as much hard disk as RAM If a laptop has a larger main memory than a PC, then the laptop must also have a higher price than the PC When inserting a new PC, laptop, or printer, make sure that the model number did not previously appear in any of PC, Laptop, Printer If the relation Product mentions a model and its type, then this model must appear in the relation appropriate to that type

Esercizi: TRIGGER e/o ASSERTION per Ships When a new class is inserted into Classes, also insert a ship with the name of that class and a NULL launch date When a new class is inserted with a displacement greater than 35000 tons, allow the insertion, but change the displacement to 35000 No class may have more than 2 ships No country may have both battleships and battlecruisers No ship with more than 9 guns may be in a battle with a ship having fewer than 9 guns that was sunk If a tuple is inserted into Outcomes, check that the ship and battle are listed in Ships and Battles respectively, and if not, insert tuples into one or both of these relations, with NULL components where necessary When there is an insertion into Ships oa an update of the “class” attribute of Ships, check that no country has more than 20 ships No ship may be launched before the ship that bears the name of the first ship’s class For every class there is a ship with the name of that class

ESERCIZIO Visualizzare i produttori di film (almeno 1) in cui recitano almeno 10 attori romani. 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 MovieExec.name,MovieExec.address FROM Movie,MovieExec WHERE Movie.producerC#=MovieExec.cert# and title in (SELECT title FROM Movie,StarIn,MovieStar WHERE Movie.title=StarsIn.movieTitle and Movie.year=StarsIn.movieYear and MovieStar.name=StarIn.starName and MovieStar.address LIKE ‘%Roma%’ GROUP BY title HAVING COUNT(*)>=10)

ESERCIZIO Visualizzare i nomi degli Studi Cinematografici che hanno prodotto la metà dei propri film in bianco e nero. 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 studioName FROM Movie as M1 WHERE inColor=‘false’ GROUP BY studioName HAVING count(*)= (SELECT count(*) FROM Movie as M2 WHERE inColor=‘true’ and M1.studioName=M2.studioName)

ESERCIZIO Visualizzare tutti gli attori di sesso femminile che abbiano partecipato a dei film con lunghezza superiore alla durata minima di tutti i film. 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 MovieStar.* FROM MovieStar WHERE gender=‘f’ and name in (SELECT starName FROM StarIn, Movie WHERE movieTitle=title and movieYear=year and length>=(Select Min(length) FROM Movie)

ESERCIZIO Visualizzare i produttori-attori (persone che hanno recitato nei film da loro stessi prodotti) che vivono a Parigi (Paris). 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 MovieExec.* FROM MovieExec as M1 WHERE name in (SELECT starName FROM StarIn, Movie WHERE movieTitle=title and movieYear=year and Movie.producerC# =M1.cert#) AND MovieExec.address LIKE ‘%Paris%’

ESERCIZIO 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#) Ricostruire il db relazionale nello schema work, tenendo in considerazione: Dividere la tabella Movie in 2: MovieColor (con i film a colori) e MovieBW (film in bianco e nero) senza l’attributo INCOLOR. Nella tabella Studio introdurre un attributo per memorizzare il nome del presidente Specificare il valore di default per gli attributi quando credete che siano utili.