Indipendenti
SELECT Nome
FROM IMPIEGATO
WHERE Nome <> ALL (SELECT Cognome FROM IMPIEGATO)ALL → deve essere diverso da TUTTI
ANY → deve essere diverso da almeno uno, qualsiasi
La query tra parentesi mi da una tabella di valori
Sul WHERE, se ho un attributo, devo averne uno anche nella query annidata come risultato, se ne ho due devo restituirne due ecc…
Quella dell’esempio è una query annidata indipendente (=non correlata alla query esterna)
Posso annidare nel where (di solito), nel from (un po’ complicato) e nel select (quasi mai)
Invece di <>ALL posso usare anche NOT IN
Correlate
SELECT CF
FROM PERSONA P1
WHERE CF <> ALL (SELECT P2.CF FROM PERSONA P2
WHERE P1.Nome = P2.Nome AND P1.Cognome = P2.Cognome)Per ogni record nelle indipendenti viene eseguita la subquery una volta, mentre in queste viene rieseguita ogni volta perché dipende dalla query esterna
Le query annidate correlate aggiungono potere espressivo al linguaggio (ad esempio massimi e minimi relativi possono essere fatti solo con queste query)
SELECT CF
FROM PERSONA P1
WHERE NOT EXISTS (SELECT * FROM PERSONA P2
WHERE P1.Nome = P2.Nome AND P1.Cognome = P2.Cognome
AND P1.CF = P2.CF)NOT EXISTS ed EXISTS sono molto più leggeri di <>ALL, confrontano numero di record e non contenuto dei record