Plan du site  
français  English
pixel
pixel

Articles - Étudiants SUPINFO

Chapitre 05 - Récupération avancée

Présentation

Supposez que vous voulez écrire une requête pour trouver qui a un salaire plus important que celui d’Abel. Pour résoudre ce problème, vous avez besoin de deux requêtes : une pour trouver combien gagne Abel et une deuxième trouver qui gagne plus que ce montant.

Vous pouvez résoudre ce problème en combinant les deux requêtes, c’est-à-dire en plaçant une requête à l’intérieure d’une autre requête.

La requête à l’intérieure (ou la sous-requête) retourne une valeur qui est utilisée par la requête extérieure (ou la requête principale). Utiliser une sous-requête équivaut à combiner deux requêtes séquentielles en utilisant le résultat de la première comme la valeur de recherche dans la seconde requête.

Qui gagne plus qu’Abel ?

Syntaxe des sous-requêtes

Une sous-requête est une clause SELECT contenue dans une autre clause SELECT. Vous pouvez construire des requêtes plus poussées que les requêtes simples en utilisant les sous-requêtes.

Elles peuvent être très utiles quand vous avez besoin de sélectionner les lignes d’une table avec une condition qui dépend des données de la table elle-même.

Vous pouvez inclure les sous-requêtes dans de nombreuses clauses SQL dont celles qui suivent :

  • Clause WHERE

  • Clause HAVING

  • Clause FROM

La sous-requête est souvent référencée comme un nested SELECT, sub-SELECT ou inner SELECT. Généralement, la sous-requête s’exécute en premier et son résultat est utilisé pour compléter la condition de la requête principale (ou extérieure).

SELECT select_list
FROM table
WHERE expr operator (SELECT select_list 
                 FROM table);

Dans la syntaxe :

operator inclut une condition de comparaison tel que >, =, ou IN.

Remarque :

Les conditions de comparaisons sont réparties en deux catégories :

  • Les opérateurs single-row (>, =, >=, <, <>, <=).

  • Les opérateurs multiple-row (IN, ANY, ALL).

Utiliser une sous-requête

La requête intérieure récupère le salaire de l’employé Abel. La requête extérieure prend le résultat de la requête intérieure et l’utilise pour afficher tous les employés qui gagnent plus que ce montant.

SELECT last_name
FROM employees
WHERE salary > 11000
                    (SELECT salary
                     FROM employees
                     WHERE last_name = 'Abel');

Guide d’utilisation des sous-requêtes

  • Une sous-requête doit être délimitée par des parenthèses.

  • Placez la sous-requête du côté droit de la condition de comparaison pour la meilleure visibilité.

  • Avec Oracle8i et les versions ultérieures, une clause ORDER BY peut être utilisée et est nécessaire dans la sous-requête pour réaliser des analyses Top-N.

    • Avant Oracle8i les sous-requêtes ne pouvaient pas contenir de clause ORDER BY. Seulement une clause ORDER BY pouvait être utilisée dans une requête SELECT et elle devait être la dernière clause dans la requête principale.

  • Deux classes de condition de comparaison sont utilisées dans les sous-requêtes : les opérateurs single-row et les opérateurs multiple-row.

  • La clause ORDER BY dans la sous-requête n’est pas nécessaire sauf si vous réalisez une analyse Top-N.

Utilisez un opérateur single-row avec les sous-requêtes single-row et les opérateurs multiple-row avec les sous-requêtes multiple-row.

Types de sous-requêtes

  • Une sous-requête single-row est une sous-requête qui retourne seulement une ligne.

  • Une sous-requête multiple-row est une sous-requête qui retourne plus d’une ligne.

[Note]

Il existe également des sous-requêtes multi-colonne qui sont des sous-requêtes qui retournent plus d’une colonne.

Sous-requête Single-Row

Une sous-requête single-row est une requête qui retourne une ligne de la requête interne SELECT. Ce type de sous-requête utilise un opérateur single-row. Vous pouvez voir la liste des opérateurs single-row dans cet exemple.

Exemple :

Affichez les employés dont le JOB_ID est le même que celui de l’employé 141 :

SELECT last_name, job_id
FROM employees
WHERE job_id =(SELECT job_id
               FROM employees
               WHERE employee_id = 141);

Opérateur

Signification

=

Égale à

>

Plus grand que

>=

Plus grand ou égal à

<

Plus petit que

<=

Plus petit ou égal à

<>

Different de

Executer les sous-requêtes Single-Row

