OpenClassrooms becomes an accredited US university.
Discover what this means for youTable of contents
- Part 1
Initiez-vous à la modélisation relationnelle
Tirez un maximum de ce cours
Organisez vos données selon la modélisation relationnelle
Prenez en main une base de données
Identifiez les lignes de votre table avec votre clé primaire
Mettez en relation plusieurs tables avec des clés étrangères
Identifiez les types d'associations entre vos tables
Quiz: S'initier à la modélisation relationnelle
- Part 2
Construisez des requêtes SQL simples
Affichez les données pertinentes avec SELECT
Filtrez vos lignes avec WHERE
Récupérez des données issues de plusieurs tables avec FROM
Liez des tables avec une jointure interne
Maîtrisez les jointures externes et naturelles
Identifiez toujours vos potentielles clés primaires
Quiz: Construire des requêtes SQL simples
- Part 3
Appliquez d'autres fonctionnalités à vos requêtes SQL
Filtrez vos données agrégées avec HAVING
Au chapitre précédent, nous avons trouvé dans quels pays nos 2 intermédiaires avaient aidé à créer des sociétés. Mais on va ici affiner un peu notre recherche pour trouver dans quels pays les 2 intermédiaires ont eu la plus grande activité.
#Découvrez HAVING
Pour rappel, voici la table que nous avions obtenue au chapitre précédent :

On pourrait faire cela en filtrant cette table en ne gardant que les lignes pour lesquelles les valeurs de cette colonne sont au-dessus d'un certain seuil.
Par exemple, je pourrais souhaiter avoir les juridictions dans lesquelles les deux intermédiaires ont créé plus de 50 sociétés, c'est-à-dire les lignes pour lesquelles la colonne nb_societes est supérieure à 50.
Il faut donc effectuer un filtrage sur cette table.
Pour l'effectuer, je pourrais me dire que les filtrages, c'est dans le mot clé WHERE. Cependant, la condition qui est spécifiée dans le WHERE est vérifiée avant que l'agrégation ne soit effectuée.
Ici, nous voulons effectuer un filtrage après l'agrégation. Pour cela, on n'utilise pas WHERE mais HAVING :
SELECT
i.id AS intermediary_id,
i.name AS intermediary_name,
e.jurisdiction,
e.jurisdiction_description,
count(*) as nb_societes
FROM
intermediary i,
assoc_inter_entity a,
entity e
WHERE
a.entity = e.id AND
a.inter = i.id AND
(i.id = 5000 OR i.id = 5001)
GROUP BY
i.id, i.name, e.jurisdiction, e.jurisdiction_description
HAVING
count(*) > 50 ;
C'est après ce mot clé HAVING que vous pouvez spécifier que count(*) doit être supérieur à 50.
Au passage, il est tout naturel de mettre une fonction d'agrégation dans le HAVING, ce qui n'est pas possible dans le WHERE.
Regardons le résultat de cette requête :

J'obtiens ici les trois lignes pour lesquelles la valeur de "nb_societes" est supérieure à 50.
Ces pays sont-ils des paradis fiscaux ? Une petite recherche sur Internet nous indique que ... non.
Mais vous ne perdez pas espoir : en tant que journaliste, vous êtes tenace !
#À vous de jouer

#Contexte
En regardant dans la base, vous vous apercevez que les intermédiaires ont eu des activités sur une grande période de temps. En effet, l'intermédiaire Pacher Banking aurait, selon votre BDD, créé une société en 1990 ! Pour votre article, il est important de situer les événements dans le temps : vos infos sont-elles récentes ou pas ?
Afin d'affiner la période sur laquelle vous vous concentrerez pour votre article, vous décidez donc de modifier la requête précédente en ne gardant que les juridictions dans lesquelles au moins l'un des 2 intermédiaires a créé une (ou des) sociétés après le 1er janvier 2010.
#Consignes
Modifiez la requête en ne gardant que les lignes satisfaisant ces 2 conditions en même temps :
count(*) est supérieur à 10 ;
max(incorporation_date) est supérieur ou égal au 1er janvier 2010.
#Vérifiez votre travail
Il faut transformer la condition du HAVING en mettant les 2 conditions voulues séparées par AND :
max(incorporation_date) >= '2010-01-01' AND nb_societes > 10
Voici la structure de la requête à obtenir :
SELECT
i.id AS intermediary_id,
i.name AS intermediary_name,
e.jurisdiction,
e.jurisdiction_description,
count(*) as nb_societes,
max(incorporation_date)
FROM
intermediary i,
assoc_inter_entity a,
entity e
WHERE
a.entity = e.id AND
a.inter = i.id AND
(i.id = 5000 OR i.id = 5001)
GROUP BY
i.id, i.name, e.jurisdiction, e.jurisdiction_description
HAVING
max(incorporation_date) >= '2010-01-01' AND nb_societes > 10 ;
#En résumé
La condition dans le WHERE est vérifiée avant l'agrégation.
Pour restreindre les lignes après l'agrégation, il faut utiliser HAVING.
La condition dans le HAVING fait intervenir une fonction d'agrégation.
Au chapitre suivant, nous apprendrons comment trier les lignes d'une table.
- Up to 100% of your training program funded
- Flexible start date
- Career-focused projects
- Individual mentoring