Notes et transcription du cours Requêtez une base de données avec SQL disponible sur la plateforme Openclassrooms.
Dans une base de données, il arrive souvent que deux chaînes de caractères différentes puissent décrire la même information.
Par exemple, les chaînes de caractères 'Anne-Marie' et 'Anne Marie' font référence au même prénom, mais elles diffèrent à cause du tiret.
Pour cela, il existe un opérateur très pratique en SQL : c'est LIKE.
LIKE va vous permettre d'effectuer une recherche dans des chaînes de caractères. Il est utilisé lorsque l'on ne connaît qu'une partie de la chaîne de caractères, ou que l'on connaît sa forme générale.
On utilise LIKE
avec les caractères _ et %. Le premier est employé pour remplacer un caractère inconnu, le second pour remplacer 0, 1 ou plusieurs caractères inconnus.
Par exemple, pour connaître toutes les sociétés qui commencent par le caractère A, nous pouvons écrire ceci :
SELECT * FROM entity WHERE name LIKE 'A%' ;
Voici dans ce tableau différentes expressions utilisant LIKE (colonne de gauche), ainsi que la valeur renvoyée par l'expression en question (colonne de droite).
Expression | Résultat |
---|---|
`'Big Data Crunchers' LIKE '%Big%'` | TRUE |
`'Big Data Crunchers' LIKE '%Big%chers'` | TRUE |
`'Big Data Crunchers' LIKE '%Big%chers%'` | TRUE |
`'Big Data Crunchers' LIKE 'Big _ata Crunchers'` | TRUE |
`'Big Data Crunchers' LIKE 'Big __ata Crunchers'` | FALSE |
`'Big Data Crunchers' LIKE '_Big Data Crunchers'` | FALSE |
`'Big Data Crunchers' LIKE 'Big D___ Crun%'` | TRUE |
`'Big Data Crunchers' LIKE '%Big D%a%ta Crunchers'` | TRUE |
Si vous souhaitez tester ces expressions, écrivez dans votre SGBDR :
SELECT 'Big Data Crunchers' LIKE '%Big%' ;
La réponse sera une table d'une ligne et d'une colonne. En fonction de votre SGBDR, la valeur contenue dans cette table peut varier : l'équivalent de 1
par exemple est TRUE
en SQLite, ou t
en PostgreSQL ; et l'équivalent de 0
est FALSE
en SQLite, et f
en PostgreSQL.
Que renvoie l'expression 'OpenClassrooms' LIKE 'openclassrooms' ?
Eh bien… cela dépend ! Les SGBDR n'ont pas tous le même comportement : certains vous renverront TRUE
, d'autres FALSE
.
Pour ne jamais vous tromper, je vous conseille donc de vous y prendre comme ceci, en utilisant la fonction scalaire LOWER
, qui convertit les chaînes de caractères en minuscules :
SELECT * FROM entity WHERE LOWER(name) LIKE 'a%' ;
De cette manière, quelle que soit sa valeur, name sera converti en minuscules. Une fois la conversion faite, écrivez votre pattern sans aucune majuscule (ici le pattern est a% ).
Cette requête vous renverra toutes les sociétés dont le nom commence par un A, qu'il soit en majuscule ou en minuscule !
Dans les Panama Papers (ou toute base de données), il arrive qu'une société ait plusieurs orthographes différentes.
Nous connaissons maintenant bien notre intermédiaire, dont le nom est “Pacher Banking S.A.”
Recherchons donc s'il existe des intermédiaires avec un nom similaire/proche. Une bonne façon de le faire est d'utiliser à la fois LIKE et lower() :
SELECT * FROM intermediary WHERE LOWER(name) LIKE '%pacher%banking%' ;
Cette requête révèle qu'il y a 2 lignes qui ont un nom similaire. Correspondent-elles à la même société ? Comme elles ont la même adresse, nous considérerons ici que oui (même si ce n'est pas une certitude absolue).
Nous pouvons donc adapter la requête du chapitre précédent, en intégrant l'opérateur LIKE :
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 (LOWER(i.name) LIKE '%pacher%banking%' OR LOWER(i.name) LIKE '%plouf%financial%services%') GROUP BY i.id, i.name, e.jurisdiction, e.jurisdiction_description ORDER BY nb_societes DESC
Et là, surprise ! Tout en haut des résultats, on voit que des sociétés ont été créées par des intermédiaires dont les identifiants sont 5002 et 5003. À en regarder les noms, il s'agit à priori des mêmes intermédiaires que nous avons ciblés depuis le début, c'est-à-dire les 5000 et 5001 !
Sauf que là, quand on regarde les pays dans lesquels ces 2 intermédiaires ont eu le plus d'activité, on tombe bien sur des pays considérés (par l'Union européenne au moment de la publication des Panama Papers) comme des paradis fiscaux !
Bravo, vous allez avoir de quoi alimenter votre article avec des révélations passionnantes !
Ah, les chaînes de caractères qui s’orthographient de différentes manières…
Dans votre carrière de data journaliste, ceci vous causera toujours du fil à retordre. En effet, il est malheureusement extrêmement rare que des données soient propres dès le départ. Une grande partie du travail d’analyse de données consiste à nettoyer les données. Afin d’être sûr que vous avez bien été exhaustif dans votre analyse des Panama Papers, il faut maintenant vérifier que vous n’êtes pas passé à côté d’une information importante dans la table entity
.
Maintenant que vous savez vérifier si des lignes de intermediary
font référence à un même intermédiaire, vérifiez également si la table entity
ne contient pas d'autres sociétés appelées Big Data Crunchers
.
Écrivez la requête permettant de répondre à cette question.
_
remplace un caractère, et où %
remplace plusieurs (ou aucun) caractères.Pour mettre un texte en majuscules, on utilise la fonction scalaire upper(), ou bien lower() pour le mettre en minuscules.
Dans le chapitre suivant, nous continuerons à utiliser LIKE, dans l'optique de créer un mini moteur de recherche !