Sei sulla pagina 1di 47

Structured Query Language

parte 2

Come fare quel che ci pare con una base di dati relazionale (e vivere felici)

Andrea Turati
andrea.turati@cefriel.it

2007 Andrea Turati

Query di join(1)

Talvolta i dati voluti sono una combinazione di quelli presenti in pi tabelle


Esempio :
Clienti Cod_fisc Nome Cognome

clienti
N 1

Ordini Cliente Importo Quantit Cod_prod

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

2007 Andrea Turati

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

2007 Andrea Turati

Query di join es.(1)


Clienti Cod_fisc Nome Cognome Cod_fisc Ordini Importo Cod_Prod Quantit

cod1 cod3 cod2

Marco Pace Sara Luca Gelo Neri

cod1 cod2 cod2

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

Individuare i clienti e limporto dei relativi ordini


Importo 200 10 100

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

2007 Andrea Turati

Query di join es.(2)


Azienda IDAzienda Fatturato A1 A2 A3 100 200 150 Rag Soc SRL SPA SNC D1 D2 D3 D4 D5 Dipendente IDDipend. Nome Pippo Pluto Paperino Topolino Minni Azienda A1 A3 A1 A1 A2

Individuare i dipendenti, le aziende in cui lavorano ed i relativi fatturati

SELECT Nome, Azienda, Fatturato FROM Azienda JOIN Dipendente ON Azienda.IDAzienda = Dipendente.Azienda;

In una query con JOIN sono coinvolte pi tabelle


pu capitare che ci siano dei campi omonimi : per non fare confusione si usa il . (dot notation) per specificare a quale tabella appartiene ogni campo

Informatica Applicata per Ingegneria Biomedica - SQL/2

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

2007 Andrea Turati

Outer join es.(1)


Clienti Cod_fisc Nome cod1 cod3 cod2 Sara Luca Cognome Gelo Neri Marco Pace cod1 cod2 cod2 cod4 Ordini Cod_fisc_cliente Importo Cod_Prod 200 10 30 50 A1 B54 S32 F87 Quantit 2 4 5 3

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

Cognome Neri Neri Gelo

Cod_Prod A1 S32 B54

Marco Pace Luca Luca Sara

2007 Andrea Turati

Outer join es.(2)


Clienti Cod_fisc Nome cod1 cod3 cod2 Sara Luca Cognome Gelo Neri Marco Pace cod1 cod2 cod2 cod4 Ordini Cod_fisc_cliente Importo Cod_Prod 200 10 30 50 A1 B54 S32 F87 Quantit 2 4 5 3

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

Nome Marco Luca Luca


9

Cognome Pace Neri Neri

Cod_fisc cod1 cod2 cod2 cod4

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.

Trovare il paese di arrivo del volo AZ274


select Aereoporto.Paese from Aereoporto, Volo where (FlightID = AZ274) and (CittArr = Citt);

select Aereoporto.Paese from Aereoporto inner join Volo on CittArr = Citt where (FlightID = AZ274);
Informatica Applicata per Ingegneria Biomedica - SQL/2

10

2007 Andrea Turati

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;

Informatica Applicata per Ingegneria Biomedica - SQL/2

11

2007 Andrea Turati

Esercizio
CD (CDNumber, Title, Year, Price) Track (CDNumber, PerformanceCode, trackNo) Recording (Performance, SongTitle, Year) Composer (CompName, SongTitle) Singer ( SingerName, PerformanceCode)

Dato il precedente schema scrivere le seguenti query in SQL:


1. Le persone che hanno scritto e suonato canzoni il cui titolo inizia per D 2. I titoli dei CD che contengono canzoni il cui anno di registrazione non conosciuto 3. Le tracce dei CD con numero di serie 78574. Fornirle in ordine di numero indicando il cantante per le tracce per cui definito.

Informatica Applicata per Ingegneria Biomedica - SQL/2

12

2007 Andrea Turati

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*")

Informatica Applicata per Ingegneria Biomedica - SQL/2

13

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

14

2007 Andrea Turati

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:

AVG(campox) MAX(campox) MIN(campox) SUM(campox) COUNT(campox)

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

15

2007 Andrea Turati

Funzioni aggregate(2)

A parte count, le altre funzioni ammettono come argomento una espressione


sum e avg
Attributo o campo calcolato (numeri o intervalli di tempo)

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)

Informatica Applicata per Ingegneria Biomedica - SQL/2

16

2007 Andrea Turati

Funzioni aggregate - es.(1)


