SQL Sous-requête

Dans le langage SQL une sous-requête (aussi appelé “requête imbriquée” ou “requête en cascade”) consiste à exécuter une requête à l’intérieur d’une autre requête. Une requête imbriquée est souvent utilisée au sein d’une clause WHERE ou de HAVING pou remplacer une ou plusieurs constante.

Syntaxe

Il y a plusieurs façons d’utiliser les sous-requêtes. De cette façon il y a plusieurs syntaxes envisageables pour utiliser des requêtes dans des requêtes.

Requête imbriquée qui retourne un seul résultat

L’exemple ci-dessous est une exemple typique d’une sous-requête qui retourne un seul résultat à la requête principale.

SELECT *
FROM `table`
WHERE `nom_colonne` = (
    SELECT `valeur`
    FROM `table2`
    LIMIT 1
  )

Cet exemple montre une requête interne (celle sur “table2”) qui renvoi une seule valeur. La requête externe quant à elle, va chercher les résultat de “table” et filtre les résultats à partir de la valeur retournée par la requête interne.

A noter : il est possible d’utiliser n’importe quel opérateur d’égalité tel que =, >, <, >=, <= ou <>.

Requête imbriquée qui retourne une colonne

Une requête imbriquée peut également retournée une colonne entière. Dès lors, la requête externe peut utiliser la commande IN pour filtrer les lignes qui possèdent une des valeurs retournées par la requête interne. L’exemple ci-dessous met en évidence un tel cas de figure:

SELECT *
FROM `table`
WHERE `nom_colonne` IN (
    SELECT `colonne`
    FROM `table2`
    WHERE `cle_etrangere` = 36
  )

Exemple

La suite de cet article présente des exemples concrets utilisant les sous-requêtes.

Imaginons un site web qui permet de poser des questions et d’y répondre. Un tel site possède une base de données avec une table pour les questions et une autre pour les réponses.

Table “question” :

q_idq_date_ajoutq_titreq_contenu
12013-03-24 12:54:32Comment réparer un ordinateur?Bonjour, j'ai mon ordinateur de cassé, comment puis-je procéder pour le réparer?
22013-03-26 19:27:41Comment changer un pneu?Quel est la meilleur méthode pour changer un pneu facilement ?
32013-04-18 20:09:56Que faire si un appareil est cassé?Est-il préférable de réparer les appareils électriques ou d'en acheter de nouveaux?
42013-04-22 17:14:27Comment faire nettoyer un clavier d'ordinateur?Bonjour, sous mon clavier d'ordinateur il y a beaucoup de poussière, comment faut-il procéder pour le nettoyer? Merci.

Table “reponse” :

r_idr_fk_question_idr_date_ajoutr_contenu
112013-03-27 07:44:32Bonjour. Pouvez-vous expliquer ce qui ne fonctionne pas avec votre ordinateur? Merci.
212013-03-28 19:27:11Bonsoir, le plus simple consiste à faire appel à un professionnel pour réparer un ordinateur. Cordialement,
322013-05-09 22:10:09Des conseils son disponible sur internet sur ce sujet.
432013-05-24 09:47:12Bonjour. Ça dépend de vous, de votre budget et de vos préférence vis-à-vis de l'écologie. Cordialement,

Requête imbriquée qui retourne un seul résultat

Avec une telle application, il est peut-être utile de connaître la question liée à la dernière réponse ajoutée sur l’application. Cela peut être effectué via la requête SQL suivante:

SELECT *
FROM `question`
WHERE q_id = (
    SELECT r_fk_question_id
    FROM `reponse`
    ORDER BY r_date_ajout DESC
    LIMIT 1
  )

Une telle requête va retourner la ligne suivante:

q_idq_date_ajoutq_titreq_contenu
32013-04-18 20:09:56Que faire si un appareil est cassé?Est-il préférable de réparer les appareils électriques ou d'en acheter de nouveaux?

Ce résultat démontre que la question liée à la dernière réponse sur le forum est bien trouvée à partir de ce résultat.

Requête imbriquée qui retourne une colonne

Imaginons maintenant que l’ont souhaite obtenir les questions liées à toutes les réponses comprises entre 2 dates. Ces questions peuvent être récupérée par la requête SQL suivante:

SELECT *
FROM `question`
WHERE q_id IN (
    SELECT r_fk_question_id
    FROM `reponse`
    WHERE r_date_ajout BETWEEN '2013-01-01' AND '2013-12-31'
  )

Dans notre cas, cette requête retournera les résultats suivants :

q_idq_date_ajoutq_titreq_contenu
12013-03-24 12:54:32Comment réparer un ordinateur?Bonjour, j'ai mon ordinateur de cassé, comment puis-je procéder pour le réparer?
22013-03-26 19:27:41Comment changer un pneu?Quel est la meilleur méthode pour changer un pneu facilement ?
32013-04-18 20:09:56Que faire si un appareil est cassé?Est-il préférable de réparer les appareils électriques ou d'en acheter de nouveaux?

Une telle requête permet donc de récupérer les questions qui ont eu des réponses entre 2 dates. C’est pratique dans notre cas pour éviter d’obtenir des réponses qui n’ont pas eu de réponses du tout ou pas de nouvelles réponses depuis longtemps.

Partager