Maison / Réseaux sociaux / Opérateur pour les ensembles de données INTERSECT. Exécution de fonctions de chaîne de requêtes SQL complexes dans SQL

Opérateur pour les ensembles de données INTERSECT. Exécution de fonctions de chaîne de requêtes SQL complexes dans SQL

L'instruction INTERSECT récupère des lignes identiques à partir des ensembles de résultats d'une ou plusieurs requêtes. À certains égards, l'opérateur INTERSECT est très similaire à INNER JOIN.

INTERSECT appartient à la classe des opérateurs permettant de travailler avec des ensembles de données (opérateur d'ensemble). D'autres opérateurs de ce type incluent EXCEPT et UNION. Tous les opérateurs d'ensemble de données sont utilisés pour manipuler les ensembles de résultats de deux requêtes ou plus en même temps, d'où leur nom.

Syntaxe SQL2003

Il n'y a pas de limite technique au nombre de requêtes dans une instruction INTERSECT. La syntaxe générale est la suivante.

COUPER

]COUPER

Mots clés

Les lignes en double de tous les ensembles de résultats sont incluses.

DISTINCT

Les lignes en double sont supprimées de tous les ensembles de résultats avant que la comparaison ne soit effectuée par l'instruction INTERSECT. Les colonnes avec des valeurs NULL sont considérées comme des doublons. Si ni ALL ni DISTINCT ne sont spécifiés, DISTINCT est utilisé par défaut.

CORRESPONDANT

Spécifie que seules les colonnes portant le même nom dans les deux requêtes seront renvoyées, même si les deux requêtes utilisent le caractère générique (*).

Spécifie que seules les colonnes nommées seront renvoyées, même si les requêtes trouvent d'autres colonnes avec des noms correspondants. Cette clause doit être utilisée conjointement avec le mot-clé CORRESPONDING.

Règles générales

Il n'y a qu'une seule règle importante à retenir lorsque vous travaillez avec l'opérateur INTERSECT.

L'ordre et le nombre de colonnes dans toutes les requêtes doivent être identiques. Les types de données des colonnes correspondantes doivent également être compatibles.

Par exemple, les types CHAR et VARCHAR sont compatibles. Par défaut, le jeu de résultats dans chaque colonne utilisera la taille correspondant au type le plus grand dans chaque position particulière.

Aucune plate-forme ne prend en charge la clause CORRESPONDING.

Selon la norme ANSI, l'opérateur INTERSECT a une priorité plus élevée que les autres opérateurs d'ensemble, bien que la priorité de ces opérateurs soit gérée différemment sur différentes plates-formes. Vous pouvez contrôler explicitement la priorité des opérateurs à l'aide de parenthèses. Sinon, le SGBD peut les exécuter dans l'ordre de gauche à droite ou du premier au dernier.

Selon la norme ANSI, une seule clause ORDER BY peut être utilisée dans une requête. Insérez-le à la toute fin de la dernière instruction SELECT. Pour éviter toute ambiguïté dans la spécification des colonnes et des tables, assurez-vous d'affecter le même alias à toutes les colonnes de table correspondantes. Par exemple:

Sur les plates-formes qui ne prennent pas en charge l'opérateur INTERSECT, vous pouvez le remplacer par une sous-requête FULL JOIN.

SELECT a.au_lname AS "nom", a.au_fname AS "prénom" FROM auteurs AS a INTERSECT SELECT e.emp_lname AS "nom", e.emp_fname AS "prénom" FROM employés AS e ORDER BY nom, prénom;

Étant donné que les types de données des colonnes dans différentes instructions INTERSECT peuvent être compatibles, différentes plates-formes RDBMS peuvent rencontrer différentes variantes travailler avec des colonnes de différentes longueurs. Par exemple, si la colonne aujname de la première requête de l'exemple précédent est nettement plus longue que la colonne empjname de la deuxième requête, différentes plates-formes peuvent avoir des règles différentes pour déterminer la longueur du résultat final. Mais de manière générale, les plateformes choisiront une taille plus longue (et moins contraignante) pour le résultat.

Chaque SGBDR peut appliquer ses propres règles d'utilisation d'un nom de colonne au cas où les noms dans les listes de colonnes diffèrent. Généralement, les noms de colonne de la première requête sont utilisés.

DB2

La plateforme DB2 prend en charge les mots clés ANSI INTERSECT et INTERSECT ALL ainsi qu'une clause facultative VALUES.

