La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli.

Presentazioni simili


Presentazione sul tema: "SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli."— Transcript della presentazione:

1 SQL

2 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli aspetti essenziali, non i dettagli storia: –prima proposta SEQUEL (IBM Research, 1974); –prima implementazione in SQL/DS (IBM, 1981); –dal 1983 ca., standard di fatto –standard (1986, poi 1989 e infine 1992) recepito in parte; –standard SQL:2003 (SQL3) approvato recentemente

3 SQL 3 Domini Domini elementari (predefiniti) Domini definiti dallutente (semplici, ma riutilizzabili)

4 SQL 4 Domini elementari Carattere: singoli caratteri o stringhe, anche di lunghezza variabile character [ varying ] [ ( Lunghezza ) ] [ character set NomeFamigliaCaratteri ] Bit: singoli booleani o stringhe bit [ varying ] [ ( Lunghezza ) ] Numerici, esatti e approssimati: numeric [ ( Precisione [, Scala ) ] ] integer float [ ( Precisione ) ] double precision

5 SQL 5 Domini elementari, 2 Data, ora, intervalli: date time [ ( Precisione ) ] [ with time zone ] timestamp [ ( Precisione ) ] [ with time zone ] interval UnitàDiTempo [ to UnitàDiTempo ]

6 SQL 6 Definizione di schemi In un database non ci sono solo tabelle: create schema [NomeSchema] [ [ authorization ] autorizzazione]{elemento schema} elemento schema può essere: dominio, tabella, indice, asserzione, vista, privilegio autorizzazione è il nome dellutente proprietario dello schema non è necessario definire tutto allinizio

7 SQL 7 Definizione di tabelle create table NomeTabella ( NomeAttributo Dominio [Default] [Vincoli] {, NomeAttributo Dominio [Default] [Vincoli] } AltriVincoli ) Default (utilizzabili anche nella create domain ) default

8 SQL 8 Esempio create table Dipartimento ( nome char(20) primary key, indirizzochar(50), cittàchar(20) )

9 SQL 9 Definizione di domini Istruzione CREATE DOMAIN: –definisce un dominio (semplice), utilizzabile in definizioni di relazioni Sintassi create domain NomeDominio as Tipo [ Default ] [ Vincoli ] Esempio create domain Voto as smallint default null check ( value >=18 and value <= 30 )

10 SQL 10 Vincoli intrarelazionali not null (su singoli attributi) unique : permette di definire chiavi; sintassi: –per singoli attributi: unique dopo il dominio –chiavi formate da più attributi: unique ( Attributo {, Attributo } ) primary key : definizione della chiave primaria (una sola, implica not null ); sintassi, come per unique check, vedremo più avanti

11 SQL 11 Vincoli intrarelazionali, esempi Nome character(20) not null, Cognome character(20) not null, unique (Cognome,Nome) è diverso da: Nome character(20) not null unique, Cognome character(20) not null unique

12 SQL 12 Vincoli interrelazionali references e foreign key (chiave esterna) permettono di definire vincoli di integrità referenziale; sintassi: –per singoli attributi: references dopo il dominio –riferimenti su più attributi: foreign key( Attributo {, Attributo } ) references... è possibile associare politiche di reazione alla violazione dei vincoli (causate da modifiche sulla tabella esterna, cioè quella cui si fa riferimento)

13 SQL 13 Richiamo: base di dati con vincoli di integrità referenziale

14 SQL 14 Vincoli interrelazionali, esempio create table Infrazioni( Codice character(6) primary key, Data date not null, Vigile integer not null references Vigile(Matricola), Provincia character(2), Numero character(6), foreign key(Provincia, Numero) references Automobili(Provincia, Numero) ) Infrazioni e una tabella interna, Vigile e Automobili sono esterne

15 SQL 15 Violazione dei vincoli per tutti i vincoli visti fino ad ora si assume che se violati a causa di un aggiornamento, il comando di aggiornamento venga rifiutato segnalando lerrore allutente. per i vincoli di integrità referenziale, SQL permette di scegliere altre reazioni da adottare quando viene rilevata una violazione la reazione è possibile solo per le operazioni sulla tabella esterna che si propagano secondo una certa politica verso la tabella interna le violazioni possibili sono causate da modifiche del valore dellattributo riferito e dalla cancellazione di righe (es. modifiche dellattributo Provincia e cancellazione di righe da Vigile )

