Fino a ora abbiamo visto interrogazioni in cui l'argomento della clausola where si basa su condizioni composte (tramite gli operatori logici) da predicati semplici, in cui ciascun predicato rappresenta un confronto tra due valori.
SQL ammette anche l'uso di predicati con una struttura più complessa, in cui si confronta un valore con il risultato dell'esecuzione di un'interrogazione SQL. L'interrogazione che viene usata per il confronto viene definita direttamente nel predicato interno alla clausola where. Si parla in questo caso di query nidificate.
Nel caso più tipico, l'espressione che compare come primo membro del confronto è il semplice nome di un attributo.
Se in un predicato si confronta un attributo con il risultato di un'interrogazione, sorge il problema di disomogeneità dei termini del confronto. Infatti da una parte abbiamo visto il risultato dell'esecuzione di una queru SQL (un insieme di valori), mentre dall'altro abbiamo il valore dell'attributo per la particolare riga.
La soluzione sono le parole chiave all e any i normali operatori di confronto.

L'interrogazione seleziona le righe di IMPIEGATO per cui il valore dell'attributo Dipart è uguale ad almeno uno dei valori dell'attributo Nome delle righe di DIPARTIMENTO.
Consideriamo un· interrogazione che permette di trovare gli impiegati che hanno lo stesso nome di un impiegato del dipartimento Produzione.
L'interrogazione ammette due formulazioni:
la prima attraverso l'uso di variabili

la seconda attraverso l'uso di una query nidificata

Consideriamo ora una diversa interrogazione:

L'interrogazione nidificata seleziona i valori di Dipart di tutte le righe in cui il cognome vale "Rossi". La condizione è quindi soddisfatta da quelle righe di DIPARTIMENTO per cui il valore dell'attributo Nome non fa parte dei nomi prodotti dall'interrogazione nidificata.
Per rappresentare il controllo di appartenenza e di esclusione rispetto a un insieme, SQL mette a disposizione due appositi operatori in e not in.