SQLite
 sql >> Base de données >  >> RDS >> SQLite

Sous-requête SQLite

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.