linguaggio sql (1) - disco · sql come linguaggio di query le query scritte in sql esprimono le...
TRANSCRIPT
Linguaggio SQL (1)
• Il linguaggio SQL, acronimo di Structured Query Language e unlinguaggio per la definizione e la manipolazione dei dati, sviluppatooriginariamente presso il laboratorio IBM a San Jose (Calif.).
• E un linguaggio oggi usato in numerosi DBMS disponibili comeprodotti commerciali
• E stato definito uno standard noto come SQL-2 (noto anche comeSQL-92)
• Un nuovo standard, noto come SQL-3, e stato definito nel 1999.
• La maggior parte dei sistemi supporta le funzionalita di base dellostandard SQL-3 ed offrono estensioni proprietarie.
• Tra i DBMS che usano SQL ricordiamo: SQL/DS e DB2 (IBM), Ora-cle, SQL Server (Microsoft), Informix, Sybase, CA-Ingres (ComputerAssociates) ed Access.
Informatica Generale 1 sql.tex: Versione 1.0, aa 2006-2007
Linguaggio SQL (2)
Le istruzioni del linguaggio SQL si dividono in due categorie:
• Le istruzioni che consentono di costruire le relazioni, le quali per-mettono di specificare i nomi degli attributi e il loro dominio. Comevedremo SQL ha dei domini predefiniti. Esistono inoltre istruzioniche consentono di specificare i vincoli di integrita referenziale. Com-plessivamente questa parte del linguaggio viene detta Data DefinitionLanguage (DDL);
• Le istruzioni che implementano gli operatori dell’algebra relazionalee che consentono di scrivere le query. Tale parte del linguaggio enota come Data Manipulation Language (DML).
Informatica Generale 2 sql.tex: Versione 1.0, aa 2006-2007
Domini (1)
• I domini specificano il contenuto degli attributi;
• I domini in SQL sono suddivisi in 3 categorie: domini numerici,domini carattere e domini temporali
• I vari domini sono suddivisi in sottocategorie
Informatica Generale 3 sql.tex: Versione 1.0, aa 2006-2007
Il Domino Character
Il domino CHARACTER permette di definire attributi che conten-gono un singolo carattere o stringhe di caratteri di lunghezza massimapredefinita. La sintassi e:
character [(Lunghezza)]
dove Lunghezza e un numero intero che se compare deve essere tratonde ed indica il massimo numero di caratteri che puo contenere l’at-tributo. Se la parola chiave character non e seguita da alcun interoallora si assume che il dominio sia costituito da un singolo carattere.
• character (20)
• characterdefiniscono due domini contenenti rispettivamente tutte le parole (strin-ghe) di al massimo 20 caratteri e tutte le stringhe di al massimo 1carattere. ’rossi’, ’romanzo’ sono due costanti appartenenti alprimo dominio. Le costanti di un dominio character devono esserecomprese tra apici.
Informatica Generale 4 sql.tex: Versione 1.0, aa 2006-2007
Domini Numerici Esatti (1)
I domini numerici esatti permettono di definire attributi che contenego-no valori esatti interi o con parte frazionaria. Esistono quattro domini:
• integer, contiene tutti gli interi compresi tra -2147483648 e+2147483647;
• smallint, contiene tutti gli interi compresi tra -32768 e +32767;
• numeric [(precisione [,scala])], consente di definire domi-ni contenenti numeri positivi e negativi la cui quantita di cifre e datada precisione di cui quelle decimali sono date da scala. I para-metri precisione e scala sono opzionali e se non specificati as-sumono valori predefiniti dipendenti dal DBMS che si sta utilizzando(ad esempio precisione 30 e scala 6);
• decimal [(precisione [,scala])] come numeric, con la dif-ferenza che precisione e scala rappresentano le esigenze minimee il sistema potra fornire una rappresentazione con precisione o scalamaggiore.
Informatica Generale 5 sql.tex: Versione 1.0, aa 2006-2007
Domini Numerici Esatti (2)
Si osservi che i primi due domini contengono solo numeri interi e sonofissati dallo standard SQL. I domini numeric e decimal consentonoall’utente di definire insiemi di numeri positivi e negativi di grandezzaarbitraria e con un numero arbitrario di cifre decimali. Ad esempio
numeric (4,2)
definisce il dominio di tutti i numeri potitivi e negativi costituiticomplessivamente da al piu 4 cifre, di cui al massimo due dopo lavirgola.
Informatica Generale 6 sql.tex: Versione 1.0, aa 2006-2007
Domini Numerici Approssimati
Lo scopo di questi domini numerici e quello di simulare i numeri reali.Un calcolarore non puo rappresentare l’insieme dei reali, ma puo solotentare di approssimarli. Esistono due domini:
• double precision, occupano 8 byte e hanno fino a 15 cifredecimali significative;
• real, occupano 4 byte e hanno fino a 6 cifre decimali significative;
Informatica Generale 7 sql.tex: Versione 1.0, aa 2006-2007
Domini Temporali
I domini temporali permettono il trattamento di date, tempi e intervallidi tempo. Esistono quattro tipi di dominio:
• date, un attributo di dominio date contiene le date di calendarioin termini di giorno, mese, anno;
• time, un attributo di dominio time contiene gli istanti di unagiornata in termini di ore, minuti, secondi;
• timestamp, un attributo di dominio timestamp contiene sia la datache l’istante di tempo;
• interval, un attributo di dominio interval contiene intervalli ditempo, spesso generati per sottrazione da due attributi di tipo date,time o timestamp;
Il formato in cui sono espressi tempi e date dipende dal DBMS e dallasua configurazione, quindi ’1/8/1999’ e ’1999-01-08’ esprimonola stessa data e ’04:05:06’ ’040506’ esprimono lo stesso tempo.
Informatica Generale 8 sql.tex: Versione 1.0, aa 2006-2007
Creazione di Tabelle con SQL (1)
• La creazione di tabelle avviene tramite il comando di Create Table
• La sintassi di questo comando e molto articolata. Di seguito nepresentiamo una versione semplificata adatta ai nostri scopi:
CREATE TABLE NomeTabella(NomeColonna Dominio[,NomeColonna Dominio]...[, PRIMARY KEY (ListaDiNomiDiColonna)]
)
dove:
Informatica Generale 9 sql.tex: Versione 1.0, aa 2006-2007
Creazione di Tabelle con SQL (2)
• NomeTabella e il nome della relazione che viene creata;
• NomeColonna Dominio [,NomeColonna Dominio]... e l’elenco sepa-rato da virgole degli attributi, con relativo dominio, che fanno partedella relazione. Ogni tabella ha almeno una colonna;
• PRIMARY KEY specifica quali attributi fanno parte della chiaveprimaria. ListaDiNomiDiColonna e una lista separata da virgole dinomi di attributi. La chiave primaria non e obbligatoria.
Informatica Generale 10 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Creazione di Tabelle (1)
CREATE TABLE Impiegati(ImpId Integer,Nome Char(20),Mansione Char(10),Data-A Date,Stipendio Real,Premio-P Real,DipNum Integer,PRIMARY KEY (ImpId)
);
CREATE TABLE Docente(Id Char(7),Nome Char(20),Residenza Char(15),PRIMARY KEY (Id)
);Informatica Generale 11 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Creazione di Tabelle (2)
CREATE TABLE Studente(Id Char(6),Name Char(20),Residenza Char(15),Birthdate Date,PRIMARY KEY (Id)
);
CREATE TABLE Relatore(IdDoc Char(7),IdStud Char(6),PRIMARY KEY (IdDoc)
);
Informatica Generale 12 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Creazione di Tabelle (3)
CREATE TABLE Cittadino (Nome Char(15),Cognome Char(25),LuogoNascita Char(30),DataNascita Date,Residenza Char(30),NumCivico Smallint,Scala Smallint,
PRIMARY KEY (Nome,Cognome,LuogoNascita,DataNascita));
Informatica Generale 13 sql.tex: Versione 1.0, aa 2006-2007
SQL come Linguaggio di Query
Le query scritte in SQL esprimono le proprieta che il rusultato devesoddisfare e non il modo in cui ottenere tale risultato. In questo sensosi dice che SQL e un linguaggio dichiarativo.
Informatica Generale 14 sql.tex: Versione 1.0, aa 2006-2007
Le Tabelle su cui Lavoreremo
Impiegati:
ImpId Nome Mansione DataAss Stipendio PremioProd DipNum
7369 Rossi ingegnere 17-Dic-80 1600, 00 500, 00 207499 Andrei tecnico 20-Feb-81 800, 00 ? 307521 Bianchi tecnico 20-Feb-81 800, 00 100, 00 307566 Rosi dirigente 02-Apr-81 2975, 00 ? 207654 Martini segretaria 28-Set-81 800, 00 ? 307698 Blacchi dirigente 01-Mag-81 2850, 00 ? 307782 Neri ingegnere 01-Giu-81 2450, 00 200, 00 107788 Scotti segretaria 09-Nov-81 800, 00 ? 207839 Dare ingegnere 17-Nov-81 2600, 00 300, 00 107844 Turni tecnico 08-Set-81 1500, 00 ? 307876 Adami ingegnere 28-Set-81 1100, 00 500, 00 207900 Gianni ingegnere 03-Dic-81 1950, 00 ? 307902 Fordi segretaria 03-Dic-81 1000, 00 ? 207934 Milli ingegnere 23-Gen-82 1300, 00 150, 00 107977 Verdi dirigente 10-Dic-80 3000, 00 ? 10
Dipartimenti:
DipId NomeDip Ufficio Divisione Dirigente
10 Edilizia Civile 1100 D1 797720 Ricerche 2200 D1 756630 Edilizia Stradale 5100 D2 7698
Informatica Generale 15 sql.tex: Versione 1.0, aa 2006-2007
Le Tabelle su cui Lavoreremo
Studenti Matricola Cognome Nome101010 Rossi Mario254532 Verdi Giovanni356622 Blu Francesca312457 Gialli Marina201015 Rossi Giovanni
Esami Studente Voto Corso101010 22 A22254532 27 C12101010 30 C12312457 28 K09101010 28 K09
Corsi Id Nome DocenteA22 Analisi I PeanoC12 Fisica FermiD55 Informatica TuringK09 Chimica CurieA23 Analisi II Peano
Informatica Generale 16 sql.tex: Versione 1.0, aa 2006-2007
Prodotto Cartesiano con SQL
In SQL, il prodotto cartesiano di relazioni e ottenuto mediante ilcostrutto SELECT FROM. La sintassi del comando e:
SELECT *FROM NomeTabella [,NomeTabella]...
dove nella clausola FROM
NomeTabella [,NomeTabella]...
e un elenco di nomi di relazione create con il comando CREATE TA-BLE. La query SQL e quindi equivalente a fare il prodotto cartesianodelle tabelle elencate nella clausola FROM.
SELECT *FROM Corsi,Esami
Informatica Generale 17 sql.tex: Versione 1.0, aa 2006-2007
Prodotto Cartesiano con SQL (2)
• La query SQL costruisce la relazione corrispondente al prodottocartesiano delle relazioni elencate della clasusola FROM;
• l’elenco nella clausola FROM deve contenere almeno un elemento;
• nella clausola FROM uno stesso nome di relazione puo occorrereal piu una volta;
• a differenza di quanto avviene nell’algebra relazionale, SQL nominaogni attributo del cartesiano con il nome della relazione da cui l’attri-buto proviene, seguito da un punto, seguito dal nome dell’attributonella relazione di provenienza;
• a differenza di quanto avviene nell’algebra relazionale, SQL consen-te di costruire il cartesiano di relazioni aventi nomi di attributo incomune senza fare ricorso al renaming.
Informatica Generale 18 sql.tex: Versione 1.0, aa 2006-2007
Prodotto Cartesiano con SQL (3)
La seguente query SQL e corretta:
SELECT *FROM Studenti,Corsi
La seguente query SQL e scorretta:
SELECT *FROM Studenti,Corsi,Studenti
Informatica Generale 19 sql.tex: Versione 1.0, aa 2006-2007
Proiezione con SQL
In SQL la proiezione di una relazione e ottenuta mediante il costruttoSELECT FROM. La sintassi e:
SELECT NomeTabella.Attributo [,NomeTabella.Attributo]...FROM NomeTabella
dove nella clausola FROM
NomeTabella
e un nome di relazione creato con CREATE TABLE e nella clausolaSELECT
NomeTabella.Attributo [,NomeTabella.Attributo]...
e un elenco separato da virgole costituito dal nome della relazione nellaclausola FROM, seguito da un punto, seguito dal nome di uno degliattributi della relazione nella clausola FROM. L’elenco nella clausolaSELECT deve contenere almeno un elemento.
Informatica Generale 20 sql.tex: Versione 1.0, aa 2006-2007
Proiezione con SQL
La query SQL permette di ottenere una tabella avente come colonnesolo quelle elencate nella clausola SELECT
SELECT Impiegati.Nome,Impiegati.Mansione,Impiegati.DipNumFROM Impiegati
Informatica Generale 21 sql.tex: Versione 1.0, aa 2006-2007
Selezione con SQL
Con SQL e possibile eliminare alcine righe di una tabella aggiungendola clausola WHERE a SELECT FROM. La sintassi e la seguente:
SELECT *FROM NomeTabellaWHERE Condizione
dove nella clausola WHERE
Condizione
Le condizioni si compongono usando AND, OR e NOT.
• La query seleziona solo le righe della tabella nella clausola FROMche soddisfano il predicato nella clausola WHERE.
Informatica Generale 22 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Selezione (1)
Selezionare gli impiegati che hanno uno stipendio maggiore di 2000
σStipendio>2000(Impiegati)
SELECT * FROM ImpiegatiWHERE Impiegati.Stipendio> 2000;
ImpID Nome Mansione DataA Stipendio PremioP DipID7566 Rosi dirigente 02-Apr-81 2975, 00 ? 207698 Blacchi dirigente 01-Mag-81 2850, 00 ? 307782 Neri ingegnere 01-Giu-81 2450, 00 200, 00 107839 Dare ingegnere 17-Nov-81 2600, 00 300, 00 107977 Verdi dirigente 10-Dic-80 3000, 00 ? 10
Informatica Generale 23 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Selezione (2)
SELECT *FROM ImpiegatiWHERE Impiegati.Stipendio>2000 AND Impiegati.Stipendio<3000
SELECT *FROM ImpiegatiWHERE Impiegati.Mansione=’Dirigente’ AND 3*Impiegati.Stipendio<2000
Informatica Generale 24 sql.tex: Versione 1.0, aa 2006-2007
Cartesiano e Proiezione con SQL
In SQL e possibile costruire la proiezione del cartesiano di relazioni. Lasintassi e:
SELECT NomeTabella.Attributo [,NomeTabella.Attributo]...FROM NomeTabella [,NomeTabella]...
dove nella clausola FROM
NomeTabella [,NomeTabella]...
e un elenco di nomi di relazione create con il comando CREATETABLE, e nella clausola SELECT
NomeTabella.Attributo [,NomeTabella.Attributo]...
e un elenco separato da virgole costituito dal nome di una delle relazioninella clausola FROM, seguito da un punto, seguito dal nome di unodegli attributi della relazione a sinistra del punto.
Informatica Generale 25 sql.tex: Versione 1.0, aa 2006-2007
Cartesiano e Proiezione con SQL (2)
• La query SQL costruisce il prodotto cartesiano delle tabelle nellaclausola FROM e della relazione cosı ottenuta proietta solo lecolonne specificate nella lista in corrispondenza di SELECT.
• valgono le osservazioni fatte precedentemente sul cartesiano eproiezione di relazioni.
Informatica Generale 26 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Cartesiano e Proiezione
La seguente query SQL e corretta:
SELECT Corsi.Nome, Corsi.DocenteFROM Studenti,Corsi;
La seguente query SQL non e corretta:
SELECT Studenti.Docente, Corsi.Nome, Corsi.DocenteFROM Studenti,Corsi;
perche Studenti non possiede un attributo chiamato Docente;
La seguente query SQL non e corretta:
SELECT Esami.Voto, Corsi.Nome, Corsi.DocenteFROM Studenti,Corsi;
perche Esami non e elencata nella clausola FROM;
Informatica Generale 27 sql.tex: Versione 1.0, aa 2006-2007
SELECT FROM WHERE
Con SQL la query piu tipica e quella che usa il costrutto SELECTFROM WHERE. La sintassi e la seguente:
SELECT NomeTabella.Attributo [,NomeTabella.Attributo]...FROM NomeTabella [,NomeTabella]...WHERE Condizione
• La query costruisce il prodotto cartesiano delle relazioni nella clausolaFROM, seleziona solo le tuple che soddisfano il predicato nellaclausola WHERE e quindi proietta solo le colonne specificate nellaclausola SELECT.
Informatica Generale 28 sql.tex: Versione 1.0, aa 2006-2007
Abbreviazioni e Uso di *
•Quando di una relazione si vogliono proiettare tutti gli attributi, piut-tosto che scrivere SELECT seguito dall’intero elenco di attributie possibile scrivere SELECT *;
• qualora le relazioni nella clausola FROM non avessero nomi diattributo in comune e possibile abbreviare la scrittura NomeTabel-la.Attributo con Attributo sia nella clausola WHERE che nellaclausola SELECT.
Informatica Generale 29 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Abbreviazioni (1)
La query SQL
SELECT Esami.Voto,Corsi.Nome, Corsi.DocenteFROM Esami,Corsi;
puo essere abbreviata come
SELECT Voto,Nome, DocenteFROM Esami,Corsi;
Informatica Generale 30 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Abbreviazioni (2)
La query SQL
SELECT Studenti.Cognome,Studenti.Nome,Corsi.DocenteFROM Studenti,Corsi
puo essere abbreviata come
SELECT Cognome,Studenti.Nome,DocenteFROM Studenti,Corsi
ma non come
SELECT Cognome,Nome,DocenteFROM Studenti,Corsi
perche le relazioni Studenti e Corsi hanno entrambe un attributochiamato Nome.
Informatica Generale 31 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Interrogazioni (1)
Selezionare il nome e il numero di dipartimento degli impiegatiche hanno uno stipendio maggiore di 2000 e hanno mansione diingegnere.
πNome,DipNum(σStipendio>2000∧Mansione=’ingegnere’(Impiegati))
SELECT Nome, DipNumFROM ImpiegatiWHERE Stipendio> 2000 AND Mansione=’ingegnere’;
Nome DipNumNeri 10Dare 10
Informatica Generale 32 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Interrogazioni (2)
Selezionare il numero degli impiegati che lavorano nel dipartimento30 e sono ingegneri o tecnici.
πImpID(σDipNum=30∧(Mansione=’ingegnere’∨Mansione=’tecnico’)(Impiegati))
SELECT ImpIDFROM ImpiegatiWHERE DipNum=30 AND (Mansione =’ingegnere’ OR Mansio-ne = ’tecnico’);
ImpID7499752178447900
Informatica Generale 33 sql.tex: Versione 1.0, aa 2006-2007
Condizioni su Intervalli di Valori (1)
• L’operatore BETWEEN permette di determinare le tuple checontengono in un dato attributo valori in un intervallo specificato;
• Formato C BETWEEN v1 AND v2
• Forma negata C NOT BETWEEN v1 AND v2
• Esempio: Visualizzare il nome e lo stipendio degli impiegati constipendio compreso tra 1100 e 1400.
Informatica Generale 34 sql.tex: Versione 1.0, aa 2006-2007
Condizioni su Intervalli di Valori (2)
SELECT Nome, StipendioFROM ImpiegatiWHERE Stipendio BETWEEN 1100 AND 1400;
equivalente a
SELECT Nome, StipendioFROM ImpiegatiWHERE Stipendio >= 1100 AND Stipendio<= 1400;
Nome StipendioAdami 1100, 00Milli 1300, 00
Informatica Generale 35 sql.tex: Versione 1.0, aa 2006-2007
Ricerca di Valori in un Insieme (1)
L’operatore IN permette di determinare le tuple che contengono,in un dato attributo, uno tra i valori in un insieme specificato. Lasintassi e:
C IN (v1, v2, · · · , vn)
equivalente ai predicati:
C = v1 OR C = v2 OR · · ·C = vn
La sintassi per la forma negata e
C NOT IN (v1, v2, · · · , vn)
equivalente ai predicati:
NOT(C = v1) AND NOT(C = v2) AND · · · NOT(C = vn)e
C <> v1 AND C <> v2 AND · · ·C <> vn
Informatica Generale 36 sql.tex: Versione 1.0, aa 2006-2007
Ricerca di Valori in un Insieme (2)
Visualizzare i dipartimenti con codice 10 o 30.
SELECT *FROM DipartimentiWHERE DipID IN (10, 30);
DipID NomeDip Ufficio Divisione Dirigente10 Edilizia Civile D1 797730 Edilizia Stardale 5100 D2 7698
Equivalente a:
SELECT *FROM DipartimentiWHERE DipID=10 OR DipID=30;
Informatica Generale 37 sql.tex: Versione 1.0, aa 2006-2007
Confronto tra Stringhe di Caratteri
• L’operatore LIKE permette di eseguire alcune semplici operazioni dipattern-matching su colonne di dominio Character;
• Un predicato di confronto espresso con l’operatore LIKE ha ilseguente formato: C LIKE pattern;
• dove pattern e una stringa di caratteri che puo contenere i caratterispeciali % e ;
• Il carattere % combacia con una sequenza di caratteri arbitrari dilunghezza qualsiasi (anche zero);
• Il carattere combacia con un singolo carattere;
• I predicati formati con gli operatori BETWEEN, IN e LIKE pos-sono essere connessi con AND ed OR nella specifica di condizionicomplesse.
Informatica Generale 38 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Confronto tra Stringhe di Caratteri (1)
Determinare tutti gli impiegati che hanno ’r’ come terza lettera delNome.
SELECT NomeFROM ImpiegatiWHERE Nome LIKE ’ r%’;
NomeMartiniNeriDareTurniFordiVerdi
Informatica Generale 39 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Confronto tra Stringhe di Caratteri (2)
Determinare tutti gli impiegati il cui Nome comincia per ’A’.
SELECT NomeFROM ImpiegatiWHERE Nome LIKE ’A%’;
NomeAndreiAdami
Informatica Generale 40 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Confronto tra Stringhe di Caratteri (3)
Determinare tutti gli impiegati il cui Nome e composto daesattamente 4 lettere.
SELECT NomeFROM ImpiegatiWHERE Nome LIKE ’ ’;
NomeRosiNeriDare
Informatica Generale 41 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Confronto tra Stringhe di Caratteri (4)
Determinare tutti gli impiegati il cui Nome contiene la lettera ’o’.
SELECT NomeFROM ImpiegatiWHERE Nome LIKE ’%o%’;
NomeRosiRossiScottiFordi
Informatica Generale 42 sql.tex: Versione 1.0, aa 2006-2007
Ordinamento del Risultato di una Query
• Negli esempi visti, l’ordine delle tuple risultato di una interrogazionee determinato dal sistema (dipende dalla strategia usata per eseguirel’interrogazione);
• e possibile specificare un ordinamento diverso aggiungendo alla finedell’interrogazione la clausola ORDER BY;
• la clausola ORDER BY posta alla fine di una query permettedi ordinare le righe della relazione risultato rispetto ad uno o piudei suoi attributi. L’ordinamento puo essere crescente (metodo didefault) o decrescente.
Informatica Generale 43 sql.tex: Versione 1.0, aa 2006-2007
Ordinamento del Risultato di una Query
La sintassi e:
SELECT NomeTabella.Attributo [,NomeTabella.Attributo]...FROM NomeTabella [,NomeTabella]...[WHERE Condizione]ORDER BY NomeTabella.Attributo [asc|desc] [, NomeTabel-la.Attributo [asc|desc]]...
dove nella clausola ORDER BY
NomeTabella.Attributo [asc|desc] [, NomeTabella.Attributo [asc|desc]]...
e un elenco separato da virgole costituito dal nome di una delle relazioninella clausola FROM, seguito da un punto, seguito dal nome di unodegli attributi della relazione a sinistra del punto eventualmente seguitoda una tra le parole asc e desc.
Informatica Generale 44 sql.tex: Versione 1.0, aa 2006-2007
Ordinamento del Risultato di una Query
• La query costruisce il prodotto cartesiano delle relazioni nella clau-sola FROM, se la clausola WHERE e presente seleziona solole tuple che soddisfano il predicato in tale clausola, quindi la queryordina le righe della relazione rispetto agli attributi nella clausolaORDER BY, dove l’ordinamento sugli attributi piu a sinistra hapriorita rispetto all’ordinamento sugli attributi piu a destra e per ogniattributo la query applica il criterio decrescente se desc e specifica-to, crescente altrimenti e infine proietta solo le colonne specificatenella clausola select;
• la clausola ORDER BY e applicabile indipendentemente dallapresenza della clausola WHERE.
Informatica Generale 45 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Ordinamento del Risultato di una Query (1)
Elencare lo stipendio, la mansione e il nome di tutti gli impiegati deldipartimento 30, ordinando le tuple in ordine crescente in base allostipendio.
Informatica Generale 46 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Ordinamento del Risultato di una Query (2)
SELECT Stipendio, Mansione, Nome
FROM Impiegati
WHERE DipNum=30
ORDER BY Stipendio;
Stipendio Mansione Nome800,00 tecnico Andrei800,00 tecnico Bianchi800,00 segretaria Martini
1500,00 tecnico Turni1950,00 ingegnere Gianni2850,00 dirigente Blacchi
Informatica Generale 47 sql.tex: Versione 1.0, aa 2006-2007
Ordinamento del Risultato di una Query (2)
Esempio: si vuole elencare mansione, nome e stipendio di tutti gliimpiegati ordinando le tuple in base alla mansione in ordine crescente,ed in base allo stipendio in ordine decrescente
Informatica Generale 48 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Ordinamento del Risultato di una Query (3)
SELECT Mansione, Stipendio, NomeFROM ImpiegatiORDER BY Mansione, Stipendio DESC;
Mansione Stipendio Nomedirigente 3000, 00 Verdidirigente 2975, 00 Rosidirigente 2850, 00 Blacchiingegnere 2450, 00 Neriingegnere 2000, 00 Dareingegnere 1950, 00 Gianniingegnere 1600, 00 Rossiingegnere 1300, 00 Milliingegnere 1100, 00 Adamisegretaria 1000, 00 Fordisegretaria 800, 00 Martinisegretaria 800, 00 Scotti
tecnico 1500, 00 Turnitecnico 800, 00 Andreitecnico 800, 00 Bianchi
Informatica Generale 49 sql.tex: Versione 1.0, aa 2006-2007
Eliminazione dei Duplicati (1)
• Supponiamo di voler ritrovare la lista di tutte le mansioni presentinella relazione Impiegati
Informatica Generale 50 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Eliminazione dei Duplicati (1)
SELECT Mansione FROM Impiegati; Risultato
Mansioneingegnere
tecnicotecnico
dirigentesegretariadirigenteingegneresegretaria
tecnicoingegnereingegneresegretariaingegneredirigente
Informatica Generale 51 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Eliminazione dei Duplicati (2)
• E’ possibile richiedere l’eliminazione dei duplicati tramite la clausolaDISTINCTSELECT DISTINCT Mansione FROM Impiegati;
Mansioneingegnere
tecnicodirigentesegretaria
Informatica Generale 52 sql.tex: Versione 1.0, aa 2006-2007
Inserimento di Tuple
• In SQL, l’inserimento di nuove tuple nelle tabelle e ottenuto medianteil comando INSERT INTO. La sintassi del comando e moltoarticolata, qui di seguito ne presentiamo una versione semplificata:
INSERT INTO NomeTabella [(ListaDiAttributi)]VALUES (ListaDiValori)
dove nella clausola INSERT INTO
NomeTabella
e un nome di relazione creato con CREATETABLE e
ListaDiAttributi
e una lista compresa tra tonde e separata da virgole di nomi diattributo della relazione NomeTabella e nella clausola VALUES
ListaDiValori
e una lista di costanti separata da virgole.
Informatica Generale 53 sql.tex: Versione 1.0, aa 2006-2007
Inserimento di Tuple
• La query SQL INSERT INTO inserisce in NomeTabella una nuo-va tupla. I valori che compaiono in ListaDiValori vengono assegnatiposizionalmente o agli attributi elencati in ListaDiAttributi, se pre-sente, o agli attributi della relazione NomeTabella cosı come elencatinella CREATETABLE;
• Se ListaDiValori non contiene tante costanti quanti sono gli attributidella relazione, gli attributi per cui manca la costante assumerannovalore NULL.
Informatica Generale 54 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Inserimento
INSERT INTO dipartimenti(nomedip, dipid,dirigente,divisione,ufficio)VALUES (’sviluppo’,40,8000,’D3’,3200);
INSERT INTO dipartimentiVALUES (50,’Edilizia Industriale’,7000,’D4’,8005);
INSERT INTO dipartimentiVALUES (60,’Esteri’);
DipId NomeDip Ufficio Divisione Dirigente10 Edilizia Civile 1100 D1 797720 Ricerche 2200 D1 756630 Edilizia Stradale 5100 D2 769840 sviluppo 3200 D3 800050 Edilizia Industriale 7000 D4 800560 Esteri
Informatica Generale 55 sql.tex: Versione 1.0, aa 2006-2007
Cancellazione di Tuple
• In SQL, la cancellazione di tuple e ottenuta mediante il costruttoDELETE FROM. La sintassi del comando e:
DELETE FROM NomeTabella [WHERE Condizione]
dove nella clausola DELETE FROM
NomeTabella
e un nome di relazione creata con CREATETABLE e nellaclausola WHERE
Condizione
e un predicato SQL.
• La query SQL cancella dalla relazione NomeTabella le tuple chesoddisfano la clausola la Condizione nella clausola WHERE;
• se la clausola WHERE non e presente vengono cancellate tutte letuple della relazione.
Informatica Generale 56 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Cancellazione di Tuple
• Si vuole cancellare il dipartimento 40:
DELETE FROM DipartimentiWHERE DipID = 40;
• Cancellare gli impiegati il cui nome comincia per ’R’:
DELETE FROM impiegati WHERE nome LIKE ’R%’;
• Si vogliono cancellare tutte le tuple della relazione Esami:
DELETE FROM Esami;
Informatica Generale 57 sql.tex: Versione 1.0, aa 2006-2007
Aggiornamento di Tuple (1)
• In SQL l’aggiornamento di tuple e ottenuto mediante il costruttoUPDATE. La sintassi del comando e articolata, di seguito nediamo una versione semplificata:
UPDATE NomeTabellaSET NomeAttributo= Espressione [, NomeAttributo= Espressio-ne]...[WHERE Condizione ]
dove nella clausola SET
NomeAttributo= Espressione [, NomeAttributo= Espressione]...
e un elenco separato da virgole costituito dal nome di uno degliattributi della relazione nella clausola UPDATE seguito dal sim-bolo = seguito da un’espressione che puo contenere operatori arit-metici e nomi di attributi della relazione specificata nella clausolaUPDATE.
Informatica Generale 58 sql.tex: Versione 1.0, aa 2006-2007
Aggiornamento di Tuple (2)
• La query SQL, per ogni tupla di NomeTabella che soddisfaCondizione procede come segue: per ogni elemento
NomeAttributo= Espressione
valuta Espressione e il valore calcolato viene assegnato aNomeAttributo nella tupla in questione;
• in ogni elemento NomeAttributo= Espressione dell’elenco nella clau-sola SET, il valore assunto da Espressione deve appartenere aldominio di NomeAttributo;
• se la clausola WHERE e mancante, tutte le tuple di NomeTabellavengono aggiornate.
Informatica Generale 59 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Aggiornamento (1)
• Aumentare di 100 lo stipendio di tutti i tecnici.
UPDATE ImpiegatiSET Stipendio = Stipendio + 100WHERE Mansione = ’tecnico’;
• Promuovere Gianni a dirigente e aumentare il suo stipendio del 10%.
UPDATE ImpiegatiSET Mansione = ’dirigente’, Stipendio = 1.10*StipendioWHERE Nome = ’Gianni’;
Informatica Generale 60 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Aggiornamento (2)
• Per ogni impiegato il cui premio di produzione e inferiore a 250fare quanto segue: aumentarne lo stipendio del valore del premio diproduzione e porre il premio di produzione a 50.
UPDATE ImpiegatiSET Stipendio=Stipendio+Premioprod, PremioProd=50WHERE PremioProd<250;
Informatica Generale 61 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Aggiornamento (3)
Impid Nome Mansione DataAss Stipendio PremioProd DipNum7369 Rossi ingegnere 1980-12-17 1600 500 207499 Andrei tecnico 1981-02-20 800 307521 Bianchi tecnico 1981-02-20 900 50 307566 Rosi dirigente 1981-04-02 2975 207654 Martini segretaria 1981-09-28 800 307698 Blacchi dirigente 1981-05-01 2850 307782 Neri ingegnere 1981-06-01 2650 50 107788 Scotti segretaria 1981-11-09 800 207839 Dare ingegnere 1981-11-17 2600 300 107844 Turni tecnico 1981-09-08 1500 307876 Adami ingegnere 1981-09-28 1100 500 207900 Gianni ingegnere 1981-12-03 1950 307902 Fordi segretaria 1981-12-03 1000 207934 Milli ingegnere 1982-01-23 1450 50 107977 Verdi dirigente 1980-12-10 3000 10
Informatica Generale 62 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Aggiornamento (2)
• Cambiare il nome del dipartimento ’Ricerche’ in ’Ricerca e Sviluppo’.
UPDATE dipartimenti SET NomeDip=’Ricerca e Sviluppo’WHERE NomeDip=’Ricerche’;
DipId NomeDip Ufficio Divisione Dirigente10 Edilizia Civile 1100 D1 797720 Ricerca e Sviluppo 2200 D1 756630 Edilizia Stradale 5100 D2 7698
Informatica Generale 63 sql.tex: Versione 1.0, aa 2006-2007
Esempi di Errori di Aggiornamento
• La seguente query SQL e sbagliata
UPDATE Impiegati SET DataAss=10WHERE Nome=’Verdi’;
• perche il dominio di DataAss e Date e 10 e un intero;
• La seguente query SQL e sbagliata
UPDATE Impiegati SET DataAss=’32-15-1980’WHERE Nome=’Verdi’;
• perche il dominio di DataAss e Date e ’32-15-1980’ non e una datavalida;
Informatica Generale 64 sql.tex: Versione 1.0, aa 2006-2007
Collegamento tra Dati
• La nozione di join (collegamento) e di fondamentale importanza inquanto permette di correlare dati rappresentati da relazioni diverse;
• In SQL cosı come in algebra relazionale tale correlazione e realizzatatramite il prodotto cartesiano:
• prendiamo il seguente esempio: determinare il nome del dipartimentoin cui lavora l’impiegato Rossi, la cui soluzione e data dalla querySQL
SELECT NomeDipFROM Impiegati, DipartimentiWHERE Nome = ’Rossi’ AND
Impiegati.DipNum = Dipartimenti.DipID;
• Impiegati.DipNum = Dipartimenti.DipID viene detto predicato dijoin perche vi compaiono attributi di tabelle diverse.
Informatica Generale 65 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (1)
Per ogni impiegato selezionare il nome, lo stipendio, la mansione eil nome del dipartimento in cui lavora. Ordinare le tuple in ordinecrescente in base al nome del dipartimento, ed in ordine decrescentein base allo stipendio.
SELECT NomeDip, Nome, Mansione, StipendioFROM Impiegati, DipartimentiWHERE Impiegati.DipNum = Dipartimenti.DipIDORDER BY NomeDip, Stipendio DESC;
Informatica Generale 66 sql.tex: Versione 1.0, aa 2006-2007
Risultato
NomeDip Nome Mansione stipendioEdilizia Civile Verdi dirigente 3000, 00Edilizia Civile Neri ingegnere 2450, 00Edilizia Civile Dare ingegnere 2000, 00Edilizia Civile Milli ingegnere 1300, 00
Edilizia Stradale Blacchi dirigente 2850, 00Edilizia Stradale Gianni ingegnere 1950, 00Edilizia Stradale Turni tecnico 1500, 00Edilizia Stradale Andrei tecnico 800, 00Edilizia Stradale Bianchi tecnico 800, 00Edilizia Stradale Martini segretaria 800, 00
Ricerche Rosi dirigente 2975, 00Ricerche Rossi ingegnere 1600, 00Ricerche Adami ingegnere 1100, 00Ricerche Fordi segretaria 1000, 00Ricerche Scotti segretaria 800, 00
Informatica Generale 67 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (2)
Determinare per ogni impiegato il nome del proprio dipartimento.
SELECT nome, nomedipFROM impiegati, dipartimentiWHERE dipnum=dipid;
Informatica Generale 68 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (3)
Per ogni dirigente determinare il nome del dipartimento che dirige.
SELECT nome, nomedipFROM impiegati, dipartimentiWHERE mansione=’dirigente’ and dipnum=dipid;
Nome NomeDipRosi RicercheBlacchi Edilizia StradaleVerdi Edilizia Civile
Informatica Generale 69 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (4)
Selezionare i nomi degli impiegati che non lavorano nel dipartimentoRicerche.
SELECT nomeFROM impiegati, dipartimentiWHERE dipnum=dipid and nomedip <>’Ricerche’;
Informatica Generale 70 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (5)
Di ogni impiegato che guadagna piu di 2000 selezionare il suo numerodi matricola e quello del suo dirigente.
SELECT impid,dirigenteFROM impiegati, dipartimentiWHERE dipnum=dipid and stipendio>2000
Informatica Generale 71 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (6)
Di ogni impiegato non dirigente che guadagna piu di 2000 selezionareil suo numero di matricola e quello del suo dirigente.
SELECT impid,dirigenteFROM impiegati, dipartimentiWHERE dipnum=dipid AND stipendio>2000 ANDMansione<>’dirigente’;
Informatica Generale 72 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (7)
Determinare i voti dello studente Rossi Mario;
SELECT votoFROM esami,studentiWHERE Nome=’Mario’ AND Cognome=’Rossi’ AND Matrico-la=Studente;
Informatica Generale 73 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (8)
Selezionare i voti ottenuti negli esami di Analisi I.
SELECT votoFROM esami,corsiWHERE Nome=’Analisi I’ AND Corso=Id;
Informatica Generale 74 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (9)
Determinare i numeri di matricola degli studenti che hanno fattol’esame con il prof. Fermi
SELECT StudenteFROM Esami,CorsiWHERE Docente=’Fermi’ AND Corso=Id;
Informatica Generale 75 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (10)
Per ogni esame sostenuto selezionare Cognome e Nome dellostudente e il docente con cui e stato sostenuto.
SELECT Studenti.Nome,Cognome,DocenteFROM esami,corsi,studentiWHERE Corso=Id AND Matricola=Studente;
Informatica Generale 76 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Join (11)
Determinare i cognomi e i nomi degli studenti che hanno fattol’esame con il prof. Fermi.
• SELECT Studenti.Nome,Studenti.CognomeFROM studenti,corsi,esamiWHERE docente=’Fermi’ and corso=id and matricola=studente;
Cognome NomeRossi MarioVerdi Giovanni
Informatica Generale 77 sql.tex: Versione 1.0, aa 2006-2007
Rinomina Di Attributi e Relazioni
Mediante il costrutto SELECT FROM SQL consente di:
• cambiare il nome degli attributi che compaiono nella clausola SE-LECT. Per fare questo e sufficiente nella clausola SELECT farseguire all’attributo che si vuole rinominare la parola chiave AS e ilnuovo nome di attributo;
• cambiare il nome delle relazioni che compaiono nella clausolaFROM. Per fare questo e sufficiente nella clausola FROM farseguire alla relazione che si vuole rinominare il suo nuovo nome.
Con questo meccanismo una relazione puo occorrere piu volte nell’e-lenco associato alla clausola FROM, purche vi occorra con un nuo-vo nome. Quindi il meccanismo della rinomina permette di superareil vincolo di pagina 18.
Informatica Generale 78 sql.tex: Versione 1.0, aa 2006-2007
Rinomina Di Attributi e Relazioni (2)
La sintassi quindi e:
SELECT NomeTabella.Attributo [AS Alias] [,NomeTabel-la.Attributo [AS Alias]]...FROM NomeTabella [Alias] [,NomeTabella [Alias]]...[WHERE]
dove nella clausola SELECT
NomeTabella.Attributo [AS Alias] [,NomeTabella.Attributo [ASAlias]]...
e un elenco separato da virgole in cui NomeTabella e il nome di un aliasdi relazione o di una relazione priva di alias nella clausola FROM.
• La query rinomina le tabelle della clausola FROM aventi un alias,quindi costruisce il prodotto cartesiano delle tabelle nella clauso-la FROM e della relazione cosı ottenuta proietta solo le colonnespecificate nella lista in corrispondenza di SELECT rinominandoquelle colonne che possiedono un alias.
Informatica Generale 79 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Rinomina di Attributi
SELECT nome as NOME, nomedip as DIPARTIMENTOFROM impiegati, dipartimenti DIPWHERE mansione=’dirigente’ and impiegati.dipnum=DIP.dipid;
NOME DIPARTIMENTORosi RicercheBlacchi Edilizia StradaleVerdi Edilizia Civile
Informatica Generale 80 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Rinomina di Attributi
Determinare la matricola degli studenti che hanno il medesimocognome.
SELECT Studenti.Matricola,K.MatricolaFROM Studenti, Studenti KWHERE Studenti.Cognome=K.Cognome;
Informatica Generale 81 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Rinomina di Attributi
Di ogni impiegato determinare il nome del suo dirigente.
SELECT impiegati.nome, DIR.nomeFROM impiegati, dipartimenti, impiegati DIRWHERE impiegati.dipnum=dipartimenti.dipid AND dipartimen-ti.dirigente=DIR.impid
Informatica Generale 82 sql.tex: Versione 1.0, aa 2006-2007
Espressioni e Funzioni Aritmetiche
•Mediante il costrutto SELECTFROM, SQL consente di calcolarevalori di espressioni aritmetiche a partire dai valori assunti, su unoo piu attributi, dalle tuple della relazione costruita nella clausolaFROM;
• tali espressioni sono formulate applicando gli operatori aritmetici(+,−, ∗, /) ai valori assunti dalle tuple sugli attributi della relazione;
• il risultato di questa caratteristica e quello di ottenere per proiezionerelazioni in cui uno o piu attributi sono calcolati a partire dagli attri-buti presenti nella relazione di partenza. Questi attributi sono nuovi,non presenti in nessuna delle relazioni della clausola FROM.
Informatica Generale 83 sql.tex: Versione 1.0, aa 2006-2007
Espressioni e Funzioni Aritmetiche (2)
• La sintassi del costrutto SELECTFROM e quindi
SELECT Espressione [AS Alias] [,Espressione [AS Alias]]...FROM NomeTabella [AS Alias] [,NomeTabella [AS Alias]]...
dove nella clausola SELECT
Espressione [AS Alias] [,Espressione [AS Alias]]...
e un elenco separato da virgole in cui Espressione puo essere deltipo NomeTabella.Attributo come visto nei lucidi precedenti o unaespressione aritmetica in cui gli operandi sono numeri o elementi deltipo NomeTabella.Attributo.
• Come osservato nei casi precedenti se NomeTabella.Attributo com-pare nella clausola SELECT allora NomeTabella deve comparirenella clausola FROM.
Informatica Generale 84 sql.tex: Versione 1.0, aa 2006-2007
Uso di Espressioni e Funzioni Aritmetiche
Di ogni impiegato selezionare il nome, lo stipendio e calcolarne ildoppio. Chiamare DOPPIO la colonna calcolata.
SELECT nome,stipendio,stipendio*2 as Doppio FROM Impie-gati; nome stipendio Doppio
Andrei 800 1600
Rosi 2975 5950
Rossi 1600 3200
Bianchi 800 1600
Martini 800 1600
Blacchi 2850 5700
Neri 2450 4900
Scotti 800 1600
Dare 2600 5200
Turni 1500 3000
Adami 1100 2200
Gianni 1950 3900
Fordi 1000 2000
Milli 1300 2600
Verdi 3000 6000
Informatica Generale 85 sql.tex: Versione 1.0, aa 2006-2007
Uso di Espressioni e Funzioni Aritmetiche
Trovare il nome, lo stipendio, il premio di produzione, e la sommadello stipendio e del premio di produzione di tutti gli ingegneri;
SELECT Nome, Stipendio, PremioProd, Stipendio + PremioProdFROM ImpiegatiWHERE Mansione = ’ingegnere’;
Nome Stipendio PremioProd Stipendio + PremioProdRossi 1600, 00 500, 00 2100, 00Neri 2450, 00 200, 00 2650, 00Dare 2000, 00 300, 00 2300, 00
Adami 1100, 00 500, 00 1600, 00Gianni 1950, 00 ? ?Milli 1300, 00 150, 00 1450, 00
Informatica Generale 86 sql.tex: Versione 1.0, aa 2006-2007
Uso di Espressioni e Funzioni Aritmetiche
Trovare il nome, lo stipendio, il premio di produzione, e la sommadello stipendio e del premio di produzione di tutti gli ingegneri percui la somma dello stipendio e del premio di produzione e maggioredi 2000
SELECT Nome, Stipendio, PremioProd, Stipendio + PremioProdFROM ImpiegatiWHERE Mansione = ’ingegnere’ AND Stipendio + PremioProd> 2000;
Nome Stipendio PremioProd Stipendio + PremioProdRossi 1600, 00 500, 00 2100, 00Neri 2450, 00 200, 00 2650, 00Dare 2000, 00 300, 00 2300, 00
Informatica Generale 87 sql.tex: Versione 1.0, aa 2006-2007
Espressioni e Funzioni Aritmetiche
• Una espressione aritmetica usata nella clausola di proiezione di un’in-terrogazione da luogo ad una colonna, detta virtuale, non presentenella relazione su cui si effettua l’interrogazione
• Le colonne virtuali non sono fisicamente memorizzate; sono solomaterializzate come risultato delle interrogazioni
• Nel calcolo delle espressioni aritmetiche la presenza del valore nullorende l’espressione indefinita.
Informatica Generale 88 sql.tex: Versione 1.0, aa 2006-2007
SQL - Funzioni scalari
• Non sono fornite in tutte le implementazioni di SQL.
Funzioni:• abs(n) calcola il valore assoluto del valore numerico n.•mod(n, b) calcola il resto intero della divisione di n per b.• sqrt(n) calcola la radice quadrata del valore numerico n.
• Alcuni DBMS supportano anche funzioni trigonometriche e funzioniper il calcolo della parte intera superiore ed inferiore
• Le funzioni possono essere usate nella clausola di proiezione e nellaclausola WHERE
Informatica Generale 89 sql.tex: Versione 1.0, aa 2006-2007
Operazioni Insiemistiche con SQL (1)
• Le operazioni insiemistiche di unione, intersezione, differenza, nonpossono essere espresse con una singola SELECT.
• In SQL l’unione di due relazioni e realizzata mediante il costruttoUNION. La sintassi del comando e la seguente:
SelectSQL UNION [ALL] SelectSQL
dove SelectSQL e una query SQL realizzata col comando SELECT.
• La query SQL realizza l’unione delle tuple contenute nelle relazionigenerate dalle due query che sono argomento di UNION. Le tupleduplicate sono rimosse a meno che non sia presente ALL.
• Le due relazioni argomento di UNION devono avere una strutturacompatibile, ovvero stesso numero di attributi definiti sullo stessodominio.
Informatica Generale 90 sql.tex: Versione 1.0, aa 2006-2007
Operazioni Insiemistiche con SQL (2)
• In SQL l’intersezione di due relazioni e realizzata mediante ilcostrutto INTERSECT. La sintassi del comando e la seguente:
SelectSQL INTERSECT SelectSQL
dove SelectSQL e una query SQL realizzata col comando SELECT.
• La query SQL realizza l’intersezione delle tuple contenute nel-le relazioni generate dalle due query che sono argomento diINTERSECT.
• Le due relazioni argomento di INTERSECT devono avere unastruttura compatibile.
Informatica Generale 91 sql.tex: Versione 1.0, aa 2006-2007
Operazioni Insiemistiche con SQL (3)
• In SQL la differenza di due relazioni e realizzata mediante il costruttoEXCEPT. La sintassi del comando e la seguente:
SelectSQL EXCEPT SelectSQL
dove SelectSQL e una query SQL realizzata col comando SELECT.
• La query SQL realizza la differenza insiemistica delle tuple conte-nute nelle relazioni generate dalle due query che sono argomento diEXCEPT.
• Le due relazioni argomento di EXCEPT devono avere unastruttura compatibile.
Informatica Generale 92 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso di EXCEPT
•Determinare i numeri di matricola degli studenti che NON hannofatto esami;
(SELECT Matricola FROM Studenti) EXCEPT(SELECT Studente FROM Esami);
•Determinare i numeri di matricola degli studenti che NON hannofatto l’esame K09.
(SELECT Matricola FROM Studenti) EXCEPT(SELECT Studente FROM Esami WHERE Corso=’K09’);
• determinare Cognome e Nome degli studenti che NON hanno fattol’esame K09;
(SELECT Nome,Cognome FROM Studenti) EXCEPT(SELECT Nome,Cognome FROM studenti,esami WHEREMatricola=Studente AND Corso=’K09’);
Informatica Generale 93 sql.tex: Versione 1.0, aa 2006-2007
Uso Errato degli Operatori Insiemistici (1)
• Le seguenti query NON sono corette perche gli attributi Nome eVoto appartengono a domini non compatibili:
(SELECT Nome FROM Studenti) UNION(SELECT Voto FROM esami);
(SELECT Nome FROM Studenti) INTERSECT(SELECT Voto FROM esami);
(SELECT Nome FROM Studenti) EXCEPT(SELECT Voto FROM esami);
Informatica Generale 94 sql.tex: Versione 1.0, aa 2006-2007
Uso Errato degli Operatori Insiemistici (2)
• Le seguenti query NON sono corrette perche gli operandi deglioperatori insiemistici non hanno lo stesso numero di attributi:
(SELECT Nome, Cognome FROM Studenti) EXCEPT(SELECT cognome FROM studenti);
(SELECT Nome, Cognome FROM Studenti) UNION(SELECT cognome FROM studenti);
(SELECT Nome, Cognome FROM Studenti) INTERSECT(SELECT cognome FROM studenti);
Informatica Generale 95 sql.tex: Versione 1.0, aa 2006-2007
Query Aggregate
• Le query aggregate non possono essere espresse in algebrarelazionale;
• esse sono utili dal punto di vista pratico;
• le query aggregate si basano sugli operatori aggregati:
count,sum,min,max,avg;
Informatica Generale 96 sql.tex: Versione 1.0, aa 2006-2007
L’Operatore count (1)
• L’operatore count restituisce il numero di righe o di valori distinti;
• count puo essere invocato in tre modi diversi:
SELECT count(*)FROM NomeTabella [,NomeTabella]...[WHERE Condizione]
la query costruisce il prodotto cartesiano delle relazioni nella clausolaFROM, seleziona solo le tuple che soddisfano il predicato nella clau-sola WHERE, se presente, e quindi restituisce il numero di tuplenella relazione.
Informatica Generale 97 sql.tex: Versione 1.0, aa 2006-2007
L’Operatore count (2)
SELECT count(DISTINCT NomeTabella.Attributo)FROM NomeTabella [,NomeTabella]...)[WHERE Condizione]
la query costruisce il prodotto cartesiano delle relazioni nella clausolaFROM, se la clausola WHERE e presente seleziona solo le tupleche ne soddisfano il predicato, proietta la colonna specificata nella listain corrispondenza di SELECT e restituisce il numero di tuple DI-STINTE che la compongono (le tuple NULL non vengono contate).
Informatica Generale 98 sql.tex: Versione 1.0, aa 2006-2007
L’Operatore count (3)
SELECT count([ALL] NomeTabella.Attributo)FROM NomeTabella [,NomeTabella]...)[WHERE Condizione]
la query costruisce il prodotto cartesiano delle relazioni nella clausolaFROM, se la clausola WHERE e presente seleziona solo le tupleche ne soddisfano il predicato, proietta la colonna specificata nella listain corrispondenza di SELECT e restituisce il numero di tuple nonNULL che la compongono.
Informatica Generale 99 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso di count (1)
Calcolare il numero di impiegati;
SELECT count(*)FROM Impiegati;
count15
Informatica Generale 100 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso di count (2)
Calcolare il numero di ingegneri;
SELECT count(*)FROM ImpiegatiWHERE Mansione=’ingegnere’;
count6
Informatica Generale 101 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso di count (3)
Calcolare il numero di mansioni diverse;
SELECT count( DISTINCT Mansione)FROM Impiegati;
count4
Informatica Generale 102 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso di count (4)
Calcolare quanti ingegneri lavorano nel dipartimento 30;
SELECT count(*)FROM ImpiegatiWHERE Mansione=’ingegnere’ AND DipNum=30;
count1
Informatica Generale 103 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso di count (5)
Calcolare quanti Impiegati lavorano nel dipartimento ’Ricerche’;
SELECT count(*)FROM Impiegati, DipartimentiWHERE DipNum=DipID AND NomeDip=’Ricerche’;
count5
Informatica Generale 104 sql.tex: Versione 1.0, aa 2006-2007
Gli Operatori sum, max, min, avg
Gli Operatori sum, max, min, avg restuiscono rispettivamente som-ma, massimo, minimo, media. Gli operatori vengono invocati tutti conla medesima sintassi. Qui come esempio consideriamo la sintassi disum.
Informatica Generale 105 sql.tex: Versione 1.0, aa 2006-2007
Gli Operatori sum, max, min, avg
SELECT sum(DISTINCT FormulaConAttributi)FROM NomeTabella [,NomeTabella]...[WHERE Condizione]
dove
FormulaConAttributi
nella clausola SELECT e una espressione aritmetica contenente ope-ratori aritmetici ed espressioni del tipo NomeTabella.Attributo doveNomeTabella e una delle relazioni elencate nella clausola FROM.
La query costruisce il prodotto cartesiano delle relazioni nella clausolaFROM, se la clausola WHERE e presente seleziona solo le tupleche ne soddisfano il predicato, proietta le colonne della relazione checompaiono in FormulaConAttributi, per ogni tupla calcola il valore dellaformula FormulaConAttributi e quindi ne esegue il totale considerandosolo i valori distinti.Informatica Generale 106 sql.tex: Versione 1.0, aa 2006-2007
Gli Operatori sum, max, min, avg
SELECT sum([ALL] FormulaConAttributi)FROM NomeTabella [,NomeTabella]...)[WHERE Condizione]
la query costruisce il prodotto cartesiano delle relazioni nella clausolaFROM, se la clausola WHERE e presente seleziona solo le tupleche ne soddisfano il predicato, proietta le colonne della relazione checompaiono in FormulaConAttributi, per ogni tupla calcola il valore dellaformula FormulaConAttributi e quindi ne esegue il totale considerandotutti i valori.
Informatica Generale 107 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso degli Operatori Aggregati
Determinare la somma degli stipendi degli impiegati;
SELECT sum(ALL stipendio)FROM Impiegati
sum25525
equivalente a
SELECT sum(stipendio)FROM Impiegati
Determinare la somma degli stipendi degli impiegati, sommandoquelli uguali una sola volta;
SELECT sum(DISTINCT stipendio)FROM Impiegati
sum23125
Informatica Generale 108 sql.tex: Versione 1.0, aa 2006-2007
Esempio di Uso degli Operatori Aggregati
Determinare la somma degli stipendi piu il premio di produzione degliingegneri;
SELECTsum (stipendio+premioprod) FROM impiegatiWHERE mansione=’ingegnere’;
sum10700
Determinare la media degli stipendi piu il premio di produzione degliingegneri;
SELECTavg (stipendio+premioprod) FROM impiegatiWHERE mansione=’ingegnere’;
avg2140
Informatica Generale 109 sql.tex: Versione 1.0, aa 2006-2007
Gli Operatori Aggregati
Nella sua forma piu generale una query aggregata ha la seguentesintassi:
SELECT OperatoreAggregato [AS Alias] [,OperatoreAggregato[AS Alias]]...FROM NomeTabella [,NomeTabella]...[WHERE Condizione]
quindi la clausola SELECT puo essere seguita da un numeroarbitrario di operatori aggregati.
Informatica Generale 110 sql.tex: Versione 1.0, aa 2006-2007
Uso degli Operatori Aggregati
Calcolare la media, il massimo ed il totale degli stipendi e il totaledei premi di produzione degli impiegati;
SELECTmax (Stipendio) AS StipMax, avg (Stipendio) AS Sti-pMed, min (Stipendio) AS StipMin, sum (Stipendio)AS StipTot, sum (PremioProd) AS PremioProdTotFROM Impiegati;
StipMax StipMed StipMin StipTot PremioProdTot3000 1701.66666666667 800 25525 1750
Determinare la somma e la media degli stipendi nel caso in cui lostipendio venga aumentato del 10%;
SELECTsum (Stipendio*1.1), avg (Stipendio*1.1)FROM impiegati;
sum avg28077.5 1871.83333333333
Informatica Generale 111 sql.tex: Versione 1.0, aa 2006-2007
Gli Operatori Aggregati
• per quanto illustrato fino ad ora la clausola SELECT ha solo edesclusivamente due forme possibili:
SELECT Espressione [AS Alias] [,Espressione [AS Alias]]...
SELECT OperatoreAggregato [AS Alias] [,OperatoreAggregato[AS Alias]]...
• E scorretto mischiare le due sintassi, quindi la lista che segue laclausola SELECT deve essere omogenea: o una lista espressio-ni costruite come specificato a pagina 84 o una lista di operatoriaggregati. La query SQL
SELECT sum(stipendio), nomeFROM impiegati
e scorretta.
Informatica Generale 112 sql.tex: Versione 1.0, aa 2006-2007