Recette
#2: |
|
Février 2011 |
A partir de maintenant, nous allons effectuer des requêtes sur
deux tables et plus... en même temps. |
SELECT * |
county_id |
county_name |
car_plate_code |
region_id |
region_id |
region_name |
1 |
TORINO |
TO |
1 |
1 |
PIEMONTE |
1 |
TORINO |
TO |
1 |
2 |
VALLE D'AOSTA |
1 |
TORINO |
TO |
1 |
3 |
LOMBARDIA |
1 |
TORINO |
TO |
1 |
4 |
TRENTINO-ALTO ADIGE |
1 |
TORINO |
TO |
1 |
5 |
VENETO |
... |
... |
... |
... |
... |
... |
Apparemment cette requête semble marcher sans soucis;
mais un
rapide coup d'oeil permet de s'apercevoir de plusieurs soucis:
un nombre surprenant de lignes
Chaque County semble être relié à chaque Region.
A chaque fois que l'on effectue une requête SQL sur deux
tables, le produit cartésien des deux tables est calculé.
Ainsi, il est clair qu'une condition de jointure doit être spécifiée afin de garder le contrôle sur les résultats, en ne gardant que les lignes d’intérêt. |
SELECT * |
Cette requête est exactement la même que la précédente, mais
avec cette fois une condition de jointure.
Quelques
remarques:
l'utilisation de plusieurs tables
mène rapidement à des ambiguïtés:
e.g. ici par exemple, on se
retrouve avec deux colonnes region_id,
l'une dans la table counties
et l'autre dans la table regions.
Afin d'éviter ce problème, une
combinaison table/colonne est utilisée :
e.g. counties.region_id
identifie la colonne region_id
de la table counties
d'une manière non ambiguë.
la clause WHERE
counties.region_id = regions.region_id impose une
condition de jointure appropriée.
Ceci permettra de
filtrer le produit cartésien, de façon à ne garder que les lignes
intéressantes.
SELECT c.county_id AS
county_id, |
county_id |
county_name |
car_plate_code |
region_id |
region_name |
1 |
TORINO |
TO |
1 |
PIEMONTE |
2 |
VERCELLI |
VC |
1 |
PIEMONTE |
3 |
NOVARA |
NO |
1 |
PIEMONTE |
4 |
CUNEO |
CN |
1 |
PIEMONTE |
5 |
ASTI |
AT |
1 |
PIEMONTE |
6 |
ALESSANDRIA |
AL |
1 |
PIEMONTE |
... |
... |
... |
... |
... |
Cette table est la même que la précédente, avec quelques améliorations graphiques:
la clause AS permet de définir un alias pour les tables et les colonnes. Les requêtes deviennent alors plus compréhensibles.
SELECT lc.lc_id AS
lc_id, |
lc_id |
lc_name |
population |
county_id |
county_name |
car_plate_code |
region_id |
region_name |
1001 |
AGLIE' |
2574 |
1 |
TORINO |
TO |
1 |
PIEMONTE |
1002 |
AIRASCA |
3554 |
1 |
TORINO |
TO |
1 |
PIEMONTE |
1003 |
ALA DI STURA |
479 |
1 |
TORINO |
TO |
1 |
PIEMONTE |
... |
... |
... |
... |
... |
... |
... |
... |
Joindre 3 tables (ou plus) n'est
pas plus difficile:
il suffit simplement d'ajouter autant de
conditions de jointure que nécessaire.
Performance L’exécution de requêtes
complexes impliquant différentes tables peut très vite devenir
lent. Surtout lorsque les tables contiennent beaucoup de données.
L'explication de ce phénomène est le temps de calcul nécessaire
à la réalisation du produit cartésien. |
|
Author: Alessandro Furieri a.furieri@lqt.it |
This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license. |
|
|
|
Permission is granted to copy, distribute and/or modify this
document under the terms of the |