(instruction._SELECT_7 | VALEURS (expr7 [, ...])) INTERSECTION

] (instruction_SCJ_2 | VALEURS (expr2 [, ...])) INTERSECTION

Bien que l'instruction INTERSECT DISTINCT ne soit pas prise en charge, son équivalent fonctionnel est INTERSECT. La clause CORRESPONDING n'est pas prise en charge.

De plus, les types de données LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK et les types de structure ne sont pas utilisés dans une clause INTERSECT, mais ils peuvent être utilisés dans une clause INTERSECT ALL.

Si le jeu de résultats contient une colonne portant le même nom dans toutes les instructions SELECT, ce nom est utilisé comme nom final pour la colonne renvoyée par l'instruction. Toutefois, si des noms de colonne différents sont utilisés dans les requêtes, la plateforme DB2 génère un nouveau nom pour la colonne résultante. Après cela, il devient inutilisable dans les clauses ORDER BY et FOR UPDATE.

Si plusieurs opérateurs sont utilisés dans une seule requête pour travailler avec des ensembles de données, celui entre parenthèses est exécuté en premier. Après cela, l'ordre d'exécution sera de gauche à droite. Cependant, toutes les instructions INTERSECT sont exécutées avant les instructions UNION et EXCEPT, par exemple :

SELECT empno FROM employé WHERE workdept LIKE "E%" INTERSECT (SELECT empno FROM emp_act WHERE projno IN ("IF1000", "IF2000", "AD3110") UNION VALUES ("AA0001"), ("AB0002"), ("AC0003 "))

L'exemple ci-dessus récupère les ID d'employés de tous les employés du service dont le nom commence par "E" à partir de la table des employés. Cependant, les identifiants ne sont récupérés que s'ils existent également dans la table des comptes salariés emp_act et sont concernés par les projets IF1000, IF200" et AD3110.

Dans ce guide d'étude vous apprendrez à utiliser EXCEPT instruction dans SQL Server(Transact-SQL) avec syntaxe et exemples.

Description

Instruction SQL Server EXCEPT(Transact-SQL) est utilisé pour renvoyer toutes les lignes de la première instruction SELECT qui ne sont pas renvoyées par la deuxième instruction SELECT. Chaque instruction SELECT définira un ensemble de données. L'instruction EXCEPT extrait tous les enregistrements du premier ensemble de données, puis supprime tous les enregistrements du deuxième ensemble de données des résultats.

Sauf demande

Explication: La requête EXCEPT renverra les entrées dans la zone grisée. Ce sont des enregistrements qui existent dans SELECT 1 et non dans SELECT 2.
Chaque instruction SELECT dans une requête EXCEPT doit avoir le même nombre de champs dans les ensembles de résultats avec des types de données similaires.

Syntaxe

La syntaxe de l'instruction EXCEPT dans SQL Server (Transact-SQL) est :

Options ou Arguments

les expressions sont les colonnes ou les calculs que vous souhaitez comparer entre les deux instructions SELECT. Ils ne doivent pas nécessairement être les mêmes champs dans chacune des instructions SELECT, mais les colonnes correspondantes doivent être de types de données similaires.
tables - tables à partir desquelles vous souhaitez obtenir des enregistrements. Il doit y avoir au moins une table répertoriée dans la clause FROM.
Conditions OÙ - facultatives. Conditions qui doivent être remplies pour les enregistrements sélectionnés.

Note

  • Les deux instructions SELECT doivent avoir le même nombre d'expressions.
  • Les colonnes correspondantes dans chacune des instructions SELECT doivent avoir des types de données similaires.
  • L'instruction EXCEPT renvoie tous les enregistrements du premier instruction SELECT, qui n'est pas inclus dans la deuxième instruction SELECT.
  • L'instruction EXCEPT dans SQL Server est équivalente à l'instruction MINUS dans Oracle.

Exemple d'expression unique

Examinons un exemple d'instruction EXCEPT dans SQL Server (Transact-SQL) qui renvoie un seul champ avec le même type de données.
Par exemple:

Transaction SQL

SELECT product_id FROM produits EXCEPT SELECT product_id FROM inventaire ;

SELECT product_id

DE produits

SELECT product_id

DE l'inventaire ;

