Il linguggio SQL: le si Sistemi Informtivi L-A Home Pge del corso: http://www-d.deis.unio.it/courses/sil-a/ Versione elettronic: SQL-si.pdf Sistemi Informtivi L-A SQL: crtteristiche generli SQL (Structured Query Lnguge) è il linguggio stndrd de fcto per DBMS relzionli, che riunisce in sé funzionlità di DDL, DML e DCL SQL è un linguggio dichirtivo (non-procedurle), ovvero non specific l sequenz di operzioni d compiere per ottenere il risultto SQL è relzionlmente completo, nel senso che ogni espressione dell lger relzionle può essere trdott in SQL inoltre SQL f molte ltre cose Il modello dei dti di SQL è sto su telle nziché relzioni: Possono essere presenti righe (tuple) duplicte In lcuni csi l ordine delle colonne (ttriuti) h rilevnz il motivo è prgmtico (ossi legto considerzioni sull efficienz) SQL dott l logic 3 vlori introdott con l Alger Relzionle SQL - Bsi Sistemi Informtivi L-A 1
SQL: stndrd e diletti Il processo di stndrdizzzione di SQL è inizito nel 1986 Nel 199 è stto definito lo stndrd SQL- (o SQL-9) d prte dell ISO (Interntionl Stndrds Orgniztion), e dell ANSI (Americn Ntionl Stndrds Institute), rispettivmente descritti nei documenti ISO/IEC 9075:199 e ANSI X3.135-199 (identici!) Del 1999 è lo stndrd SQL:1999, che rende SQL un linguggio computzionlmente completo (e quindi con istruzioni di controllo!) per il supporto di oggetti persistenti Allo stto ttule ogni sistem h ncor un suo diletto: support (in lrg prte) SQL- h già elementi di SQL:1999 h nche costrutti non stndrd Quello che vedimo è l prte più diffus SQL - Bsi Sistemi Informtivi L-A 3 Orgnizzzione del mterile L trttzione di SQL viene suddivis in più prti come segue: DDL di se e DML per gli opertori dell lger e per le operzioni di modific dei dti Per fre quello che si f nche in lger DML per il rggruppmento dei dti Per derivre informzioni di sintesi di dti DML con locchi innestti Per scrivere richieste complesse DDL per l definizione di viste e vincoli generici Per migliorre l qulità dei dti Utilizzo di SQL d linguggio ospite Per scrivere ppliczioni SQL - Bsi Sistemi Informtivi L-A 4
Dt Definition Lnguge (DDL) Il DDL di SQL permette di definire schemi di relzioni (o tle, telle), modificrli ed eliminrli Permette di inoltre di specificre vincoli, si livello di tupl (o rig ) che livello di tell Permette di definire nuovi domini, oltre quelli predefiniti Per vincoli e domini si può nche fre uso del DML (quindi inizilmente non si trttno completmente) Inoltre si possono definire viste ( view ), ovvero telle virtuli, e indici, per ccedere efficientemente i dti (questi ultimi li vedremo in SI L-B) Per qunto non trttto nel seguito si fcci riferimento l mterile di lortorio SQL - Bsi Sistemi Informtivi L-A 5 Crezione ed eliminzione di telle Medinte l istruzione CREATE TABLE si definisce lo schem di un tell e se ne cre un istnz vuot Per ogni ttriuto v specificto il dominio, un eventule vlore di defult e eventuli vincoli Infine possono essere espressi ltri vincoli livello di tell Medinte l istruzione DROP TABLE è possiile eliminre lo schem di un tell (e conseguentemente l corrispondente istnz) DROP TABLE Imp SQL - Bsi Sistemi Informtivi L-A 6 3
Definizione di telle: esempio CREATE TABLE Imp ( CodImp chr(4) PRIMARY KEY, CF chr(16) NOT NULL UNIQUE, -- chive Cognome vrchr(60) NOT NULL, Nome vrchr(30) NOT NULL, Sede chr(3) REFERENCES Sedi(Sede), -- FK Ruolo chr(0) DEFAULT Progrmmtore, Stipendio int CHECK (Stipendio > 0), UNIQUE (Cognome, Nome) -- chive ) CREATE TABLE Prog ( CodProg chr(3), Citt vrchr(40), PRIMARY KEY (CodProg,Citt) ) SQL - Bsi Sistemi Informtivi L-A 7 Vlori nulli e vlori di defult Per vietre l presenz di vlori nulli, è sufficiente imporre il vincolo NOT NULL CF chr(16) NOT NULL, Per ogni ttriuto è inoltre possiile specificre un vlore di defult, che verrà usto se ll tto dell inserimento di un tupl non viene fornito esplicitmente un vlore per l ttriuto reltivo Ruolo chr(0) DEFAULT Progrmmtore SQL - Bsi Sistemi Informtivi L-A 8 4
Chivi L definizione di un chive vviene esprimendo un vincolo UNIQUE, che si può specificre in line, se l chive consiste di un singolo ttriuto CF chr(16) UNIQUE, o dopo ver dichirto tutti gli ttriuti, se l chive consiste di uno o più ttriuti: UNIQUE(Cognome,Nome) Ovvimente, specificre sree molto più restrittivo UNIQUE(Cognome), UNIQUE(Nome) SQL - Bsi Sistemi Informtivi L-A 9 Chivi primrie L definizione dell chive primri di un tell vviene specificndo un vincolo PRIMARY KEY, o in line o come vincolo di tell CodImp chr(4) PRIMARY KEY PRIMARY KEY (CodProg,Citt) V osservto che: L specific di un chive primri non è oligtori Si può specificre l mssimo un chive primri per tell Non è necessrio specificre NOT NULL per gli ttriuti dell primry key In DB è necessrio specificre il vincolo NOT NULL si per definire chivi si per definire chivi primrie! SQL - Bsi Sistemi Informtivi L-A 10 5
Chivi strniere ( foreign key ) L definizione di un foreign key vviene specificndo un vincolo FOREIGN KEY, e indicndo qule chive viene referenzit Sede chr(3) REFERENCES Sedi(Sede) Ovvero FOREIGN KEY (Sede) REFERENCES Sedi(Sede) Nell esempio, Imp è dett tell di riferimento e Sedi tell di destinzione (nlog terminologi per gli ttriuti coinvolti) Le colonne di destinzione devono essere un chive dell tell destinzione (non necessrimente l chive primri) Se si omettono gli ttriuti destinzione, vengono ssunti quelli dell chive primri Sede chr(3) REFERENCES Sedi SQL - Bsi Sistemi Informtivi L-A 11 Vincoli generici ( check constrint ) Medinte l clusol CHECK è possiile esprimere vincoli di tupl ritrri, sfruttndo tutto il potere espressivo di SQL L sintssi è: CHECK (<condizione>) Il vincolo è violto se esiste lmeno un tupl che rende fls l <condizione>. Pertnto Stipendio int CHECK (Stipendio > 0), non permette tuple con stipendio negtivo, m mmette vlori nulli per l ttriuto Stipendio Se CHECK viene espresso livello di tell (nziché nell definizione dell ttriuto) è possiile fre riferimento più ttriuti dell tell stess CHECK (ImportoLordo = Netto + Ritenute) In DB il CHECK può usre solo condizioni vlutili sull singol tupl SQL - Bsi Sistemi Informtivi L-A 1 6
Vincoli con nomi A fini dignostici (e di documentzione) è spesso utile spere qule vincolo è stto violto seguito di un zione sul DB A tle scopo è possiile ssocire dei nomi i vincoli, d esempio: Stipendio int CONSTRAINT StipendioPositivo CHECK (Stipendio > 0), CONSTRAINT ForeignKeySedi FOREIGN KEY (Sede) REFERENCES Sedi SQL - Bsi Sistemi Informtivi L-A 13 Modific di telle Medinte l istruzione ALTER TABLE è possiile modificre lo schem di un tell, in prticolre: Aggiungendo ttriuti Aggiungendo o rimuovendo vincoli ALTER TABLE Imp ADD COLUMN Sesso chr(1) CHECK (Sesso in ( M, F )) ADD CONSTRAINT StipendioMx CHECK (Stipendio < 4000) DROP CONSTRAINT StipendioPositivo DROP UNIQUE(Cognome,Nome); Se si ggiunge un ttriuto con vincolo NOT NULL, isogn prevedere un vlore di defult, che il sistem ssegnerà utomticmente tutte le tuple già presenti ADD COLUMN Istruzione chr(10) NOT NULL DEFAULT Lure SQL - Bsi Sistemi Informtivi L-A 14 7
Dt Mnipultion Lnguge (DML) Le istruzioni principli del DML di SQL sono SELECT INSERT DELETE UPDATE esegue interrogzioni (query) sul DB inserisce nuove tuple nel DB cncell tuple dl DB modific tuple del DB INSERT può usre il risultto di un query per eseguire inserimenti multipli DELETE e UPDATE possono fre uso di condizioni per specificre le tuple d cncellre o modificre SQL - Bsi Sistemi Informtivi L-A 15 DB di riferimento per gli esempi Imp Sedi CodImp Nome Sede Ruolo Stipendio Sede Responsile Citt E001 Rossi Anlist 000 Biondi Milno E00 Verdi Sistemist 1500 Mori Bologn E003 Binchi Progrmmtore 1000 S03 Fulvi Milno E004 Gilli S03 Progrmmtore 1000 E005 E006 E007 E008 Neri Grigi Violetti Arnci Anlist Sistemist Progrmmtore Progrmmtore 500 1100 1000 100 Prog CodProg P01 P01 Citt Milno Bologn P0 Bologn SQL - Bsi Sistemi Informtivi L-A 16 8
L istruzione SELECT È l istruzione che permette di eseguire interrogzioni (query) sul DB L form di se è: SELECT A1,A,..,Am FROM R1,R,..,Rn WHERE <condizione> ovvero: SELECT (o TARGET) list clusol FROM clusol WHERE (cos si vuole come risultto) (d dove si prende) (che condizioni deve soddisfre) SQL - Bsi Sistemi Informtivi L-A 17 SELECT su singol tell Codice, nome e ruolo dei dipendenti dell sede SELECT CodImp, Nome, Ruolo WHERE Sede = Si ottiene in questo modo: CodImp E001 E003 E006 E007 L clusol FROM dice di prendere l tell IMP Nome Rossi Binchi Sistemist L clusol WHERE dice di prendere solo le tuple per cui Sede= Infine, si estrggono i vlori degli ttriuti (o colonne ) nell SELECT list Grigi Violetti Ruolo Anlist Progrmmtore Progrmmtore Equivle π CodImp,Nome,Ruolo (σ Sede = (Imp)) SQL - Bsi Sistemi Informtivi L-A 18 9
SELECT senz proiezione Se si vogliono tutti gli ttriuti: SELECT CodImp, Nome, Sede, Ruolo, Stipendio WHERE Sede = si può revire con: SELECT * WHERE Sede = SQL - Bsi Sistemi Informtivi L-A 19 SELECT senz condizione Se si vogliono tutte le tuple: SELECT CodImp, Nome, Ruolo Quindi SELECT * restituisce tutt l istnz di Imp SQL - Bsi Sistemi Informtivi L-A 0 10
Telle vs Relzioni Il risultto di un query SQL può contenere righe duplicte: SELECT Ruolo WHERE Sede = Ruolo Anlist Progrmmtore Sistemist Progrmmtore Per eliminrle si us l opzione DISTINCT nell SELECT list SELECT DISTINCT Ruolo WHERE Sede = Ruolo Anlist Progrmmtore Sistemist SQL - Bsi Sistemi Informtivi L-A 1 Espressioni nell clusol SELECT L SELECT list può contenere non solo ttriuti, m nche espressioni: SELECT CodImp, Stipendio*1 WHERE Sede = CodImp E001 E003 E006 E007 4000 1000 1300 1000 Si noti che in questo cso l second colonn non h un nome SQL - Bsi Sistemi Informtivi L-A 11
Ridenominzione delle colonne Ad ogni elemento dell SELECT list è possiile ssocire un nome picere: SELECT CodImp AS Codice, Stipendio*1 AS StipendioAnnuo Codice StipendioAnnuo WHERE Sede = E001 E003 E006 E007 4000 1000 1300 1000 L prol chive AS può nche essere omess: SELECT CodImp Codice,... SQL - Bsi Sistemi Informtivi L-A 3 Pseudonimi Per chirezz, ogni nome di colonn può essere scritto prefissndolo con il nome dell tell: SELECT Imp.CodImp AS Codice, Imp.Stipendio*1 AS StipendioAnnuo WHERE Imp.Sede = e si può nche usre uno pseudonimo (lis) in luogo del nome dell tell SELECT I.CodImp AS Codice, I.Stipendio*1 AS StipendioAnnuo I -- oppure Imp AS I WHERE I.Sede = SQL - Bsi Sistemi Informtivi L-A 4 1
Opertore LIKE L opertore LIKE, medinte le wildcrd _ (un crttere ritrrio) e % (un string ritrri), permette di esprimere dei pttern su stringhe Nomi degli impiegti che finiscono con un i e hnno un i in second posizione SELECT Nome WHERE Nome LIKE _i%i Nome Binchi Gilli Violetti SQL - Bsi Sistemi Informtivi L-A 5 Opertore BETWEEN L opertore BETWEEN permette di esprimere condizioni di pprtenenz un intervllo Nome e stipendio degli impiegti che hnno uno stipendio compreso tr 1300 e 000 Euro (estremi inclusi) SELECT Nome, Stipendio WHERE Stipendio BETWEEN 1300 AND 000 Nome Rossi Verdi Stipendio 000 1500 SQL - Bsi Sistemi Informtivi L-A 6 13
Opertore IN L opertore IN permette di esprimere condizioni di pprtenenz un insieme Codici e sedi degli impiegti delle sedi e S03 SELECT CodImp, Sede WHERE Sede IN (, S03 ) Lo stesso risultto si ottiene scrivendo: CodImp E00 E004 E005 E008 Sede S03 SELECT CodImp, Sede WHERE Sede = OR Sede = S03 SQL - Bsi Sistemi Informtivi L-A 7 Vlori nulli Il trttmento dei vlori nulli si s su qunto già visto in lger relzionle, quindi SELECT CodImp WHERE Stipendio > 1500 OR Stipendio <= 1500 restituisce solo CodImp E001 E00 E003 E005 Imp CodImp E001 E00 E003 E004 E005 E006 E007 E008 Sede S03 Stipendio 000 1500 1000 NULL 500 NULL 1000 100 E007 E008 SQL - Bsi Sistemi Informtivi L-A 8 14
Logic 3 vlori in SQL Nel cso di espressioni complesse, SQL ricorre ll logic 3 vlori: vero (V), flso (F) e sconosciuto (?) SELECT CodImp, Sede, Stipendio WHERE (Sede = S03 ) OR (Stipendio > 1500) CodImp E001 E004 E005 Sede S03 Stipendio 000 NULL 500 Per verificre se un vlore è NULL si us l opertore IS NOT (A IS NULL) si scrive nche A IS NOT NULL SELECT CodImp WHERE Stipendio IS NULL CodImp E004 E006 SQL - Bsi Sistemi Informtivi L-A 9 Ordinmento del risultto Per ordinre il risultto di un query secondo i vlori di un o più colonne si introduce l clusol ORDER BY, e per ogni colonn si specific se l ordinmento è per vlori scendenti (ASC, il defult) o discendenti (DESC) SELECT Nome, Stipendio ORDER BY Stipendio DESC, Nome Nome Neri Rossi Verdi Arnci Grigi Binchi Gilli Violetti Stipendio 500 000 1500 100 1100 1000 1000 1000 SQL - Bsi Sistemi Informtivi L-A 30 15
Interrogzioni su più telle L interrogzione SELECT I.Nome, I.Sede, S.Citt I, Sedi S WHERE I.Sede = S.Sede AND I.Ruolo = Progrmmtore si interpret come segue: Si esegue il prodotto Crtesino di Imp e Sedi Si pplicno i predicti dell clusol WHERE Si estrggono le colonne dell SELECT list Il predicto I.Sede = S.Sede è detto predicto di join, in qunto stilisce il criterio con cui le tuple di Imp e di Sedi devono essere cominte SQL - Bsi Sistemi Informtivi L-A 31 Interrogzioni su più telle: risultto Dopo vere pplicto il predicto I.Sede = S.Sede: I.CodImp I.Nome I.Sede I.Ruolo I.Stipendio S.Sede S.Responsile S.Citt E001 Rossi Anlist 000 Biondi Milno E00 Verdi Sistemist 1500 Mori Bologn E003 Binchi Progrmmtore 1000 Biondi Milno E004 Gilli S03 Progrmmtore 1000 S03 Fulvi Milno E005 Neri Anlist 500 Mori Bologn E006 Grigi Sistemist 1100 Biondi Milno E007 Violetti Progrmmtore 1000 Biondi Milno E008 Arnci Progrmmtore 100 Mori Bologn SQL - Bsi Sistemi Informtivi L-A 3 16
Ridenominzione del risultto Se l SELECT list contiene o più colonne con lo stesso nome, è necessrio operre un ridenominzione per ottenere un output con tutte le colonne intestte SELECT I.Sede AS SedeE001, S.Sede AS AltrSede I, Sedi S WHERE I.Sede <> S.Sede AND I.CodImp = E001 SedeE001 AltrSede S03 SQL - Bsi Sistemi Informtivi L-A 33 Self Join L uso di lis è forzto qundo si deve eseguire un self-join Chi sono i nonni di Ann? Genitori G1 Genitore Figlio Luc Ann Mri Ann Giorgio Luc Silvi Mri Enzo Mri Genitori G Genitore Figlio Luc Ann Mri Ann Giorgio Luc Silvi Mri Enzo Mri SELECT G1.Genitore AS Nonno FROM Genitori G1, Genitori G WHERE G1.Figlio = G.Genitore AND G.Figlio = Ann SQL - Bsi Sistemi Informtivi L-A 34 17
Join espliciti Anziché scrivere i predicti di join nell clusol WHERE, è possiile costruire un joined tle direttmente nell clusol FROM SELECT I.Nome, I.Sede, S.Citt I JOIN Sedi S ON (I.Sede = S.Sede) WHERE I.Ruolo = Progrmmtore in cui JOIN si può nche scrivere INNER JOIN Altri tipi di join espliciti sono: LEFT [OUTER] JOIN RIGHT [OUTER] JOIN FULL [OUTER] JOIN NATURAL JOIN DB non support il join nturle SQL - Bsi Sistemi Informtivi L-A 35 Opertori insiemistici L istruzione SELECT non permette di eseguire unione, intersezione e differenz di telle Ciò che si può fre è cominre in modo opportuno i risultti di due istruzioni SELECT, medinte gli opertori UNION, INTERSECT, EXCEPT In tutti i csi gli elementi delle SELECT list devono vere tipi comptiili e gli stessi nomi se si vogliono colonne con un intestzione definit L ordine degli elementi è importnte (notzione posizionle) Il risultto è in ogni cso privo di duplicti, per mntenerli occorre ggiungere l opzione ALL: UNION ALL, INTERSECT ALL, EXCEPT ALL SQL - Bsi Sistemi Informtivi L-A 36 18
Opertori insiemistici: esempi (1) R A 1 1 3 B c S C SELECT A A FROM R 1 UNION SELECT C AS A 3 FROM S 4 1 1 3 4 B c c d SELECT A FROM R 1 UNION SELECT C 3 FROM S 4 SELECT A,B FROM R UNION SELECT B,C AS A FROM S Non corrett! SELECT B FROM R UNION ALL SELECT B FROM S B c c c d SQL - Bsi Sistemi Informtivi L-A 37 Opertori insiemistici: esempi () R A 1 1 B c SELECT B FROM R INTERSECT SELECT B FROM S B c SELECT B FROM S EXCEPT SELECT B FROM R B d 3 S C 1 1 3 B c c SELECT B FROM R INTERSECT ALL SELECT B FROM S B c SELECT B FROM R EXCEPT ALL SELECT B FROM S B 4 d SQL - Bsi Sistemi Informtivi L-A 38 19
Istruzioni di ggiornmento dei dti Le istruzioni che permettono di ggiornre il DB sono INSERT DELETE UPDATE inserisce nuove tuple nel DB cncell tuple dl DB modific tuple del DB INSERT può usre il risultto di un query per eseguire inserimenti multipli DELETE e UPDATE possono fre uso di condizioni per specificre le tuple d cncellre o modificre In ogni cso gli ggiornmenti rigurdno un sol relzione SQL - Bsi Sistemi Informtivi L-A 39 Inserimento di tuple: cso singolo È possiile inserire un nuov tupl specificndone i vlori INSERT INTO Sedi(Sede,Responsile,Citt) VALUES ( S04, Bruni, Firenze ) Ci deve essere corrispondenz tr ttriuti e vlori L list degli ttriuti si può omettere, nel qul cso vle l ordine con cui sono stti definiti Se l list non include tutti gli ttriuti, i restnti ssumono vlore NULL (se mmesso) o il vlore di defult (se specificto) INSERT INTO Sedi(Sede,Citt) -- sede senz responsile VALUES ( S04, Firenze ) SQL - Bsi Sistemi Informtivi L-A 40 0
Inserimento di tuple: cso multiplo È possiile nche inserire le tuple che risultno d un query INSERT INTO SediBologn(SedeBO,Resp) SELECT Sede,Responsile FROM Sedi WHERE Citt = Bologn Vlgono ncor le regole viste per il cso singolo Gli schemi del risultto e dell tell in cui si inseriscono le tuple possono essere diversi, l importnte è che i tipi delle colonne sino comptiili SQL - Bsi Sistemi Informtivi L-A 41 Cncellzione di tuple L istruzione DELETE può fre uso di un condizione per specificre le tuple d cncellre DELETE FROM Sedi -- elimin le sedi di Bologn WHERE Citt = Bologn Che succede se l cncellzione port violre il vincolo di integrità referenzile? (d es.: che ccde gli impiegti delle sedi di Bologn?) lo vedimo tr minuti SQL - Bsi Sistemi Informtivi L-A 4 1
Modific di tuple Anche l istruzione UPDATE può fre uso di un condizione per specificre le tuple d modificre e di espressioni per determinre i nuovi vlori UPDATE Sedi SET Responsile = Bruni, Citt = Firenze WHERE Sede = UPDATE Imp SET Stipendio = 1.1*Stipendio WHERE Ruolo = Progrmmtore Anche l UPDATE può portre violre il vincolo di integrità referenzile SQL - Bsi Sistemi Informtivi L-A 43 Politiche di rezione Anziché lscire l progrmmtore il compito di grntire che fronte di cncellzioni e modifiche i vincoli di integrità referenzile sino rispettti, si possono specificre opportune politiche di rezione in fse di definizione degli schemi CREATE TABLE Imp ( CodImp chr(4) PRIMARY KEY, Sede chr(3),... FOREIGN KEY Sede REFERENCES Sedi ON DELETE CASCADE -- cncellzione in csct ON UPDATE NO ACTION -- modifiche non permesse Altre politiche: SET NULL e SET DEFAULT SQL - Bsi Sistemi Informtivi L-A 44
Rissumimo: Il linguggio SQL è lo stndrd de fcto per intergire con DB relzionli Si discost dl modello relzionle in qunto permette l presenz di tuple duplicte (telle nziché relzioni) L definizione delle telle permette di esprimere vincoli e nche di specificre politiche di rezione fronte di violzioni dell integrità referenzile L istruzione SELECT consiste nell su form se di 3 prti: SELECT, FROM e WHERE A queste si ggiunge ORDER BY, per ordinre il risultto (e ltre che vedremo) Per trttre i vlori nulli, SQL ricorre un logic 3 vlori (vero, flso e sconosciuto) SQL - Bsi Sistemi Informtivi L-A 45 3