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).
Retour au sommaire du Travail Pratique Access