SQLite Sous-requêtes

Une sous-requête, également appelée requête interne ou requête imbriquée, consiste à intégrer une instruction de requête dans la clause WHERE d'une requête SQLite.

Le résultat d'une instruction SELECT peut être utilisé comme valeur d'entrée pour une autre instruction.

Les sous-requêtes peuvent être utilisées avec les instructions SELECT, INSERT, UPDATE et DELETE, et peuvent être accompagnées d'opérateurs tels que =, <, >, >=, <=, IN, BETWEEN, etc.

Voici plusieurs règles que les sous-requêtes doivent respecter :

  • Les sous-requêtes doivent être placées entre parenthèses.

  • Une sous-requête ne peut avoir qu'une seule colonne dans la clause SELECT, sauf si la requête principale a plusieurs colonnes à comparer avec les colonnes sélectionnées de la sous-requête.

  • ORDER BY ne peut pas être utilisé dans une sous-requête, bien que la requête principale puisse utiliser ORDER BY. GROUP BY peut être utilisé dans une sous-requête, et il fonctionne de la même manière que ORDER BY.

  • Si une sous-requête renvoie plus d'une ligne, elle ne peut être utilisée qu'avec des opérateurs à valeurs multiples, tels que l'opérateur IN.

  • L'opérateur BETWEEN ne peut pas être utilisé avec une sous-requête ; cependant, BETWEEN peut être utilisé à l'intérieur d'une sous-requête.

Sous-requêtes dans les instructions SELECT

Les sous-requêtes sont le plus souvent utilisées avec les instructions SELECT. La syntaxe de base est la suivante :

SELECT column_name [, column_name ]
FROM   table1 [, table2 ]
WHERE  column_name OPERATOR
      (SELECT column_name [, column_name ]
      FROM table1 [, table2 ]
      [WHERE])

Exemple

Supposons que la table COMPANY contient les enregistrements suivants :

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  20000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Voyons maintenant l'utilisation des sous-requêtes dans une instruction SELECT :

sqlite> SELECT * 
     FROM COMPANY 
     WHERE ID IN (SELECT ID 
                  FROM COMPANY 
                  WHERE SALARY > 45000) ;

Cela produira le résultat suivant :

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       85000.0

Sous-requêtes dans les instructions INSERT

Les sous-requêtes peuvent également être utilisées avec les instructions INSERT. L'instruction INSERT utilise les données renvoyées par la sous-requête pour les insérer dans une autre table. Les données sélectionnées dans la sous-requête peuvent être modifiées à l'aide de n'importe quelle fonction de caractères, de date ou numérique.

La syntaxe de base est la suivante :

INSERT INTO table_name [ (column1 [, column2 ]) ]
           SELECT [ *|column1 [, column2 ]
           FROM table1 [, table2 ]
           [ WHERE VALUE OPERATOR ]

Exemple

Supposons que COMPANY_BKP ait une structure similaire à la table COMPANY et puisse être créée à l'aide de la même instruction CREATE TABLE, sauf que le nom de la table est remplacé par COMPANY_BKP. Maintenant, pour copier toute la table COMPANY dans COMPANY_BKP, la syntaxe est la suivante :

sqlite> INSERT INTO COMPANY_BKP
     SELECT * FROM COMPANY 
     WHERE ID IN (SELECT ID 
                  FROM COMPANY) ;

Sous-requêtes dans les instructions UPDATE

Les sous-requêtes peuvent être utilisées conjointement avec les instructions UPDATE. Lorsqu'une sous-requête est utilisée avec une instruction UPDATE, une ou plusieurs colonnes de la table sont mises à jour.

La syntaxe de base est la suivante :

UPDATE table
SET column_name = new_value
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Exemple

Supposons que nous ayons la table COMPANY_BKP, qui est une sauvegarde de la table COMPANY.

L'exemple suivant met à jour le SALARY de tous les clients de la table COMPANY dont l'AGE est supérieur ou égal à 27 à 0.50 fois la valeur d'origine :

sqlite> UPDATE COMPANY
     SET SALARY = SALARY * 0.50
     WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
                   WHERE AGE >= 27 );

Cela affectera deux lignes, et les enregistrements de la table COMPANY seront finalement les suivants :

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
1           Paul        32          California  10000.0
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0

Sous-requêtes dans les instructions DELETE

Les sous-requêtes peuvent être utilisées conjointement avec les instructions DELETE, tout comme les autres instructions mentionnées ci-dessus.

La syntaxe de base est la suivante :

DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
   (SELECT COLUMN_NAME
   FROM TABLE_NAME)
   [ WHERE) ]

Exemple

Supposons que nous ayons la table COMPANY_BKP, qui est une sauvegarde de la table COMPANY.

L'exemple suivant supprime les enregistrements de tous les clients de la table COMPANY dont l'AGE est supérieur ou égal à 27 :

sqlite> DELETE FROM COMPANY
     WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
                   WHERE AGE > 27 );

Cela affectera deux lignes, et les enregistrements de la table COMPANY seront finalement les suivants :

ID          NAME        AGE         ADDRESS     SALARY
----------  ----------  ----------  ----------  ----------
2           Allen       25          Texas       15000.0
3           Teddy       23          Norway      20000.0
4           Mark        25          Rich-Mond   65000.0
5           David       27          Texas       42500.0
6           Kim         22          South-Hall  45000.0
7           James       24          Houston     10000.0
Autres extensions