vuoi
o PayPal
tutte le volte che vuoi
EXCEPT
SELECT Fornitore
FROM Fornitura;
Perciò il costrutto EXCEPT necessita di 2 SELECT, come d'altrocanto anche UNION e
INTERSECT anche se quest'ultimo non è implementato commercialmente.
Le viste sono molto utili per realizzare risultati intermedi. Se ad esempio voglio i fornitori che
forniscono esattemente una merce, le viste sono molto comode che realizzare i risultati intermedi
di almeno 1 merce fornita ed almeno 2. Per creare una vista si utilizza CREATE VIEW. Esempio
di fornitore che fornisce esattamente una merce:
CREATE VIEW Almeno1(Fornitore) AS
(SELECT Fornitore
FROM Fornitura);
CREATE VIEW Almeno2(Fornitore) AS
(SELECT X1.Fornitore
FROM Fornitura X1, Fornitura X2
WHERE X1.Fornitore=X2.Fornitore AND X1.Merce!=X2.Merce);
SELECT *
FROM Almeno1;
EXCEPT
SELECT *
FROM Almeno2;
quindi CREATE VIEW NomeVista (Attributi che compongono la vista).
Exists, not exists, in, not in
EXISTS prende come argomento una query e restituisce true quando la query restituisce almeno
una riga. La query all'interno della WHERE viene valutata ogni volta per ogni riga.
Esempio nomi fornitore che forniscono almeno una merce e nomi fornitori che non forniscono
alcuna merce: 5 / 8
Linguaggio SQL
SELECT F.Nome
FROM Fornitore F
WHERE EXISTS(SELECT *
FROM Fornitura X
WHERE X.Fornitore=F.PIVA);
SELECT F.Nome
FROM Fornitore F
WHERE NOT EXISTS(SELECT *
FROM Fornitura X
WHERE X.Fornitore=F.PIVA);
EXISTS ha solo 1 argomento che è sempre SELECT.
IN serve a stabilire se un valore di un attributo o una combinazione di valore di più attributi, fa
parte della tabella riportata a destra. Esempio:
SELECT F.Nome
FROM Fornitore F
WHERE F.PIVA IN (SELECT Fornitore
FROM Fornitura);
NOT IN serve a stabilire se un valore di un attributo o una combinazione di valore di più
attributi, non fa parte della tabella riportata a destra.
Esempio fornitori che non forniscono merci:
SELECT F.Nome
FROM Fornitore F
WHERE F.PIVA NOT IN (SELECT Fornitore
FROM Fornitura);
Coppie nome fornitore, nome merce tale che le corrispondenti coppie (P.IVA,Codice)
appartengono a fornitura:
SELECT F.Nome, M.Nome
FROM Fornitore F, Merce M 6 / 8
Linguaggio SQL
WHERE (F.PIVA, M.Codice) IN (SELECT Fornitore, Merce
FROM Fornitura);
Gli attributi della SELECT su fornitura potrebbero essere sbagliati e necessitare di
ridenominazione a seconda del DBMS che si utilizza. La query sopra calcola il prodotto
cartesiano Fornitore Merce e ogni riga prosegue se la coppia P.IVA, Codice è presente nella
×
SELECT.
SQL è un linguaggio che consente di esprimere le query in forma dichiarativa, per dichiarativo si
intende un liguaggio che consente di esprimere un risultato dichiarandone la proprietà, questo fa
si che la query in SQL è facilmente comprensibile. L'algebra relazionale è invece intrinsecamente
procedurale.
Costrutti di aggregazione
I costrutti di aggregazione sono dei possibili calcoli che ad esempio calcolano il valore massimo
da un insieme di tuple. Le aggregazioni si riferiscono a fare operazioni di valori che stanno su più
righe della tabella attraverso operatori quali SUM, COUNT, MIN, MAX, AVG ecc. Utilizziamo
come riferimento il seguente schema relazionale:
Cliente(CF, Nome, Città, Eta)
Codice Nome Città Età
C1 N1 CS 10
C2 N2 RC 30
C3 N3 RM 26
Fare
SELECT Max(Eta) AS EtaMax
FROM Cliente;
Ritorna una tabella con numero di righe diverso da quello di cliente. Ogni qualvolta si usa un
operatore di aggregazione la SELECT si rimanda, si esegue la FROM e quindi vengono
importate le righe di cliente e vengono filtrate dalla WHERE e prese tutte le righe si valuta
l'aggregato e poi si valuta la SELECT. Vale l'ordine di priorità come detto.
7 / 8