Persone Nome Angelo Marco Martina Compenso _mensile Impiego Mesi_ di_lavoro 3 5 6 Estrarre il numero degli impiegati Estrarre il totale dei compensi per i ricercatori

1.000 ricercatore 1.500 ricercatore 4.000 capo area

select count(*) as NumImpiegati from Persone;

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

2007 Andrea Turati

Funzioni aggregate - es.(2)


Persone Nome Angelo Marco Martina Compenso _mensile Impiego Mesi_di_ lavoro 3 5 6 Estrarre lo stipendio medio delle persone Estrarre lo stipendio massimo

3.000 ricercatore 2.500 ricercatore 4.000 capo area

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

18

2007 Andrea Turati

Funzioni aggregate - Raggruppamento select Cognome, Nome, max(stipendio) from Impiegato where Dipartimento = NomeDip and Citt = Milano;

Cosa fa questa operazione?


Problema: non detto che dia un solo valore di Cognome, Nome come risultato

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

20

2007 Andrea Turati

Raggruppamento di dati es.


Persone Nome Angelo Marco Luca Martina Compenso _mensile Impiego Mesi_di _lavoro 3 5 10 6 Estrarre lo stipendio medio di ogni tipologia di impiego

3.000 ricercatore 2.500 ricercatore 4.200 capo area 4.000 capo area

select avg(Compenso_mensile) as Paga_media, Impiego from Persone group by Impiego;

Paga_media

Impiego

2.750 ricercatore 4.100 capo area


Informatica Applicata per Ingegneria Biomedica - SQL/2

21

2007 Andrea Turati

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

4.100 capo area

Informatica Applicata per Ingegneria Biomedica - SQL/2

22

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

23

2007 Andrea Turati

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;

Informatica Applicata per Ingegneria Biomedica - SQL/2

24

2007 Andrea Turati

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 );

Informatica Applicata per Ingegneria Biomedica - SQL/2

25

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

26

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

27

2007 Andrea Turati

Operazioni insiemistiche es.(1)


Paz_Cardiol Cod_fisc cod1 cod3 cod2 Data_ric 10/11/01 02/05/01 23/01/01 By_pass N S N cod5 cod9 cod12 cod21
select Cod_fisc, Data_ric as Data from Paz_Cardiol where Data_ric > 30/06/01 union select Cod_fisc, Data_acc from Accessi_Pronto_Socc where Data_acc > 30/06/01; Cod_fisc

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

Data 10/11/01 20/10/01 02/09/01

cod1 cod5 cod9


Informatica Applicata per Ingegneria Biomedica - SQL/2

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

2007 Andrea Turati

Operazioni insiemistiche es.(2)


Paz_Cardiol Cod_fisc cod1 cod3 cod2 Data_ric 10/11/01 02/05/01 23/08/01 By_pass N S N cod5 cod2 cod12 cod1 select Cod_fisc from paz_cardiol where Data_ric > 30/06/01 intersect select Cod_fisc from accessi_pronto_socc where Data_acc > 30/06/01; 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/07/01

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

ESERCIZIO: fare la stessa query senza INTERSECT


Informatica Applicata per Ingegneria Biomedica - SQL/2

29

Data Definition Language

Comandi SQL (Structured Query Language) DDL DML DCL


CREATE DROP ALTER INSERT UPDATE DELETE SELECT GRANT REVOKE

Informatica Applicata per Ingegneria Biomedica - SQL/2

30

2007 Andrea Turati

SQL come DDL

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

31

2007 Andrea Turati

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

32

2007 Andrea Turati

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

Esempio: NumeroFigli integer default 0

Informatica Applicata per Ingegneria Biomedica - SQL/2

33

2007 Andrea Turati

Vincoli intrarelazionali

Not null
Indica che non ammesso un valore nullo per un certo attributo

Unique

Cognome char(20) not null

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

Vincoli di integrit generici


check(condizione)

Stipendio integer(9) check(Stipendio > 0)


Informatica Applicata per Ingegneria Biomedica - SQL/2

34

2007 Andrea Turati

Vincoli interrelazionali (1)

E possibile definire vincoli di integrit referenziale


Crea un legame fra i valori di un attributo della tabella corrente (interna) e i valori di un attributo di unaltra tabella (esterna) Impone che per ogni riga della tabella interna il valore, se diverso da null, sia presente nei valori dellattributo della tabella esterna Lattributo della tabella esterna deve essere unique (tipicamente chiave primaria) Il tutto pu essere imposto anche su un insieme di attributi

Si usano i costrutti references e foreign key

Informatica Applicata per Ingegneria Biomedica - SQL/2

35

2007 Andrea Turati

