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.
