SQL AVOIR
SQL HAVINGclause
HAVING clause
La raison de l'ajout de la clause HAVING dans SQL est que le mot clé WHERE ne peut pas être utilisé avec des fonctions d'agrégation.
La clause HAVING nous permet de filtrer chaque groupe de données après regroupement.
Syntaxe SQL HAVING
SELECT nom_colonne, fonction_agrégat (nom_colonne)
FROM nom_table
WHERE nom_colonne valeur de l'opérateur
GROUP BY nom_colonne
HAVING fonction_agrégat (nom_colonne ) valeur de l'opérateur ;
FROM nom_table
WHERE nom_colonne valeur de l'opérateur
GROUP BY nom_colonne
HAVING fonction_agrégat (nom_colonne ) valeur de l'opérateur ;
Base de données de démonstration
Dans ce tutoriel, nous utiliserons l'exemple de base de données php.
Voici les données sélectionnées dans le tableau "Sites Web" :
+----+--------------+-- - --------------+------+---------+
| identifiant | URL --------+-------+---------+
| 1 | Google https://www.google.cm/ 1 | |
| 2 | Taobao | https://www.taobao.com/ | 13 | CN |
| php Site Web chinois |
| Weibo | http://weibo.com/ |
| | http://stackoverflow.com/ | 0 |
+----+--------------+---------- ---------------+------+---------+
Instance SQL HAVINGMaintenant, nous voulons trouver le visites totales Plus de 200 sites Web. Nous utilisons l'instruction SQL suivante :
| identifiant | URL --------+-------+---------+
| 1 | Google https://www.google.cm/ 1 | |
| 2 | Taobao | https://www.taobao.com/ | 13 | CN |
| php Site Web chinois |
| Weibo | http://weibo.com/ |
| | http://stackoverflow.com/ | 0 |
+----+--------------+---------- ---------------+------+---------+
Voici les données de la table d'enregistrement d'accès au site Web "access_log" :
mysql> SELECT * FROM access_log;
+-----+------ --- +-------+------------+
| aide site_id | compte date |
+-----+--- --- ---+-------+------------+
| 1 | 45 | 2016-05-10 |
| 3 | 100 | 2016-05-13 |
| 3 | 2016-05-14 |
| 4 | 2016-05-14 |
| | 2016-05-14 |
| 6 | 13 | 2016-05-15 |
| -05 -16 |
| 9 | 201 | 2016-05-17 |
+-----+---------+------+- -- ---------+
9 lignes dans l'ensemble (0,00 sec)
+-----+------ --- +-------+------------+
| aide site_id | compte date |
+-----+--- --- ---+-------+------------+
| 1 | 45 | 2016-05-10 |
| 3 | 100 | 2016-05-13 |
| 3 | 2016-05-14 |
| 4 | 2016-05-14 |
| | 2016-05-14 |
| 6 | 13 | 2016-05-15 |
| -05 -16 |
| 9 | 201 | 2016-05-17 |
+-----+---------+------+- -- ---------+
9 lignes dans l'ensemble (0,00 sec)
Instance SQL HAVINGMaintenant, nous voulons trouver le visites totales Plus de 200 sites Web. Nous utilisons l'instruction SQL suivante :
ExempleSELECT Websites.name, Websites.url, SUM(access_log.count) AS nums FROM
(access_log
Maintenant, nous voulons trouvez le nombre total de visites supérieur à 200 sur le site Web et le classement Alexa est inférieur à 200. Nous ajoutons une clause WHERE commune à l'instruction SQL : INNER JOIN Sites Web
ON access_log.site_id=Websites.id)
GROUPE PAR Websites.name
HAVING SUM(access_log.count) > 200;
Le résultat de l'exécution du SQL ci-dessus est le suivant :ON access_log.site_id=Websites.id)
GROUPE PAR Websites.name
HAVING SUM(access_log.count) > 200;
ExempleSELECT Websites.name, SUM(access_log.count) AS nums FROM
Sites Web
INNER JOIN access_log
ON Websites.id=access_log.site_id
OÙ Websites.alexa < 200
GROUPE PAR Websites.name
HAVING SOMME(access_log.count) > 200;
ON Websites.id=access_log.site_id
OÙ Websites.alexa < 200
GROUPE PAR Websites.name
HAVING SOMME(access_log.count) > 200;
Le résultat de l'exécution du SQL ci-dessus est le suivant :