SQLite - Sous-requêtes
Une sous-requête ou une requête interne ou une requête imbriquée est une requête dans une autre requête SQLite et incorporée dans la clause WHERE.
Une sous-requête est utilisée pour renvoyer des données qui seront utilisées dans la requête principale comme condition pour restreindre davantage les données à récupérer.
Les sous-requêtes peuvent être utilisées avec les instructions SELECT, INSERT, UPDATE et DELETE avec les opérateurs tels que =, <,>,> =, <=, IN, BETWEEN, etc.
Il y a quelques règles que les sous-requêtes doivent suivre -
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 plusieurs colonnes se trouvent dans la requête principale pour que la sous-requête compare ses colonnes sélectionnées.
Un ORDER BY ne peut pas être utilisé dans une sous-requête, bien que la requête principale puisse utiliser un ORDER BY. Le GROUP BY peut être utilisé pour exécuter la même fonction que ORDER BY dans une sous-requête.
Les sous-requêtes qui renvoient plusieurs lignes ne peuvent être utilisées qu'avec plusieurs opérateurs de valeur, 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é dans la sous-requête.
Sous-requêtes avec instruction SELECT
Les sous-requêtes sont le plus souvent utilisées avec l'instruction 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
Considérez la table COMPANY avec 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
Maintenant, vérifions la sous-requête suivante avec l'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 avec instruction INSERT
Les sous-requêtes peuvent également être utilisées avec des 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 avec l'une des fonctions de caractère, de date ou de nombre.
Voici la syntaxe de base est la suivante -
INSERT INTO table_name [ (column1 [, column2 ]) ]
SELECT [ *|column1 [, column2 ]
FROM table1 [, table2 ]
[ WHERE VALUE OPERATOR ]
Exemple
Considérez une table COMPANY_BKP avec une structure similaire à la table COMPANY et peut être créée en utilisant le même CREATE TABLE en utilisant COMPANY_BKP comme nom de table. Pour copier la table COMPANY complète dans COMPANY_BKP, voici la syntaxe -
sqlite> INSERT INTO COMPANY_BKP
SELECT * FROM COMPANY
WHERE ID IN (SELECT ID
FROM COMPANY) ;
Sous-requêtes avec instruction UPDATE
La sous-requête peut être utilisée conjointement avec l'instruction UPDATE. Une ou plusieurs colonnes d'une table peuvent être mises à jour lors de l'utilisation d'une sous-requête avec l'instruction UPDATE.
Voici 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
En supposant que nous ayons la table COMPANY_BKP disponible qui est une sauvegarde de la table COMPANY.
L'exemple suivant met à jour le SALAIRE de 0,50 fois dans la table COMPANY pour tous les clients dont l'ÂGE est supérieur ou égal à 27.
sqlite> UPDATE COMPANY
SET SALARY = SALARY * 0.50
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE >= 27 );
Cela aurait un impact sur deux lignes et enfin la table COMPANY aurait les enregistrements 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 avec instruction DELETE
La sous-requête peut être utilisée conjointement avec l'instruction DELETE comme avec toutes les autres instructions mentionnées ci-dessus.
Voici la syntaxe de base est la suivante -
DELETE FROM TABLE_NAME
[ WHERE OPERATOR [ VALUE ]
(SELECT COLUMN_NAME
FROM TABLE_NAME)
[ WHERE) ]
Exemple
En supposant que nous ayons la table COMPANY_BKP disponible qui est une sauvegarde de la table COMPANY.
L'exemple suivant supprime les enregistrements de la table COMPANY pour tous les clients dont l'ÂGE est supérieur ou égal à 27.
sqlite> DELETE FROM COMPANY
WHERE AGE IN (SELECT AGE FROM COMPANY_BKP
WHERE AGE > 27 );
Cela aura un impact sur deux lignes et enfin la table COMPANY aura les enregistrements 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