SGBD 2er année SeRéCom 18 02 2006 Travaux Pratiques
Petit guide 5
Thème d’approfondissement : Les requêtes de jointures
(P. Ferré)
I) Votre travail, à ce point de nos avancées
A) Le modèle est vérifié et stabilisé !
Faisant le tour des postes, je peux affirmer qu’un modèle sur deux n’est pas vérifié, ou est incomplet. Il convient de finaliser une version stable, en ayant à l’esprit que la suite et le fonctionnement du SGBD en dépendent.
B) Les requêtes SQL, dont la syntaxe est traitée dans l’un des précédents documents sont maîtrisées. Je serais sur ce point intransigeant. Certains, peu nombreux, en sont encore à poser la question d’une requête qui se trouve être illustrée et expliquée d’un exemple dans deux des trois petits guides. Vous devez savoir manipuler ces requêtes qui se trouvent être très simples.
II) Le modèle stabilisé permet des requêtes SQL et Php / SQL:
A) L’extractions de données (fiches à visualiser) / éditer / mettre à jour
B) Le couplage avec le langage de script php, permet la connexion avec le SGBD
C) Ce même couplage, php et sql, permet l’affichage des pages .html générées par le php.
Ce qui est dit ci-dessus est un minimum à maîtriser pour pouvoir continuer
D) En croisant le travail que vous avez réalisé en php avec mon collègue Marco Wincker, il ne serait pas concevable que vous ne sachiez pas interpeller une base de données pour en afficher des fiches et des médias (images entre autre) à l’aide du langage php couplé aux instructions php.
Tout a plus, l’un ou l’autre des deux enseignants a appuyé tel ou tel aspect. Mais, les connaissances posées sont complémentaires et coordonnées.
Il vous appartient, quand une solution vous paraît plus adéquate, de choisir entre les deux propositions (celle vue en php (en priorité) ou celle vue en SGBD)
III) L’interface avec un client Web
1) Se connecter à la base (Voir le précédent petit guide, et le cours de php pour les solutions alternatives.
2) Passer les requête, en SQL lancées par php : Ces dernières étant encapsulées dans une fonction. La chose est considérée être à ce point acquise. Inspirez-vous du précédent petit guide 3) L’affichage de la page, même cause même effet, le script étudié précédemment permet l’affichage d’une table, sans critère particulier pour l’instant.
4) Ce que nous allons approfondir : les requêtes de jointure, sous deux formes particulières a) Les requêtes de jointures interpellant plusieurs tables. La clause WHERE.
Nous avons délaissé le passage de critères qui permettent la sélection d’un sous-ensemble sur un critère donné ou plusieurs. Le principe est simple, déjà évoqué en cours et dans un petit guide. Dans le cas d’une jointure de plusieurs tables, la clause qui fixe un ou plusieurs critères se combine au fait que nous interpellons plusieurs tables. Exemple extraire des données de la table « opérateurs » et des données les médias qu’il à réaliser :
* Exemple sur plusieurs tables (soit une jointure)
/* Exemple de jointure sur quatres tables: Le résultat escompté est le suivant, Afficher les nom, prénoms des OPERATEURS, le libellé des MEDIAS, les PRETS de MATERIEL */
SELECT operateurs.ID, operateurs.Nom, operateurs.Prenom, medias.Libelle, prets.DateRestitution,
materiels.*
FROM operateurs, medias, prets, materiels /* Le critèrem L'égalité de valeurs des clés primaires et des clés ETRANGERES de la TABLE fournissant les x
occurences */
WHERE operateurs.ID = medias.ID_operateur
AND medias.ID = prets.ID_Medias AND prets.ID_Materiel = materiels.ID
Cela marche, et vous pouvez tenter des variations, n’interpeller que deux tables, voire même toutes les tables.
* Exemple quasi identique, mais en escomptant retourner, les mêmes informations mais ne concernant qu’un seul opérateur, identifié par son nom
/* Exemple de jointure sur quatre tables: Le résultat escompté est le suivant, Afficher les nom, prénoms des OPERATEURS, le libellé des MEDIAS, les PRETS de MATERIEL pour l’opérateur Pauline Abadie */
SELECT operateurs.ID, operateurs.Nom, operateurs.Prenom, medias.Libelle, prets.DateRestitution,
materiels.*
FROM operateurs, medias, prets, materiels /* Le critère L'égalité de valeurs des clés primaires et des clés ETRANGERES de la TABLE fournissant les x occurrences
*/WHERE operateurs.ID = medias.ID_operateur
AND medias.ID = prets.ID_Medias AND prets.ID_Materiel = materiels.ID AND operateurs.Nom = 'abadie' AND operateurs.Prenom = 'Pauline'
Cela marche aussi, merci Pauline.
b) Subtilités des jointures LEFT, RIGHT
Deux « nuances » de jointures peuvent être étudiées maintenant. Avec un exemple visuel, pour commencer. Si nous posons en SQL l’instruction suivante, nous escomptons obtenir de la base qu’elle interroge les tables suivantes : « opérateurs », « médias », « prêts » et que soit retourné les noms, prénoms des opérateurs, les libellés des médias et les médias qui sont des photos (nom des photos) réalisées par les opérateurs, ainsi que les emprunts de matériels qui ont été nécessaires Comme ci-dessous :
/* Soit à extraire de la base, les noms et prenoms des opérateurs, les médias réalisés, les matériels
empruntés pour réalisers ces médias */
select DISTINCT operateurs.Nom, operateurs.Prenom, medias.Libelle, medias.Photographie,
prets.*
from medias
LEFT JOIN operateurs ON operateurs.ID = medias.ID_Operateur LEFT JOIN prets ON medias.ID = prets.ID_Medias
WHERE prets.ID is not null ORDER BY operateurs.Nom
Résultat, qui ne contient que les médias réalisés ayant nécessité l’emprunt de matériel, cela du fait du critère Where prets.ID is not nul.
Bien entendu la requête fonctionne sous DbDesigner, avec un visuel des table qui peut-être permet une meilleure perceptions des champs de part le schémas des tables à la mode MERSIE. En conséquence de quoi, choisissez l’outils qui vous convient le mieux. L’essentiel est que le résultat soit au rendez-vous.
Voir page suivante :
Vous aurez notez que ces requêtes SQL, sont gérables avec php, par inclusion de la requête en paramètre de la fonction mysql_query ($requete).
Nous aurions donc :
$requete = “select DISTINCT operateurs.Nom, operateurs.Prenom, medias.Libelle, medias.Photographie, prets.* from medias LEFT JOIN operateurs ON operateurs.ID = medias.ID_Operateur LEFT JOIN prets ON medias.ID = prets.ID_Medias WHERE
prets.ID is not null ORDER BY operateurs.Nom”;
$resultat = mysql_query ($requete);
if ($resultat) {while …
{} }