|

Requetes SQL

But du document

Ce document a pour but de montrer comment :

  • Créer des requêtes simples
  • Comment relier 2 tables dans une requête
  • Optimiser les requêtes

Nous allons donc utiliser les tables créées dans l’article  précédent:

  • Codepostal
  • Ville

Requêtes simples

Sans critère

Le select ci-dessous affiche toutes les lignes de la table :

select * from codepostal;
+-------+-------+------------+-------------------------+
| cp_id | Insee | codepostal | Acheminement            |
+-------+-------+------------+-------------------------+
|     1 | 01001 | 01400      | L ABERGEMENT CLEMENCIAT |
|     2 | 01002 | 01640      | L ABERGEMENT DE VAREY   |
|     3 | 01004 | 01500      | AMBERIEU EN BUGEY       |
|     4 | 01005 | 01330      | AMBERIEUX EN DOMBES     |
|     5 | 01006 | 01300      | AMBLEON                 |
|     6 | 01007 | 01500      | AMBRONAY                |
|     7 | 01008 | 01500      | AMBUTRIX                |
|     8 | 01009 | 01300      | ANDERT ET CONDON        |
|     9 | 01010 | 01350      | ANGLEFORT               |
|    10 | 01011 | 01100      | APREMONT                |
|    11 | 01012 | 01110      | ARANC                   |
|    12 | 01013 | 01230      | ARANDAS                 |
|    13 | 01014 | 01100      | ARBENT                  |
|    14 | 01015 | 01300      | ARBOYS EN BUGEY         |
|    15 | 01016 | 01190      | ARBIGNY                 |
|    16 | 01017 | 01230      | ARGIS                   |
|    17 | 01019 | 01510      | ARMIX                   |
|    18 | 01021 | 01480      | ARS SUR FORMANS         |
|    19 | 01022 | 01510      | ARTEMARE                |
...
| 35601 | 98817 | 98874      | PONT DES FRANCAIS       |
| 35602 | 98817 | 98875      | PLUM                    |
| 35603 | 98817 | 98876      | LA COULEE               |
| 35604 | 98818 | 98800      | NOUMEA                  |
| 35605 | 98819 | 98821      | OUEGOA                  |
| 35606 | 98820 | 98814      | FAYAOUE                 |
| 35607 | 98821 | 98840      | TONTOUTA                |
| 35608 | 98821 | 98889      | PAITA                   |
| 35609 | 98821 | 98890      | PAITA                   |
| 35610 | 98822 | 98822      | POINDIMIE               |
| 35611 | 98823 | 98823      | PONERIHOUEN             |
| 35612 | 98824 | 98824      | POUEBO                  |
| 35613 | 98825 | 98825      | POUEMBOUT               |
| 35614 | 98826 | 98826      | POUM                    |
| 35615 | 98827 | 98827      | POYA                    |
| 35616 | 98827 | 98877      | NEPOUI                  |
| 35617 | 98828 | 98882      | SARRAMEA                |
| 35618 | 98829 | 98829      | THIO                    |
| 35619 | 98830 | 98831      | TOUHO                   |
| 35620 | 98831 | 98833      | VOH                     |
| 35621 | 98831 | 98883      | OUACO                   |
| 35622 | 98832 | 98834      | YATE                    |
| 35623 | 98833 | 98818      | KOUAOUA                 |
| 35624 | 98901 | 98799      | ILE DE CLIPPERTON       |
| 35625 | 99138 | 98000      | MONACO                  |
+-------+-------+------------+-------------------------+
35625 rows in set (0.00 sec)rows in set (0.00 sec)

Avec critère

Nous allons voir comment utiliser la clause where

Nous allons faire plusieurs requêtes :

  • Toutes les villes portant même nom
  • Toutes les villes ayant une partie du nom en commun

Ville ayant le même nom

Nous allons utiliser la clause where basiquement en indiquant comme critère :

  • Le nom du champ
  • L’expression exacte recherchée

Grâce à cette requête nous savons qu’il y a 3 villes en France qui s’appellent Bellegarde.  😛

D’autres villes peuvent-elles avoir ce nom de ville dans leur nom

Nous allons maintenant rajouter le discriminant « = » like dans une expression régulière :

select * 
from ville 
where Name like "%Bellegarde%";
+----------+-------+-----------------------------+
| ville_id | cp_id | Name                       |
+----------+-------+-----------------------------+
|     3628 |  3628 | Bellegarde Du Razes         |
|     7724 |  7724 | Bellegarde En Marche        |
|     7935 |  7935 | St Silvain Bellegarde       |
|     8291 |  8291 | St Barthelemy De Bellegarde |
|     9087 |  9087 | Bellegarde En Diois         |
|    11063 | 11063 | Bellegarde                  |
|    11440 | 11440 | Bellegarde Ste Marie        |
|    12011 | 12011 | Bellegarde                  |
|    14204 | 14204 | Bellegarde Poussieu         |
|    15808 | 15808 | Bellegarde En Forez         |
|    16620 | 16620 | Bellegarde                  |
|    16819 | 16819 | Ouzouer Sous Bellegarde     |
|    32148 | 32148 | Bellegarde Marsal           |
+----------+-------+-----------------------------+
13 rows in set (0.23 sec)