Cet exemple d'instruction EXCEPT renvoie toutes les valeurs product_id qui se trouvent dans la table des produits et non dans la table des stocks. Cela signifie que si une valeur product_id existe dans la table products et existe également dans la table d'inventaire, la valeur product_id n'apparaîtra pas dans les résultats d'une requête EXCEPT.

Exemple avec plusieurs expressions

Examinons ensuite un exemple de requête EXCEPT dans SQL Server (Transact-SQL) qui renvoie plusieurs colonnes.
Par exemple:

Transaction SQL

Dans cet exemple, la requête EXCEPT renvoie des enregistrements dans la table des contacts avec le nom contact_id , last_name et first_name , qui ne correspondent pas aux valeurs employee_id , last_name et first_name dans la table des employés.

SQL propose deux manières de joindre des tables :
  • en spécifiant les tables à joindre (y compris les sous-requêtes) dans la clause FROM de l'instruction SELECT. Tout d'abord, les tables sont jointes, puis seulement les conditions spécifiées par la clause WHERE, l'agrégation, l'ordre des données, etc., déterminées par la clause GROUP BY, sont appliquées à l'ensemble résultant ;
  • définissant l'union des ensembles de résultats produits par le traitement de l'instruction SELECT. Dans ce cas, les deux instructions SELECT sont jointes par la phrase SYNDICAT, COUPER, SAUF ou CORRESPONDANT .

SYNDICAT

Phrase SYNDICAT combine les résultats de deux requêtes selon les règles suivantes :

La norme n'impose aucune restriction sur l'ordre des lignes dans le jeu de résultats. Ainsi, certains SGBD affichent d'abord le résultat de la première requête, puis le résultat de la deuxième requête. Oracle DBMS trie automatiquement les enregistrements en fonction de la première colonne spécifiée, même si aucun index n'a été créé pour celle-ci.

Pour spécifier explicitement l'ordre de tri requis, utilisez la clause ORDER BY. Dans ce cas, vous pouvez utiliser à la fois le nom de la colonne et son numéro (Fig. 4.3).


Riz. 4.3.

Phrase SYNDICAT ALL effectue l'union de deux sous-requêtes de la même manière que la clause UNION, avec les exceptions suivantes :

  • les lignes correspondantes ne sont pas supprimées du jeu de résultats généré ;
  • les requêtes fusionnées apparaissent séquentiellement dans le jeu de résultats sans classement.

Lors de la combinaison de plus de deux requêtes, les parenthèses peuvent être utilisées pour modifier l'ordre dans lequel l'opération de jointure est effectuée (Figure 4.4).


Riz. 4.4.

Jointure INTERSECT

Phrase COUPER vous permet de sélectionner uniquement les lignes présentes dans chaque jeu de résultats fusionné. Sur la fig. 4.5 montre un exemple de combinaison de requêtes sous forme d'ensembles croisés.


Riz. 4.5.

SAUF syndicat

Phrase SAUF vous permet de sélectionner uniquement les lignes qui sont présentes dans le premier jeu de résultats à fusionner mais pas présentes dans le deuxième jeu de résultats.

Phrases COUPER Et SAUF ne doit être pris en charge qu'au niveau de conformité SQL-92 complet. Donc, certains SGBD au lieu de la phrase

Lorsque vous rencontrez souvent une technologie, un langage de programmation, une norme, une certaine image de leurs capacités se forme, des limites dans lesquelles elles sont utilisées. Cela peut durer longtemps jusqu'à ce que des exemples viennent élargir les horizons durcis de la connaissance. Aujourd'hui, je voudrais parler de tels exemples et les démontrer pour le langage SQL. Des designs intéressants et rares, des expressions oubliées, des astuces étranges vous attendent dans cet article. Qui sont intéressés, bienvenue sous le chat.

Nuances

On me demande souvent à qui s'adresse cet article ? Mais, croyez-moi, il n'est pas toujours facile de donner une réponse : d'un côté, il y a des développeurs ninjas difficiles à surprendre avec quoi que ce soit, et de l'autre, de jeunes Padawans. Mais une chose que je peux dire avec certitude - pour un lecteur qui s'intéresse à SQL, qui est capable de compléter sa riche image avec des détails petits mais très intéressants. Cet article ne contiendra pas des pages kilométriques d'une requête sql, un maximum de 1, 2 lignes, et seulement ce qui est rare à mon sens. Mais comme je veux être complètement franc, si vous êtes avec sql sur vous, l'article vous semblera ennuyeux. Tous les exemples de l'article, à l'exception du premier et du quatrième, peuvent être attribués à la norme SQL-92.

