SQL IN vs SQL ESISTE
Questo articolo illustra in dettaglio gli operatori IN e EXISTS in SQL . È una domanda comune tra gli sviluppatori quale sia la differenza tra questi due operatori. Per conoscere la differenza, discutiamo prima di ciascuno di questi operatori in dettaglio.
Operatore IN
L'operatore IN viene utilizzato per ottenere risultati quando un valore specificato corrisponde a un valore in un insieme di valori o viene restituito da una query interna. Questo operatore può essere utilizzato anche con WHERE clausola per specificare più di un valore. L'operatore IN viene spesso indicato come l'acronimo dell'operatore OR perché riduce l'uso di più condizioni OR nelle query SELECT, INSERT, UPDATE o DELETE .
In questo operatore, la sottoquery viene risolta per prima e il risultato viene quindi utilizzato per risolvere la query esterna.
Quella che segue è la sintassi generale dell'operatore IN:
SELECT column_name FROM table_name WHERE column_name IN (value1, value2, …);
Esempio:
Consideriamo la seguente tabella Clienti.
ID_cliente | Nome_cliente | Città | Occupazione |
1 | Harry | Calcutta | Affari |
2 | Ron | Mumbai | Dottore |
3 | Albus | Delhi | Ingegnere |
4 | Dobby | Pune | Scienziato |
5 | Piton | Bangalore | Studente |
Query:
SELECT * FROM Customer WHERE Occupation IN ('Doctor', 'Scientist', 'Engineer');
La query precedente restituirà tutti i clienti che sono Dottore o Scienziato o Ingegnere.
Risultato:
ID_cliente | Nome_cliente | Città | Occupazione |
2 | Ron | Mumbai | Dottore |
3 | Albus | Delhi | Ingegnere |
4 | Dobby | Pune | Scienziato |
Operatore EXISTS
L'operatore EXISTS, a differenza dell'operatore IN, restituisce un valore booleano. Questo operatore controlla il risultato della query interna e restituisce un valore booleano, ovvero true o false. Se la query interna restituisce uno o più record, l'operatore restituisce true altrimenti restituisce false quando non vengono trovati record.
Questo operatore è anche efficiente poiché interrompe l'ulteriore elaborazione non appena viene rilevato il primo vero evento.
Quella che segue è la sintassi dell'operatore EXISTS:
SELECT column_names FROM table_name WHERE NOT EXISTS ( SELECT column_names FROM table_name WHERE condition );
Esempio:
Consideriamo la seguente tabella Clienti.
ID_cliente | Nome | Occupazione | Età |
101 | Harry | Ingegnere | 32 |
102 | Ron | Sviluppatore | 30 |
103 | Dobby | Leader | 28 |
104 | Albus | Scienziato | 45 |
105 | Piton | Falegname | 26 |
106 | Zenzero | Attore | 25 |
107 | NULLO | NULLO | NULLO |
Consideriamo un'altra tabella Ordini.
ID_ordine | ID_cliente | Nome_prodotto | Data_ordine |
1 | 101 | Computer portatile | 10-01-2021 |
2 | 103 | Desktop | 12-02-2021 |
3 | 106 | iPhone | 15-02-2021 |
4 | 104 | Cellulare | 05-03-2021 |
5 | 102 | TV | 20-03-2021 |
Query:
SELECT Name, Occupation FROM Customer WHERE EXISTS ( SELECT * FROM Orders WHERE Customer.Cust_id = Orders.Cust_id );
La query di cui sopra restituirà il nome e l'occupazione di tutti i clienti che hanno effettuato almeno un ordine.
Risultato:
Nome | Occupazione |
Harry | Ingegnere |
Ron | Sviluppatore |
Dobby | Leader |
Albus | Scienziato |
Zenzero | Attore |
Tabella delle differenze tra operatore IN ed EXISTS
Le differenze principali tra l'operatore IN e l'operatore EXISTS sono elencate di seguito in modo tabulare:
Operatore IN | Operatore EXISTS |
Riduce al minimo l'utilizzo delle condizioni OR. | Verifica l'esistenza di un record nella query interna. |
Confronta i valori della query interna con il valore della query esterna. | Non confronta i valori tra la query interna e la query secondaria. |
Verifica tutti i valori all'interno del blocco della clausola IN. | Arresta ogni ulteriore esecuzione non appena viene soddisfatta la prima condizione vera. |
Può restituire TRUE, FALSE o NULL. | Restituisce TRUE o FALSE. |
Può essere usato per controllare i valori NULL. | Non può essere utilizzato per controllare i valori NULL. |
Viene usato sia con sottoquery che con valori. | Viene utilizzato solo con le sottoquery. |
L'esecuzione è più veloce quando il risultato della query interna è inferiore. | L'esecuzione è più veloce anche quando il risultato della query interna è di grandi dimensioni. È più efficiente dell'operatore IN. |
Sintassi :SELECT nome_colonna DA nome_tabella WHERE nome_colonna IN (sottoquery); | Sintassi :SELECT nome_colonna DA nome_tabellaWHERE [NON] ESISTE (sottoquery); |
Conclusione:
In questo argomento è stato effettuato un confronto tra l'operatore IN e gli operatori EXISTS di SQL. Entrambi gli operatori eseguono la stessa operazione ma il loro funzionamento interno è diverso. Hanno un funzionamento logico diverso. Ognuno di loro può essere selezionato secondo il requisito. Tuttavia, se l'insieme di dati è grande, si consiglia sempre di utilizzare l'operatore EXISTS.