Partager via


Utiliser des clauses HAVING et WHERE dans la même requête (Visual Database Tools)

Dans certains cas, vous pouvez exclure des lignes individuelles des groupes (à l’aide d’une clause WHERE) avant d’appliquer une condition à des groupes dans leur ensemble (à l’aide d’une clause HAVING).

Une clause HAVING est semblable à une clause WHERE, mais s’applique uniquement aux groupes dans son ensemble (c’est-à-dire aux lignes du jeu de résultats représentant des groupes), tandis que la clause WHERE s’applique à des lignes individuelles. Une requête peut contenir à la fois une clause WHERE et une clause HAVING. Dans ce cas :

  • La clause WHERE est appliquée en premier aux lignes individuelles des tables ou des objets à valeur de table dans la fenêtre Diagramme. Seules les lignes qui remplissent les conditions de la clause WHERE sont regroupées.

  • La clause HAVING est ensuite appliquée aux lignes du jeu de résultats. Seuls les groupes qui satisfont aux critères de HAVING apparaissent dans le résultat de la requête. Vous pouvez appliquer une clause HAVING uniquement aux colonnes qui apparaissent également dans la clause GROUP BY ou dans une fonction d’agrégation.

Par exemple, imaginez que vous joignez les tables titles et publishers pour créer une requête affichant le prix moyen des livres pour un groupe d'éditeurs. Seul le prix moyen d’un ensemble donné d’éditeurs vous intéresse, en l’occurrence ceux répertoriés en Californie. Et même alors, vous voulez voir le prix moyen seulement s’il est supérieur à 10,00 $.

Vous pouvez établir la première condition en incluant une clause WHERE, qui ignore tous les éditeurs qui ne sont pas en Californie, avant de calculer les prix moyens. La deuxième condition nécessite une clause HAVING, car la condition est basée sur les résultats du regroupement et de la synthèse des données. L’instruction SQL obtenue peut se présenter de la manière suivante :

SELECT titles.pub_id, AVG(titles.price)  
FROM titles INNER JOIN publishers  
   ON titles.pub_id = publishers.pub_id  
WHERE publishers.state = 'CA'  
GROUP BY titles.pub_id  
HAVING AVG(price) > 10  

Vous pouvez créer des clauses HAVING et WHERE dans le volet Critères. Par défaut, si vous spécifiez une condition de recherche pour une colonne, la condition fait partie de la clause HAVING. Toutefois, vous pouvez modifier la condition pour qu’elle soit une clause WHERE.

Vous pouvez créer une clause WHERE et une clause HAVING impliquant la même colonne. Pour ce faire, vous devez ajouter la colonne deux fois au volet Critères, puis spécifier une instance dans le cadre de la clause HAVING et de l’autre instance dans le cadre de la clause WHERE.

Pour spécifier une condition WHERE dans une requête d’agrégation

  1. Spécifiez les groupes de votre requête. Pour plus d'informations, consultez la section intitulée "Grouper des lignes dans les résultats de requête (Visual Database Tools)".

  2. Si ce n’est pas déjà dans le volet Critères, ajoutez la colonne sur laquelle vous souhaitez baser la condition WHERE.

  3. Supprimez la colonne Sortie à moins que la colonne de données fasse partie de la clause GROUP BY ou soit incluse dans une fonction d’agrégation.

  4. Dans la colonne Filtre , spécifiez la condition WHERE. Le Concepteur de requêtes et de vues ajoute la condition à la clause HAVING de l’instruction SQL.

    Remarque

    La requête illustrée dans cet exemple de procédure joint deux tables, titles et publishers.

    À ce stade de la requête, l’instruction SQL contient une clause HAVING :

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    GROUP BY titles.pub_id  
    HAVING publishers.state = 'CA'  
    
  5. Dans la colonne Grouper par , sélectionnez Where dans la liste des options de synthèse et de groupe. Le Concepteur de requêtes et de vues supprime la condition de la clause HAVING dans l’instruction SQL et l’ajoute à la clause WHERE.

    L’instruction SQL change pour inclure une clause WHERE à la place :

    SELECT titles.pub_id, AVG(titles.price)  
    FROM titles INNER JOIN publishers   
       ON titles.pub_id = publishers.pub_id  
    WHERE publishers.state = 'CA'  
    GROUP BY titles.pub_id  
    

Voir aussi

trier et regrouper les résultats des requêtes (Visual Database Tools)
Résumer les Résultats des Requêtes (Outils de Base de Données Visuelle)