Cours 7
L'OPÉRATION 'JOIN'


La requête simple


Récupérez le fichier pour faire les exemples: Gestion de projets


En passant, afin d'être certain que le vocabulaire est clair pour tous:
     requête = question = interrogation = Query, en anglais

Nous utilisons une requête simple pour répondre à une interrogation simple :

Tous les projets gérés par Lebeau?


SELECT * FROM projet
WHERE pChef = 'Lebeau'



Le nom et la date d'embauche de tous les employés masculin?

SELECT ePrenom, eNom, eDateemb AS Embauche
FROM employe
WHERE esexe = 'M'










Requête avec plusieurs tables

Pour répondre à une interrogation où il faut extraire des champs de 2 tables, on utilise un JOIN (Jointure) ; par définition, la jointure produit une multiplication des 2 tables ; donc, si une table contient 10 enregistrements et l'autre en contient 15, le produit de la jointure en contient 150. 


Affichez le numéro d'employé, le nom et les heures pour toutes les feuilles de temps.

Numéro d'employé est dans Employe et dans Feuille, Nom est dans Employe et Heures est dans Feuille. Il faut donc nommer les 2 tables dans le FROM. On pourrait essayer ceci:

SELECT eNom, fEmpId, fHeures FROM Feuille, Employe;

Ça fonctionne mais, comptez le nombre de lignes de résultat! Si vous avez 10 employés et 10 feuilles, vous devriez avoir une sortie de 100 lignes.

Si on avait 100 employés et 100 feuilles, on verrait 10,000 lignes de sortie.


Le truc dans un JOIN est de spécifier qu'on veut seulement ceux qui ont une colonne commune:

SELECT eNom, fEmpId,fDate
FROM Feuille, Employe
WHERE fEmpId = eId;

La condition WHERE fEmpId = eId identifie la relation entre les 2 tables. En somme, on exprime la relation en terme de: la clé étrangère dans une table = la clé primaire de l'autre table ce qui est précisément ce qu'on a dit quand on a fait la modélisation.

Et ce n'est pas tout; le SELECT précédent me donnera la liste de toutes les feuilles soumises par tous les employés; même si chaque employé n'a qu'une feuille, le résultat contiendra 100 lignes si j'ai 100 employés.

Si je voulais seulement les feuilles soumises par l'employé '11111' je pourrais continuer la condition:

SELECT eNom, fEmpId, fHeures
FROM Feuille, Employe
WHERE fEmpId = eId;
AND fEmpId = '11111'

En résumé: La première condition à inclure après le WHERE dans la requête est la condition qui spécifie la clé commune dans les 2 tables.


Autres exemples:

Le numéro d'employé, le numéro de projet, le titre et la date de début de tous les projets en cours?

SELECT fEmpId, fdProjNum, pTitre, pDatedeb
FROM feuille, feuilledetail, projet
     WHERE fProjNum = pNumero
          AND fNumero= fdNumero
          AND curdate() BETWEEN pDatedeb AND pDatefin ;



Le nom et les heures de tous les employés pour les 3 derniers mois?

SELECT eNom, fheures, fdate
     FROM employe, feuille
      WHERE fEmpId = eId
          AND fDate > SUBDATE(now(), interval 3 month);





Si les colonnes doivent être tirées de 3 tables, il faudra qu'il y aie 2 relations entre les colonnes communes:

Le prénom et nom de l'employé et le titre du projet ainsi que les heures pour toutes les feuille de temps soumises?

SELECT ...

      FROM ...

      WHERE ...












Haut de la page