Données

Afin de nous faciliter la vie, j'ai jeté une simple plaque signalétique sur laquelle certains points seront testés, et par souci de brièveté, je donnerai le résultat de l'expérience sur eux. Je vérifie toutes les requêtes sur PostgreSql.

Scripts et table de données

CREATE TABLE marchandises (id bigint NOT NULL, caractère de nom variable (127) NOT NULL, caractère de description variable (255) NOT NULL, prix numeric (16,2) NOT NULL, caractère articulé variable (20) NOT NULL, act_time timestamp NOT NULL , disponibilité booléen NON NULL, CONTRAINTE pk_goods PRIMARY KEY (id)); INSERT INTO marchandises (id, nom, description, prix, articul, act_time, disponibilité) VALUES (1, "Chaussons", "Soft", 100.00, "TR-75", (ts "2017-01-01 01:01 : 01.01"), VRAI); INSERT INTO marchandises (id, nom, description, prix, articul, act_time, disponibilité) VALUES (2, "Pillow", "White", 200.00, "PR-75", (ts "2017-01-02 02:02 : 02.02"), VRAI); INSERT INTO marchandises (id, nom, description, prix, articul, act_time, disponibilité) VALUES (3, "Blanket", "Down", 300.00, "ZR-75", (ts "2017-01-03 03:03 : 03.03"), VRAI); INSERT INTO marchandises (id, nom, description, prix, articul, act_time, disponibilité) VALUES (4, "Pillowcase", "Grey", 400.00, "AR-75", (ts "2017-01-04 04:04 : 04.04"), FAUX); INSERT INTO marchandises (id, nom, description, prix, articul, act_time, disponibilité) VALUES (5, "Sheet", "Silk", 500.00, "BR-75", (ts "2017-01-05 05:05 : 05.05"), FAUX);

Demandes

1. Guillemets doubles

Et la première chose que j'ai est une question simple: Pourriez-vous donner un exemple de requête sql utilisant double devis? Oui, pas avec des simples, des doubles ?

Exemple avec des guillemets doubles

SELECT name "Nom du produit" FROM marchandises


J'ai été très surpris quand je l'ai vu pour la première fois. Si vous essayez de changer les guillemets doubles en guillemets simples, le résultat sera complètement différent!

Il peut sembler que ce n'est pas un exemple très utile pour un développement réel. Pour moi ce n'est pas le cas. Maintenant, je l'utilise activement dans tous mes sql-blanks. L'essentiel est simple, lorsque vous revenez dans six mois à une requête sql de 40 colonnes, oh, comment leur "notre" nom sauve. Malgré le fait que je n'ai pas indiqué à propos de SQL-92, dans la dernière édition, il est fait mention de guillemets doubles.

2. Pseudo-tableau. SQL-92

Un peu pas exactement, en termes de terminologie, mais l'essentiel est simple - le tableau résultant de la sous-requête dans la section FROM. Peut-être le plus fait connu Dans cet article

Pseudo-tableau

SELECT mock.nickname "Surnom", (CASE WHEN mock.huff THEN "Yes" ELSE "No" END) "Huffed?" FROM (SELECT nom AS surnom, disponibilité AS huff FROM marchandises) mock

Dans notre exemple, mock est une pseudo table (parfois appelée table virtuelle). Naturellement, ils ne sont pas du tout destinés à déformer le vrai sens. Un exemple est celui-ci.

3. Constructeur de bloc de données. SQL-92

Ça fait peur, juste parce que je n'ai pas trouvé de bonne traduction ou interprétation. Et comme toujours, c'est plus facile à expliquer avec un exemple :

Exemple de constructeur de bloc de données

SELECT name "Nom du produit", prix "Prix" FROM (VALUES ("Chaussons", 100.00), ("Oreiller", 200.00)) AS marchandises(nom, prix)

Nom du produit Prix
Chaussons 100.00
Oreiller 200.00

Dans la section DEPUIS utilisé mot-clé VALEURS, suivi des données entre parenthèses, ligne par ligne. L'essentiel est que nous ne sélectionnions pas du tout les données d'une table, mais que nous les créons simplement à la volée, "nommez-la" une table, nommez les colonnes, puis utilisez-les à notre discrétion. Cette chose s'est avérée extrêmement utile lors du test de différents cas d'une requête SQL, lorsqu'il n'y a pas de données pour certaines tables (dans votre base de données locale) et que l'écriture d'insertion est trop paresseuse ou parfois très difficile, en raison de la connexion des tables et restrictions.