16 SQL 16 Politiche di reazione Specificata immediatamente dopo il vincolo di integrità consente di associare politiche diverse ai diversi eventi (delete, update) secondo la seguente sintassi: on < cascade | set null | set default | no action >

17 SQL 17 Reazioni per delete cascade : si propagano le cancellazioni set null : allattributo referente viene assegnato il valore nullo al posto del valore cancellato nella tabella set default : allattributo referente viene assegnato il valore di default al posto del valore cancellato nella tabella esterna no action : la cancellazione non viene consentita

18 SQL 18 Reazioni per update cascade : il nuovo valore valore viene propagato nellaltra tabella set null : allattributo referente viene assegnato il valore nullo al posto del valore modificato nella tabella set default : allattributo referente viene assegnato il valore di default al posto del valore modificato nella tabella esterna no action : lazione di modifica non viene consentita

19 SQL 19 Modifiche degli schemi Fornisce primitive per la manipolazione di schemi che permettono di modificare gli schemi: alter domain alter table drop domain drop table...

20 SQL 20 Dizionario dei Dati Tutti i DBMS relazionali gestiscono le descrizioni delle tabelle presenti nella basi di dati mediante una struttura relazionale, cioè mediante tabelle. La base di dati contiene due tipi di tabelle: –quelle contente i dati, e –quelle contenente i metadati (dati che descrivono dati), dette il catalogo della base di dati oppure il dizionario dei dati I comandi di definizione e modifica dello schema manipolano il dizionario dei dati

21 SQL 21 SELECT, sintassi select AttrExpr [ [ as ] Alias ] {, AttrExpr [ [ as ] Alias ] } from Tabella [ [ as ] Alias ] {, Tabella [ [ as ] Alias ] } [ where Condizione ] le tre parti vengono di solito chiamate –target list –clausola from –clausola where seleziona tra le righe che appartengono al prodotto cartesiano delle tabelle elencate nella clausola from quelle che soddisfano la condizione espressa nellargomento della clausola where

22 SQL 22

23 SQL 23 Selezione e proiezione Nome e reddito delle persone con meno di trenta anni select nome, reddito from persone where eta < 30

24 SQL 24 SELECT, abbreviazioni data una relazione R su A e B select * from R equivale (intutivamente) a select X.A AS A, X.B AS B from R X where true

25 SQL 25

26 SQL 26 Selezione, senza proiezione select * from Impiegato where Cognome = 'Rossi

27 SQL 27 Espressioni nella target list select Stipendio/12 as StipendioMensile from Impiegato where Cognome = 'Bianchi'

28 SQL 28 Disgiunzione select Nome, Cognome from Impiegato where Dipart = 'Amministrazione' or Dipart = 'Produzione'

29 SQL 29 Condizione complessa select Nome from Impiegato where Cognome = 'Rossi' and (Dipart = 'Amministrazione' or Dipart = 'Produzione')

30 SQL 30 Condizione LIKE Gli impiegati che hanno un cognome che ha una 'o' in seconda posizione e finisce per 'i'. select * from Impiegato where Cognome like '_o%i'

31 SQL 31 Gestione dei valori nulli Gli impiegati che hanno o potrebbero avere uno stipendio minore di 50 milioni select * from Impiegato where Stipendio < 50 or Stipendio is null

32 SQL 32 Selezione, proiezione e join I padri di persone che guadagnano più di venti milioni select distinct padre from persone, paternita where figlio = nome and reddito > 20

33 SQL 33 Proiezione, senza selezione select Nome, Cognome from Impiegato

34 SQL 34 Proiezione: duplicati select Cognome from Impiegato select distinct Cognome from Impiegato

35 SQL 35 Join naturale Padre e madre di ogni persona select paternita.figlio, padre, madre from maternita, paternita where paternita.figlio = maternita.figlio

36 SQL 36 Join di una relazione con se stessa Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre select f.nome, f.reddito, p.reddito from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and f.reddito > p.reddito

37 SQL 37 Ridenominazione del risultato Le persone che guadagnano più dei rispettivi padri; mostrare nome, reddito e reddito del padre select figlio, f.reddito as reddito, p.reddito as redditoPadre from persone p, paternita, persone f where p.nome = padre and figlio = f.nome and f.reddito > p.reddito

38 SQL 38 SELECT, con join esplicito, sintassi select AttrExpr [ [ as ] Alias ] {,AttrExpr [ [ as ] Alias ] } from Tabella [ [ as ] Alias ] {[ TipoJoin ] join Tabella [ [ as ] Alias ] on CondDiJoin },... [ where AltraCondizione ]

