Sei sulla pagina 1di 18

LINGUAGGIO SQL IN SINTESI

L’accesso ad una base dati relazionale (livello fisico) avviene attraverso un


linguaggio standard denominato SQL (Structured Query Language)

DDL DML DCL QL

Il linguaggio SQL è suddiviso in quattro parti:

- DDL (Data Definition Language)


sono le istruzioni che consentono la definizione fisica della base dati,
cioè permettono di creare/modificare la STRUTTURA delle tabelle.

- DML (Data Manipulation Language)


sono le istruzioni che consentono la modifica dei dati all’interno delle
tabelle, agiscono quindi sul CONTENUTO delle tabelle
(inserimento/modifica/cancellazione dati).

- DCL (Data Control Language)


sono le istruzioni che consentono di impostare i PERMESSI DI
ACCESSO alla base dati da parte degli utenti del DBMS (chi può fare
che cosa…)

- QL (Query Language)
sono le istruzioni che consentono l’ESTRAZIONE dei dati dal DBMS,
utilizzando vari criteri di filtro, di raggruppamento e di
visualizzazione.
ISTRUZIONI DDL
(CREATE TABLE, ALTER TABLE, DROP TABLE)

CREATE TABLE Aziende (


CodAzienda COUNTER NOT NULL,
NomeAzienda TEXT(30) NOT NULL,
Citta TEXT(30),
PRIMARY KEY (CodAzienda) );

CREATE TABLE Dipendenti (


CodFisc TEXT(16) NOT NULL,
Cognome TEXT(30) NOT NULL,
Nome TEXT(30) NOT NULL,
DataNascita DATE, La clausola NOT NULL indica che in
NumFigli INTEGER, dato è obbligatorio.
Stipendio NUMERIC,
Laureato BIT,
CodAzienda INTEGER REFERENCES Aziende(CodAzienda),
PRIMARY KEY (CodFisc) );
La clausola REFERENCES indica il
legame della chiave importata con
quella primaria a cui il campo si
riferisce.

ALTER TABLE Dipendenti ALTER TABLE è utilizzata per


ADD COLUMN Città TEXT(16) ; modificare la struttura di una
tabella già esistente; tipicamente
per aggiungere colonne dati.
ALTER TABLE Dipendenti
DROP COLUMN Città; DROP TABLE è utilizzata per
eliminare fisicamente una tabella.
DROP TABLE Dipendenti; Non c’è possibilità di recupero dalla
cancellazione.
ISTRUZIONI DML
(INSERT, DELETE, UPDATE)

DIPENDENTI (CodFisc, Cognome, Nome, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

INSERT
INSERT permette di
inserire un nuovo
Possibilità a) record in una tabella.
Esistono due
INSERT INTO DIPENDENTI possibilità:
VALUES (“RCCFRD…..”, “Ricci”, “Alfredo”, a. Indicare i valori di
#14/03/1980#, 2, 2134.00, true, 5) tutti i campi della
tabella
In questa modalità si devono indicare i b. Indicare solo i
valori dei campi (nella clausola VALUES) valori di alcuni
nello stesso ordine con cui sono stati campi
definiti nella create della tabella.
La modalità b. va
La sintassi prevede di utilizzare: utilizzata solo se non
si possiedono tutti i
- Le virgolette “ ” per i campi di tipo testo
valori delle colonne da
- Il cancelletto # # per i campi di tipo data inserire.
- Nessun simbolo per i campi numerici
- true o false per i campi booleani

Possibilità b)

INSERT INTO DIPENDENTI (Nome, Cognome, CodFisc, Laureato)


VALUES (“Ricci“, “Alfredo”, RCCFRD…..”, true)

