Vous êtes sur la page 1sur 8

[SQL] Slection multitables

Par BoZ

www.siteduzero.com

Licence Creative Commons 6 2.0 Dernire mise jour le 1/01/2011

2/9

Sommaire
Sommaire ........................................................................................................................................... 2 [SQL] Slection multi-tables ............................................................................................................... 3
Explication et prparation des tables ................................................................................................................................ 3
news ............................................................................................................................................................................................................................ 4

1re mthode : les requtes imbriques (ou sous-requtes) ........................................................................................... 5 2e mthode : les requtes slection multi-tables .............................................................................................................. 6 Q.C.M. ............................................................................................................................................................................... 7
Partager ....................................................................................................................................................................................................................... 8

www.siteduzero.com

Sommaire

3/9

[SQL] Slection multi-tables

Par

BoZ

Mise jour : 01/01/2011 Difficult : Facile 335 visites depuis 7 jours, class 317/797 Je vais essayer de vous expliquer le plus clairement possible comment faire une slection sur plusieurs tables en une seule requte. Ceci est diffrent des jointures car on n'ajoute pas les tables les unes la suite des autres.

Bon on y va

Les tables sont reprsentes sous forme de MCD. Le cadre suprieur reprsente le nom de la table, le cadre infrieur regroupe les divers champs de la tables. Dans le cadre infrieur la cl primaire est souligne.

Sommaire du tutoriel :

Explication et prparation des tables 1re mthode : les requtes imbriques (ou sous-requtes) 2e mthode : les requtes slection multi-tables Q.C.M.

Explication et prparation des tables


Un novice va tre content lorsqu'il aura russi slectionner les champs qui l'intressent. Mais imaginez, aprs un peu de rflexion, vous vous dites : "flte, ma base n'est pas bien faite, j'ai une redondance d'information". En effet, votre table ressemble ceci :

Comme on peut le remarquer, si vous avez trois personnes qui postent des news chaque fois, vous aurez les informations de

www.siteduzero.com

[SQL] Slection multi-tables

4/9

l'auteur qui vont revenir. Pas super optimis, surtout si on doit faire un tri sur les champs auteur_nom et auteur_prenom. De plus, il est dconseill de travailler sur des champs de type chane de caractres (du fait de leur complexit, entier est plus simple tout point de vue). Il serait en effet bon d'optimiser un peu cela. Nous allons donc rflchir un petit peu. Nous avons un auteur qui peut tre identifi par son nom, son prnom :

Encore une fois, pour faire des oprations sur cette table, pas super, surtout qu'il faut encore mettre le nom et le prnom de l'auteur dans la table

news
. On a gagn un seul champ mais nous n'avons pas facilit le travail pour le serveur. Nous allons donc lui attribuer un id. Nos deux tables seront plus claires. Maintenant nous associons nos deux tables et nous arrivons au schma suivant :

Comme je l'ai dit, j'utilise la reprsentation de la mthode merise : les MCD. Comme je pense que vous ne matrisez pas tous cette mthode d'analyse, je vais expliquer un peu le schma. On retrouve toujours nos deux tables news et auteur. On peut voir une "bulle" entre ces deux tables avec le nom associer, ceci s'appelle une relation car nous avons mis nos deux tables en relation (simple, non ? ). Une relation est TOUJOURS un verbe l'infinitif. Entre la relation et la table news, il y a un trait avec en dessous 1,1 ceci s'appelle une cardinalit. Mme chose entre la relation et la table auteur. Il existe quatre cardinalits : 0 , 1 : au minimum 0 fois et au maximum 1 fois ; 0 , N : au minimum 0 fois et au maximum N fois ; 1 , 1 : 1 et 1 seul fois ; 1 , N : au minimum 1 fois et au maximum N fois. En fait ici, pour comprendre le schma, il faut lire : une news est associe 1 et 1 seul auteur ; un auteur est associ 0 ou N news.

Maintenant que vous avez compris le principe, je vous laisse rflchir au code SQL pour la cration de ces deux tables. Alors, vous avez trouv ? Facile, non ? Secret (cliquez pour afficher) Code : SQL

www.siteduzero.com

[SQL] Slection multi-tables

5/9

CREATE TABLE auteur ( id_auteur int(3), nom varchar(100), prenom varchar(100), email varchar(200) ); CREATE TABLE news ( id int(3), Date_news date, titre varchar(255), message text, id_auteur int(3) ); ALTER TABLE auteur ADD CONSTRAINT PK_auteur PRIMARY KEY (id_auteur); ALTER TABLE news ADD CONSTRAINT PK_news PRIMARY KEY (id);

Pour ma part, j'ai l'habitude de crer mes contraintes (cl primaire et trangre par exemple) grce un ALTER TABLE pour bien sparer la cration des tables des contraintes (mais il est tout a fait possible de crer les contraintes en mme temps) et pouvoir nommer ces dernires comme je veux.

Je suis sr que vous avez oubli quelque chose !! Et je l'ai omis volontairement. En fait, il faut indiquer notre SGBD (Systme de Gestion de Base de Donnes) que la cl id_auteur de la table news fait rfrence l'id_auteur de la table auteur. Pour cela, il faut crer une contrainte de cl trangre : Code : SQL ALTER TABLE news ADD CONSTRAINT FK_news_id_auteur FOREIGN KEY (id_auteur) REFERENCES auteur (id_auteur);

V : maintenant, il ne vous reste plus qu' crer vos tables. oil Avant de continuer rflchissez ceci... Comment faire pour afficher les deux news de DUPONT Marcel sans utiliser les jointures ? V ous voulez savoir ? Ok, ok, je vous le dis.

1re mthode : les requtes imbriques (ou sous-requtes)