39 SQL 39 Join esplicito Padre e madre di ogni persona select madre, paternita.figlio, padre from maternita join paternita on paternita.figlio = maternita.figlio

40 SQL 40 Ulteriore estensione: join naturale Padre e madre di ogni persona select madre, paternita.figlio, padre from maternita natural join paternita select madre, paternita.figlio, padre from maternita join paternita on paternita.figlio = maternita.figlio

41 SQL 41 Join

42 SQL 42 Join esplicito select I.Nome, Cognome, Citta from Impiegato I join Dipartimento D on Dipart = D.Nome

43 SQL 43 Ordinamento del risultato order by AttrDiOrdinamento [ asc | desc ] {, AttrDiOrdinamento [ asc | desc ] } select Cognome, Nome, Stipendio from Impiegato where Dipart like 'Amm%' order by Stipendio desc, Cognome

44 SQL 44 Necessità di operatori su tuple tutte le condizioni dellalgebra vengono valutate su una tupla alla volta la condizione è sempre un predicato che viene valutato su ciascuna tupla indipedentemente da tutte le altre se volessi contare il numero di impiegati di un certo dipartimento a partire da una relazione Impiegato come si fa? occorre introdurre degli operatori che consentono di valutare proprietà che dipendono da insiemi di tuple questi operatori sono detti operatori aggregati

45 SQL 45 Operatori aggregati select count(*) AS NumeroImpiegati from Impiegato where Dipart = 'Produzione' loperatore aggregato ( count ) viene applicato al risultato dellinterrogazione: select * from Impiegato where Dipart = 'Produzione'

46 SQL 46 COUNT: sintassi count ( ) select count(Stipendio) as NumeroStipendi from Impiegato select count(distinct Stipendio) as StipendiDiversi from Impiegato

47 SQL 47 COUNT e valori nulli select count(*) as NumeroImpiegati from Impiegato select count(Stipendio) as NumeroStipendi from Impiegato

48 SQL 48 Somma, media, massimo, minimo ( [ distinct | all ] AttrEspr ) Totale degli stipendi del dipartimento amministrazione select sum(Stipendio) as TotaleStipendi from Impiegato where Dipart = 'Amministrazione' escludono opportunamente i valori nulli

49 SQL 49 Join e operatore aggregato Il massimo stipendio tra quelli degli impiegati che lavorano in un dipartimento con sede a Milano select max(Stipendio) from Impiegato, Dipartimento D where Dipart = D.Nome and Citta = 'Milano' Nota: non abbiamo usato la as e lattributo nel risultato non ha nome

50 SQL 50 Operatori aggregati e target list uninterrogazione scorretta: select Cognome, Nome, max(Stipendio) from Impiegato, Dipartimento where Dipart = NomeDip and Citta = 'Milano di chi sarebbe il cognome? La target list deve essere omogenea

51 SQL 51 Interrogazioni con raggruppamento gli operatori aggregati vengono applicati ad un insieme di righe gli esempi visti operano su tutte le righe spesso esiste lesigenza di applicare operatori aggregati a distintamente ad insiemi di tuple in SQL loperatore group by ci consente di fare questo

52 SQL 52 Operatori aggregati e raggruppamenti Per ogni dipartimento, la somma degli stipendi select Dipart, sum(Stipendio) as SommaStipendi from Impiegato group by Dipart

53 SQL 53 Semantica di interrogazioni con operatori aggregati e raggruppamenti interrogazione senza group by e senza operatori aggregati: select Dipart, Stipendio from Impiegato

54 SQL 54 Semantica …, 2 poi si raggruppa e si applica loperatore aggregato a ciascun gruppo dopo group by dopo sum()as

55 SQL 55 Raggruppamento sbagliato select ufficio from impiegato group by dipart Ad ogni valore ( e quindi gruppo) di dipart possono corrispondere più valori di ufficio. Quale scegliere?

56 SQL 56 importante! nella clausola select può comparire solo un sottoinsieme S degli attributi utilizzati nella clausola group by in questo modo, ciascuna tupla sugli attributi in S è associata ad un unico valore del gruppo E una condizione molto restrittiva. interrogazione scorretta: select dipart, count (*), d.città from impiegato i join dipartimento d on i.dipart=d.nome group by dipart corretta: select dipart, count (*), d.città from impiegato i join dipartimento d on i.dipart=d.nome group by dipart, città

