Retour au sommaire du Travail Pratique Access

6. SQL et requêtes complexes

Dans cette partie, nous allons approfondir la question des requêtes, et notamment leur expression dans le langage SQL (Structured Query Language), le mode habituel de l'interrogation d'une base de données relationnelle. Chemin faisant, nous mettrons en évidence un certain nombre d'incohérences dans les données actuellement stockées dans notre base. Ceci permettra d'aborder la question des règles d'intégrité et donc de déboucher sur la manière de vérifier qu'une mise à jour de notre base maintienne la cohérence des informations.
Il est à noter que cette partie ne vise pas à apprendre le langage SQL, mais plutôt l'illustration progressive de ses fonctionnalités, ce qui implique une connaissance suffisante préalable des opérations relationnelles et de SQL (sélection, composition, projection).

6.1    Formulation en SQL de la requête ReqSérieEpreuve


Après avoir ouvert la requête ReqSérieEpreuve qui s'affiche par défaut en Mode Feuille de données, nous allons accéder au Mode SQL dans la liste des choix de modes de travail sur les requêtes :
 


On se retrouve alors avec une fenêtre contenant la formulation SQL de cette requête. Son contenu est le suivant :

SELECT    Série.Num_Série, Epreuve.Nom_Epreuve, Série.Horaire
FROM    Epreuve INNER JOIN Série ON Epreuve.Num_Epreuve = Série.Num_Epreuve
ORDER BY Série.Num_Série;

On reconnaît trois clauses de base de SQL, à savoir :
·    SELECT qui définit les colonnes de la table résultante (projection)
·    FROM pour énumérer les tables dont sont extraites les informations (composition)
·    ORDER BY qui précise sur quelle(s) colonne(s) sera triée la table.
On se souvient que cette requête avait profité des jointures que nous avions définies entre nos tables. Access a pris en compte ceci dans la requête SQL : INNER JOIN exprime le fait que les tables Epreuve et Série ont un lien sur leur champ commun Num_Epreuve.
Nous allons maintenant reprendre cette requête pour la formuler en SQL et différemment. On va créer une nouvelle requête (bouton Nouveau), que nous nommerons par la suite ReqSérieEpreuveV2, en y incluant les tables Série et Epreuve.
Ensuite, nous allons supprimer le lien sur Num_Epreuve (on se positionne sur le lien et on tape <Suppr> ), puis on déclare les 3 champs pour les colonnes comme ci-dessous :
 


A ce stade, si nous regardons le résultat dans le Mode Feuille de données, on se rend compte que la table résultante contient 36 lignes, avec toutes les combinaisons séries/épreuves. En mode SQL, on a en effet la formulation suivante :

SELECT    Série.Num_Série, Epreuve.Nom_Epreuve, Série.Horaire
FROM    Série, Epreuve
ORDER BY Série.Num_Série;

Effectivement, il n'y a aucune restriction sur le fait que nous voulons qu'il y ait correspondance entre Num_Epreuve dans la table Série et Num_Epreuve dans Epreuve. C'est ce que faisait automatiquement INNER JOIN, et qui découlait de la jointure déclarée en 4.2 et que nous avons supprimée dans cette requête. Nous pouvons la rétablir avec la clause WHERE. Pour cela, on éditera la version SQL de notre requête de la façon suivante :

SELECT    Série.Num_Série, Epreuve.Nom_Epreuve, Série.Horaire
FROM    Série, Epreuve
WHERE    Série.Num_Epreuve = Epreuve.Num_Epreuve;

Allons plus loin en modifiant cette requête pour lui faire afficher uniquement le numéro de série et l'horaire des séries correspondant à la seule épreuve "Tirefort", et on veut la trier par horaires croissants. Il suffit de mettre à jour la version SQL de notre requête :

SELECT    Série.Num_Série, Série.Horaire
FROM    Série, Epreuve
WHERE    Série.Num_Epreuve = Epreuve.Num_Epreuve
AND    Epreuve.Nom_Epreuve = "Tirefort"
ORDER BY Série.Horaire;

En mode Feuille de données, elle nous donne le résultat escompté. Regardons maintenant la formulation de cette requête en mode Création. On a la présentation suivante :
 


On se rend compte de plusieurs choses. Les colonnes affichées sont bien les deux premières qui possèdent une "coche" dans la ligne Afficher. Deux autres colonnes figurent : la première concerne le champ Num_Epreuve dans la table Série. Elle possède dans la ligne Critères la valeur [Epreuve].[Num_Epreuve], qui n'est autre que la jointure figurant dans la clause WHERE. La dernière colonne fait référence au nom de l'épreuve avec la valeur "Tirefort" dans Critères pour exprimer que nous ne nous intéressons qu'à cette seule épreuve ; c'est la deuxième partie de la clause WHERE que nous avons énoncée dans notre requête SQL. Les 2 dernières colonnes ne sont pas affichées (pas de coche dans la ligne Afficher).
On notera pour finir qu'après avoir sauvegardé et fermé cette requête, on obtiendrait, à sa réouverture une formulation SQL légèrement différente :

SELECT Série.Num_Série, Série.Horaire
FROM Série, Epreuve
WHERE (((Série.Num_Epreuve)=[Epreuve].[Num_Epreuve])
AND ((Epreuve.Nom_Epreuve)="Tirefort"))
ORDER BY Série.Horaire;

Access a ajouté, à sa façon, des parenthèses et crochets (à ne pas confondre).

 

Suite

Retour au sommaire du Travail Pratique Access