Une requête SELECT peut être considérée comme un bloc de requête. Cet exemple affiche les employés qui ont le même identifiant de poste que l’employé 141 et dont le salaire est supérieur à celui de l’employé 143. Cet exemple est composé de trois blocs de requête : une requête principale et deux sous-requêtes. Les sous-requêtes sont exécutées en premier, produisant les résultats recherchés, respectivement ST_CLERK et 2600. La requête principale est alors traitée et utilise les valeurs qui sont retournées par les sous-requêtes pour compléter les conditions de recherche.

Chacune des deux requêtes internes retourne une valeur (ST_CLERK et 2600 respectivement), donc chaque sous-requête SQL est appelée sous-requête single-row.

[Note]

Les requêtes externes et internes peuvent obtenir les données de tables différentes.

SELECT last_name, job_id, salary
FROM employees
WHERE job_id =
             (SELECT job_id
              FROM employees
              WHERE employee_id = 141)
AND salary >
             (SELECT salary
              FROM employees
              WHERE employee_id = 143);

Utiliser les fonctions de groupe dans les sous-requêtes

Vous pouvez afficher les données d’une requête principale en utilisant une fonction de groupe dans une sous-requête ne retournant qu’une seule ligne. La sous-requête est entre parenthèse et est placée après la condition de comparaison.

Cet exemple affiche le nom de l’employé, l’identifiant de poste et le salaire pour tous les employés qui ont un salaire égal au salaire minimum. La fonction de groupe MIN retourne une seule valeur (2500) à la requête principale.

SELECT last_name, job_id, salary
FROM employees
WHERE salary =
            (SELECT MIN(salary)
             FROM employees);

La clause HAVING avec les sous-requêtes

Vous pouvez utiliser les sous-requêtes non seulement dans la clause WHERE mais aussi dans la clause HAVING. Le serveur Oracle exécute la sous-requête et le résultat sera retourné dans la clause HAVING de la requête principale. L’ordre SQL affiche tous les départements qui ont un salaire plus grand que ceux du département 50.

SELECT department_id, MIN(salary)
FROM employees
GROUP BY department_id
HAVING MIN(salary) >
                   (SELECT MIN(salary)
                    FROM employees
                    WHERE department_id = 50);

Exemple :

Trouver le job avec le salaire moyen le moins élevé.

SELECT job_id, AVG(salary)
FROM employees
GROUP BY job_id
HAVING AVG(salary) = (SELECT MIN(AVG(salary))
                      FROM employees
                      GROUP BY job_id);
  • Le serveur Oracle exécute en premier la sous-requête.

  • Le serveur Oracle retourne les résultats dans la clause HAVING de la requête principale.

Les erreurs avec les sous-requêtes

Une erreur commune arrive lorsque plus d’une ligne est retournée pour une sous-requête single-row.

Dans la requête SQL ci-dessous, la sous-requête contient une clause GROUP BY qui implique que la sous-requête devra retourner plusieurs lignes, une pour chaque groupe qu’elle trouvera. Dans ce cas, le résultat de la sous-requête est 4400, 6000, 2500, 4200, 7000, 17000 et 8300.

La requête externe prend les résultats et les utilise dans la clause WHERE. La clause WHERE contient un opérateur égal (=), un opérateur de comparaison single-row qui n’attend qu’une seule valeur. L’opérateur = ne peut pas accepter plus d’une valeur de la sous-requête, pour cette raison, une erreur est générée. Pour corriger cette erreur, remplacez l’opérateur = par IN.

SELECT employee_id, last_name
FROM employees
WHERE salary =
             (SELECT MIN(salary)
              FROM employees
              GROUP BY department_id);

ERROR at line 4:
ORA-01427: single-row subquery returns more than one row

Un autre problème commun arrive avec les sous-requêtes quand aucune ligne n’est retournée par la sous-requête.

Dans la requête SQL ci-dessous, la sous-requête contient une clause WHERE. Vraisemblablement, le but est de trouver le l’identifiant de poste de l’employé Haas. La requête est correcte mais ne retourne aucune ligne.

L’employé Haas n’existe pas. La sous requête ne retourne aucune ligne. La requête principale prend le résultat de la sous-requête (NULL) et l’utilise dans la clause WHERE. La requête principale ne trouve aucun employé dont le JOB_ID est égal à NULL, et ainsi ne retourne aucune ligne. Si un JOB_ID existe avec une valeur NULL, la ligne n’est pas retournée parce que de la comparaison de deux valeurs NULL est évoluée à NULL. Donc la condition WHERE n’est pas vraie.

