SQl come DML Angelo Chianese,, Vincenzo Moscato, Antonio Picariello,, Lucio Sansone Basi di dati per la gestione dell'informazione 2/ed McGraw-Hill Capitolo 5 Appunti dalle lezioni SQL come DDL Sistemi informativi e basi di dati La Progettazione Concettuale SQL come DML Il modello relazionale La Progettazione Logica SQL come DCL Utilizzo di un DBMS Reale La Progettazione Fisica Strumenti CASE Forme normali Programmazione Transazioni e tecnologie di supporto Basi di dati direzionali Basi di dati distribuite 2 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Data Manipulation Language (DML) Inserire dati Modificare dati Cancellare dati Estrarre dati SQL I sistemi commerciali spesso offrono una serie di strumenti che estendono le funzionalità definite a livello di standard. 3 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Inserimento di Righe Prima forma: insert into NomeTab [(Lista)] values (Valori) Dipartimento(Codice: Codice:char char(4),nome: (4),Nome:varchar varchar(20)) Insert into Dipartimento values( aaa aaa, Amministrazione Amministrazione ) Insert into Dipartimento(Codice,Nome) values( aaa aaa, Amministrazione Amministrazione ) Insert into Diparttimento(Codice) values ( cccc cccc ) Insert into Diparttimento(Codice,Nome) values ( dddd dddd,null) 4 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Modifica di Righe update NomeTabella set Attr=< =<Espr null default> {,Attr Attr=< =<Espr null default>} [where Condizione] Dipartimento(Codice:char char(4),nome: (4),Nome:varchar varchar(20)) Update Dipartimento Set Nome = Amministrazione Amministrazione Update Dipartimento Set Nome = Amministrazione Amministrazione where Codice = aaaa aaaa Update Dipartimento Set Nome = Sconosciuto Sconosciuto where Nome is Null UPDATE prodotto SET prezzo = prezzo * 1.10 5 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Cancellazione Righe delete from NomeTab [where Condizione] Dipartimento(Codice:char char(4),nome: (4),Nome:varchar varchar(20)) Delete from Dipartimento where Nome is Null Se la condizione where manca allora la tabella viene svuotata. delete from Dipartimento Invece: drop table Dipartimento elimina la tabella 6 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Interrogazioni (Query Query) SQL esprime le interrogazioni in modo dichiarativo attraverso il comando select. L interrogazione è poi automaticamente tradotta in termini procedurali e poi eseguita. Esistono vari modi per formulare una stessa query. L utente, tipicamente, non ha bisogno di preoccuparsi dell efficienza della query formulata quanto della sua leggibilità e modificabilità. 7 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Query Sintassi (quasi) generale Select <elenco attributi> From <elenco tabella> [Where <condizione>] [Group by <attributi di raggruppamento>] [Having <condizione di raggruppamento>] [Order by <elenco attributi>] From Where Group By Having Select Order By 8 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Query Esempio: studente (Matricola ( Matricola,Nome, Cognome) CREATE TABLE studente ( matricola character(4) NOT NULL, cognome character varying(20), nome character varying(20), CONSTRAINT pk_studente PRIMARY KEY (matricola( matricola) ) INSERT INTO studente(matricola, cognome, nome) VALUES ('aaaa aaaa', 'Paolino', 'Paperino').. INSERT INTO studente(matricola, cognome, nome) VALUES ( bbbb ( bbbb', Rossi, Mario') 9 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By select Cognome from Studente Matricola Cognome Nome aaaa Paolino Paperino bbbb Rossi Mario cccc Bianchi Mario dddd Bianchi Giuseppe eeee Rossi Vincenzo ffff Esposito Gennaro Cognome Paolino Rossi Bianchi Bianchi Rossi Esposito 10 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By select Cognome as Surname from Studente Matricola Cognome Nome aaaa Paolino Paperino bbbb Rossi Mario cccc Bianchi Mario dddd Bianchi Giuseppe eeee Rossi Vincenzo ffff Esposito Gennaro Surname Paolino Rossi Bianchi Bianchi Rossi Esposito 11 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By select Cognome as Surname,, Nome from Studente Matricola Cognome Nome aaaa Paolino Paperino bbbb Rossi Mario cccc Bianchi Mario dddd Bianchi Giuseppe eeee Rossi Vincenzo ffff Esposito Gennaro Surname Paolino Rossi Bianchi Bianchi Rossi Esposito Nome Paperino Mario Mario Giuseppe Vincenzo Gennaro 12 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By select * from Impiegato Matricola Cognome Nome aaaa Paolino Paperino bbbb Rossi Mario cccc Bianchi Mario dddd Bianchi Giuseppe eeee Rossi Vincenzo ffff Esposito Gennaro Matricola Cognome Nome aaaa Paolino Paperino bbbb Rossi Mario cccc Bianchi Mario dddd Bianchi Giuseppe eeee Rossi Vincenzo ffff Esposito Gennaro 13 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By select * from Impiegato where Cognome= Bianchi Bianchi Matricola Cognome Nome aaaa Paolino Paperino bbbb Rossi Mario cccc Bianchi Mario dddd Bianchi Giuseppe eeee Rossi Vincenzo ffff Esposito Gennaro Matricola Cognome Nome cccc Bianchi Mario dddd Bianchi Giuseppe select Stipendio/12 as StipMens from Impiegato where cognome= Rossi Rossi 14 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By E possibile usare connettivi logici (and, or, not) ed espressioni di confronto. select nome, cognome from Impiegato where ufficio=20 and dipartimento= DIS DIS select nome, cognome from Impiegato where ufficio=20 or dipartimento= DIS DIS select nome from Impiegato where cognome = Rossi Rossi and (ufficio=20 or dipartimento= DIS DIS ) 15 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By Operatore LIKE E usato nel confronto di stringhe e si appoggia su due caratteri speciali: _ (indica un qualsiasi carattere) % (indica una stringa, anche vuota) select nome from Impiegato where cognome like _o%i _o%i Ritornerà tutti nomi di Impiegato il cui cognome ha una o in seconda posizione e termina per i (Rossi, Doncelli, Loi). 16 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By Valori Null Where Stipendio > 40 è soddisfatta dalle righe in cui Stipendio e e noto e maggiore di 40. Per i valori nulli si usa Stipendio is null: where stipendio is null where stipendio is not null Not V F U F V U O r V U F V V V V U V U U F V U F a n d V U F V V U F U U U F F F F F 17 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML SQL vs Relazione come Insieme Abbiamo detto che il risultato del select è una relazione. Questo non è del tutto vero, in quanto tale risultato potrebbe avere righe uguali. Ciò è dovuto a ragioni di efficienza, perché eliminare i duplicati può essere costoso in termini di tempo e deve essere espressamente richiesto. select distinct Città from... 18 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By Impiegato(Matricola Matricola,, Cognome, Nome, Dipartimento.Dipartimento(Nome)) Dipartimento(Nome Nome, Citta) select * from Impiegato, Dipartimento select * from Impiegato CROSS JOIN Dipartimento 19 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By 20 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By Nomi ambigui select nome from Impiegato, Dipartimento select Impiegato.nome from Impiegato, Dipartimento select I.nome, D.citta from Impiegato as I, Dipartimento as D 21 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By select * from Impiegato as I, Dipartimento as D where I.Dipartimento =D.Nome 22 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By select * from Impiegato as I inner join Dipartimento as D on (I.Dipartimento( =D.Nome) 23 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By Join from t1 tipojoin join t2 on condizione tipojoin inner, right (outer ( outer) left (outer outer) full (outer ( outer) 24 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By Con il join interno le righe coinvolte nel risultato sono in genere un sottoinsieme delle righe di ciascuna tabella, perché una riga della tabella R1 potrebbe non avere corrispondenze nella tabella R2 e viceversa. In alcune applicazioni potrebbe servire mantenere tutte le righe di qualcuna delle (tutte le) tabelle coinvolte, mettendo dei valori Null per indicare l l assenza di informazioni provenienti dall altra tabella. Outer Join Il join esterno mantiene tutte le righe della tabella di sinistra (left ( left), della tabella di destra (right) o di entrambe (full). 25 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By 26 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By 27 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By 28 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By Variabili usate nel FROM select I.nome,, D.nome, D.Citta from Impiegato as I, Dipartimento as D where I.Dipart = D.Nome In questo caso la variabile è da interpretarsi semplicemente come un ridenominazione. Utilizzando gli Alias è però possibile anche far riferimento a più esemplari della stessa tabella. In questo caso l interpretazione l è che, per ogni alias, si introducesse una variabile di tipo tabella che viene inizializzata con la tabella in questione. 29 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Esempio Impiegato(Matricola Cognome Eta Stipendio) Supervisione(Capo Capo:Impiegato.Matricola Impiegato:Impiegato Impiegato.Matricola) Trovare il nome e lo stipendio degli impiegati che guadagnano più del proprio capo. Select I2.Nome,, I2.Stip from (Impiegato as I1 join Supervisione as S on (I1.Matricola=S.Capo)) join Impiegato as I2 on (I2.Matricola=S.Impiegato) where I2.Stipendio > I1.Stipendio Cognome Eta Stipendio Matricola Capo Impiegato Matricola Cognome Eta Stipendio 30 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Esempio 31 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML From Where Group By Having Select Order By Il risultato di una interrogazione è una relazione e come tale non è ordinata. Nelle applicazioni è comunque utile avere i risultati ordinati secondo una certa strategia. L ordinamento agisce prima del select Non è necessario ordinare su un attributo selezionato L ordinamento introduce, in molti casi, un certo overhead. select Matricola from Impiegato order by Cognome, Nome desc 32 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
From Where Group By Having Select Order By Operatori Aggregati Agiscono non a livello di tupla ma a livello di relazione. count sum max min avg count (<* [distinct [ all] listaattributi) select count(all nome,cognome) from Impiegati 33 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML 34 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Operatori Aggregati (continua) <sum avg max min> ([distinct all] Attr) sum e avg richiedono che l l attributo sia numerico o di tipo intervallo temporale. max e min possono riferirsi a qualsiasi attributo sul cui dominio sia s definito un ordinamento. select max(stip Stip) from Impiegato where eta <35 errata select Matr, max(stip Stip) from Impiegato where eta <35 35 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Interrogazioni con Raggruppamento In alcune applicazioni sorge l esigenza l di applicare gli operatori aggregati distintamente a sottoinsiemi di righe. Impiegati nome dipart Uff Stip Pippo dip1 1 10 Pluto dip2 2 15 Topolino dip3 3 12 Paperino dip1 4 11 Paperina dip2 5 10 select dipart, sum(stip) from Impiegati Group by dipart 36 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Interrogazioni con Raggruppamento Step 1: select dipart, Stip from Impiegati Step 2. Le righe della tabella ottenuta sono analizzate e raggruppate in sottoinsiemi in funzione dell attributo di group by. Step 3. Sui sottoinsiemi viene applicato l l operatore aggregato. 37 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML 38 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Interrogazioni con Raggruppamento select ufficio from impiegato group by dipart sintatticamente errata e priva di senso. select dipart, count (*), Citta from Impiegato I inner join dipartimento D on (I.dipart=D.nome) group by dipart sintatticamente errata ma significativa select dipart, count (*), Citta from Impiegato I inner join dipartimento D on (I.dipart=D.nome) group by dipart, citta 39 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Predicati sui Gruppi La clausola group by consente di lavorare su sottoinsiemi. La clausola having consente di selezionare i sottoinsiemi. select dipart,, sum(stip Stip) from Impiegati groupby dipart having sum(stip Stip) >= 20 40 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
41 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Interrogazioni Insiemistiche union, intersect, execpt (minus minus) Possono essere solo al livello più esterno di una query, operando sul risultato di un select. Eseguono sempre una eliminazione di duplicati (se non si esplicita la keyword all). E richiesto che gli attributi siano compatibili. select cognome from Impiegati union all select nome from impiegati 42 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
43 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Interrogazioni Nidificate In SQL è possibile confrontare un valore con il risultato di un select. All, any select * from impiegato where Dipart = any ( select Nome from dipartimento where citta = topolinia ) select * from impiegato where Dipart <> all ( select Nome from dipartimento where citta = topolinia ) 44 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Interrogazioni Nidificate Impiegato(Matricola, Cognome,Stipendio) Trovare gli impiegati che guadagnano lo stipendio più alto Select * From Impiegato Where Stipendio = ( Select max(stipendio) From Impiegato) 45 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML Interpretazione L interrogazione nidificata è eseguita una sola volta prima di eseguire l interrogazione esterna. che sarà basata su un risultato temporaneo. L interrogazione interna può anche fare riferimento a quella esterna, rendendo questa interpretazione non più valida. Bisogna allora reinterpretare il tutto in termini di prodotto cartesiano di tabelle sul cui risultato si applicano le condizioni espresse nel l predicato where. Poiché il predicato where è a sua volta una interrogazione, questa dovrà essere valutata per ogni riga del prodotto stesso. 46 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML
Interpretazione Persona(CF,Cognome,Nome) Trovare gli omonimi Select distinct P1.* From Persona P1, Persona P2 where P1.nome = P2.nome and P1.cognome = P2.cognome and P1.CodFis <> P2.CodFis 47 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML select * from Persona P Inserimento di Righe (forma 2) insert into NomeTab [ListaAttributi ListaAttributi] <values (ListaValori ListaValori) SelectSQL> Esempio forma 1: insert into Dipartimento(Nome,Citta) values( prod prod, Milano Milano ) Esempio forma 2: insert into ProdottiMilanesi (select * from Prodotti where LuogoProd= Milano Milano ) 48 AA 2010-2011, Basi di Dati, Prof. Antonio d Acierno, dacierno.a@isa.cnr.it SQL come DML