57 SQL 57 Condizioni sui gruppi I dipartimenti che spendono più di 100 milioni in stipendi select Dipart, sum(Stipendio) as SommaStipendi from Impiegati group by Dipart having sum(Stipendio) > 100

58 SQL 58 WHERE o HAVING? I dipartimenti per cui la media degli stipendi degli impiegati che lavorano nell'ufficio 20 è superiore a 25 milioni select Dipart from Impiegato where Ufficio = 20 group by Dipart having avg(Stipendio) > 25

59 SQL 59 Sintassi, riassumiamo SelectSQL ::= select ListaAttributiOEspressioni from ListaTabelle [ where CondizioniSemplici ] [ group by ListaAttributiDiRaggruppamento ] [ having CondizioniAggregate ] [ order by ListaAttributiDiOrdinamento ]

60 SQL 60 Unione, intersezione e differenza la sintassi select-from-where da sola non permette di fare unioni; serve un costrutto esplicito: SelectSQL { [ all ] SelectSQL } select Nome from Impiegato union select Cognome as Nome from Impiegato i duplicati vengono eliminati (a meno che si usi all ) (anche dalle proiezioni)

61 SQL 61 Interrogazioni nidificate le condizioni atomiche esprimibili nella clausola WHERE permettono anche –il confronto fra un attributo (o più, vedremo poi) e il risultato di una sottointerrogazione –quantificazioni esistenziali

62 SQL 62 Interrogazioni nidificate, sintassi ConfrontoConNidificazione :: = Scalare OpConfronto [ any | all ] ( SelectAttributoSingolo ) | exists ( SelectStar ) senza any o all, il risultato della SelectAttributoSingolo deve essere un solo valore v.A any Select... (risp. all ) è vero se v.A è in relazione con almeno uno (risp. con tutti) dei valori del risultato della Select = any puo essere abbreviato con in exists( SelectStar ) è vero se il risultato della sottoespressione non è vuoto.

63 SQL 63 Interrogazioni nidificate Gli impiegati che lavorano in dipartimenti di Roma select * from Impiegato where Dipart = any (select Nome from Dipartimento where Citta = 'Roma')

64 SQL 64 Nome e reddito del padre di Mario select Nome, Reddito from Persone where Nome = (select Padre from Paternita where Figlio = 'Mario') select Nome, Reddito from Persone, Paternita where Nome = Padre and Figlio = 'Mario'

65 SQL 65 Interrogazioni nidificate, commenti La prima versione di SQL prevedeva solo la forma nidificata (o strutturata), con una sola relazione in ogni clausola FROM. Il che è insoddisfacente: –la dichiaratività è limitata –non si possono includere nella target list attributi di relazioni nei blocchi interni La forma nidificata è meno dichiarativa, ma talvolta più leggibile (richiede meno variabili) La forma piana e quella nidificata possono essere combinate Le sottointerrogazioni non possono contenere operatori insiemistici (lunione si fa solo al livello esterno); la limitazione non è significativa

66 SQL 66 Nome e reddito dei padri di persone che guadagnano più di 20 milioni" select Nome, Reddito from Persone where Nome in (select Padre from Paternita where Figlio =any (select Nome from Persone where Reddito > 20)) select distinct P.Nome, P.Reddito from Persone P, Paternita, Persone F where P.Nome = Padre and Figlio = F.Nome and F.Reddito > 20

67 SQL 67 Interrogazioni piatte o nidificate? select I1.Nome from Impiegato I1, Impiegato I2 where I1.Nome = I2.Nome and I2.Dipart = 'Produzione' select Nome from Impiegato where Nome = any (select Nome from Impiegato where Dipart = 'Produzione')

68 SQL 68 Le persone che hanno almeno un figlio select * from Persone where exists (select * from Paternita where Padre = Nome) or exists (select * from Maternita where Madre = Nome)

69 SQL 69 Interrogazioni nidificate, commenti, 2 regole di visibilità: –non è possibile fare riferimenti a variabili definite in blocchi più interni –se un nome di variabile è omesso, si assume riferimento alla variabile più vicina nota: in un blocco si può fare riferimento a variabili definite in blocchi più esterni; la semantica (prodotto cartesiano, selezione, proiezione) non funziona più, ne serve una più sofisticata: –linterrogazione interna va ripetuta una volta per ciascun valore della variabile


Scaricare ppt "SQL. 2 Structured Query Language è un linguaggio con varie funzionalità: –contiene sia il DDL sia il DML; esistono varie versioni dellSQL; vediamo gli."

Presentazioni simili


Annunci Google