Entrambi gli operatori EXCEPT e NOT IN vengono utilizzati per filtrare i record da una tabella in base a un criterio specifico. In questo articolo, esamineremo questi operatori in dettaglio e analizzeremo le differenze tra loro.
Prima di andare oltre, creiamo alcuni dati fittizi che useremo in questo esempio:
Preparazione di dati fittizi
Esegui lo script seguente per creare un database fittizio e tabelle che utilizzeremo in questo articolo.
CREATE Database ShowRoom; GO USE ShowRoom; CREATE TABLE Cars1 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL ) CREATE TABLE Cars2 ( id INT, name VARCHAR(50) NOT NULL, company VARCHAR(50) NOT NULL, power INT NOT NULL )
Nello script sopra, creiamo un database ShowRoom con due tabelle, Cars1 e Cars2.
Aggiungiamo alcuni record fittizi alle tabelle Cars1 e Cars2.
Esegui il seguente script:
USE ShowRoom INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800), (2, 'City', 'Honda', 1500), (3, 'C200', 'Mercedez', 2000), (4, 'Vitz', 'Toyota', 1300), (5, 'Baleno', 'Suzuki', 1500), (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200) INSERT INTO Cars2 VALUES (6, 'C500', 'Mercedez', 5000), (7, '800', 'BMW', 8000), (8, 'Mustang', 'Ford', 5000), (9, '208', 'Peugeot', 5400), (10, 'Prius', 'Toyota', 3200), (11, 'Atlas', 'Volkswagen', 5000), (12, '110', 'Bugatti', 8000), (13, 'Landcruiser', 'Toyota', 3000), (14, 'Civic', 'Honda', 1800), (15, 'Accord', 'Honda', 2800)
Ora abbiamo un utile set di dati.
Diamo un'occhiata a come gli operatori EXCEPT e NOT IN differiscono l'uno dall'altro utilizzando questi dati.
ECCETTO Operatore
L'operatore EXCEPT filtra tutti i record dal risultato della query di sinistra, che sono presenti anche nel risultato della query di destra e restituisce i risultati rimanenti dalla query di sinistra.
La sintassi dell'operatore EXCEPT è la seguente:
Right_Query EXCEPT Left_Query
Ci sono due condizioni che devono essere soddisfatte prima dell'esecuzione dell'operatore EXCEPT. Sono:
- L'ordine e il numero delle colonne restituite da entrambe le query devono essere gli stessi.
- I tipi di dati delle colonne devono corrispondere o essere compatibili.
Questo può sembrare complicato. Tuttavia, l'esempio seguente lo chiarirà.
Nelle tabelle Cars1 e Cars2, i record con ID da 6 a ID 10 sono comuni. Se utilizziamo l'operatore EXCEPT con i record della tabella Cars1 a sinistra e la tabella Cars2 a destra, verranno restituiti quei record della tabella Cars1 che non sono in Cars2.
Vediamo l'operatore EXCEPT in azione.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Il risultato della query precedente sarà simile al seguente:
La query sul lato sinistro recupera tutti i record dalla tabella Cars1 mentre quella sul lato destro recupera tutti i record dalla tabella Cars2. Nella tabella Cars1 i record con id da 6 a 10 sono presenti anche nella tabella Cars2, pertanto l'operatore EXCEPT ha restituito solo le prime cinque righe della tabella Cars1.
Allo stesso modo, se vuoi restituire tutti i record della tabella Cars2 che non sono presenti nella tabella Cars1, puoi semplicemente spostare la tabella Cars2 a sinistra dell'operatore EXCEPT come mostrato nella seguente query:
USE ShowRoom SELECT id, name, company, power FROM Cars2 Except SELECT id, name, company, power FROM Cars1
Utilizzo dell'operatore EXCEPT su un unico tavolo
Negli esempi precedenti, abbiamo applicato l'operatore EXCEPT su due tabelle. Tuttavia, l'operatore EXCEPT può essere utilizzato anche per filtrare i record da una singola tabella. Ad esempio, se desideri filtrare tutti i record della tabella Cars1 in cui il valore della potenza è maggiore di 3.000, puoi utilizzare l'operatore EXCEPT come segue:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power from Cars1 WHERE power < 3000
Nello script precedente, la query sul lato sinistro dell'operatore EXCEPT recupera tutti i record dalla tabella Cars1. La query sul lato destro dell'operatore EXCEPT recupera solo i record dalla tabella Cars1 in cui il valore della potenza è inferiore a 3.000. L'operatore EXCEPT filtra i record dalla query a sinistra che esistono nei risultati della query a destra. Pertanto, tutti i record nella tabella Cars1 in cui la potenza è inferiore a 3.000 verranno filtrati e il resto dei record verrà restituito come mostrato nell'output seguente:
NON IN Operatore
L'operatore NOT IN viene utilizzato anche per filtrare le righe. Troviamo tutti i record della tabella Cars1 che sono presenti anche nella tabella Cars2 e restituiamo il resto dei record utilizzando l'operatore NOT IN.
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
Il risultato della query precedente è simile al seguente:
Questo è simile ai risultati ottenuti utilizzando l'operatore EXCEPT.
Differenza tra operatori EXCEPT e NOT IN
Possiamo vedere che i risultati ottenuti utilizzando l'operatore EXCEPT e NOT IN sono simili. Tuttavia, ci sono due differenze principali tra gli operatori EXCEPT e NOT IN:
1- NOT IN Restituisce record duplicati mentre EXCEPT restituisce solo record distinti
L'operatore EXCEPT rimuove le righe duplicate dai risultati e restituisce solo i record DISTINCT. D'altra parte, l'operatore NOT IN restituirà record duplicati.
Diamo un'occhiata a questo con l'aiuto di un esempio. Eseguire la query seguente per inserire un record duplicato nella tabella Cars1.
INSERT INTO Cars1 VALUES (1, 'Corrolla', 'Toyota', 1800)
Ora la tabella Cars1 ha due record duplicati. Puoi verificarlo eseguendo la seguente query:
SELECT * FROM Cars1
La tabella Cars1 avrà questo aspetto:
Puoi vedere che le righe 1 e 11 sono duplicate l'una dell'altra.
Per prima cosa utilizziamo l'operatore EXCEPT per filtrare tutti i record della tabella Cars1 che sono presenti nella tabella Cars2.
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name, company, power FROM Cars2
Il risultato è simile al seguente:
Puoi vedere che sebbene le righe 1 e 11 fossero duplicate nella tabella Cars1 e non fossero presenti nella tabella Cars2, l'operatore EXCEPT non ha restituito entrambe queste righe. Ha restituito solo righe distinte.
Ora utilizziamo l'operatore NOT IN per lo stesso compito:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id from Cars2)
L'output della query precedente è simile al seguente:
Puoi vedere che NOT IN restituisce righe duplicate, ovvero riga 1 e riga 6.
2- EXCEPT confronta le colonne mentre NOT IN confronta un singolo valore
L'operatore EXCEPT confronta i valori in una o più colonne. Ciò significa che il numero di colonne deve essere lo stesso. D'altra parte, l'operatore NOT IN confronta i valori in una singola colonna.
Ad esempio, non puoi avere un numero di colonne diverso per le query a sinistra ea destra di un operatore EXCEPT come mostrato nell'esempio seguente:
USE ShowRoom SELECT id, name, company, power FROM Cars1 Except SELECT id, name,power FROM Cars2
La query precedente restituisce il seguente errore:
Per l'operatore NOT IN, non puoi avere più di una colonna nella sottoquery. Ciò significa che la seguente query restituirà un errore:
USE ShowRoom SELECT id, name, company, power FROM Cars1 WHERE id NOT IN (SELECT id, name from Cars2)
Nello script precedente, la sottoquery ha due colonne, ovvero id e name. Pertanto verrà generato un errore:
Ulteriori letture:
- Scuole W3:IN e NON IN Esempi
- TechontheNet:l'operatore EXCEPT
- YouTube:l'operatore EXCEPT