4. Heure, date et heure et date

Tout le monde a probablement rencontré des requêtes, avec la nécessité de spécifier l'heure, la date ou la date et l'heure. De nombreux SGBD prennent en charge les littéraux t, d et ts, respectivement, pour fonctionner avec ces types. Mais c'est plus facile à expliquer avec un exemple : Pour les littéraux d et t, tout est pareil.
Je m'excuse auprès du lecteur pour avoir induit en erreur, mais tout ce qui est dit au paragraphe 4 ne s'applique pas au langage SQL, mais fait référence aux capacités de prétraitement des requêtes dans JDBC.

5. Déni. SQL-92

Nous connaissons tous l'opérateur PAS, mais oublie bien souvent qu'elle peut s'appliquer aussi bien à un groupe de prédicats qu'à une seule colonne :

6. Comparaison des blocs de données. SQL-92

Encore une fois, je m'excuse pour la terminologie. C'est l'un de mes exemples préférés.

Exemple de comparaison de blocs de données

SELECT * FROM marchandises WHERE (nom, prix, disponibilité) = ("Taie d'oreiller", 400,00, FALSE) -- ou équivalent SELECT * FROM marchandises WHERE nom = "Taie d'oreiller" AND prix = 400,00 AND disponibilité = FAUX

Comme vous pouvez le voir dans l'exemple, la comparaison de blocs de données est similaire à la comparaison élément par élément. signification_ 1 _bloc_1 = valeur_ 1 _bloc_2, valeur_ 2 _bloc_1 = valeur_ 2 _bloc_2, valeur_ 3 _bloc_1 = valeur_ 3 _block_2 en utilisant ET entre eux.

7. Opérateurs de comparaison avec les modificateurs ANY, SOME ou ALL. SQL-92

C'est là qu'une explication s'impose. Mais comme toujours, d'abord un exemple Qu'est-ce que cela signifie TOUS dans ce cas? Et cela signifie que la condition de sélection n'est satisfaite que par les lignes dont les identifiants (dans notre cas, ce sont 4 et 5) sont supérieurs à n'importe quelà partir des valeurs trouvées dans la sous-requête (1, 2 et 3). 4 est supérieur à 1 et à 2 et à 3. 5 est similaire. Que se passe-t-il si nous remplaçons TOUS sur N'IMPORTE QUEL?
Que signifie N'IMPORTE QUEL dans ce cas? Et cela signifie que la condition de sélection n'est satisfaite que par les lignes dont les identifiants (dans notre cas, ce sont 2, 3, 4 et 5) sont supérieurs à au moins unà partir des valeurs trouvées dans la sous-requête (1, 2 et 3). Pour ma part j'ai associé TOUS Avec ET, UN N'IMPORTE QUEL Avec OU. QUELQUES Et N'IMPORTE QUEL analogues les uns aux autres.

8. Opérateurs pour travailler avec des requêtes / sous requêtes. SQL-92

Il est assez connu qu'il est possible de combiner 2 requêtes entre elles à l'aide des opérateurs SYNDICAT ou UNION TOUS. Ceci est souvent utilisé. Mais il y a 2 autres opérateurs SAUF Et COUPER.

Exemple avec SAUF

En fait, les données du deuxième ensemble sont exclues du premier ensemble de valeurs.
En fait, il y a une intersection du premier ensemble de valeurs et du deuxième ensemble.
C'est tout, merci de votre attention.

Éditorial

N1. Merci à streetflush pour la critique constructive. A contribué un article avec des informations sur ce qui est une norme linguistique et ce qui ne l'est pas.
N2. Point 4 corrigé, avec précision que ts/d/t ne fait pas partie du langage SQL. Merci pour votre attention Melkij.

Il n'y a qu'une seule règle importante à retenir pour l'utilisation de l'instruction EXCEPT.

L'ordre, le nombre et les types de données des colonnes doivent être du même type dans toutes les requêtes.

Selon la norme ANSI, les opérateurs ensemblistes UNION et EXCEPT ont la même priorité, mais l'opérateur INTERSECT est évalué avant les autres opérateurs ensemblistes. Nous vous recommandons de contrôler explicitement la priorité des opérateurs à l'aide de parenthèses. C'est généralement une très bonne pratique.

