Résumé :dans ce didacticiel, vous découvrirez la sous-requête SQLite pour construire des requêtes plus lisibles et plus complexes.
Introduction à la sous-requête SQLite
Une sous-requête est un SELECT
instruction imbriquée dans une autre instruction. Voir la déclaration suivante.
SELECT column_1
FROM table_1
WHERE column_1 = (
SELECT column_1
FROM table_2
);
Code language: SQL (Structured Query Language) (sql)
La requête suivante est la requête externe :
SELECT column_1
FROM table_1
WHERE colum_1 =
Code language: SQL (Structured Query Language) (sql)
Et la requête suivante est la sous-requête .
(SELECT column_1
FROM table_2)
Code language: SQL (Structured Query Language) (sql)
Vous devez utiliser une paire de parenthèses pour délimiter une sous-requête. Notez que vous pouvez imbriquer une sous-requête dans une autre sous-requête avec une certaine profondeur.
En règle générale, une sous-requête renvoie une seule ligne en tant que valeur atomique, bien qu'elle puisse renvoyer plusieurs lignes pour comparer les valeurs avec le IN
opérateur.
Vous pouvez utiliser une sous-requête dans le SELECT
, FROM
, WHERE
, et JOIN
clauses.
Exemples de sous-requête SQLite
Nous utiliserons les tracks
et albums
tables de l'exemple de base de données pour la démonstration.
1) Sous-requête SQLite dans WHERE
exemple de clause
Vous pouvez utiliser une simple sous-requête comme condition de recherche. Par exemple, l'instruction suivante renvoie toutes les pistes de l'album avec le titre Let There Be Rock
SELECT trackid,
name,
albumid
FROM tracks
WHERE albumid = (
SELECT albumid
FROM albums
WHERE title = 'Let There Be Rock'
);
Code language: SQL (Structured Query Language) (sql)
La sous-requête renvoie l'identifiant de l'album avec le titre 'Let There Be Rock'
. La requête utilise l'opérateur égal (=) pour comparer albumid
renvoyé par la sous-requête avec l'albumid
dans les tracks
tableau.
Si la sous-requête renvoie plusieurs valeurs, vous pouvez utiliser le IN
opérateur pour vérifier l'existence d'une valeur unique par rapport à un ensemble de valeurs.
Voir les employees
suivants et customers
table dans la base de données exemple :
Par exemple, la requête suivante renvoie les clients dont les commerciaux sont au Canada.
SELECT customerid,
firstname,
lastname
FROM customers
WHERE supportrepid IN (
SELECT employeeid
FROM employees
WHERE country = 'Canada'
);
Code language: SQL (Structured Query Language) (sql)
La sous-requête renvoie une liste des identifiants des employés qui se trouvent au Canada. La requête externe utilise le IN
opérateur pour trouver les clients qui ont l'identifiant du représentant commercial dans la liste.
2) Sous-requête SQLite dans le FROM
exemple de clause
Parfois, vous souhaitez appliquer plusieurs fois des fonctions d'agrégation à une colonne. Par exemple, vous souhaitez d'abord additionner la taille d'un album, puis calculer la taille moyenne de tous les albums. Vous pouvez trouver la requête suivante.
SELECT AVG(SUM(bytes)
FROM tracks
GROUP BY albumid;
Code language: SQL (Structured Query Language) (sql)
Cette requête n'est pas valide.
Pour résoudre ce problème, vous pouvez utiliser une sous-requête dans le FROM
clause comme suit :
SELECT
AVG(album.size)
FROM
(
SELECT
SUM(bytes) SIZE
FROM
tracks
GROUP BY
albumid
) AS album;
Code language: SQL (Structured Query Language) (sql)
AVG(album.size) --------------- 338288920.317
Dans ce cas, SQLite exécute d'abord la sous-requête dans le FROM
clause et renvoie un ensemble de résultats. Ensuite, SQLite utilise cet ensemble de résultats comme table dérivée dans la requête externe.
Sous-requête corrélée SQLite
Toutes les sous-requêtes que vous avez vues jusqu'à présent peuvent être exécutées indépendamment. En d'autres termes, cela ne dépend pas de la requête externe.
La sous-requête corrélée est une sous-requête qui utilise les valeurs de la requête externe. Contrairement à une sous-requête ordinale, une sous-requête corrélée ne peut pas être exécutée indépendamment.
La sous-requête corrélée n'est pas efficace car elle est évaluée pour chaque ligne traitée par la requête externe.
La requête suivante utilise une sous-requête corrélée pour renvoyer les albums dont la taille est inférieure à 10 Mo.
SELECT albumid,
title
FROM albums
WHERE 10000000 > (
SELECT sum(bytes)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
ORDER BY title;
Code language: SQL (Structured Query Language) (sql)
Fonctionnement de la requête.
- Pour chaque ligne traitée dans la requête externe, la sous-requête corrélée calcule la taille des albums à partir des pistes qui appartiennent à l'album actuel en utilisant le
SUM
fonction. - Le prédicat dans
WHERE
La clause filtre les albums dont la taille est supérieure ou égale à 10 Mo (1 000 000 octets).
Sous-requête corrélée SQLite dans SELECT
exemple de clause
La requête suivante utilise une sous-requête corrélée dans le SELECT
clause pour retourner le nombre de pistes dans un album.
SELECT albumid,
title,
(
SELECT count(trackid)
FROM tracks
WHERE tracks.AlbumId = albums.AlbumId
)
tracks_count
FROM albums
ORDER BY tracks_count DESC;
Code language: SQL (Structured Query Language) (sql)
Dans ce didacticiel, nous vous avons présenté la sous-requête et montré différentes manières d'utiliser une sous-requête dans une requête pour sélectionner des données dans des tables.