Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Atzeni,Ceri,Paraboschi,Torlone
Basidida6
OriginariamenteStructuredQueryLanguage,ora "nomeproprio" Linguaggioconvariefunzionalit: DDLDataDeni6onLanguage(insiemedi comandiperladenizionedelloschemadellaBD relazionale) DMLDataManipula6onLanguage(insiemedi comandiperlamodicaelinterrogazione dellistanzadellaBD). Neesistonovarieversioni VediamogliaspeOessenziali,nonidePagli
2
SQL:"storia"
PrimapropostaSEQUEL(1974); PrimeimplementazioniinSQL/DSeOracle (1981) Dal1983ca."standarddifaPo" Standard(1986,poi1989einne1992,1999)
Denizionedeida6inSQL
IstruzioneCREATETABLE: Denisceunoschemadirelazioneenecrea unistanzavuota SpecicaunelencodiaPribu6checompongono loschemaeuninsieme(eventualmentevuoto)di vincolitrapiaPribu6. PerogniaPributosidenisceunnome,un dominioeeventualmenteuninsiemedivincoli chedevonoesseresoddisfaOdaivalori dellaPributo.
4
CREATETABLE:esempio
CREATETABLEDipar6mento( NomeCHAR(20)PRIMARYKEY, IndirizzoCHAR(50), CiPCHAR(20) )
CREATETABLE:esempio
CREATETABLEImpiegato( MatricolaCHAR(6)PRIMARYKEY, NomeCHAR(20)NOTNULL, CognomeCHAR(20)NOTNULL, DipartCHAR(20), S6pendioNUMERIC(9)DEFAULT0, FOREIGNKEY(Dipart)REFERENCES Dipar6mento(Nome), UNIQUE(Cognome,Nome) )
5 6
Domini
Dominielementari(predeni6dellinguaggio) Dominideni6dall'utenteapar6redaidomini predeni6.
Dominielementari
CaraPere:singolicaraPeriostringhe,anchedi lunghezzavariabile(siindicalalunghezzamassima) Bit:singolibooleaniostringhedibit Numerici(esaOeapprossima6) Data,ora,intervalliditempo IntrodoOinSQL:1999: Boolean(valoresingolobooleano) BLOB,CLOB(Binary/CharacterLargeObject):per grandiimmaginietes6
8
Denizionedidomini
IstruzioneCREATEDOMAIN:
Denisceundominio(semplice),u6lizzabilein denizionidirelazioni. DominiocaraPerizzatodaunnome,daundominio elementare(odenitodallutenteinprecedenza), dauneventualevaloredidefault,dauneventuale insiemedivincoli(insiemedicondizioniche devonoessererispePatedaivalorideldominio).
Denizionedidomini
LadichiarazionedinuovidominipermePedi associareuninsiemedivincoliadunnomedi dominio: importantequandosideveripetere(omodicare) lastessadenizionediaPributoindiversetabelle. Valoredidefault:valorechedeveassumere laPributoquandovieneinseritaunnuovarigain tabellasenzachesiaspecicatounvaloreper laPributostesso.
10
CREATEDOMAIN:esempio
CREATEDOMAINVoto ASSMALLINTDEFAULTNULL CHECK(value>=18ANDvalue<=30)
Vincoliintrarelazionali
NOTNULL UNIQUE:deniscechiavi PRIMARYKEY:deniscechiaveprimaria(una sola,implicaNOTNULL) CHECK,vedremopiavan6
11
12
UNIQUEePRIMARYKEY
DenibiliaPraversodueforme:
nelladenizionediunsingoloaPributo,seforma dasololachiave comeelementoseparatoelencandopiaPribu6
UNIQUE
ImponecheivaloridellaPributo(odegli aPribu6)sianouna(super)chiave:
righedieren6dellatabellanonpossonoaveregli stessivalori
13
14
ChiavisupiaPribu6,aPenzione
Nome CHAR(20)NOTNULL,
Cognome CHAR(20)NOTNULL, UNIQUE(Cognome,Nome),
PRIMARYKEY
ImponecheivaloridellaPributo(odegli aPribu6)sianolachiaveprimaria. Denibileunasolachiaveprimariaperogni tabella(mentreivincoliUNIQUEeNOTNULL sipossonousarepivolte). GliaPribu6chefannopartedellachiave primarianonpossonoassumereilvalorenullo (ladenizioneNOTNULLimplicita)
16
PRIMARYKEY:Esempio
PRIMARYKEY:alterna6ve
MatricolaCHAR(6)PRIMARYKEY Oppure MatricolaCHAR(6), , PRIMARYKEY(Matricola)
17 18
Nome CHAR(20),
CREATETABLE:esempio
CREATETABLEImpiegato( MatricolaCHAR(6)PRIMARYKEY, NomeCHAR(20)NOTNULL, CognomeCHAR(20)NOTNULL, DipartCHAR(15), S6pendioNUMERIC(9)DEFAULT0, FOREIGNKEY(Dipart)REFERENCES Dipar6mento(NomeDip), UNIQUE(Cognome,Nome) )
19
Vincoliinterrelazionali
CHECK,vedremopiavan6 REFERENCESeFOREIGNKEYpermePonodidenirevincolidi integritreferenziale: creanolegamitraivaloridiunaPributonellatabella corrente(interna)eivaloridiunaPributodiunaltra tabella(esterna) perognirigadellatabellailvaloredellaPributo(sediverso dalvalorenullo)deveesserepresentenellerighedella tabellaesternatraivaloridelcorrispondenteaPributo. Requisito:laPributodellatabellaesternadeveessere soggePoavincoloUNIQUE(ingenerePRIMARYKEY).
20
Vincoliinterrelazionali
Duesintassi: perunsingoloaPributo:REFERENCES sidevespecicarelatabellaesternaelaPributodella tabellaesternaalqualelaPributocorrentedeveessere legato. supiaPribu6:FOREIGNKEYdopoladenizionedegli aPribu6. sidevonoelencaregliaPribu6dellatabellacorrente coinvol6,cuisegueREFERENCESallatabellaesternaela denizionedeicorrisponden6aPribu6dellatabella esterna
21
Infrazioni
Codice 34321 53524 64521 73321 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 3295 9345 Prov Numero MI 39548K TO E39548 PR PR 839548 839548 Nome Luca Piero Mario Gino
Vigili
Matricola Cognome 3987 Rossi 3295 9345 7543 Neri Neri Mori
22
Infrazioni
Codice 34321 53524 64521 73321 Data 1/2/95 4/3/95 5/4/96 5/2/98 Vigile 3987 3295 3295 9345 Prov Numero MI 39548K TO E39548 PR PR 839548 839548 Nome Mario Mario Luca
23
CREATETABLE:esempio
CREATETABLEInfrazioni( CodiceCHAR(6)PRIMARYKEY, DataDATENOTNULL, VigileINTEGERNOTNULL REFERENCESVigili(Matricola), ProvinciaCHAR(2), NumeroCHAR(6), FOREIGNKEY(Provincia,Numero) REFERENCESAuto(Provincia,Numero) )
24
CREATESCHEMA
Perdenireunoschemadibasedida6come insiemedielemen6(tabelle,domini,viste, ecc.) CREATESCHEMA[NomeSchema] {defElemen6}
Modicadeglischemi
Permodicaredomini,schemiditabelle,vincoli,valori didefault,ecc.: ALTERDOMAIN ALTERTABLE Perrimuoveredomini,schemiditabelle,vincoli,valori didefault,ecc.: DROPDOMAIN DROPTABLE ...
25 26
DML
SQLesprimeleinterrogazioniinmododichiara6vo:si specicalobieOvodellinterrogazioneenonilmodo incuioPenerlo. SQLsicontrapponeailinguaggidiinterrogazione procedurali(comelalgebrarelazionale)incui linterrogazionespecicaipassidacompiereper estrarrelinformazionecercata. Inmol6sistemisiu6lizzanostrumen6diversidal codiceSQLperdenireloschemadellabasedida6.
SQL:operazionisuida6
Interrogazione:
SELECT
Permodicareilcontenutodellabasedida6 (listanzadellabasedida6):
INSERT,DELETE,UPDATE
27
28
IstruzioneSELECT:versionebase
SELECTListaAPribu6 FROMListaTabelle [WHERECondizione] clausolaSELECTdePa"targetlist" clausolaFROM clausolaWHERE
Maternit Madre Figlio Luisa Maria Luisa Luigi Anna Olga Anna Filippo Maria Andrea Maria Aldo Paternit Padre Sergio Luigi Luigi Franco Franco Figlio Franco Olga Filippo Andrea Aldo
Persone Nome Et Reddito Andrea 27 21 Aldo 25 15 Maria 55 42 Anna 50 35 Filippo 26 30 Luigi 50 40 Franco 60 20 Olga 30 41 Sergio 85 35 Luisa 75 87
30
29
Selezioneeproiezione:esempio
Nomeeredditodellepersoneconmenoditrenta anni
PROJNome,Reddito(SELEta<30(Persone))
Persone Nome Andrea Aldo Filippo Maria Anna Filippo Luigi Franco Olga Sergio Luisa Reddito Et Reddito 2721 21 2515 15 26 5530 42 30 50 35 26 30 50 40 60 20 30 41 85 35 75 87
32
SELECT:abbreviazioni
Si pu fare uso di alias per le tabelle per abbreviare i riferimenti ad esse.
selectnome,reddito frompersone whereeta<30 select p.nome as nome, p.reddito as reddito from persone p where p.eta < 30
Selezione,senzaproiezione
Nome,eteredditodellepersoneconmeno ditrentaanni
SELEta<30(Persone)
select* frompersone whereeta<30 Lasterisco rappresenta la selezione di tutti gli attributi della tabella persone.
34
alias
33
Proiezione,senzaselezione
select* frompersone whereeta<30 Equivalea: selectnome,et,reddito frompersone whereeta<30
35
NomeeredditodituPelepersone
PROJNome,Reddito(Persone)
selectnome,reddito frompersone
36
SELECT,abbreviazioni
R(A,B) select* fromR Equivale(intui6vamente)a selectX.AasA,X.BasB fromRX wheretrue
37
Condizionecomplessa:esempio
select* frompersone wherereddito>25 and(eta<30oreta>60)
38
Ges6onedeivalorinulli
Impiegati
Matricola Cognome Filiale 5998 7309 Rossi Neri Milano Roma 9553 5998 Bruni Neri Milano 9553 Bruni Milano Et 45 32 NULL 45
NULL
Gliimpiega6lacuieto potrebbeesseremaggioredi40
40
Selezione,proiezioneejoin
IstruzioniSELECTconunasolarelazionenella clausolaFROMpermePonodirealizzare:
selezioni,proiezioni,ridenominazioni
SQLealgebrarelazionale
R1(A1,A2)R2(A3,A4) selectR1.A1,R2.A4 fromR1,R2 whereR1.A2=R2.A3 prodoPocartesiano(FROM) selezione(WHERE) proiezione(SELECT)
41 42
ConpirelazioninellaclausolaFROMsi realizzanojoin(eprodoOcartesiani)
SQLealgebrarelazionale,2
R1(A1,A2) R2(A3,A4) select R1.A1, R2.A4 from R1, R2 where R1.A2 = R2.A3 PROJ A1,A4 (SELA2=A3 (R1 JOIN R2))
possonoesserenecessarieridenominazioni
nelprodoPocartesiano nellatargetlist
43
44
SQL:esecuzionedelleinterrogazioni
LeespressioniSQLsonodichiara6veenoine s6amovedendolaseman6ca Inpra6ca,iDBMSeseguonoleoperazioniin modoeciente,adesempio:
eseguonoleselezionialpipresto sepossibile,eseguonojoinenonprodoO cartesiani
SQL:specicadelleinterrogazioni
UninterrogazioneSQLvienepoipassata alloOmizzatoredelleinterrogazioni(queryop6mizer) chelariformulanellinguaggioproceduraleinternoal DBMS(nascostoallutente). LacapacitdeiDBMSdi"oOmizzare"le interrogazioni,rende(disolito)nonnecessario preoccuparsidell'ecienzaquandosispecica un'interrogazione percipiimportantepreoccuparsidellachiarezza (ancheperchcospidicilesbagliare)
45
46
Proiezione:aPenzione
cognome e filiale di tutti gli impiegati
Matricola Cognome Filiale Stipendio 7309 Neri Napoli 55 5998 Neri Milano 64 9553 Rossi Roma 44 5698 Rossi Roma 64 PROJ Cognome, Filiale (Impiegati)
Duplica6
InSQLsipossonoavereinunatabellapi righeuguali(dePeduplica6). Perleliminazionedeiduplica6occorre specicare: selectdis6nct
47
48
Cognome Filiale Neri Napoli Neri Milano Rossi Roma Rossi Roma
Maternit Madre Figlio Luisa Maria Luisa Luigi Anna Olga Anna Filippo Maria Andrea Maria Aldo Paternit Padre Sergio Luigi Luigi Franco Franco Figlio Franco Olga Filippo Andrea Aldo
Persone Nome Andrea Aldo Maria Anna Filippo Luigi Franco Olga Sergio Luisa Et Reddito 27 21 25 15 55 42 50 35 26 30 50 40 60 20 30 41 85 35 75 87
50
49
Selezione,proiezioneejoin
Ipadridipersonecheguadagnanopidiven6 milioni PROJPadre(paternita JOINFiglio=Nome SELReddito>20(persone)) select distinct padre from persone, paternita where figlio = nome and reddito > 20
Joinnaturale
Padreemadrediognipersona paternitaJOINmaternita selectpaternita.glio,padre,madre frommaternita,paternita wherepaternita.glio=maternita.glio
51
52
LepersonecheguadagnanopideirispeOvipadri; mostrarenome,redditoeredditodelpadre
PROJNome, Reddito, RP (SELReddito>RP (RENNP,EP,RP Nome,Eta,Reddito(persone) JOINNP=Padre (paternita JOIN Figlio =Nome persone))) 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
53
SELECT,conridenominazionedel risultato
selectglio,f.redditoasreddito, p.redditoasredditoPadre frompersonep,paternita,personef wherep.nome=padreandglio=f.nome and.reddito>p.reddito
54
Joinesplicito
Lacondizionedijoinnoncomparecome argomentodellaclausolawheremaviene spostatanellaclausolafromassociataalle tabellecoinvolteneljoin. Sintassi:
SELECT FROMTabella{JOINTabellaONCondDiJoin}, [WHEREAltraCondizione]
Joinesplicito:esempio
Padreemadrediognipersona selectpaternita.glio,padre,madre frommaternita,paternita wherepaternita.glio=maternita.glio selectpaternita.glio,padre,madre frommaternitajoinpaternitaon paternita.glio=maternita.glio
55
56
LepersonecheguadagnanopideirispeOvipadri;mostrare nome,redditoeredditodelpadre
Joinnaturale
Naturaljoin:neljointraduetabellesiconsidera comecondizioneimplicitaluguaglianzadegli aPribu6conlostessonome.
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 select f.nome, f.reddito, p.reddito from persone p join paternita on p.nome = padre join persone f on figlio = f.nome where f.reddito > p.reddito
57
58
Joinnaturale:esempio
selectmadre,paternita.glio,padre frommaternitajoinpaternitaon paternita.glio=maternita.glio selectmadre,paternita.glio,padre frommaternitanaturaljoinpaternita
Joinesterno:"outerjoin"
EsegueunjoinmantenendotuPelerigheinunao entrambeletabelle. Trevarian6deljoinesterno: le right full
59
60
10
Joinesterno:"outerjoin,esempio
Padree,senota,madrediognipersona selectpaternita.glio,padre,madre frompaternitalejoinmaternita onpaternita.glio=maternita.glio selectpaternita.glio,padre,madre frompaternitaleouterjoinmaternita onpaternita.glio=maternita.glio outere'opzionale
61
Outerjoin
selectpaternita.glio,padre,madre frommaternitajoinpaternita onmaternita.glio=paternita.glio selectpaternita.glio,padre,madre frommaternitaleouterjoinpaternita onmaternita.glio=paternita.glio selectpaternita.glio,padre,madre frommaternitafullouterjoinpaternita onmaternita.glio=paternita.glio
62
Ordinamentodelrisultato
Nomeeredditodellepersoneconmenodi trentaanniinordinealfabe6co selectnome,reddito frompersone whereeta<30 orderbynome
select nome, reddito from persone where eta < 30 order by nome Persone Nome Reddito Aldo 15 Andrea 21 Filippo 30
63
64
Operatoriaggrega6
Rappresentanounestensionedellalgebra relazionale. Nelleespressionidellatargetlistpossiamoavere ancheespressionichecalcolanovaloriapar6reda insiemidiennuple: conteggio,minimo,massimo,media,totale sintassibase(semplicata): Funzione([DISTINCT]*) Funzione([DISTINCT]APributo)
65
Operatoriaggrega6:COUNT
IlnumerodiglidiFranco selectcount(*)asNumFigliDiFranco fromPaternita wherePadre='Franco' loperatoreaggregato(count)vieneapplicatoalrisultato dellinterrogazione: select* fromPaternita wherePadre='Franco'
66
11
Paternit
Altrioperatoriaggrega6
SUM,AVG,MAX,MIN Mediadeireddi6deiglidiFranco selectavg(reddito) frompersonejoinpaternitaonnome=glio wherepadre='Franco'
NumFigliDiFranco 2
67
68
Unione,intersezioneedierenza
LaselectdasolanonpermePedifareunioni;serve uncostruPoesplicito: select union[all] select... Iduplica6vengonoelimina6(amenochesiusiall); anchedalleproiezioni!
69
Notazioneposizionale
SQLnonrichiedecheglischemisianoiden6ci(come richiestodallalgebrarelazionale)masolochesiano inparinumeroecondominicompa6bili. LacorrispondenzatragliaPribu6nonsibasasul nomemasullaposizionedegliaPribu6. SegliaPribu6hannonomediversonelladuetabelle ilrisultatoingenerenonhanomeoppureusai nomidegliaPribu6dellaprimatabella.
70
Notazioneposizionale:esempio
selectpadre,glio frompaternita union selectmadre,glio frommaternita
Sergio Luigi Luigi Franco Franco Luisa Luisa Anna Anna Maria Maria
71
Figlio Franco Olga Filippo Andrea Aldo Maria Luigi Olga Filippo Andrea Aldo
Padre Sergio Luigi Luigi Franco Franco Luisa Luisa Anna Anna Maria Maria
Figlio Franco Olga Filippo Andrea Aldo Maria Luigi Olga Filippo Andrea Aldo
72
12
Notazioneposizionale,2
selectpadre,glio frompaternita union selectglio,madre frommaternita CorrePa: selectpadre,glio frompaternita union selectmadre,glio frommaternita
Notazioneposizionale,3
Ancheconleridenominazioninoncambianiente: selectpadreasgenitore,glio frompaternita union selectglio,madreasgenitore frommaternita CorrePa: selectpadreasgenitore,glio frompaternita union selectmadreasgenitore,glio frommaternita
73 74
Dierenza
selectNome fromImpiegato except selectCognomeasNome fromImpiegato
Intersezione
selectNome fromImpiegato intersect selectCognomeasNome fromImpiegato equivalea selectI.Nome fromImpiegatoI,ImpiegatoJ whereI.Nome=J.Cognome
75
76
Interrogazioninidicate
LecondizioniatomichepermePonoanche
ilconfrontofraunaPributo(opi,vedremopoi)e ilrisultatodiunasoPointerrogazione
Interrogazioninidicate:esempio
nomeeredditodelpadrediFranco selectNome,Reddito fromPersone,Paternita whereNome=PadreandFiglio='Franco' selectNome,Reddito fromPersone whereNome=( selectPadre fromPaternita whereFiglio='Franco')
77 78
13
Interrogazioninidicate,commen6
Laformanidicatamenodichiara6va,ma talvoltapileggibile(richiedemenovariabili) Laformapianaequellanidicatapossono esserecombinate LesoPointerrogazioninonpossonocontenere operatoriinsiemis6ci(lunionesifasoloal livelloesterno);lalimitazionenon signica6va
Nomeeredditodeipadridipersonecheguadagnanopidi20 milioni selectdis6nctP.Nome,P.Reddito fromPersoneP,Paternita,PersoneF whereP.Nome=PadreandFiglio=F.Nome andF.Reddito>20 selectNome,Reddito fromPersone whereNomein(selectPadre fromPaternita whereFiglio=any(selectNome fromPersone whereReddito>20))
80
79
Nomeeredditodeipadridipersonecheguadagnanopidi20 milioni selectdis6nctP.Nome,P.Reddito fromPersoneP,Paternita,PersoneF whereP.Nome=PadreandFiglio=F.Nome andF.Reddito>20 selectNome,Reddito fromPersone whereNomein(selectPadre fromPaternita,Persone whereFiglio=Nome andReddito>20)
81
Vincolidiintegritgenerici:check
Specicadivincolidiennupla(eanchevincolipi complessi) check(Condizione) Sipossonousarelestessecondizioniusatecome argomentodiwhere
82
Check:esempio
createtableImpiegato ( Matricolacharacter(6), Cognomecharacter(20), Nomecharacter(20), Sessocharacternotnullcheck(sessoin(M,F)) S6pendiointeger, Superiorecharacter(6), check(S6pendio<=(selectS6pendio fromImpiegatoJ whereSuperiore=J.Matricola)
83
14