SELECT last_name, job_id
FROM employees
WHERE job_id =
           (SELECT job_id
            FROM employees
            WHERE last_name = 'Haas');

no rows selected

Sous-requêtes Multiple-Row

Les sous-requêtes qui retournent plus d’une ligne sont appelés les sous-requêtes multiple-row.

Vous devez utiliser un opérateur multiple-row au lieu d’un opérateur single-row avec les sous-requêtes single-row. Les opérateurs multiple-row attendent une ou plusieurs valeurs :

SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (SELECT MIN(salary)
            FROM employees
                 GROUP BY department_id);

Trouvez les employés qui gagnent le même salaire que le salaire minimum de chaque département.

La sous-requête est exécutée en premier. La requête principale est alors traitée et utilise les valeurs qui sont retournés par la sous-requête pour compléter la condition de la recherche. En fait, la requête principale apparaît au serveur Oracle de la manière suivante :

SELECT last_name, salary, department_id
FROM employees
WHERE salary IN (6900, 2500, 7000, 17000, 6000, 10000, 8300, 2100, 6100, 6500, 4200, 4400);

Les requêtes multiple-row ont les propriétés suivantes :

  • Retournent plus d’une ligne.

  • Utilisez les opérateurs de comparaisons multiple-row.

    Opérateurs

    Signification

    IN

    Égale à n’importe quel membre de la liste

    ANY

    Compare la valeur à chaque valeur retournée par la sous-requête

    ALL

    Compare la valeur à toutes les valeurs retournées par la sous-requête

L’opérateur ANY (et son synonyme l’opérateur SOME) compare une valeur à chaque valeur retournée par la sous-requête. Ainsi, pour qu’une ligne soit retournée, la condition doit être validée avec une des valeurs retournées par la sous-requête.

