Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
S’applique à :SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
Il peut arriver que vous souhaitiez exclure des lignes individuelles de groupes (à l’aide d’une clause WHERE) avant d’appliquer une condition aux groupes dans leur ensemble (à l’aide d’une clause HAVING).
Une clause HAVING est similaire à une clause WHERE si ce n’est qu’elle s’applique uniquement aux groupes dans leur ensemble (c’est-à-dire aux lignes du jeu de résultats qui représentent des groupes), tandis que la clause WHERE s’applique aux lignes individuelles. Une requête peut comporter à la fois une clause WHERE et une clause HAVING. Dans ce cas :
La clause
WHEREest d’abord appliquée aux lignes individuelles dans les tables ou les objets table du volet Diagramme. Seules les lignes répondant aux conditions précisées dans la clauseWHEREsont groupées.La clause
HAVINGest ensuite appliquée aux lignes du jeu de résultats. Seuls les groupes qui répondent aux conditionsHAVINGfigurent dans le résultat de la requête. Vous pouvez appliquer uneHAVINGclause uniquement aux colonnes qui apparaissent également dans laGROUP BYclause ou dans une fonction d’agrégation.
Spécifier une clause WHERE et HAVING sur deux tables jointes
Remarque
La base de données utilisée dans cet article est la base de données pubs, disponible à partir des exemples de bases de données Northwind et pubs pour Microsoft SQL Server sur GitHub.
Imaginons, par exemple, que vous décidiez de joindre les tables titles et publishers pour créer une requête affichant le prix moyen d’un livre pour un ensemble 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 là, vous voulez voir le prix moyen seulement s'il est supérieur à 10,00 USD.
Vous pouvez définir la première condition en incluant une clause WHERE qui rejette tous les éditeurs non répertoriés en Californie, avant de calculer les prix moyens. La seconde condition nécessite une clause HAVING dans la mesure où elle est fondé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;
Dans Visual Database Tools de SQL Server Management Studio, vous pouvez créer à la fois une clause 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 alors partie de la clause HAVING. Toutefois, vous pouvez modifier la condition pour qu’elle devienne une clause WHERE.
Il est possible de créer une clause WHERE et HAVING qui s’appliquent à une même colonne. Pour cela, vous devez ajouter deux fois la colonne au volet Critères, puis spécifier qu’une instance doit faire partie de la clause HAVING et l’autre de la clause WHERE.
Spécifiez une condition WHERE dans une requête d’agrégation
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)".
Si elle ne figure pas encore dans le volet Critères, ajoutez la colonne sur laquelle vous souhaitez baser la condition
WHERE.Effacez la colonne Sortie , sauf si la colonne de données fait partie de la
GROUP BYclause ou incluse dans une fonction d’agrégation.Dans la colonne Filtre, spécifiez la condition
WHERE. Le Concepteur de requêtes et de vues ajoute la condition à la clauseHAVINGde l’instruction SQL.Remarque
La requête illustrée dans cet exemple de procédure joint deux tables,
titlesetpublishers.À 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';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
HAVINGdans l’instruction SQL et l’ajoute à la clauseWHERE.L’instruction SQL est modifiée afin d’inclure à la place une clause
WHERE: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;