Database
 sql >> Base de données >  >> RDS >> Database

Comprendre la différence entre les opérateurs EXCEPT et NOT IN

Les opérateurs EXCEPT et NOT IN sont utilisés pour filtrer les enregistrements d'une table en fonction d'un critère spécifique. Dans cet article, nous examinerons ces opérateurs en détail et étudierons les différences entre eux.

Avant d'aller plus loin, créons quelques données factices que nous utiliserons dans cet exemple :

Préparation des données factices

Exécutez le script suivant pour créer une base de données et des tables factices que nous utiliserons dans cet article.

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
 )

Dans le script ci-dessus, nous créons une base de données ShowRoom avec deux tables, Cars1 et Cars2.

Ajoutons quelques enregistrements factices aux tables Cars1 et Cars2.

Exécutez le script suivant :

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)

Nous avons maintenant un ensemble de données utiles.

Regardons comment les opérateurs EXCEPT et NOT IN diffèrent les uns des autres en utilisant ces données.

Opérateur SAUF

L'opérateur EXCEPT filtre tous les enregistrements du résultat de la requête de gauche, qui sont également présents dans le résultat de la requête de droite et renvoie les résultats restants de la requête de gauche.

La syntaxe de l'opérateur EXCEPT est la suivante :

Right_Query EXCEPT Left_Query

Deux conditions doivent être remplies avant l'exécution de l'opérateur EXCEPT. Ce sont :

  • L'ordre et le nombre de colonnes renvoyées par les deux requêtes doivent être identiques.
  • Les types de données des colonnes doivent correspondre ou être compatibles.

Cela peut sembler délicat. Cependant, l'exemple suivant le rendra clair.

Dans les tables Cars1 et Cars2, les enregistrements avec id 6 à id 10 sont communs. Si nous utilisons l'opérateur EXCEPT avec des enregistrements de la table Cars1 à gauche et de la table Cars2 à droite, les enregistrements de la table Cars1 seront renvoyés qui ne sont pas dans Cars2.
Voyons l'opérateur EXCEPT en action.

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

Le résultat de la requête ci-dessus ressemblera à ceci :

La requête de gauche récupère tous les enregistrements de la table Cars1 tandis que celle de droite récupère tous les enregistrements de la table Cars2. Dans la table Cars1, les enregistrements avec les ID 6 à 10 sont également présents dans la table Cars2, par conséquent, l'opérateur EXCEPT n'a renvoyé que les cinq premières lignes de la table Cars1.

De même, si vous souhaitez renvoyer tous les enregistrements de la table Cars2 qui ne sont pas présents dans la table Cars1, vous pouvez simplement déplacer la table Cars2 à gauche de l'opérateur EXCEPT comme indiqué dans la requête suivante :

USE ShowRoom
SELECT id, name, company, power FROM  Cars2
Except
SELECT id, name, company, power FROM  Cars1

Utilisation de l'opérateur EXCEPT sur une seule table

Dans les exemples précédents, nous avons appliqué l'opérateur EXCEPT sur deux tables. Cependant, l'opérateur EXCEPT peut également être utilisé pour filtrer les enregistrements d'une seule table. Par exemple, si vous souhaitez filtrer tous les enregistrements de la table Cars1 dont la valeur de puissance est supérieure à 3 000, vous pouvez utiliser l'opérateur SAUF comme suit :

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
Except
SELECT id, name, company, power from Cars1 WHERE power < 3000

Dans le script ci-dessus, la requête à gauche de l'opérateur EXCEPT récupère tous les enregistrements de la table Cars1. La requête à droite de l'opérateur EXCEPT récupère uniquement les enregistrements de la table Cars1 où la valeur de puissance est inférieure à 3 000. L'opérateur EXCEPT filtre les enregistrements de la requête de gauche qui existent dans les résultats de la requête de droite. Par conséquent, tous les enregistrements de la table Cars1 où la puissance est inférieure à 3 000 seront filtrés et le reste des enregistrements sera renvoyé comme indiqué dans la sortie ci-dessous :

Opérateur PAS DANS

L'opérateur NOT IN est également utilisé pour filtrer les lignes. Trouvons tous les enregistrements de la table Cars1 qui sont également présents dans la table Cars2 et renvoyons le reste des enregistrements à l'aide de l'opérateur NOT IN.

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

Le résultat de la requête ci-dessus ressemble à ceci :

Ceci est similaire aux résultats obtenus avec l'opérateur SAUF.

Différence entre les opérateurs EXCEPT et NOT IN

Nous pouvons voir que les résultats obtenus en utilisant les opérateurs EXCEPT et NOT IN sont similaires. Cependant, il existe deux différences majeures entre les opérateurs EXCEPT et NOT IN :

1- NOT IN renvoie les enregistrements en double tandis que EXCEPT renvoie uniquement les enregistrements distincts

L'opérateur EXCEPT supprime les lignes en double des résultats et renvoie uniquement les enregistrements DISTINCT. D'un autre côté, l'opérateur NOT IN renverra des enregistrements en double.
Regardons cela à l'aide d'un exemple. Exécutez la requête suivante pour insérer un enregistrement en double dans la table Cars1.

INSERT INTO Cars1

VALUES
(1, 'Corrolla', 'Toyota', 1800)

Maintenant, la table Cars1 a deux enregistrements en double. Vous pouvez le vérifier en exécutant la requête suivante :

SELECT * FROM Cars1

La table Cars1 ressemblera à ceci :

Vous pouvez voir que les lignes 1 et 11 sont des doublons l'une de l'autre.

Commençons par utiliser l'opérateur EXCEPT pour filtrer tous les enregistrements de la table Cars1 présents dans la table Cars2.

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name, company, power FROM Cars2

Le résultat ressemble à ceci :

Vous pouvez voir que même si les lignes 1 et 11 étaient des doublons dans la table Cars1 et qu'elles n'étaient pas présentes dans la table Cars2, l'opérateur EXCEPT n'a pas renvoyé ces deux lignes. Il n'a renvoyé que des lignes distinctes.

Utilisons maintenant l'opérateur NOT IN pour la même tâche :

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id from Cars2)

Le résultat de la requête ci-dessus ressemble à ceci :

Vous pouvez voir que NOT IN renvoie les lignes en double, c'est-à-dire les lignes 1 et 6.

2- EXCEPT compare les colonnes tandis que NOT IN compare une seule valeur

L'opérateur EXCEPT compare les valeurs dans une ou plusieurs colonnes. Cela signifie que le nombre de colonnes doit être le même. D'autre part, l'opérateur NOT IN compare les valeurs dans une seule colonne.

Par exemple, vous ne pouvez pas avoir un nombre inégal de colonnes pour les requêtes à gauche et à droite d'un opérateur EXCEPT, comme illustré dans l'exemple suivant :

USE ShowRoom
SELECT id, name, company, power FROM Cars1
Except
SELECT id, name,power FROM Cars2

La requête ci-dessus renvoie l'erreur suivante :

Pour l'opérateur NOT IN, vous ne pouvez pas avoir plus d'une colonne dans la sous-requête. Cela signifie que la requête suivante renverra une erreur :

USE ShowRoom
SELECT id, name, company, power FROM Cars1 
WHERE id NOT IN (SELECT id, name from Cars2)

Dans le script ci-dessus, la sous-requête comporte deux colonnes, à savoir id et name. Par conséquent, une erreur sera générée :

Autres lectures :

  • Écoles W3 :Exemples IN et NOT IN
  • TechontheNet :l'opérateur EXCEPT
  • YouTube :l'opérateur EXCEPT