Le SQL (Structured Query Language) est le langage utilisé pour établir les requêtes. Quand vous créez une requête, vous utilisez le QBE (Query By Examble), c'est la grille dans laquelle vous faites glisser les champs et mettez les ordres de tris, etc. Certains requêtes, par exemple les requêtes UNION ne peuvent pas se faire avec le QBE. Il est alors nécessaire d'utiliser directement SQL
Nous avons un certain nombre de sociétés
Chaque société a un certain nombre de collaborateurs
Chaque collaborateur un certain nombre de voitures
Chaque voiture est pourvue d'un certain nombre d'options
T_Societe : Table des sociétés
IDSociete |
Nomsociete |
1 |
Info 3000 |
2 |
Best of Bois |
3 |
Inexistator |
T_Collaborateur : Table des Collaborateurs
IDCollaborateur |
IDSociete |
NomCollaborateur |
Prenom |
1 |
1 |
Defawes | Michel |
2 |
1 |
Mourey | Isabelle |
3 |
2 |
Rivares | Maria |
4 |
2 |
Pochon | Pierre |
5 |
2 |
Nicoli | Jean-Pierre |
T_Voiture : Table des Voitures
IDVoiture |
IDCollaborateur |
Marque |
Couleur |
1 |
1 |
VR6 | Grise |
2 |
1 |
Yamaha | Rouge |
3 |
2 |
Peugeot | Grise |
4 |
3 |
Opel Manta | Champagne |
5 |
4 |
Opel | Jaune |
6 |
4 |
Fiat | Jaune |
T_Option : Table des options
IDOption |
IDVoiture |
Libelle |
1 |
1 |
Vitres électrique |
2 |
1 |
Peinture métal |
3 |
1 |
Boite automatique |
4 |
1 |
Sièges recaro |
5 |
4 |
Phares halogènes |
6 |
5 |
Vitres électriques |
7 |
6 |
Boite manuelle |
8 |
6 |
Porte latérale |
Si nous voulons seulement les noms des sociétés :
SELECT DISTINCTROW T_Societe.Nomsociete
FROM T_Societe;
Si nous voulons les noms des sociétés avec les collaborateurs qui y travaillent :
SELECT DISTINCTROW T_Societe.Nomsociete, T_Collaborateur.NomCollaborateur
FROM T_Societe INNER JOIN T_Collaborateur ON T_Societe.IDSociete = T_Collaborateur.IDSociete;
Si nous voulons les noms des sociétés avec les collaborateurs qui y travaillent, et la marque de chacune de leur(s) voiture :
SELECT DISTINCTROW T_Societe.Nomsociete, T_Collaborateur.NomCollaborateur, T_Voiture.Marque
FROM (T_Societe INNER JOIN T_Collaborateur ON T_Societe.IDSociete = T_Collaborateur.IDSociete) INNER JOIN T_Voiture ON T_Collaborateur.IDCollaborateur = T_Voiture.IDCollaborateur;
Si nous voulons les noms des sociétés avec les collaborateurs qui y travaillent, la marque de chacune de leur(s) voiture, ainsi que chacune des options qu'ils ont choisi :
SELECT DISTINCTROW T_Societe.Nomsociete, T_Collaborateur.NomCollaborateur, T_Voiture.Marque, T_Option.Libelle
FROM ((T_Societe INNER JOIN T_Collaborateur ON T_Societe.IDSociete = T_Collaborateur.IDSociete) INNER JOIN T_Voiture ON T_Collaborateur.IDCollaborateur = T_Voiture.IDCollaborateur) INNER JOIN T_Option ON T_Voiture.IDVoiture = T_Option.IDVoiture;
Autre exemple : Nous avons une table des collaborateurs. Chaque collaborateur à un certain nombre de voitures, mais chaque collaborateur à également un certain nombre d'animaux, comme suit :
IDCollaborateur |
NomCollaborateur |
1 |
Defawes |
2 |
Mourey |
3 |
Rivares |
4 |
Pochon |
5 |
Nicoli |
IDCollaborateur |
Animal |
1 |
Chat |
2 |
Tourterelle |
3 |
Chat |
4 |
Chat |
4 |
Chien |
5 |
Chien |
IDCollaborateur |
Marque |
1 |
VR6 |
1 |
Yamaha |
2 |
Peugeot |
3 |
Opel Manta |
4 |
Opel |
4 |
Fiat |
Pour obtenir ceci :
NomCollaborateur |
Animal |
Marque |
Defawes | Chat | VR6 |
Defawes | Chat | Yamaha |
Mourey | Tourterelle | Peugeot |
Rivares | Chat | Opel Manta |
Pochon | Chat | Opel |
Pochon | Chat | Fiat |
Pochon | Chien | Opel |
Pochon | Chien | Fiat |
On utilise le code SQL Suivant :
SELECT DISTINCTROW T_Collaborateur.NomCollaborateur, T_Animal.Animal, T_Voiture.Marque
FROM (T_Collaborateur INNER JOIN T_Animal ON T_Collaborateur.IDCollaborateur = T_Animal.IDCollaborateur) INNER JOIN T_Voiture ON T_Collaborateur.IDCollaborateur = T_Voiture.IDCollaborateur;
Imaginons la table suivante :
Collabo |
AnimalPrefere1 |
AnimalPrefere2 |
AnimalPrefere3 |
Michel | Chat | Chien | perruche |
Isabelle | Tourterelle | Perroquet | |
Maria | oiseau | dinosaure | Chat |
Laetitia | Chien | ||
Pierre | Autruche | Chat | Chien |
Chaque client a un animal préféré, et deuxième et un troisière animal préféré. Comment extraire tous les clients qui ont dans leurs animaux préférés (1, 2 ou 3) au moins un chat et un chien ?
Voici une solution visuelle :
Et voici une solution SQL qui renvoie le même résultat, mais affiche différemment les critères si on les demande visuels. Le code SQL est peut-être plus logique à comprendre :
SELECT DISTINCTROW T_TEST.Collabo, T_TEST.AnimalPrefere1, T_TEST.AnimalPrefere2, T_TEST.AnimalPrefere3
FROM T_TEST
WHERE (AnimalPrefere1 LIKE "Chat" OR AnimalPrefere2 LIKE "Chat" OR AnimalPrefere3 LIKE "Chat") AND (AnimalPrefere1 LIKE "Chien" OR AnimalPrefere2 LIKE "Chien" OR AnimalPrefere3 LIKE "Chien")
Admettons la table T_Couleur:
Couleur |
Jaune |
Rouge |
Jaune |
Vert |
Rouge |
Vert |
Nous désirons une requête qui nous renvoie tous les "Jaune" :
SELECT DISTINCTROW T_Couleur.Couleur
FROM T_Couleur
WHERE ((T_Couleur.Couleur Like "Jaune"));
Il nous renvoie donc 2 enregistrements "Jaune". Dans le cas ou nous ne voulons qu'un seul exemplaire de cet enregistrement, il faut donc les regrouper, et pour demander que le "Jaune", il ne faudra non plus utiliser WHERE mais HAVING :
SELECT DISTINCTROW T_Couleur.Couleur
FROM T_Couleur
GROUP BY T_Couleur.Couleur
HAVING ((T_Couleur.Couleur Like "Jaune"));
Il est possible de demander dans une requête les premiers enregistrements selon un certain critère. Par exemple, dans une liste de clients, on voudrait la liste des 25% les plus agés, ou la liste des 3 clients les plus jeunes. Cette possibilité se trouve dans les propriétés de la requête.
Voici la liste des 2 premiers clients dans l'ordre alphabétique :
SELECT DISTINCTROW TOP 2 T_Client.NomClient
FROM T_Client;
Et voici les 25 premier pourcents par ordre alphabétique :
SELECT DISTINCTROW TOP 25 PERCENT T_Client.NomClient
FROM T_Client;
Appel d'ordres SQL depuis Access Basic.
Exemple d'ordre de mise à jour
DoCmd RunSQL "UPDATE T_Article SET [Prix] = [Prix] * 2 WHERE [Prix] > 0 ;"
DoCmd Requery ' Pour afficher les données actualisées par la requête
Une astuce consiste a aller dans les requêtes, peaufiner la requête action, et copier le code SQL généré dans le code Access Basic.
Même exemple avec un paramètre variable inclus :
Facteur = InputBox("Donnez le facteur de multiplication")
DoCmd RunSQL "UPDATE DISTINCTROW T_Article SET T_Article.Prix = [Prix]*" & Facteur & " WHERE ((T_Article.LibArt>""d""));"
DoCmd Requery