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.
