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.0Autres extensions