Vincoli interrelazionali/es. (1)


create table Impiegato ( Due modi per esprimere il Matricola char(6) primary key, vincolo di integrit referenziale Nome char(20) not null, Cognome char(20) not null, Dipart char(15) references Dipartimento(NomeDip), foreign key (Nome, Cognome) references Anagrafica(Nome,Cognome) )

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

Modifica delle tabelle

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

Modificare il nome delle colonne Modificare il tipo delle colonne

Modificare i vincoli di integrit associati ad una tabella

alter table NomeTabella drop foreign key NomeChiaveEsternaDaEliminare;


37
2007 Andrea Turati

Informatica Applicata per Ingegneria Biomedica - SQL/2

Creazione, modifica, cancellazione di una tabella Creazione:


create table Persona ( Cod_fisc char(16) primary key, Nome char(25), Stipendio integer Cod_fisc Nome );

Stipendio

Modifica:
alter table Persona ( add Mesi_di_lavoro integer ); Cod_fisc Nome Stipendio Mesi_di_lavoro

Cancellazione:
drop table Persona;

Informatica Applicata per Ingegneria Biomedica - SQL/2

38

2007 Andrea Turati

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

2007 Andrea Turati

Altri comandi di Data Manipulation Language

Comandi SQL (Structured Query Language) DDL DML DCL


CREATE DROP ALTER INSERT UPDATE DELETE SELECT GRANT REVOKE

Informatica Applicata per Ingegneria Biomedica - SQL/2

40

2007 Andrea Turati

Comandi di modifica dellistanza della base di dati

INSERT into tabella


Permette di inserire in una tabella una nuova riga (specificando i valori per tutti i campi, oppure solo alcuni campi, con la possibilit di inserire valori provenienti da una query)

UPDATE tabella set


Permette di modificare i valori di una singola riga oppure di un insieme di righe

DELETE tabella
Permette di cancellare alcune o tutte le righe di una tabella

Informatica Applicata per Ingegneria Biomedica - SQL/2

41

2007 Andrea Turati

Insert

insert into nometabella (listaAttributi) values (listaValori);


La listaAttributi deve essere compatibile con la listaValori: nella colonna corrispondente al primo attributo verr inserito il primo valore, e cos via ( Attenzione alla posizione!) Se non viene specificata la lista di attributi si intendono tutti gli attributi (nellordine specificato dalla definizione della tabella) La listaValori pu essere sostituita da una query il cui risultato sia costituito da una lista di attributi compatibile con listaAttributi.

Informatica Applicata per Ingegneria Biomedica - SQL/2

42

2007 Andrea Turati

Update

update nometabella set AttributoX = ValoreX where Condizione1;


Il ValoreX deve essere di tipo compatibile con lAttributoX La condizione WHERE permette di indicare i record che si vuole aggiornare
Se non specificata alcuna condizione, verranno modificati tutti i record, impostando a tutti il valoreX per la colonna AttributoX

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)

Informatica Applicata per Ingegneria Biomedica - SQL/2

43

2007 Andrea Turati

Delete

delete from nometabella where Condizione1;


La condizione WHERE permette di individuare i record da cancellare
Vengono cancellati tutti i record che soddisfano la condizione

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)

Informatica Applicata per Ingegneria Biomedica - SQL/2

44

2007 Andrea Turati

Inserimento e modifica di dati es.(1)


Persone Cod_fisc Nome cod1 cod3 Sara Cognome Gelo Marco Pace cod8 cod7 Luigi Lara Clienti Cod_fisc Nome Cognome Strada Santi Prodotto re456 f54t Cognome Gelo

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

Cognome Gelo Strada Santi

Marco Pace Sara Luigi Lara

45

2007 Andrea Turati

Inserimento e modifica di dati es.(2)


Persone Cod_fisc Nome cod1 cod4 cod3 Luigi Sara Cognome Gioia Gelo Compenso_mensile 85 105 102 Persone Cod_fisc Nome cod11 cod4 cod3 Luigi Sara Cognome Gioia Gelo Persone
delete from Persone Cod_fisc where Compenso_mensile < 100;

Marco Pace

update Persone set Cod_fisc = cod11 where (Nome = Marco) and (Cognome = Pace);

Compenso_mensile 85 105 102

Marco Pace

Nome Cognome Luigi Sara Gioia Gelo

Compenso_mensile 105 102


2007 Andrea Turati

cod4 cod3

Informatica Applicata per Ingegneria Biomedica - SQL/2

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

Informatica Applicata per Ingegneria Biomedica - SQL/2

47

2007 Andrea Turati