SistemiInformativiT Versioneelettronica:04.2.SQL.DMLbase.pdf SQL: DML di base Sistemi Informativi T 2 Data Manipulation Language (DML) LeistruzionidelDMLdiSQLsono SELECT esegueinterrogazioni(query)sulDB INSERT inseriscenuovetuplenelDB DELETE cancellatupledalDB UPDATE modificatupledelDB NB: InambitoDBMS(equindinellamanualistica)siparlaspessodi: TABLE, intesa come sinonimo di relazione (ma c qualche differenza) ROW, sinonimo di tupla COLUMN, sinonimo di attributo 2 SQL: DML di base Sistemi Informativi T 3 DB di riferimento per gli esempi Universit lucia78@cs.ucsd.edu mverdi@mv.com anna.rossi@yahoo.it gbianchi@alma.unibo.it Email DataNascita Cognome Nome 15/02/1978 Lucia Neri 42132 20/09/1979 Marco Verdi 39654 13/04/1978 Anna Rossi 35467 21/06/1978 Giorgio Bianchi 29323 Matricola 2 1 1 Anno Titolo Docente Castani SistemiInformativi 913 Neri Analisi 729 Biondi Analisi 483 CodCorso NO NO S NO Lode CodCorso Voto 30 913 35467 26 913 29323 30 729 39654 28 483 29323 Matricola Studenti Corsi Esami SQL: DML di base Sistemi Informativi T 4 Listruzione SELECT listruzionechepermettedieseguireinterrogazioni (query)sulDB Laformadibase: SELECT A1,A2,..,Am FROM R1,R2,..,Rn WHERE <condizione> ovvero: clausola SELECT (cosa si vuole come risultato) clausola FROM (da dove si prende) clausola WHERE (che condizioni deve soddisfare) NB: Non obbligatorio scrivere le clausole su righe separate In ogni istruzione SQL si possono inserire commenti, con -- se su singola riga oppure /* in questo modo se si tratta di commenti su pi righe */ 3 SQL: DML di base Sistemi Informativi T 5 Estrarre tutti i dati Laquery: SELECT * FROM Corsi -- la nostra prima query! restituiscelistanzadellarelazioneCorsi(* significa:tuttigliattributi) Con SELECT CodCorso, Titolo, Anno FROM Corsi otteniamoinformazionisolopergliattributispecificati(proiezione) 2 1 1 Anno Titolo Docente Castani SistemiInformativi 913 Neri Analisi 729 Biondi Analisi 483 CodCorso 2 1 1 Anno Titolo SistemiInformativi 913 Analisi 729 Analisi 483 CodCorso SQL: DML di base Sistemi Informativi T 6 Tabelle vs Relazioni: righe replicate Setralecolonnesucuisiproiettanoncomparenessunachiave, pu capitarechesigenerinodellerigheduplicate Adesempio: SELECT Titolo FROM Corsi La keyword DISTINCT eliminadalrisultatolerigheduplicate,chedi defaultvengonomantenute: SELECT DISTINCT Titolo FROM Corsi Titolo SistemiInformativi Analisi Analisi Titolo SistemiInformativi Analisi 4 SQL: DML di base Sistemi Informativi T 7 Espressioni nella clausola SELECT Inoutput anchepossibileottenererisultatidiespressioni (numeriche,sustringhe,ecc.),chevengonovalutatesulletuple del risultato SELECT Matricola, Voto/3 FROM Esami Sinotiche: la seconda colonna non ha un nome il tipo dei valori non cambia (resta un intero) 35467 29323 39654 29323 Matricola 10 8 10 9 SQL: DML di base Sistemi Informativi T 8 Casting Ilsecondoproblemasirisolveoeseguendouncasting esplicitodiVoto: SELECT Matricola, CAST(Voto AS Decimal(4,2))/3 FROM Esami oppureforzandolespressioneafornire unvalorereale: SELECT Matricola, Voto/3.0 FROM Esami acuivolendosipuaggiungereun castingperlimitareilnumerodicifre decimali 35467 29323 39654 29323 Matricola 10.00 8.66 10.00 9.33 35467 29323 39654 29323 Matricola 10.000000000000000000 8.666666666666666666 10.000000000000000000 9.333333333333333333 5 SQL: DML di base Sistemi Informativi T 9 Ridenominare le colonne Perrisolvereilprimoproblemasisfruttalapossibilt cheSQLoffredi ridenominarelecolonne,caratteristicautileanchequandononsifa usodiespressionialfinedimigliorarelaleggibilit delrisultato: SELECT Titolo AS NomeCorso, Docente AS Prof FROM Corsi incuila keyword AS puanche essere omessa Lesempiovistosipuquindiriscriverecome: SELECT Matricola, CAST(Voto AS Decimal(4,2))/3 AS Decimi FROM Esami Castani SistemiInformativi Neri Analisi Biondi Analisi Prof NomeCorso 35467 29323 39654 29323 Matricola 10.00 8.66 10.00 9.33 Decimi SQL: DML di base Sistemi Informativi T 10 Espressioni con stringhe Perlavorareconlastringhe utileloperatoreCONCAT(esisteanche unafunzionebinariaanaloga) SELECT Matricola, Nome CONCAT CONCAT Cognome AS NomeCognome FROM Studenti E possibileconcatenare(senzabisognodicastingesplicito)numerie date,efareusodicostanti SELECT Matricola CONCAT ha preso CONCAT Voto CONCAT in CONCAT CodCorso FROM Esami 42132 39654 35467 29323 Matricola LuciaNeri MarcoVerdi AnnaRossi GiorgioBianchi NomeCognome 35467hapreso30in913 29323hapreso26in913 39654hapreso30in729 29323hapreso28in483 6 SQL: DML di base Sistemi Informativi T 11 Filtrare il risultato: la clausola WHERE Perselezionare lesoletuple diinteressedobbiamoscrivereuna condizione,chesiavera soloper talituple SELECT Matricola, Voto, Lode FROM Esami WHERE CodCorso = 913 Siottieneinquestomodo: La clausola FROM dice di prendere la tabella Esami La clausola WHERE dice di prendere solo le tuple per cui CodCorso = 913 Infine, si estraggono i valori degli attributi nella SELECT list Equivalea Matricola,Voto,Lode ( CodCorso=913 (Esami)) NO NO Lode Voto 30 35467 26 29323 Matricola SQL: DML di base Sistemi Informativi T 12 Clausola WHERE = espressione logica LaclausolaWHEREconsiste,nelcasogenerale,diunaespressione logica(operatoriAND,OR,NOT)dipredicati Una tupla soddisfalaclausolaWHEREseesoloselespressione risultaverapertaletupla SELECT * FROM Esami WHERE CodCorso = 913 AND Voto > 28 NO Lode CodCorso Voto 30 913 35467 Matricola 7 SQL: DML di base Sistemi Informativi T 13 Alcuni utili operatori: LIKE LoperatoreLIKE,mediantelewildcard _ (corrispondeauncaratterearbitrario)e % (corrispondeaunastringaarbitraria), permetteditrovarestringhechesoddisfanouncertopattern Studentilacuiemail finiscecon.it ehannounab inseconda posizione SELECT * FROM Studenti WHERE Email LIKE _b%.it gbianchi@alma.unibo.it Email DataNascita Cognome Nome 21/06/1978 Giorgio Bianchi 29323 Matricola gbianchi@alma.unibo.it SQL: DML di base Sistemi Informativi T 14 Alcuni utili operatori: BETWEEN LoperatoreBETWEEN permettediesprimerecondizionidi appartenenzaaunintervallo (estremiinclusi) Esamiconvototra26e29 SELECT * FROM Esami WHERE Voto BETWEEN 26 AND 29 Lostessorisultatosipuottenerescrivendo: SELECT * FROM Esami WHERE Voto >= 26 AND Voto <= 29 NO NO Lode CodCorso Voto 26 913 29323 28 483 29323 Matricola 8 SQL: DML di base Sistemi Informativi T 15 Alcuni utili operatori: IN LoperatoreIN permettediesprimerecondizionidiappartenenzaaun insiemedivalori Esamideicorsiconcodici483e729 SELECT * FROM Esami WHERE CodCorso IN (483,729) Lostessorisultatosipuottenerescrivendo: SELECT * FROM Esami WHERE CodCorso = 483 OR CodCorso = 729 S NO Lode CodCorso Voto 30 729 39654 28 483 29323 Matricola SQL: DML di base Sistemi Informativi T 16 Valori nulli Valequantogi vistoinAlgebraRelazionale,quindidatalarelazione SELECT FROM Studenti WHERE DataNascita > 31-12-1978 restituiscesolo lucia78@cs.ucsd.edu mverdi@mv.com anna.rossi@yahoo.it gbianchi@alma.unibo.it Email DataNascita Cognome Nome 15/02/1978 Lucia Neri 42132 20/09/1979 Marco Verdi 39654 NULL Anna Rossi 35467 21/06/1978 Giorgio Bianchi 29323 Matricola Studenti mverdi@mv.com Email DataNascita Cognome Nome 20/09/1979 Marco Verdi 39654 Matricola 9 SQL: DML di base Sistemi Informativi T 17 Verifica di valori nulli N lacondizioneDataNascita > 31-12-1978 n ilsuocontrario (DataNascita <= 31-12-1978)sonovere seilvaloredelladatadi nascita NULL Perverificareseunvalore NULL sideveusareloperatoreIS SELECT * FROM Studenti WHERE DataNascita IS NULL NOT (A IS NULL),che veraseilvaloredellattributoAnon NULL, siscriveancheA IS NOT NULL anna.rossi@yahoo.it NULL Anna Rossi 35467 Email DataNascita Nome Cognome Matricola SQL: DML di base Sistemi Informativi T 18 Logica a 3 valori in SQL Nelcasodiespressionicomplesse,SQLricorrealla logicaa3valori:vero (V),falso(F)esconosciuto (?) SELECT Matricola FROM Studenti WHERE DataNascita <= 31-12-1978 AND Email LIKE %.edu WHERE DataNascita <= 31-12-1978 OR Email LIKE %.edu lucia78@cs.ucsd.edu mverdi@mv.com anna.rossi@yahoo.it NULL Email DataNascita Cognome Nome 15/02/1978 Lucia Neri 42132 20/09/1979 Marco Verdi 39654 NULL Anna Rossi 35467 21/06/1978 Giorgio Bianchi 29323 Matricola Studenti 42132 29323 Matricola 42132 Matricola 10 SQL: DML di base Sistemi Informativi T 19 Ordinamento del risultato Perordinareilrisultatosecondo ivaloridiunaopi colonnesiintroduce laclausolaORDER BY,eperognicolonnasispecificaselordinamento pervaloriascendenti (ASC,ildefault)odiscendenti (DESC) Si ordinasullaprimacolonna,aparit divaloridiquestasullaseconda,e cos via SELECT * FROM Esami ORDER BY CodCorso, Voto DESC SELECT * FROM Esami ORDER BY Voto DESC, CodCorso NO NO S NO Lode CodCorso Voto 26 913 29323 30 913 35467 30 729 39654 28 483 29323 Matricola S 30 729 39654 NO 30 913 35467 NO NO Lode CodCorso Voto 26 913 29323 28 483 29323 Matricola SQL: DML di base Sistemi Informativi T 20 Interrogazioni su pi tabelle Aparteilcasodeljoinnaturale(peraltrononsupportatodatuttiiDBMS, inclusoDB2),percombinareletuplediduerelazioni necessario scriveredeipredicatidijoin Ilproblema chesegliattributisucuisifailjoinhannonomiugualic ambiguit,ades.chesignificaMatricola = Matricola? Ilcasodijoinconcondizionedijoinasimmetrica illuminante: Datalarichiestaperogniconcorsotrovailaureatiilcuivotodilaurea maggioreougualealVotoFinaleminimorichiestoperlammissioneal concorsostesso,scrivereVotoFinale >= VotoFinale nonsignifica nulla! VotoFinale 102 39654 89 29323 Matricola Laureati VotoFinale 99 GHJ 88 XYZ Codice Concorsi 11 SQL: DML di base Sistemi Informativi T 21 Pseudonimi per i nomi delle relazioni Perreferenziareunacolonna,inSQLsipuanchefareusodella forma estesa<nome tabella>.<nome colonna>: SELECT Esami.CodCorso FROM Esami WHERE Esami.Matricola = 29323 Inoltre,perabbreviarelascrittura(manonsolo!vediselfjoin)sipu introdurreunopseudonimo (alias)perlatabella SELECT E.CodCorso FROM Esami E -- oppure Esami AS E WHERE Esami.Matricola = 29323 SQL: DML di base Sistemi Informativi T 22 Interrogazioni con join Linterrogazione SELECT S.Cognome,S.Nome,E.* FROM Esami E, Studenti S WHERE E.Matricola = S.Matricola siinterpretacomesegue: 1) FROM: Si genera il prodotto Cartesiano di Esami e Studenti 2) WHERE: Si applicano i predicati della clausola WHERE 3) SELECT: Si estraggono le colonne della SELECT list E.Matricola = S.Matricola dettopredicatodijoin 35467 29323 39654 29323 Matricola NO 30 913 Anna Rossi NO 26 913 Giorgio Bianchi S 30 729 Marco Verdi NO 28 483 Giorgio Bianchi Lode Voto CodCorso Nome Cognome 12 SQL: DML di base Sistemi Informativi T 23 Semantica di SQL ed esecuzione effettiva Linterpretazione(semantica)diunaquerySQLinterminidiprodotto Cartesiano,applicazionedeipredicatiequindiproiezione,NON vacerto intesacomeindicativadelmodoincuiilrisultatovieneprodotto OgniDBMShainfattilepropriestrategieperdeterminaremodalit efficientidiesecuzione,sfruttandoregolediequivalenzache generalizzanoquellevisteperlAlgebraRelazionale Ad esempio il push-down delle selezioni Inoltre,adifferenzadellAlgebra,inSQL moltopi laboriosoragionare suaspettidiequivalenzadelleinterrogazioni Questoverr fattosolopericasipi importanti,senzaalcunapretesadi completezza SQL: DML di base Sistemi Informativi T 24 Altri esempi (1) inumeridimatricoladeglistudenti chehannosostenutolesamediAnalisiconilProf.Biondi SELECT E.Matricola FROM Corsi C, Esami E WHERE C.CodCorso = E.CodCorso AND C.Titolo = Analisi AND C.Docente = Biondi 2 1 1 Anno Titolo Docente Castani SistemiInformativi 913 Neri Analisi 729 Biondi Analisi 483 CodCorso NO NO S NO Lode CodCorso Voto 30 913 35467 26 913 29323 30 729 39654 28 483 29323 Matricola 2 2 1 1 Anno Castani Castani Neri Biondi Docente SistemiInformativi SistemiInformativi Analisi Analisi Titolo NO NO S NO Lode CodCorso Voto 30 913 35467 26 913 29323 30 729 39654 28 483 29323 Matricola 13 SQL: DML di base Sistemi Informativi T 25 Altri esempi (2) idocentideicorsidicuilostudente conmatricola29323hasostenutolesame SELECT C.Docente FROM Corsi C, Esami E WHERE C.CodCorso = E.CodCorso AND E.Matricola = 29323 2 1 1 Anno Titolo Docente Castani SistemiInformativi 913 Neri Analisi 729 Biondi Analisi 483 CodCorso NO NO S NO Lode CodCorso Voto 30 913 35467 26 913 29323 30 729 39654 28 483 29323 Matricola 2 2 1 1 Anno Castani Castani Neri Biondi Docente SistemiInformativi SistemiInformativi Analisi Analisi Titolo NO NO S NO Lode CodCorso Voto 30 913 35467 26 913 29323 30 729 39654 28 483 29323 Matricola SQL: DML di base Sistemi Informativi T 26 Pi di 1 tabella = 2,3,4, Quantofattocon2tabellesigeneralizza alcasodi3opi tabelle: idocentideicorsidicuilostudente GiorgioBianchihasostenutolesame SELECT C.Docente FROM Corsi C, Esami E, Studenti S WHERE C.CodCorso = E.CodCorso AND E.Matricola = S.Matricola AND S.Cognome = Bianchi AND S.Nome = Giorgio 14 SQL: DML di base Sistemi Informativi T 27 Self J oin Lusodialias forzatoquandosideveeseguireunselfjoin ChisonoinonnidiAnna? SELECT G1.Genitore AS Nonno FROM Genitori G1, Genitori G2 WHERE G1.Figlio = G2.Genitore AND G2.Figlio = Anna Maria Enzo Maria Silvia Luca Giorgio Anna Maria Anna Figlio Luca Genitore Genitori G1 Maria Enzo Maria Silvia Luca Giorgio Anna Maria Anna Figlio Luca Genitore Genitori G2 Enzo Silvia Giorgio Nonno SQL: DML di base Sistemi Informativi T 28 J oin espliciti Anzich scrivereipredicatidijoin nellaclausolaWHERE possibile definire una(opi) joined table nella clausolaFROM SELECT S.*, E.CodCorso, E.Voto, E.Lode FROM Studenti S JOIN Esami E ON (S.Matricola = E.Matricola) WHERE E.Voto > 26 incuiJOIN sipuanchescrivereINNERJOIN Altri tipidijoin esplicitisono: CROSS JOIN (prodottoCartesiano) LEFT [OUTER] JOIN RIGHT [OUTER] JOIN FULL [OUTER] JOIN NATURAL JOIN (nonsupportatodaDB2) 15 SQL: DML di base Sistemi Informativi T 29 Outer join Lasemanticadellouter join inSQL: PRIMA si applicano TUTTI i predicati del join POI si completa il risultato con le tuple dangling Pertanto SELECT * FROM Studenti S LEFT JOIN Esami E ON (S.Matricola = E.Matricola) AND (E.Anno = 2) WHERE E.CodCorso IS NULL restituiscegli studentisenza esaminelsecondoanno,mentre SELECT * FROM Studenti S LEFT JOIN Esami E ON (S.Matricola = E.Matricola) WHERE E.CodCorso IS NULL AND (E.Anno = 2) ovviamentenonrestituiscenulla! SQL: DML di base Sistemi Informativi T 30 Operatori insiemistici ListruzioneSELECTnonpermettedieseguireunione,intersezionee differenzaditabelle Cichesipufare combinareinmodoopportunoirisultatididue istruzioniSELECT,medianteglioperatori UNION, INTERSECT, EXCEPT IntuttiicasiglielementidelleSELECTlistdevonoaveretipi compatibilie glistessinomisesivoglionocolonneconunintestazionedefinita Lordinedeglielementi importante (notazioneposizionale) Ilrisultato inognicasoprivodiduplicati,permantenerlioccorre aggiungerelopzioneALL: UNION ALL, INTERSECT ALL, EXCEPT ALL 16 SQL: DML di base Sistemi Informativi T 31 Operatori insiemistici: esempi (1) b 3 c 2 b 2 a 2 a 1 a B 1 A R S d 4 c 3 c 2 a 2 b 1 a B 1 C SELECT A FROM R UNION SELECT C FROM S 4 3 2 1 SELECT A FROM R UNION SELECT C AS A FROM S 4 3 2 1 A SELECT A,B FROM R UNION SELECT B,C AS A FROM S Non corretta! SELECT B FROM R UNION ALL SELECT B FROM S b d c c a b a c b a a a B SQL: DML di base Sistemi Informativi T 32 Operatori insiemistici: esempi (2) b 3 c 2 b 2 a 2 a 1 a B 1 A R S d 4 c 3 c 2 a 2 b 1 a B 1 C SELECT B FROM R INTERSECT ALL SELECT B FROM S c b a a B SELECT B FROM R INTERSECT SELECT B FROM S c b a B SELECT B FROM S EXCEPT SELECT B FROM R d B SELECT B FROM R EXCEPT ALL SELECT B FROM S b a B 17 SQL: DML di base Sistemi Informativi T 33 Istruzioni di aggiornamento dei dati LeistruzionichepermettonodiaggiornareilDBsono: INSERT inseriscenuovetuple nelDB DELETE cancellatuple dalDB UPDATE modificatuple delDB INSERT puusareilrisultatodiunaquery DELETE eUPDATE possonofareusodicondizioni perspecificareletuple dacancellareomodificare Inognicasogliaggiornamentiriguardanounasolarelazione SQL: DML di base Sistemi Informativi T 34 Inserimento di tuple: valori espliciti Perinserireunaopi tuple bisognaspecificarneivalori,dicendoquale valorevaassegnatoaqualeattributo INSERT INTO Corsi(Titolo,CodCorso,Docente,Anno) VALUES (StoriaAntica,456,Grigi,3), (StoriaModerna,457,Gialli,2) Selalistadegliattributivieneomessavalelordineconcuisonostati definiti INSERT INTO Corsi VALUES (456,StoriaAntica,Grigi,3) Selalistanonincludetuttigliattributi,irestantiassumono valoreNULL (seammesso)oilvaloredidefault (sespecificato) INSERT INTO Corsi(CodCorso,Titolo) VALUES (456,StoriaAntica) 18 SQL: DML di base Sistemi Informativi T 35 Inserimento di tuple: risultato di query Inalcunicasisirendenecessarioinserireinunatabellaletuple che risultanodaunaquery Sipufaredirettamente!Adesempio: INSERT INTO StudentiSenzaEmail(Matr,Cog,Nom) SELECT Matricola,Cognome,Nome FROM Studenti WHERE Email IS NULL Glischemidelrisultatoedellatabellaincuisiinserisconoletuple possono esserediversi,limportante cheitipidellecolonnesianocompatibili NO NO S NO Lode Voto 26 29323 30 35467 30 39654 28 29323 Matr SELECT.. INSERT.. SQL: DML di base Sistemi Informativi T 36 Cancellazione di tuple ListruzioneDELETE pufareusodiunacondizione perspecificareletuple dacancellare: DELETE FROM Corsi -- elimina i corsi di Biondi WHERE Docente = Biondi Percancellaretutteletuple (attenzione!): DELETE FROM Corsi Chesuccedeselacancellazioneportaaviolareilvincolodiintegrit referenziale? (ades.:cheaccadeagliesamideicorsidiBiondi?) 19 SQL: DML di base Sistemi Informativi T 37 Modifica di tuple AnchelistruzioneUPDATE pufareusodiunacondizione perspecificare letuple damodificareediespressioniperdeterminareinuovivalori UPDATE Corsi SET Docente = Bianchi, Anno = 2 WHERE Docente = Biondi UPDATE Dipendenti SET Stipendio = 1.1*Stipendio -- aumento del 10% WHERE Ruolo = Programmatore AnchelUPDATEpuportareaviolareilvincolodiintegrit referenziale SQL: DML di base Sistemi Informativi T 38 Politiche di reazione (1) Anzich lasciarealprogrammatoreilcompitodigarantirecheafrontedi cancellazioniemodificheivincolidiintegrit referenzialesianorispettati, sipossonospecificareopportunepolitichedireazione infasedi definizionedeglischemi Inassenzadispecificheopportuneleviolazioninonvengonoammesse. Equivaleaspecificareesplicitamente: CREATE TABLE Esami ( Matricola char(5) NOT NULL, CodCorso int NOT NULL, ... FOREIGN KEY CodCorso REFERENCES Corsi ON DELETE NO ACTION -- cancellazioni non permesse ON UPDATE NO ACTION -- modifiche non permesse 20 SQL: DML di base Sistemi Informativi T 39 Politiche di reazione (2) Tuttaviasonopossibilipoltichealternative: DELETE: ON DELETE CASCADE vengono cancellate tutte le tuple che referenziano la tupla cancellata, e cos via ricorsivamente (in cascata) ON DELETE SET NULL se ammesso, la foreign key viene resa NULL UPDATE: lo standard prevede politiche analoghe a quelle del DELETE, ma non cos DB2 che non ammette modifiche di chiavi referenziate SQL: DML di base Sistemi Informativi T 40 Riassumiamo: ListruzioneSELECT consistenellasuaformabasedi3parti:SELECT, FROM e WHERE Aquestesiaggiunge ORDERBY,per ordinare ilrisultato(ealtreche vedremo) Pertrattareivalorinulli,SQLricorreaunalogicaa3valori (vero, falso e sconosciuto)