In questa modalità bisogna indicare quali campi si vogliono valorizzare (è


anche possibile variare l’ordine rispetto a come sono stati creati nella create)
e successivamente inserire i valori nella clausola VALUES.
Ovviamente tutte le colonne create con la clausola NOT NULL, devono essere
riempite con un valore.
DELETE
DIPENDENTI (CodFisc, Cognome, Nome, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

DELETE FROM DIPENDENTI


WHERE …..criterio di filtro…… DELETE permette di
cancellare una o più
Il criterio di filtro è una condizione booleana che righe (record) della
fa riferimento ad uno o più campi della tabella tabella, utilizzando un
ed evidenzia un confronto di uguaglianza, di criterio di selezione
maggioranza, minoranza o diversità con dei valori (filtro).
fissi i variabili.
Es. Cognome=”ROSSI” o anche Stipendio>2000
E’ possibile utilizzare connettivi logici AND e OR
per unire più condizioni semplici tra loro.

Es. cancellare i nominativi con stipendio maggiore di 2000€ e che lavorano


nell’azienda di codice 35.
DELETE FROM DIPENDENTI WHERE Stipendio>2000 AND CodAzienda=35

Oltre ai consueti criteri di confronto ( = , > , >= , < , <= , <>) ne esistono altri
importanti nel mondo dei dati. Vediamo i principali:

- BETWEEN a AND b : filtro per intervallo valori


ES. cancellare i nominativi con stipendio compreso tra 2500€ e 3000€
WHERE Stipendio BETWEEN 2500 AND 3000

- IN ( , , , ) : filtro di appartenenza ad un insieme enumerato di valori


ES. cancellare i nominativi di nome “Mario”, “Luca” ed “Andrea”
WHERE Nome IN (“Mario”, “Luca” , “Andrea”)

- LIKE “*testo*” : filtro per criterio di similitudine.


Il carattere * rappresenta il carattere jolly della ricerca

ES. cancellare i nominativi il cui cognome comincia per “Ross”


WHERE Cognome LIKE “Ross*”
Il carattere jolly fornisce un grado di libertà nelle ricerca.
- YEAR(data), MONTH(data), DAY(data) : sono funzioni che permettono di
estrarre una precisa componente di un campo di tipo DATE.

ES. cancellare i nominativi nati nel 1970


WHERE YEAR(DataNascita) = 1970

ES. cancellare i nominativi nati nel mese di marzo del 1970


WHERE MONTH(DataNascita)=3 AND YEAR(DataNascita) = 1970
UPDATE
DIPENDENTI (CodFisc, Cognome, Nome, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

UPDATE DIPENDENTI
SET campo=nuovo_valore
WHERE …..criterio di filtro…… UPDATE permette di
modificare il valore di
La clausola WHERE permette di identificare i record una o più colonne in
che saranno oggetto della modifica. riferimento ad uno o
Stesso utilizzo già visto nel comando DELETE. più record della
tabella.
La clausola SET permette di impostare il nuovo valore
nel campo specificato.

ES. Impostare lo stipendio di 2000€ al dipendente Rossi Mario


UPDATE DIPENDENTI
SET Stipendio = 2000
WHERE Cognome=”Rossi” AND Nome=”Mario”

E’ possibile indicare anche una formula algebrica nel nuovo valore da


assegnare ad un campo.
ES. Incrementare di 100€ lo stipendio a tutti i dipendenti con almeno 2 figli
UPDATE DIPENDENTI
SET Stipendio = Stipendio+100
WHERE NumFigli>=2

E’ anche possibile reimpostare i valori di più campi contemporaneamente in


un’unica istruzione UPDATE.
I vari assegnamenti vanno separati da una virgola.

ES. Al dipendente Rossi Mario incrementare del 15% il proprio stipendio ed


impostare che è Laureato.
UPDATE DIPENDENTI
SET Stipendio = Stipendio*1.15 , Laureato=true
WHERE Cognome=”Rossi” AND Nome=”Mario”
ISTRUZIONI DCL
(GRANT, REVOKE)

Nei DBMS SQL ogni operazione deve essere autorizzata, ovvero l’utente che
esegue l’operazione deve avere i privilegi necessari.„
I privilegi vengono concessi e revocati per mezzo delle istruzioni GRANT e
REVOKE.

Il formato per assegnare privilegi su tabelle è:

GRANT { ALL | < lista di privilegi > }


ON [ TABLE ] <table name>
TO { <lista di utenti e gruppi> | PUBLIC }[ WITH GRANT OPTION ]

Es.
Si dispone della tabella:
DIPENDENTI (CodFisc, Cognome, Nome, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

La seguente istruzione assegna i privilegi di selezione dati e modifica della


colonna “Stipendio” agli utenti “Pippo“ e “Topolino”

GRANT SELECT, UPDATE(Stipendio)


ON TABLE Dipendenti
TO USER Pippo, USER Topolino
ISTRUZIONI QL
(SELECT)

DIPENDENTI (CodFisc, Cognome, Nome, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

SELECT Cognome, Nome, DataNascita SELECT permette di estrarre


FROM DIPENDENTI i dati di uno o più record,
WHERE …..criterio di filtro…… indicando solamente alcune
colonne da visualizzare.
La clausola WHERE permette di identificare I dati estratti possono
i record che saranno oggetto di visualizzazione. essere singole colonne ma
Stesso utilizzo già visto nei comandi DML. anche dati aggregati e/o
calcolati sulla tabelle stessa.
I campi indicati dopo SELECT sono quelli Con opportune clausole è
che verranno mostrati a video come risultato possibile ordinare i dati,
dell’interrogazione dati. raggrupparli ed unire più
tabelle tra loro per
estrazioni complesse (JOIN).
Nel gergo relazionale si indica come:
- “Selezione” : la possibilità di filtrare le righe di una tabella (attraverso la
clausola “WHERE”) – una sorta di “taglio orizzontale” della tabella
- “Proiezione” : la possibilità di visualizzare in uscita solo alcune colonne di
una relazione – una sorta di “taglio verticale” della tabella

ESTRAZIONE DI COLONNE SEMPLICI

E’ sufficiente indicare, dopo la parola “SELECT”, le colonne da visualizzare. Per


indicarle tutte è possibile utilizzare il simbolo *
ES. Visualizzare Cognome, Nome e Data di Nascita di tutti i dipendenti laureati
che lavorano nell’azienda di codice 35.

SELECT Cognome, Nome, DataNascita FROM DIPENDENTI


WHERE Laureato=true AND CodAzienda=35;

ES: Visualizzare tutti i dipendenti laureati


SELECT * FROM Dipendenti WHERE Laureato=true;
Clausola di Ordinamento dati: ORDER BY

Per visualizzare in output (da una selezione) i dati ordinati secondo un certo
criterio, è possibile specificare una o più colonne di ordinamento.

ES: Visualizzare tutti i dipendenti laureati, ordinando l’elenco per cognome e


nome.
SELECT * FROM Dipendenti WHERE Laureato=true
ORDER BY Cognome, Nome

Clausola di eliminazione duplicati in output: DISTINCT

Per evitare di visualizzare in output (da una selezione) righe esattamente


uguali tra loro, è possibile utilizzare la clausola DISTINCT dopo la parola
SELECT, in questo caso le righe uguali non verranno duplicate in
visualizzazione.

ES: Data la tabella:

DIPENDENTI (CodFisc, Cognome, Nome, Città, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

visualizzare le diverse città da cui provengono i dipendenti dell’azienda di


codice 35.

SELECT DISTINCT Città


FROM DIPENDENTI
WHERE CodAzienda=35;
ESTRAZIONE DI DATI AGGREGATI

Esistono delle funzioni di aggregazione SQL che consentono di ottenere in


output valori ottenuti tramite una pre-elaborazione dei dati da parte del
DBMS. Si fa presente che tali funzioni sono utilizzabili solamente nell’elenco
dei campi da “proiettare” in uscita e non possono essere utilizzare nelle
condizioni di filtro “WHERE” (in quanto esse lavorano sul sottoinsieme di
record che soddisfano la selezione ed estraggono UN SOLO DATO
rappresentativo di quell’insieme di record).

Principali funzioni di aggregazione:

- COUNT(*) : tale funzione restituisce il numero di record che


soddisfano un determinato criterio di selezione.

ES. Contare quanti sono i dipendenti nati tra il 1970 e il 1980

SELECT COUNT(*) FROM DIPENDENTI


WHERE YEAR(DataNascita) BETWEEN 1970 AND 1980

- MIN (colonna) : tale funzione restituisce il valore minimo della colonna


indicata come parametro, cercandolo tra tutti i record che
soddisfano la selezione impostata nella WHERE.
La funzione accetta qualunque tipo di colonna (numerica,
testuale e data)

ES. Visualizzare lo stipendio più basso tra tutti i dipendenti laureati con
almeno 3 figli.

SELECT MIN(Stipendio) FROM DIPENDENTI


WHERE Laureato=true AND NumFigli>=2

- MAX (colonna) : come MIN ma restituisce il valore massimo della colonna


- AVG (colonna) : restituisce la media aritmetica dei valori (solo numerici)
nella colonna indicata, calcolandola tra tutti i record che
soddisfano la selezione impostata nella WHERE.
ES. Visualizzare lo stipendio medio dei dipendenti dell’azienda di
codice 35.

SELECT AVG (Stipendio) FROM DIPENDENTI WHERE CodAzienda=35

- SUM (colonna) : restituisce la somma aritmetica dei valori (solo numerici)


nella colonna indicata, calcolandola tra tutti i record che
soddisfano la selezione impostata nella WHERE.
ES. Visualizzare il numero totale di figli che hanno i dipendenti
dell’azienda di codice 35.

SELECT SUM (NumFigli) FROM DIPENDENTI WHERE CodAzienda=35

NOTA IMPORTANTISSIMA!
Siccome il formato di restituzione dei dati della SELECT è comunque
tabellare, quando si utilizzano le funzioni di aggregazione NON E’ POSSIBILE
chiedere contemporaneamente di estrarre anche una qualsiasi colonna
della tabella.
ES: Visualizzare quanti sono i dipendenti nati nel 1980 e visualizzare i loro nomi.

Se si provasse la seguente soluzione:


SELECT COUNT(*), Cognome, Nome FROM DIPENDENTI
WHERE YEAR(DataNascita)=1980

…riceveremmo un errore dal DBMS poiché incapace di restituire una tabella


dei risultati simile alla seguente:

COUNT(*) Cognome Nome


Rossi Mario
3 Verdi Carlo
Amedei Luca

(in quanto non sarebbe una tabella regolare, cioè ogni colonna non avrebbe lo
stesso numero di righe)
ALIAS “AS”

E’ possibile rinominare i nomi delle colonne “proiettate” durante l’operazione


di SELECT, solitamente per migliorare la leggibilità delle informazioni
restituite.
Tale operazione viene sicuramente consigliata per le funzioni di aggregazione
poiché hanno un nome poco intuitivo per l’utente che visualizza i risultati.

ES. Visualizzare il numero dei dipendenti (ed il loro stipendio medio) nati dal
1981 in avanti.

SELECT COUNT(*) AS Num_Dipendenti, AVG(Stipendio) AS Stipendio_Medio


FROM DIPENDENTI
WHERE YEAR(DataNascita)>=1981

In risultato finale sarà del tipo: Num_Dipendenti Stipendio_Medio


7 1830,65

Si fa presente che in alcuni DMBS il meccanismo dell’alias è funzionante


all’interno di tutta l’istruzione SQL e non solamente nella fase di output del
risultato.
RAGGRUPPAMENTI DI DATI – GROUP BY

La clausola GROUP BY è utilizzata nelle operazioni di SELECT al fine di


raggruppare i valori identici presenti in una o più colonne.
In tal caso verrà visualizzato in output solamente un valore per ogni diverso
gruppo creabile tra i record risultanti dalla selezione fatta.
Solitamente il GROUP BY viene utilizzato in combinazione con le funzioni di
aggregazione per estrarre, all’interno di ogni gruppo, un dato riepilogativo e
rappresentativo del gruppo stesso.

ES: Data la tabella:


DIPENDENTI (CodFisc, Cognome, Nome, Città, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

visualizzare, per ogni diversa città, quanti sono i dipendenti, con almeno un
figlio, che abitano in quella città.

SELECT Città, COUNT(*)


FROM DIPENDENTI
WHERE NumFigli>=1
GROUP BY Città

Il sistema procede internamente in questo modo:


1. Analizza i record della tabella DIPENDENTI e verifica quali soddisfano il
criterio di selezione “NumFigli>1”
2. Solamente con questi record, crea dei gruppi a parità di Città.
3. In ogni gruppo creato applica la funzione di aggregazione COUNT(*) e
restituisce una sottotabella (in output) visualizzando, per ogni città, il
numero di record riferiti a quella città.
FILTRI SUI GRUPPI – CLAUSOLA HAVING

La clausola HAVING è utilizzata nelle operazioni di SELECT nelle quali è


presente un GROUP BY, per impostare dei filtri sui gruppi costituiti tramite il
raggruppamento.
In sostanza, dopo che i gruppi sono stati costituiti, la clausola HAVING può
impostare un filtro tramite una o più funzioni di aggregazione applicate ai
gruppi stessi.

ES: Data la tabella:


DIPENDENTI (CodFisc, Cognome, Nome, Città, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

Visualizzare la città nelle quali c’è più di un dipendente con almeno un figlio.

SELECT Città, COUNT(*)


FROM DIPENDENTI
WHERE NumFigli>=1
GROUP BY Città
HAVING COUNT(*)>1

La clausola HAVING viene paragonata alla clausola WHERE con la sostanziale


differenza che:
- il WHERE applica un filtro ai record diretti della tabella (quindi le condizioni
di filtro devono riguardare campi della tabella)

- l’ HAVING applica un filtro ai gruppi (creati mediante il GROUP BY): quindi le


condizioni di filtro possono riguardare solamente valori aggregati quali
COUNT(*), SUM (), AVG (), MIN () e MAX ()
SUB-QUERY

In linea generale con il termine Sub-Query si intende inserire una istruzione


SELECT all’interno di un’altra istruzione SQL.
Per capire in che modo utilizzare una subquery, è necessario innanzitutto
soffermarsi sui possibili valori di ritorno di una query di selezione (ovvero di
una query che utilizza l’istruzione SELECT). Lo faremo sfruttando alcuni esempi,
ognuno dei quali utilizza un diverso tipo di subquery.

CASO 1

La subquery interna ritorna UN INSIEME DI VALORI da utilizzarsi all’interno


dell’operatore IN.

Es. Date le tabelle:


DIPENDENTI (CodFisc, Cognome, Nome, Città, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)
ELENCO_CITTA (NomeCittà, Provincia, Regione)

Estrarre i dipendenti che abitano in città della Toscana.


SELECT Cognome, Nome
FROM DIPENDENTI
WHERE Città IN (SELECT NomeCittà FROM ELENCO_CITTA WHERE Regione=”Toscana”)

In questo caso la subquery restituisce un insieme di città, e più precisamente


quelle della regione Toscana.
Se osserviamo ora l’intera query, noteremo la parola chiave IN: dal momento
che è inserito all’interno di una clausola WHERE, questo costrutto ci permette
di selezionare tutte e sole le righe della tabella Dipendenti tali che il campo
Città sia presente tra i risultati della subquery. Utilizzando NOT IN otterremmo,
ovviamente, l’esatto contrario: selezioneremmo tutti quei dipendenti la cui
Città NON è presente tra i risultati della subquery.
CASO 2
La subquery interna ritorna UN SOLO VALORE da utilizzarsi all’interno di una
condizione di filtro nella clausola WHERE.

Es. Data la tabella:


DIPENDENTI (CodFisc, Cognome, Nome, Città, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)

Estrarre i dipendenti con stipendio superiore alla media degli stipendi calcolata
tra tutti i dipendenti.

SELECT Cognome, Nome


FROM DIPENDENTI
WHERE Stipendio > ( SELECT AVG(Stipendio) FROM Dipendenti )

In questo caso la subquery restituisce un SOLO valore – numerico – che


contiene il valore medio degli stipendi di tutti i dipendenti.
Tale valore viene utilizzato nella condizione di confronto delle SELECT esterna.
JOIN TRA TABELLE

Con il termine JOIN si intende l’ unione di due o più tabelle – in fase di


estrazione dati – attraverso l’utilizzo della chiave importata e della relativa
chiave primaria della tabella di partenza.

La suddivisione dei dati in più tabelle nasce dall’esigenza di evitare ridondanze


nel modo relazionale, di conseguenza, sia la progettazione del DB attraverso lo
schema E/R e sia l’utilizzo delle Forme Normali, portano la base dati in una
situazione in cui le informazioni risultano “suddivise” in tabelle tra loro
collegate attraverso le chiavi importate.

Esistono diversi tipi di JOIN e diverse modalità tecniche per realizzarlo; per
questioni di semplicità tratteremo solamente l’ INNER JOIN.

L’ Inner Join combina solo le righe delle due tabelle che soddisfano un certo
predicato di confronto, come in un’operazione di intersezione.
Il risultato consiste nel creare, in modo virtuale e temporaneo, un’unica
tabella formata dall’unione delle due tabelle di partenza in modo da poter
elaborare i dati in maniera trasversale tra le varie tabelle.
Questo tipo di join è la combinazione tra il prodotto cartesiano delle due
tabelle ed una selezione dati applicata ad esso.

Es. Siano date le tabelle:


DIPENDENTI (CodFisc, Cognome, Nome, Città, DataNascita, NumFigli, Stipendio, Laureato, CodAzienda)
AZIENDE (CodAzienda, Denominazione, Città, SettoreLavorativo)
Per effettuare il Join tra due tabelle è necessaria la presenza di un campo “in
comune”, rappresentato dalla chiave importata e dalla relativa chiave primaria
nella tabella collegata.
Nell’esempio il campo di collegamento tra le due tabelle è CodAzienda.

In SQL un modo per realizzare il Join è quello di indicare:


- nel FROM entrambe le tabelle
- nel WHERE la condizione di Join (mediante uguaglianza) tra i due campi in
comune tra le due tabelle.

SELECT campi
FROM DIPENDENTI, AZIENDE
WHERE DIPENDENTI.CodAzienda = AZIENDE.CodAzienda

NOTA: Quando nelle due tabelle di join ci sono colonne con lo stesso
nome (es. CodAzienda, Città) per referenziare una precisa colonna è
OBBLIGATORIO anteporre al nome del campo il nome della tabella,
seguito dal carattere . (PUNTO)
ES. DIPENDENTI.CodAzienda oppure DIPENDENTI.Città

Dopo aver eseguito l’operazione di Join, è possibile utilizzare tutti campi di


entrambe la tabelle come se fossero appartenenti ad un’unica maxi-tabella
denormalizzata, disponibile real-time solo per il tempo di esecuzione della
query.

Es. Estrarre i nomi dei dipendenti che lavorano nell’azienda denominata “Beta
Spa”.

SELECT Cognome, Nome


Condizione di Join
FROM DIPENDENTI, AZIENDE
WHERE DIPENDENTI.CodAzienda = AZIENDE.CodAzienda
AND Denominazione = “Beta Spa”
Condizione di filtro

Potrebbero piacerti anche