Bonne nouvelle 13 Villes en France ont Bellegarde dans leur nom. 😀

Relier des tables entre elles et filtrer la sortie

Requêtes parallélisées

Il est déconseillé d’utiliser cette méthode sur des grosse base de données car elle est très consommatrice de ressource système

Nous allons partir de la dernière requête pour afficher le code postal de chaque ville

select *
from ville
where cp_id IN (
SELECT cp_id
FROM cp
WHERE cp.cp_id=ville.cp_id)
AND Name like "%Bellegarde%"
order by name
;

Le résultat n’est pas à la hauteur de nos attentes :

+----------+-------+-----------------------------+
| ville_id | cp_id | Name                        |
+----------+-------+-----------------------------+
|    11063 | 11063 | Bellegarde                  |
|    12011 | 12011 | Bellegarde                  |
|    16620 | 16620 | Bellegarde                  |
|     3628 |  3628 | Bellegarde Du Razes         |
|     9087 |  9087 | Bellegarde En Diois         |
|    15808 | 15808 | Bellegarde En Forez         |
|     7724 |  7724 | Bellegarde En Marche        |
|    32148 | 32148 | Bellegarde Marsal           |
|    14204 | 14204 | Bellegarde Poussieu         |
|    11440 | 11440 | Bellegarde Ste Marie        |
|    16819 | 16819 | Ouzouer Sous Bellegarde     |
|     8291 |  8291 | St Barthelemy De Bellegarde |
|     7935 |  7935 | St Silvain Bellegarde       |
+----------+-------+-----------------------------+
13 rows in set (0.28 sec)

Utilisation des jointures

Nous allons voir l’utilisation des jointures et comparer le résultat avec la requête précédente.

Rechercher les codes postaux par ville

select ZIP.codepostal as "code postal", TOWN.name AS "Ville"
from ville AS TOWN
LEFT JOIN cp AS ZIP ON ZIP.cp_id=TOWN.cp_id
WHERE Name like "%Bellegarde%"
order by ZIP.codepostal,TOWN.name;

Résultat :

+-------------+-----------------------------+
| code postal | Ville                       |
+-------------+-----------------------------+
| 11240       | Bellegarde Du Razes         |
| 23190       | Bellegarde En Marche        |
| 23190       | St Silvain Bellegarde       |
| 24700       | St Barthelemy De Bellegarde |
| 26470       | Bellegarde En Diois         |
| 30127       | Bellegarde                  |
| 31530       | Bellegarde Ste Marie        |
| 32140       | Bellegarde                  |
| 38270       | Bellegarde Poussieu         |
| 42210       | Bellegarde En Forez         |
| 45270       | Bellegarde                  |
| 45270       | Ouzouer Sous Bellegarde     |
| 81430       | Bellegarde Marsal           |
+-------------+-----------------------------+
13 rows in set (0.24 sec)

Rechercher les villes par code postal

select ZIP.codepostal as "code postal", TOWN.name AS "Ville"
from ville AS TOWN
LEFT JOIN cp AS ZIP ON ZIP.cp_id=TOWN.cp_id
-- WHERE Name like "%Bellegarde%"
WHERE codepostal=45270
order by TOWN.name;

Résultat :

+-------------+-------------------------+
| code postal | Ville                   |
+-------------+-------------------------+
| 45270       | Auvilliers En Gatinais  |
| 45270       | Beauchamps Sur Huillard |
| 45270       | Bellegarde              |
| 45270       | Chapelon                |
| 45270       | Freville Du Gatinais    |
| 45270       | Ladon                   |
| 45270       | Mezieres En Gatinais    |
| 45270       | Moulon                  |
| 45270       | Nesploy                 |
| 45270       | Ouzouer Sous Bellegarde |
| 45270       | Quiers Sur Bezonde      |
| 45270       | Villemoutiers           |
+-------------+-------------------------+
12 rows in set (0.21 sec)

Conclusion

Les jointures sont :

  • Beaucoup plus souples à utiliser
  • Le temps de réponse est grandement amélioré

Temps d’exécution de la requête inférieur a 20% via les jointures pour remonter seulement 15 lignes. Je vous laisse imaginer le gain de temps quand il s’agis de remonter des dizaines de millier de lignes.