Selon la norme ANSI, une seule clause ORDER BY peut être utilisée dans une requête. Insérez-le à la toute fin de la dernière instruction SELECT. Pour éviter toute ambiguïté dans la spécification des colonnes et des tables, assurez-vous d'affecter le même alias à toutes les colonnes de table correspondantes. Par exemple:

SELECT au_lname AS "nom", au_fname AS "prénom" FROM auteurs EXCEPT SELECT emp_lname AS "nom", emp_fname AS "prénom" FROM employés ORDER BY nom, prénom;

De plus, étant donné que les colonnes peuvent être spécifiées dans chaque liste de colonnes avec des types de données compatibles correspondants, différentes plates-formes RDBMS peuvent avoir différentes manières de traiter les colonnes de différentes longueurs. Par exemple, si la colonne au_lname de la première requête de l'exemple précédent est nettement plus longue que la colonne emp_lname de la deuxième requête, différentes plates-formes peuvent avoir des règles différentes pour déterminer la longueur du résultat final. Mais de manière générale, les plateformes choisiront une taille plus longue (et moins contraignante) pour le résultat.

Chaque SGBDR peut appliquer ses propres règles d'utilisation d'un nom de colonne au cas où les noms dans les listes de colonnes diffèrent. En général, les noms de colonne de la première requête sont utilisés.

Les types de données ne doivent pas nécessairement être identiques, mais ils doivent être compatibles. Par exemple, les types CHAR et VARCHAR sont compatibles. Par défaut, le jeu de résultats dans chaque colonne utilisera la taille correspondant au type le plus grand dans chaque position particulière. Par exemple, une requête qui récupère des données à partir de colonnes contenant des valeurs de type VARCHAR(IO) et VARCHAR(15) utilisera le type et la taille de VARCHAR(15).

Aucune des plates-formes ne prend en charge la clause CORRESPONDING )) EXCEPT

(SELECT statemenr.2 | VALUES (expressionl, expression2 [, ...])) SAUF

Vous permet de spécifier une ou plusieurs colonnes spécifiées manuellement qui sont incluses dans le jeu de résultats final. (C'est ce qu'on appelle le constructeur de ligne.) La clause VALUES doit spécifier exactement autant de colonnes que celles spécifiées dans les requêtes d'instruction EXCEPT. Bien que l'instruction EXCEPT DISTINCT ne soit pas prise en charge, EXCEPT est l'équivalent fonctionnel. La clause CORRESPONDING n'est pas prise en charge. En outre, les types de données LONG VARCHAR, LONG VARGRAPHIC, BLOB, CLOB, DBCLOB, DATALINK et les types de structure ne sont pas utilisés dans une clause EXCEPT, mais ils peuvent être utilisés dans une clause EXCEPT ALL.

Si le jeu de résultats contient une colonne portant le même nom dans toutes les instructions SELECT, ce nom est utilisé comme nom final pour la colonne renvoyée par l'instruction. Si une colonne donnée est nommée différemment dans différentes instructions SELECT, vous devez renommer la colonne dans toutes les requêtes en utilisant la même clause d'alias AS dans toutes les requêtes.

Si plusieurs opérateurs sont utilisés dans une seule requête pour travailler avec des ensembles de données, celui entre parenthèses est exécuté en premier. Après cela, l'ordre d'exécution sera de gauche à droite. Cependant, toutes les instructions INTERSECT sont exécutées avant les instructions UNION et EXCEPT. Par exemple:

SELECT empno FROM employé WHERE workdept LIKE "E%" EXCEPT SELECT empno FROM emp_act WHERE projno IN (TF1000", TF2000", -AD3110") UNION VALUES ("AA0001"), ("AB0002"), ("AC0003") ;

L'exemple ci-dessus récupère les ID de tous les employés qui travaillent dans le département qui commence par "E" de la table des employés, puis supprime les ID de ceux qui travaillent dans les projets IF1000, IF200" et AD3110 de la table des comptes des employés (emp_act) Enfin , trois ID supplémentaires, AA0001, AB0002 et AC0003, sont ajoutés à l'aide de l'opérateur d'ensemble UNION.

MySQL

MySQL ne prend pas en charge l'instruction EXCEPT. Vous pouvez également utiliser les opérateurs NOT IN ou NOT EXISTS.