Académique Documents
Professionnel Documents
Culture Documents
parte 2
Come fare quel che ci pare con una base di dati relazionale (e vivere felici)
Andrea Turati
andrea.turati@cefriel.it
Query di join(1)
clienti
N 1
ordini
Se si vuole conoscere nome e cognome dei clienti che hanno fatto qualche ordine e limporto dei rispettivi ordini, occorre collegare queste due tabelle Per utilizzare come origine dei dati due o pi tabelle possiamo utilizzare il prodotto cartesiano di queste: loperatore la virgola (,) da utilizzare nella clausola FROM.
Informatica Applicata per Ingegneria Biomedica - SQL/2
Query di join(2)
Il prodotto cartesiano anche detto JOIN tra tabelle. Il risultato del prodotto cartesiano tra due tabelle una tabella con tutte le possibili combinazioni dei record delle due: select * D E A B C from Tab1, Tab2; D1 E1 A1 B1 C1
Tab 1 D E D1 E1 D2 E2
Tab 2 A B C A1 B1 C1 A2 B2 C2 A3 B3 C3
D1 E1 A2 B2 C2
D1 E1 A3 B3 C3 D2 E2 A1 B1 C1 D2 E2 A2 B2 C2 D2 E2 A3 B3 C3
Attraverso il select ... from ... where possibile: - effettuare una proiezione su una parte dei campi - indicare una condizione che deve essere verificata da tutte le tuple
select E,B,C from Tab1, Tab2 where (??) ;
Informatica Applicata per Ingegneria Biomedica - SQL/2
200 10 100
A1 B54 S32
2 4 5
select Clienti.*, Ordini.Cod_fisc, Ordini.Importo from Clienti, Ordini where Clienti.Cod_fisc = Ordini.Cod_fisc; Nome Luca Luca Cognome Neri Neri Cod_fisc cod1 cod2 cod2 Cod_fisc cod1 cod2 cod2
Marco Pace
clienti
Informatica Applicata per Ingegneria Biomedica - SQL/2
ordini
4
2007 Andrea Turati
Query di join(3)
Il prodotto cartesiano pu essere realizzato anche attraverso il comando JOIN Il comando JOIN permette anche di specificare direttamente nella clausola FROM le condizioni di selezione delle righe della tabella prodotto
Tab 1 A B C JOIN D A1 B1 C1 A2 B2 C2 A3 B3 C3 Tab 2 E C ON Tab1.C = Tab2.C D1 E1 C1 D2 E2 C3 D3 E3 C4 D4 E4 C6 A B C D E
A1 B1 C1 D1 E1 A3 B3 C3 D2 E2
Informatica Applicata per Ingegneria Biomedica - SQL/2
SELECT Nome, Azienda, Fatturato FROM Azienda JOIN Dipendente ON Azienda.IDAzienda = Dipendente.Azienda;
Tipi di join
Il tipo di join che abbiamo considerato lINNER JOIN: esso permette di includere nella tabella risultato solo i record che si corrispondono come specificato dalla condizione ON su un campo di ciascuno dei record Altri tipi di JOIN sono gli OUTER JOIN: essi permettono di includere nella combinazione anche dei record che non hanno record corrispondenti nellaltra tabella secondo la condizione ON
In particolare:
LEFT OUTER JOIN Permette di includere nella combinazione tutti i record della prima tabella e quelli della seconda che soddisfano la condizione RIGHT OUTER JOIN Permette di includere nella combinazione tutti i record della seconda tabella e quelli della prima che corrispondono
select Clienti.*, Cod_Prod from Clienti left outer join Ordini on Clienti.Cod_fisc = Ordini.Cod_fisc_cliente; Individuare i clienti e gli eventuali prodotti da essi acquistati
Cod_fisc Nome cod1 cod2 cod2 cod3
Informatica Applicata per Ingegneria Biomedica - SQL/2
select Clienti.Nome, Clienti.Cognome, Ordini.Cod_fisc_cliente as Cod_fisc, Ordini.Importo from Clienti right outer join ordini on Clienti.Cod_fisc = Ordini.Cod_fisc_cliente; Individuare gli ordini e le info sui clienti, se presenti
Informatica Applicata per Ingegneria Biomedica - SQL/2
Importo 200 10 30 50
2007 Andrea Turati
Esercizio
Aereoporto (Citt, Paese, NumeroDiPiste) Volo (FlightID, Giorno, CittPart, OraPart, CittArr, OraArr, TipoAereo) Aereo (TipoAereo, NumeroPasseggeri)
1.
select Aereoporto.Paese from Aereoporto inner join Volo on CittArr = Citt where (FlightID = AZ274);
Informatica Applicata per Ingegneria Biomedica - SQL/2
10
Esercizio
Aereoporto (Citt, Paese, NumeroDiPiste) Volo (FlightID, Giorno, CittPart, OraPart, CittArr, OraArr, TipoAereo) Aereo (TipoAereo, NumeroPasseggeri)
2.
Visualizzare il tipo di aereo e il numero di passeggeri dei voli in partenza da Boston; se non ci sono le informazioni dellaereo, visualizzarne solo il tipo
select Volo.TipoAereo, Aereo.NumeroPasseggeri from Volo left join Aereo on Volo.TipoAereo = Aereo.TipoAereo where Volo.CittPart = Boston;
11
Esercizio
CD (CDNumber, Title, Year, Price) Track (CDNumber, PerformanceCode, trackNo) Recording (Performance, SongTitle, Year) Composer (CompName, SongTitle) Singer ( SingerName, PerformanceCode)
12
Soluzione(1)
1.1 select SingerName from Singer, Recording, Composer where (Singer.PerformanceCode = Recording.Performance) AND (Recording.SongTitle = Composer.SongTitle) AND (SingerName = CompName) AND (SongTitle like "D*")
1.2 select SingerName from (Singer join Recording on Singer.PerformanceCode = Recording.Performance) join Composer on Recording.SongTitle=Composer.SongTitle where (SingerName = CompName) AND (SongTitle like "D*")
13
Soluzione(2)
2. select CD.title from CD join Track on CD.CDNumber = Track.CDNumber join Recording on Track.PerformanceCode = Recording.Performance where Recording.Year is null 3. select trackNo, Singer.SingerName from Track left join Singer on Track.PerformanceCode = Singer.PerformanceCode where Track.CDNumber = 78754 order by trackNo
14
Funzioni aggregate(1)
Spesso abbiamo bisogno di informazioni che riassumono il contenuto di sottoinsiemi di record. In tali casi calcolare tali dati a partire dai singoli sarebbe un dispendio di risorse SQL mette a disposizione diverse funzioni per fare ci in modo semplice, quelle principali sono:
valore medio dei valori di campox massimo valore assunto da campox minimo valore assunto da campox somma dei valori della colonna campox numero di righe nella colonna campox
15
Funzioni aggregate(2)
min e max
Attributo o espressione il cui risultato sia ordinabile (anche per le stringhe di cartatteri)
La presenza di una condizione WHERE nella query naturalmente limita il numero di righe su cui sono calcolate le funzioni Per fare calcoli sui valori distinti si pu utilizzare loperatore distinct Es.: avg(DISTINCT campox) Esistono altre operazioni possibili: dipende dal tipo di DBMS che si sta utilizzando Es.: first(campox), last(campox)
16
NumImpiegati 3
select sum(Compenso_mensile*Mesi_di_lavoro) as spese_ric from Persone Spese_ric where Impiego = ricercatore; 10.500
Informatica Applicata per Ingegneria Biomedica - SQL/2
17
select avg(Compenso_mensile) as stipendio_medio from Persone; stipendio_medio 3.160 select max(Compenso_mensile) as tetto_stipendi from Persone; tetto_stipendi 4.000
18
Funzioni aggregate - Raggruppamento select Cognome, Nome, max(stipendio) from Impiegato where Dipartimento = NomeDip and Citt = Milano;
Per questo motivo lSQL non consente di mescolare fra i campi della SELECT attributi semplici e funzioni aggregate a meno che non si usi la clausola GROUP BY
19
2007 Andrea Turati
Raggruppamento
Il raggruppamento di record consente di dividere le tabelle (originarie o risultati di operazioni di selezione) in gruppi logici distinti Loperatore usato GROUP BY Sui gruppi cos creati possibile poi effettuare operazioni di calcolo applicando le funzioni aggregate select Campo1, func(Campo2) from Tabella where Campo1 [cond] group by Campo1;
Nella select posso specificare solo campi presenti nella clausola GROUP BY oppure una funzione sugli altri campi
il raggruppamento pu avvenire su uno o pi campi se avviene su pi campi il risultato sar una tabella con un numero di righe pari al prodotto dei campi su cui effettuato il raggruppamento
20
3.000 ricercatore 2.500 ricercatore 4.200 capo area 4.000 capo area
Paga_media
Impiego
21
Filtri su raggruppamenti
Per imporre delle condizioni sui valori di certe grandezze caratteristiche di un raggruppamento si pu usare il comando HAVING
Estrarre lo stipendio medio di ogni Tipologia di impiego se superiore a 3.000 select avg(Compenso_mensile) as Paga_media, Impiego from Persone group by Impiego having avg(Compenso mensile) > 3.000;
Paga_media
Impiego
22
Esercizio
Aereoporto (Citt, Paese, NumeroDiPiste) Volo (FlightID, Giorno, CittPart, OraPart, CittArr, OraArr, TipoAereo) Aereo (TipoAereo, NumeroPasseggeri)
Dato il precedente schema scrivere le seguenti query in SQL: 1. Il numero di voli che lasciano Parigi il Gioved 2. Il numero di voli internazionali che lasciano citt canadesi 3. Le citt francesi dalle quali partono pi di 20 voli diretti verso la Germania
23
Soluzioni
1. select count(*) from Volo where Giorno = Gioved and CittPart = Parigi; 2. select count(*) from Aereporto as A1 join Volo on A1.Citt = Volo.CittPart join Aeroporto as A2 on Volo.CittArr = A2.Citt where A1.Paese = Canada and A2.Paese <> Canada; 3. select A1.citt from Aereporto as A1 join Volo on A1.Citt = Volo.CittPart join Aeroporto as A2 on Volo.CittArr = A2.Citt where A1.Paese = Francia and A2.Paese = Germania group by A1.Citt having count(*) > 20;
24
Esercizio
Aereoporto (Citt, Paese, NumeroDiPiste) Volo (FlightID, Giorno, CittPart, OraPart, CittArr, OraArr, TipoAereo) Aereo (TipoAereo, NumeroPasseggeri)
Trovare gli aereoporti del Belgio che hanno solo voli domestici
a. usando not in b. usando not exists
select CittPart from Aeroporto join Volo on CittPart = Citt where Paese = "Belgio" and CittPart not in (select CittPart from Aereoporto as A1 join Volo on A1.Citt = CittPart join Aereoporto as A2 on CittArr = A2.Citt where A1.Paese = Belgio and A2.Paese <> Belgio); select CittPart from Aeroporto join Volo as A1 on CittPart = Citt where Paese = "Belgio" and not exists (select * from Volo join Aereoporto as A2 on A2.Citt = CittArr where A1.Citt = CittPart and A2.Paese <> Belgio );
25
Operazioni insiemistiche(1)
UNION consente di unire il risultato di pi query INTERSECT consente di ottenere linsieme di record che sono comuni ai risultati delle diverse query EXCEPT consente di avere come risultato i record che sono nella prima query e non nella seconda
INTERSECT e EXCEPT non aggiungono nulla a quanto visto, mentre la UNION arricchisce il potere espressivo di SQL
26
Operazioni insiemistiche(2)
Tutti questi operatori possono essere utilizzati solo per query i cui risultati siano compatibili: ovvero abbiano lo stesso numero di campi ed i tipi dei campi corrispondenti (in ordine) siano confrontabili
Se i campi hanno nomi diversi viene usato il nome del primo operando
Al contrario del resto degli operatori di interrogazione SQL, gli operatori insiemistici eliminano i duplicati
E pi logico che sia cos (ricorda gli insiemi) Non accresce il costo delloperazione (comunque necessario analizzare tutte le righe) Se si vogliono i duplicati usare ALL
27
Accessi_Pronto_Socc Cod_fisc Tipo_interv tipo1 tipo2 tipo3 tipo4 Diagnosi diag1 diag2 diag3 diag4 Data_acc 20/10/01 02/09/01 10/06/01 13/03/01
Estrarre codice e data di ricovero di tutti i pazienti cardiologici ricoverati dopo il 30/06 e di tutti i pazienti del PS con accesso dopo il 30/06
28
Estrarre codice fiscali di tutti i pazienti cardiologici ricoverati dopo il 30/06 che hanno fatto accesso al PS dopo la stessa data. Cod_fisc cod1 cod2
2007 Andrea Turati
29
30
SQL presenta tutti i costrutti necessari per la definizione e le modifica degli schemi di un DB
Normalmente si affianca alle interfacce proprietarie fornite dai produttori di DBMS relazionali
Gli oggetti manipolabili con il DDL sono le Tabelle, le Viste, gli Utenti, ecc.... Per le tabelle:
Il comando CREATE TABLE permette di creare tabelle specificando i nomi ed i tipi delle colonne Il comando ALTER TABLE consente di aggiungere (attraverso lADD) e, talvolta, cancellare (attraverso il DROP) colonne di una tabella Il comando DROP TABLE consente di cancellare tabelle
31
Creazione di tabelle
create table NomeTabella ( NomeAttributo Dominio [ValoreDiDefault] [Vincoli] { , NomeAttributo Dominio [ValoreDiDefault] [Vincoli] } AltriVincoli )
Ogni tabella viene definita con un nome e un elenco di attributi che ne definiscono lo schema Ogni attributo caratterizzato da un nome, un dominio (tipo) e dei vincoli
32
Valori di default
Il valore di default consente di specificare per ogni attributo il valore che assume automaticamente allinserimento di una nuova riga nella tabella default (GenericoValore | user | null)
GenericoValore valore del dominio user identificativo dellutente null il valore inserito se non si indica nulla
33
Vincoli intrarelazionali
Not null
Indica che non ammesso un valore nullo per un certo attributo
Unique
Si specifica per un attributo o un insieme di attributi e impone che i valori siano una superchiave
Nome char(20) not null, Cognome char(20) not null, unique(Nome,Cognome)
Chiave primaria
E possibile impostare il vincolo di chiave primaria una sola volta per tabella Il vincolo pu essere definito su un attributo o su un insieme di attributi
Nome char(20), Cognome char(20), primary key (Cognome,Nome) E invece possibile usare pi volte unique e not null
34
35
create table Dipartimento ( NomeDip char(15) primary key, Via char(20), NumeroUffici integer, )
create table Anagrafica ( Nome char(20), Cognome char(20), Indirizzo char(40), primary key (Nome, Cognome) )
36
2007 Andrea Turati
Il comando ALTER consente in generale di modificare la struttura degli oggetti dello schema di una base di dati, quindi anche le tabelle:
Modificare il nome di una tabella Cancellare colonne
alter table VecchioNomeTabella rename NuovoNomeTabella; alter table NomeTabella drop column NomeColonnaDaEliminare; alter table NomeTabella add column NomeNuovaColonna char(10); alter table NomeTabella change VecchioNomeColonna NuovoNomeColonna char(20); alter table NomeTabella modify NomeColonna tinyint not null;
Aggiungere colonne
Stipendio
Modifica:
alter table Persona ( add Mesi_di_lavoro integer ); Cod_fisc Nome Stipendio Mesi_di_lavoro
Cancellazione:
drop table Persona;
38
Esercizio
Sciatore( Nome, Paese, Et) Gareggia(NomeSciatore, NomeGara, Piazzamento) Gara (Nome, Luogo, Paese, Lunghezza ) Definire in SQL le tabelle, indicando i vincoli di integrit referenziale
create table Sciatore ( Nome char(25) primary key, Paese char(25), Et integer ) create table Gara ( Nome char(25) primary key, Luogo char(30), Paese char(25), Lunghezza integer )
create table Gareggia ( NomeSciatore char(25) references Sciatore(Nome), NomeGara char(25), Piazzamento integer, primary key (NomeSciatore, NomeGara), foreign key (NomeGara) references Gara(Nome) )
Informatica Applicata per Ingegneria Biomedica - SQL/2
39
40
DELETE tabella
Permette di cancellare alcune o tutte le righe di una tabella
41
Insert
42
Update
Il ValoreX pu essere il risultato di una query Lespressione Attibuto=Valore pu essere ripetuta pi volte per modificare diversi attributi con ununica istruzione (gli elementi della lista saranno separati da una virgola)
43
Delete
La clausola WHERE opzionale: se non viene specificata alcuna condizione, vengono cancellati tutti i record della tabella
La tabella rimane comunque, anche se alla fine non contiene alcun record (a differenza di DROP, che cancella lintera tabella)
44
Cod_fisc Nome insert into Persone (Cod_fisc, Nome) values (cod9, Lucia); cod1 cod3 cod9 Sara Lucia
Marco Pace
Cod_fisc Nome insert into Persone select Cod_fisc, Nome, Cognome from clienti; cod1 cod3 cod8 cod7
Informatica Applicata per Ingegneria Biomedica - SQL/2
45
Marco Pace
update Persone set Cod_fisc = cod11 where (Nome = Marco) and (Cognome = Pace);
Marco Pace
cod4 cod3
46
Bibliografia
Paolo Atzeni, Stefano Ceri, Stefano Paraboschi, Riccardo Torlone Basi di Dati Modelli e linguaggi di interrogazione, 2002 - McGraw Hill
4.1, 4.2, 4.4
Teach Yourself SQL in 10 minutes second edition Ben Forta 2001, SAMS
47