Sei sulla pagina 1di 14

SQL

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

Eccezioneperilvalorenullochepu compariresurighediverse(siassumechei valorinullisianodiversitraloro)

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)

Nome CHAR(20)NOTNULLUNIQUE, Cognome CHAR(20)NOTNULLUNIQUE, Nonlastessacosa:nelprimocasosiimponeche noncisiano2righeconnomeecognomeuguali,nel secondo(pirestriOvo)siimponechenoncisiano pidiunavoltalostessonomeolostessocognome.


15

16

PRIMARYKEY:Esempio

PRIMARYKEY:alterna6ve
MatricolaCHAR(6)PRIMARYKEY Oppure MatricolaCHAR(6), , PRIMARYKEY(Matricola)
17 18

Nome CHAR(20),

Cognome CHAR(20), PRIMARYKEY(Cognome,Nome),

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

Auto Prov Numero Cognome


MI TO PR 39548K E39548 839548 Rossi Rossi Neri

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

selectnome,reddito frompersone proiezione whereeta<30 selezione


31

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

SEL Et > 40 OR Et IS NULL (Impiegati)

Gliimpiega6lacuieto potrebbeesseremaggioredi40 SEL Et > 40 OR Et IS NULL (Impiegati)


39

select * from impiegati where eta > 40 or eta is null

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

selectX.A1ASB1,... fromR1X,R2Y,R1Z whereX.A2=Y.A3AND...

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

select cognome,liale fromimpiega6

selectdis6nct cognome,liale fromimpiega6

Cognome Filiale Neri Napoli Neri Milano Rossi Roma Rossi Roma

Cognome Filiale Neri Napoli Neri Milano 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

select nome, reddito from persone where eta < 30 order by nome Persone Nome Reddito Aldo 15 Andrea 21 Filippo 30

Persone Nome Reddito Andrea 21 Aldo 15 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

Padre Sergio Luigi Luigi Franco Franco

Figlio Franco Olga Filippo Andrea Aldo

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

Potrebbero piacerti anche