Qu'est-ce qu'une requte imbrique ?

Eh bien, une requte dans une autre requte

, a vous suffit comme explication ?

Une requte "standard " s'crit souvent comme ceci : Code : SQL SELECT * FROM ma_table WHERE id=1;

Ceci est suffisant pour une requte mono-table. Mais lorsqu'il y a plusieurs tables, et que nous voulons rcuprer les news de DUPONT Marcel qui a pour id 2, le programmeur

www.siteduzero.com

[SQL] Slection multi-tables


non initi correctement va faire minimum deux requtes, une premire pour rcuprer l'id de l'auteur dans la table auteur : Code : SQL SELECT id_auteur FROM auteur WHERE nom='Dupont' AND prenom='marcel';

6/9

puis une deuxime pour rcuprer la news : Code : SQL SELECT * FROM news WHERE id_auteur='2';

Mais vous ne remarquez pas quelque chose ? Le rsultat de la 1re requte est directement inject dans la deuxime. Pourquoi alors ne pas faire une seule requte ?

Allez, on rflchit

.V ous avez trouv ?

D'accord, je vous le donne : Secret (cliquez pour afficher) Code : SQL SELECT * FROM news WHERE id_auteur=(SELECT id_auteur FROM auteur WHERE nom='Dupont' AND prenom='marcel');

Ainsi, nous avons deux requtes excutes en une fois. V ous savez maintenant ce qu'est une requte imbrique. Cette mthode est simple car trs naturelle, mais peut vite se transformer en casse-tte.

2e mthode : les requtes slection multi-tables


L'inconvnient de cette premire mthode est que le SGBD va quand mme excuter deux requtes. Ici, on ne va faire qu'une seule belle requte. Oubliez de suite la simplicit des requtes imbriques... Euuuh!! En fait non, car c'est aussi simple, il faut juste rflchir un petit peu plus. Maintenant, on va faire une vraie slection multiple, c'est--dire que nous allons faire une seule requte mais sur plusieurs tables. Comme pour la premire mthode, nous allons slectionner les news postes par DUPONT Marcel. Nous allons slectionner tous les champs de la table news : Code : SQL SELECT n.* FROM news AS n

L'instruction AS permet de dfinir un alias, ce qui vite de rcrire le nom de la table au complet.

Ensuite, il faut savoir de quelles tables nous allons avoir besoin : ici, pas de problme, notre base de donnes ne contient que deux tables : news et auteur, donc notre requte se complte : Code : SQL

www.siteduzero.com

[SQL] Slection multi-tables


SELECT * FROM news AS n, auteur AS a

7/9

C'est ici qu'il faut comprendre et surtout bien rflchir.

Nous posons nos conditions de slection : nous voulons que le champ id_auteur de la table news soit gal au champ id_auteur de la table auteur, pour lequel le champ nom est gal DUPONT et le champ prenom Marcel. Maintenant que nous avons crit clairement notre condition, on va la transcrire en langage SQL. Pour accder au champ id_auteur de la table news, il faut utiliser la notation pointe, c'est--dire news.id_auteur ou n.id_auteur. Code : SQL WHERE n.id_auteur = a.id_auteur AND nom="DUPONT" AND prenom="Marchel"

Lorsqu'il n'y aucune ambigut, nous ne sommes pas obligs d'utiliser la notation pointe. Il y a ambigut lorsque deux champs de mme nom sont dans deux tables diffrentes, par exemple le champ id_auteur.

Notre requte de slection est : Code : SQL SELECT * FROM news AS n, auteur AS a WHERE n.id_auteur = a.id_auteur AND nom="DUPONT" AND prenom="Marchel"

Je vous conseille de ne pas crire vos requtes sur une seule et mme ligne. Je me suis permis de le faire car elle toute petite, mais lorsque vous aurez de plus grosses requtes, cela deviendra illisible. Prfrez les crire comme ceci : Code : SQL SELECT * FROM news AS n, auteur AS a WHERE n.id_auteur = a.id_auteur AND nom="DUPONT" AND prenom="Marchel"

V ous savez maintenant crer de super belles requtes de slection multi-tables. En fait, ce n'est pas si dur que a.

Q.C.M.
Le premier QCM de ce cours vous est offert en libre accs. Pour accder aux suivants Connectez-vous Inscrivez-vous Qu'est-ce qu'une requte imbrique ?
Une requte faite avec des briques. Une requte la suite d'une autre. Une requte qui renvoie son rsultat directement dans une autre requte.

Si je lance cette requte sur le serveur, que va-t-il se passer ?

www.siteduzero.com

[SQL] Slection multi-tables


Code : SQL SELECT user_nom, message_texte FROM utilisateur AS u, message AS m WHERE u.user_id='1' AND user_id=user_id;

8/9

Je vais rcuprer un message de l'utilisateur 1. Je vais rcuprer le nom de l'utilisateur et ses messages. Une erreur.

On considre les deux tables suivantes (les mmes que celles du cours) :

Quelle est la bonne requte pour obtenir l'adresse e-mail de l'auteur de la news numro 3 ?
SELECT email FROM news AS n, auteur AS a WHERE n.id=3 AND n.id_auteur=a.id_auteur SELECT email FROM news AS n, auteur AS a WHERE n.id=3 AND id_auteur=id_auteur SELECT email FROM news, auteur WHERE n.id=3 AND n.id_auteur=a.id_auteur

Correction !
Statistiques de rponses au Q CM

V oil, ce tuto est fini. J'espre que vous tes maintenant des pros des slections multi-tables

. .

Il ne reste plus qu' faire une seule chose ! Trouver une application pour ces jolies requtes

Partager

www.siteduzero.com