L’exemple suivant affiche les employés qui ne sont pas des IT_PROG et dont le salaire est inférieur au salaire de n’importe quel IT_PROG. Le salaire maximal d’un programmeur (IT_PROG) est 9 000$.

  • <ANY signifie plus petit que le maximum.

  • >ANY signifie plus grand que le minimum

  • =ANY est équivalent à la clause IN.

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ANY
                 (SELECT salary
                  FROM employees
                  WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

L’opérateur ALL compare une valeur à toutes les valeurs retournées par la sous-requête. Ainsi, pour qu’une ligne soit retournée, la condition doit être validée avec toutes les valeurs retournées par la sous-requête.

L’exemple suivant affiche les employés qui ne sont pas des IT_PROG et dont le salaire est inférieur aux salaires de tous les IT_PROG. Le salaire minimal d’un programmeur (IT_PROG) est 4 200$.

  • >ALL signifie plus grand que le maximum

  • <ALL signifie plus petit que le minimum

SELECT employee_id, last_name, job_id, salary
FROM employees
WHERE salary < ALL
                 (SELECT salary
                  FROM employees
                  WHERE job_id = 'IT_PROG')
AND job_id <> 'IT_PROG';

L’opérateur NOT peut être utilisé avec les opérateurs IN, ANY, et ALL.

Retourner la valeur Null dans le résultat de la sous-requête

La requête SQL suivante tente d’afficher tous les employés qui n’ont pas de subordonnés.

Logiquement, cet ordre SQL devrait retourner 12 lignes. Cependant, la requête SQL ne retourne aucune ligne. En effet, une des valeurs retournée par la sous-requête est une valeur NULL et par conséquent la requête ne retourne aucune ligne.

SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id NOT IN
                           (SELECT mgr.manager_id
                           FROM employees mgr);

no rows selected

La raison est que toutes les conditions faisant une comparaison avec une valeur NULL sont évaluées à NULL. Donc à chaque fois qu’une valeur NULL sera à même de faire partie du jeu de résultat de la sous-requête, n’utilisez pas l’opérateur NOT IN. L’opérateur NOT IN est équivalent à <>ALL.

Remarquez que la valeur NULL faisant partie des résultats retournés par une sous-requête ne pose pas problème si vous utilisez l’opérateur IN. L’opérateur IN est équivalent à =ANY.

Par exemple, pour afficher les employés qui ont des subordonnés, utilisez cette requête SQL suivante :

SELECT emp.last_name
FROM employees emp
WHERE emp.employee_id IN
                     (SELECT mgr.manager_id
                      FROM employees mgr);

Alternativement, une clause WHERE peut être incluse dans une sous-requête pour afficher tous les employés qui n’ont pas de subordonnés :

SELECT last_name 
FROM employees
WHERE employee_id NOT IN
                     (SELECT manager_id
                      FROM employees
                      WHERE manager_id IS NOT NULL);

Les opérateurs d'ensemble

Présentation

Les opérateurs d'ensemble combinent les résultats de deux requêtes ou plus dans un seul résultat.

Les requêtes contenant des opérateurs d'ensemble sont appelées des requêtes composées.

Tous les opérateurs d'ensemble ont une priorité égale. Si une requête SQL contient plusieurs opérateurs d'ensemble, le serveur Oracle les évalue de gauche (ou haut) à droite (ou bas) si aucune parenthèse ne spécifie un autre ordre. Vous devez utiliser des parenthèses pour spécifier l'ordre d'évaluation dans les requêtes qui utilisent l'opérateur INTERSECT avec d'autres opérateurs.

Tables utilisées dans cette leçon

Deux tables sont utilisées majoritairement dans cette leçon. Il s'agit des tables EMPLOYEES et JOB_HISTORY.

La table EMPLOYEES contient les détails des employés, notamment l’identifiant unique de chaque employé, l’adresse e-mail, l’identifiant de poste, le salaire et l’identifiant de manager. Certains employés reçoivent une commission en plus de leur salaire. Plusieurs employés ont déjà changés de poste au cours de leurs années passées dans l'entreprise. Ces informations sont surveillées en utilisant la table JOB_HISTORY. Quand un employé change de poste, la date d’arrivée et la date de départ d’ancien poste sont enregistrées dans la table JOB_HISTORY, aussi bien que l’identifiant de poste et le numéro de département.

La structure et les données des tables EMPLOYEES et JOB_HISTORY sont montrées ci-dessous :

DESCRIBE employees
DESCRIBE job_history
SELECT * FROM job_history;

L'opérateur UNION

Définition

L'opérateur UNION retourne toutes les lignes sélectionnées par chaque requête. Utilisez l'opérateur UNION pour retourner toutes les lignes de plusieurs tables et éliminer les lignes dupliquées.

Règles :

  • Le nombre de colonnes et les types de données des colonnes sélectionnées doivent être identiques dans chaque clause SELECT utilisée dans la requête. Les noms de colonne peuvent être différents.

  • UNION agit sur toutes les colonnes sélectionnées.

  • Les valeurs NULL ne sont pas ignorées lors de la vérification.

  • L'opérateur IN a une plus forte priorité que l'opérateur UNION.

  • Par défaut, la sortie est triée par ordre croissant utilisant la première colonne dans la clause SELECT.

Utilisation de l'opérateur UNION

L'opérateur UNION élimine chaque enregistrement dupliqué. Si des enregistrements présents dans chacune des tables EMPLOYEES et JOB_HISTORY sont identiques, les enregistrements sont affichés une seule fois.

Observez dans l'exemple suivant que l'enregistrement pour l'employé dont l'EMPLOYEES_ID est 200 apparaît deux fois parce que le JOB_ID est différent dans chaque ligne.

SELECT employee_id, job_id
FROM   employees
UNION
SELECT employee_id, job_id
FROM   job_history;

Dans cet exemple suivant, l'employé 200 apparaît trois fois. Pourquoi ? Remarquez la valeur de DEPARTMENT_ID de l'employé 200. Une ligne possède un DEPARTMENT_ID de 90, une autre de 10 et la troisième de 90. A cause de ces combinaisons uniques de JOB_ID et DEPARTMENT_ID, chaque ligne pour l'employé 200 est unique et donc n'est pas considérée comme dupliquée. Observez que l’affichage est trié par ordre croissant en utilisant la première colonne de la clause SELECT (dans ce cas, EMPLOYEE_ID).

SELECT      employee_id, job_id, department_id
FROM        employees
UNION
SELECT      employee_id, job_id, department_id
FROM        job_history;

L'opérateur UNION ALL

Définition

Utilisez l'opérateur UNION ALL pour récupérer toutes les lignes de plusieurs requêtes.

Règles :

Les règles pour les opérateurs UNION et UNION ALL sont les mêmes sauf deux exceptions suivantes qui concernent UNION ALL :

  • Les lignes dupliquées ne sont pas éliminées, l’affichage des résultats n'est pas trié par défaut.

  • Le mot clé DISTINCT ne peut pas être utilisé.

Utilisation de l'opérateur UNION ALL

Dans cet exemple suivant, 30 lignes sont sélectionnées. La combinaison des deux tables génère donc 30 lignes. L'opérateur UNION ALL n'élimine pas les lignes dupliquées. UNION retourne toutes les lignes distinctes sélectionnées par les requêtes. UNION ALL retourne toutes les lignes sélectionnées par chacune des requêtes, y compris les lignes dupliquées.

SELECT   employee_id, job_id, department_id
FROM     employees
UNION ALL
SELECT   employee_id, job_id, department_id
FROM     job_history
ORDER BY employee_id;

En réécrivant la requête précédente avec l’operateur UNION, nous obtenons 29 lignes.

SELECT   employee_id, job_id, department_id
FROM     employees
UNION
SELECT   employee_id, job_id, department_id
FROM     job_history
ORDER BY employee_id;

La ligne suivant étant présente dans les deux tables est éliminée par l’opérateur UNION.

L'opérateur INTERSECT

Définition

Utilisez l'opérateur INTERSECT pour retourner toutes les lignes communes à plusieurs requêtes.

Règles :

  • Le nombre de colonnes et les types de données des colonnes sélectionnées doivent être identiques dans chaque clause SELECT utilisée dans la requête. Les noms de colonne peuvent être différents.

  • Le résultat ne changera pas si vous inversez l’ordre des tables.

  • INTERSECT n'ignore pas les valeurs NULL.

Utilisation de l'opérateur INTERSECT

Dans cet exemple, la requête retourne seulement les enregistrements qui possèdent les mêmes valeurs dans les colonnes sélectionnées de chaque table.

SELECT employee_id, job_id
FROM   employees
INTERSECT
SELECT employee_id, job_id
FROM   job_history;

Quels seront les résultats si vous ajoutez la colonne DEPARTMENT_ID à la clause SELECT de la table EMPLOYEES et ajoutez la colonne DEPARTMENT_ID à la clause SELECT de la table JOB_HISTORY, et exécutez la requête ? Le résultat peut être différent suite à l'introduction d'une autre colonne dont les valeurs peuvent être dupliquées ou non.

SELECT    employee_id, job_id, department_id
FROM      employees
INTERSECT
SELECT    employee_id, job_id, department_id
FROM      job_history;

L’employé 200 ne fait plus partie des résultats parce que la valeur de EMPLOYEES.DEPARTMENT_ID est différente de la valeur de JOB_HISTORY.DEPARTMENT_ID.

L'opérateur MINUS

Définition

Utilisez l'opérateur MINUS pour afficher les lignes retournées par la première requête qui ne sont pas présentes dans la seconde requête (première requête SELECT MINUS(moins deuxième requête SELECT).

Règles :

  • Le nombre de colonnes et les types de données des colonnes sélectionnées doivent être identiques dans chaque clause SELECT utilisée dans la requête. Les noms de colonne peuvent être différents.

  • Toutes les colonnes dans la clause WHERE doivent être dans la clause SELECT pour que l'opérateur MINUS fonctionne.

Utilisation de l'opérateur MINUS

Afficher les identifiants des employés qui n'ont jamais changé de travail :

SELECT employee_id,job_id
FROM   employees
MINUS
SELECT employee_id,job_id
FROM   job_history;

Dans l'exemple précédent, les identifiants des employés et les identifiant des postes de la table JOB_HISTORY sont soustraits de ceux de la table EMPLOYEES. Le rapport affiche les employés restant après la soustraction, ils sont représentés par les lignes qui existent dans la table EMPLOYEES mais n'existant pas dans la table JOB_HISTORY.

Règles pour les opérateurs d'ensemble

  • Les expressions dans la clause SELECT des requêtes doivent correspondre en nombres et types de données. Les requêtes qui utilisent les opérateurs UNION, UNION ALL, INTERSECT et MINUS dans leur clause WHERE doivent avoir le même nombre de colonne et le même type de colonne dans leur liste SELECT.

    Par exemple :

    SELECT employee_id, department_id
    FROM   employees
    WHERE        (employee_id, department_id)
    IN    (SELECT employee_id, department_id
           FROM   employees
           UNION
           SELECT employee_id, department_id
           FROM   job_history);
  • La clause ORDER BY :

    • Doit apparaître uniquement tout à la fin de la requête

    • Accepte le nom de colonne, un alias ou la position de la colonne

  • Le nom de colonne ou l'alias de colonne utilisé dans la clause ORDER BY doit provenir de la première clause SELECT.

  • Les opérateurs d'ensemble peuvent être utilisés dans les sous-requêtes.

  • Si les requêtes récupèrent les données de type de caractères le type de données du résultat est déterminé ainsi :

    • Si les deux requêtes sélectionnent les valeurs de type de données CHAR, les valeurs retournées auront comme type de données CHAR.

    • Si une seule ou deux requêtes sélectionnent les valeurs de type de données VARCHAR2, les valeurs retournées auront comme type de données VARCHAR2.

  • A l’affichage, les noms de colonne dépendent des colonnes présentes dans le premier ordre SELECT.

Adaptation des clauses SELECT

Parce que les expressions dans la clause SELECT des requêtes doivent correspondre en nombre, vous pouvez utiliser des colonnes factices et des fonctions de conversion de types de données pour être en accord avec cette règle.

SELECT department_id, TO_NUMBER(null) location, hire_date
FROM   employees
UNION
SELECT department_id, location_id, TO_DATE(null)
FROM   departments;

Dans cet exemple, le lieu de travail (LOCATION) est donné comme entête de colonne factice. La fonction TO_NUMBER est utilisée dans la première requête SELECT pour faire correspondre le type de donnée NUMBER de la colonne LOCATION_ID retournée par la seconde requête.

De la même façon, la fonction TO_DATE dans la deuxième requête SELECT est utilisée pour faire correspondre le type de donnée DATE de la colonne HIRE_DATE retournée par la première requête.

Les tables EMPLOYEES et JOB_HISTORY ont plusieurs colonnes communes (par exemple, EMPLOYEE_ID, JOB_ID et DEPARTMENT_ID).

Mais comment faire pour que la requête affiche les EMPLOYEE_ID, JOB_ID et SALARY en utilisant l'opérateur UNION, sachant que le salaire n'existe que dans la table EMPLOYEES?

SELECT employee_id, job_id, salary
FROM   employees
UNION
SELECT employee_id, job_id, 0
FROM   job_history;

Dans l’exemple de code précédent les colonnes EMPLOYEE_ID et JOB_ID dans tables EMPLOYEES et JOB_HISTORY correspondent. Une valeur littérale de 0 est ajoutée à la liste de la clause SELECT de JOB_HISTORY afin de faire correspondre la colonne SALARY (de type NUMBER) dans de clause SELECT de EMPLOYEES.

Dans ces résultats, chaque ligne affichée qui correspond à un enregistrement de JOB_HISTORY contient 0 dans la colonne SALARY.

Contrôler l'ordre des lignes

Par défaut, l’affichage est trié par ordre croissant de la première colonne. Vous pouvez utiliser la clause ORDER BY pour le modifier.

La clause ORDER BY ne peut être utilisée qu'une seule fois dans une requête composée et doit être placée à la fin de la requête. La clause ORDER BY accepte un nom de colonne ou un alias de colonne.

Sans la clause ORDER BY, l'exemple de code suivant revoit un rapport trié par ordre alphabétique en fonction de la première colonne.

COLUMN a_dummy NOPRINT

SELECT 'sing' AS "My dream", 3 a_dummy
FROM   dual
UNION
SELECT 'I''d like to teach', 1 a_dummy
FROM   dual
UNION
SELECT 'the world to', 2 a_dummy
FROM   dual
ORDER BY a_dummy;
[Note]

Considérez une requête composée ou l'opérateur d'ensemble UNION est utilisé plus d'une fois. Dans ce cas, la clause ORDER BY peut utiliser uniquement les numéros de position plutôt que des expressions explicites.

A propos de SUPINFO | Contacts & adresses | Enseigner à SUPINFO | Presse | Conditions d'utilisation & Copyright | Respect de la vie privée | Investir
Logo de la société Cisco, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société IBM, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sun-Oracle, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Apple, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Sybase, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Novell, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Intel, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Accenture, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société SAP, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo de la société Prometric, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management Logo du IT Academy Program par Microsoft, partenaire pédagogique de SUPINFO, la Grande École de l'informatique, du numérique et du management

SUPINFO International University
Ecole d'Informatique - IT School
École Supérieure d'Informatique de Paris, leader en France
La Grande Ecole de l'informatique, du numérique et du management
Fondée en 1965, reconnue par l'État. Titre Bac+5 certifié au niveau I.
SUPINFO International University is globally operated by EDUCINVEST Belgium - Avenue Louise, 534 - 1050 Brussels