Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SQL QUERY
A cura di: Celora Luca
>definizione
Fare una query significa fare delle ricerche sul
nostro database.
>strumenti da usare
SELECT //sceglie le colonne da visualizzare
FROM //indica da quali tabelle andare a prendere
i dati
WHERE //condizione di ricerca da rispettare
>join (definizione)
l'operazione di join rappresenta un'importante
operazione in quanto permette di correlare dati
rappresentati da relazioni diverse
>join (come usarlo)
Il JOIN va usato per le query su + tabelle e si usa
inserendo nella clausola di where luguaglianza
tra le chiavi primarie-esterne delle due relazioni
che voglio correlare
WHERE Nome = 'Rossi' AND
Impiegati.Dip# = Dipartimenti.Dip#;
>funzioni di gruppo (definizione)
Permettono di raggruppare tuple che si riferiscono
da un determinato attributo.
>funzioni di gruppo (come usarle)
in SELECT vanno messi davanti alle colonne:
MAX - scegli il valore massimo
MIN - scegli il valore minimo
SUM - somma tutti i valori
AVG - fai la media di tutti i valori
COUNT - conte gli elementi della colonna
Dopo WHERE fa messa lattributo per cui si
vogliono raggruppare le tuple
GROUP by attributo
>having (definizione)
possibile specificare condizioni di ricerca su
gruppi di tuple
>having (come usarlo)
Having specifica un ulteriore clausola
sullattributo per cui le tuple sono state
raggruppate.
Es.
SELECT Nome_Dip, Mansione, SUM(Stipendio),
COUNT(*), AVG(Stipendio)
FROM Dipartimenti, Impiegati
WHERE Dipartimenti.Dip#=Impiegati.Dip#
GROUP BY Nome_Dip, Mansione
HAVING COUNT(*) > 2;
//trova i gruppi che contengono solo due
impiegati.
>sottoquery (subquery)
la subquery viene usata per determinare uno o pi
valori da usare come valori di confronto in un
predicato della query esterna
>sottoquery (come usarle)
Per fare una subquery bisogna inserire un ulteriore
condizione nel where.
Se usiamo paragonare un elemento della 1 query
con un elemento della 2 query dobbiamo usare gli
alias.
SELECT Dip#, Nome, Stipendio FROM Impiegati X
WHERE Stipendio > (SELECT AVG(Stipendio)
FROM Impiegati
WHERE X.Dip# = Dip#)
//condizione: stipendi degli impiegati maggiore
dalla media degli stipendi per ogni dipartimento.
Si possono mettere prima delle subquery dei
comandi sql che indicano se la 1 condizione deve
essere verificata x
ANY almeno 1 tupla della 2 condizione
ALL per tutte le tuple della 2 condizione
>come fare le query (schema)
SELECT (scegli le colonne da visualizzare nel
risultato)
FROM (scegli le tabelle dove andare a prelevare i
file)
WHERE (indicare la condizione da verificare)
Ev. GROUP BY (raggruppa le tuple mediante
questo attributo)
Ev. HAVING (clausola sul GROUP BY)
>esercizi svolti
trovare tutti gli impiegati con lo stipendio
superiore a 2000 euro.
SELECT * FROM Impiegati
WHERE Stipendio>2000;
trovare gli ingegneri che guadagnano pi di
2000 euro.
SELECT Nome, Dip# FROM Impiegati
WHERE Stipendio>2000 AND
Mansione = 'ingegnere;
trovare gli impiegati che hanno lo stipendio
compreso tra 1100 e 1400 euro
SELECT Nome, Stipendio FROM Impiegati
WHERE Stipendio BETWEEN 1100 AND 1400;
trovare gli impiegati che hanno la lettera R in
3a posizione del nome.
SELECT Nome FROM Impiegati
WHERE Nome LIKE '_ _ R%';
trovare gli impiegati del dipartimento 30 e
ordinarli in base allo stipendio.
SELECT Stipendio, Mansione, Nome
FROM Impiegati
WHERE Dip#=30
ORDER BY Stipendio;
trovare il nome del dipartimento deove
lavora limpiegato Rossi.
SELECT Nome_Dip
FROM Impiegati, Dipartimenti
WHERE Nome = 'Rossi' AND
Impiegati.Dip# = Dipartimenti.Dip#;
si vuole determinare il massimo stipendio
SELECT MAX(Stipendio) FROM Impiegati;
si vuole raggruppare gli impiegati in base al
numero di dipartimento e si vuole
determinare il massimo stipendio di ogni
gruppo
SELECT Dip#, MAX(Stipendio)
FROM Impiegati
GROUP BY Dip#;
per ogni gruppo si vuole determinare la
somma degli stipendi, quanti impiegati
appartengono ad ogni gruppo e la media degli
stipendi
SELECT Nome_Dip, Mansione, SUM(Stipendio),
COUNT(*), AVG(Stipendio)
FROM Dipartimenti, Impiegati
WHERE Dipartimenti.Dip#=Impiegati.Dip#
GROUP BY Nome_Dip, Mansione;
supponiamo di essere interessati solo ai
gruppi che contengono almeno due impiegati
SELECT Nome_Dip, Mansione, SUM(Stipendio),
COUNT(*), AVG(Stipendio)
FROM Dipartimenti, Impiegati
WHERE Dipartimenti.Dip#=Impiegati.Dip#
GROUP BY Nome_Dip, Mansione
HAVING COUNT(*) > 2;
si vuole elencare tutti gli impiegati che hanno
la stessa mansione dell'impiegato di nome
Gianni
SELECT Nome, Mansione FROM Impiegati
WHERE Mansione = (SELECT Mansione FROM
Impiegati
WHERE Nome = 'Gianni');
si vuole elencare tutti gli impiegati che hanno
uno stipendio superiore alla media degli
stipendi di tutti gli impiegati
SELECT Nome, Stipendio FROM Impiegati
WHERE Stipendio > (SELECT AVG(Stipendio)
FROM Impiegati);
determinare lo stipendio, la mansione, il
nome e il numero di dipartimento degli
impiegati che guadagnano pi di almeno un
impiegato del dipartimento 30
SELECT Stipendio, Mansione, Nome, Dip#
FROM Impiegati WHERE Stipendio > ANY
(SELECT Stipendio FROM Impiegati
WHERE Dip#=30);
determinare i dipartimenti tali che tutti gli
impiegati di tali dipartimenti guadagnino pi
di 1000
SELECT * FROM Dipartimenti X
WHERE 1000 < ALL (SELECT Stipendio
FROM Impiegati
WHERE Dip#=X.Dip#);
determinare i dipartimenti che abbiano
almeno un impiegato che guadagna pi di
1000
SELECT * FROM Dipartimenti X
WHERE 1000 < ANY (SELECT Stipendio
FROM Impiegati
WHERE Dip#=X.Dip#)
si vuole determinare il nome di tutti gli
impiegati che non hanno alcun impiegato che
risponde loro
SELECT Nome FROM Impiegati X
WHERE NOT EXISTS (SELECT * FROM Impiegati
WHERE X.Imp# = Risponde_a);