SQL

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

Inner join imbriqués

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;

Plusieurs champs dans une table

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")

Group By, Having

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"));

Top

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;

VB : Appel SQL

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