|

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.