Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !

Le langage SQL appliqué à Access

Le langage SQL

Le langage SQL (Structured Query Language) est le langage utilisé sous Access pour extraire, mettre à jour ou supprimer des données issues des différentes tables contenues dans la base de données. Les sections suivantes ont pour objectif d’expliquer les différentes structures et syntaxes qui peuvent être utilisées à cette fin. Bien que permettant d’utiliser un large panel des instructions normées SQL, Access et par extension VBA ne respectent pas l’intégralité des fonctions dites natives du SQL.

La commande SELECT

La syntaxe générale d’une requête SQL est la suivante :

SELECT [DISTINCT ou DISTINCTROW OU ALL] [TOP N [PERCENT]]<* ou liste de Champs>  
FROM <Nom des Tables> 
[WHERE <Prédicats>] 
[GROUP BY ordre des groupes] 
[HAVING condition] 
[ORDER BY] <liste des Champs> 

Le mot-clé DISTINCT permet de n’afficher que des résultats uniques sur la liste de champs sélectionnés, par opposition aux doublons qui seront affichés avec le mot-clé ALL. Le mot-clé DISTINCTROW, quant à lui, permet d’omettre les enregistrements complets (tous les champs) en double. Si aucun des trois mots-clés n’est utilisé, ALL sera pris par défaut.

Le mot-clé TOP permet de retourner un certain nombre de résultats. Il peut également être complété du mot-clé PERCENT, pour renvoyer un certain pourcentage de résultats. Ainsi sur un total de 500 enregistrements possibles, TOP 10 retournera 10 enregistrements, alors que TOP 10 PERCENT en retournera 50. Le pourcentage n’est pas respecté lorsque ce n’est pas possible de le respecter. Par exemple, avec 4 enregistrements, si on indique top 10 percent, 1 enregistrement sera retourné.

Lorsque l’on souhaite extraire des données issues des tables, il faut simplement lister les champs à extraire.

SELECT EMP_NOM, EMP_PRENOM, EMP_DATE_NAISSANCE  
FROM ENI_EMPLOYES_EMP 

Les champs EMP_NOM, EMP_PRENOM et EMP_DATE_NAISSANCEqui sont contenus dans la table ENI_EMPLOYES_EMP seront affichés en résultat. Chaque champ sélectionné est séparé des autres par une virgule.

Le symbole * permet de sélectionner tous les champs disponibles dans les tables apparaissant dans la clause FROM.

La source FROM

1. Syntaxe générale

Les différentes tables disponibles dans la base Access peuvent servir de source de données. Chaque table peut donc apparaître dans la clause FROM, séparée des autres tables par une virgule.

SELECT EMP_NOM, EMP_TITRE, BUR_VILLE 
FROM ENI_EMPLOYES_EMP, ENI_BUREAUX_BUR 

Lorsque plusieurs tables contiennent le même nom de champs, il devient nécessaire de préciser la table d’origine en indiquant le nom dans la requête.

SELECT ENI_EMPLOYES_EMP.NOM, VILLE FROM ENI_EMPLOYES_EMP, 
ENI_BUREAUX_BUR 

2. Les jointures

Il est possible de préciser dans la requête si certaines correspondances entre les différentes tables doivent être prises en compte. Il existe trois types de correspondances SQL sous Access :

SELECT * 
FROM Table_1 [INNER ou LEFT ou RIGHT] JOIN Table_2 
ON <conditions de jointure> 

a. Jointure interne INNER JOIN

La jointure INNER JOIN permet de ne prendre en compte que les enregistrements pour lesquels il existe une correspondance exacte entre les tables.

SELECT EMP_NOM, EMP_TITRE, BUR_VILLE 
FROM ENI_EMPLOYES_EMP INNER JOIN ENI_BUREAUX_BUR 
ON ENI_EMPLOYES_EMP.EMP_BUR_ID = ENI_BUREAUX_BUR.BUR_ID 

b. Jointure externe LEFT JOIN

La jointure externe gauche LEFT JOIN permet d’afficher tous les enregistrements contenus dans la table de gauche (ci-dessous ENI_EMPLOYES_EMP), même si ceux-ci n’ont pas de correspondance dans la table de droite (ci-dessous ENI_BUREAUX_BUR). Ainsi, on affiche tous les noms des employés, même s’ils ne sont pas encore rattachés à un bureau (cas des stagiaires par exemple).

SELECT EMP_NOM, EMP_TITRE, BUR_VILLE 
FROM ENI_EMPLOYES_EMP LEFT JOIN ENI_BUREAUX_BUR 
ON ENI_EMPLOYES_EMP.EMP_BUR_ID = ENI_BUREAUX_BUR.BUR_ID 

c. Jointure externe RIGHT JOIN

La jointure externe droite RIGHT JOIN permet d’afficher tous...

La clause WHERE

Dans une requête d’extraction de données, il est possible d’appliquer certains critères de valeurs pour filtrer les enregistrements selon la valeur de leurs champs. Ces critères s’expriment dans la clause WHERE de la requête SQL.

SELECT EMP_NOM, EMP_PRENOM 
FROM ENI_EMPLOYES_EMP 
WHERE EMP_TITRE = 'Gestionnaire RH' 

Cette requête permet de trouver les nom et prénom des employés dont le titre est « Gestionnaire RH ».

1. Les différents critères existants

Il est possible de filtrer selon plusieurs critères : l’égalité (=), l’inégalité (<, >, <=, >=, <>), la nullité (Is Null), la correspondance de texte (LIKE), l’appartenance à un intervalle (BETWEEN) ou l’appartenance à une liste (IN). Les différents critères peuvent se combiner entre eux grâce aux opérateurs booléens (AND, OR, XOR et NOT).

2. Quelques exemples

La requête suivante affiche les champs EMP_NOM et EMP_TITRE des enregistrements issus de la table ENI_EMPLOYES_EMP dont la date EMP_DEBUT_EMPLOI se situe entre le 15 mars 2020 et le 1er juin 2022.

SELECT EMP_NOM, EMP_TITRE 
FROM ENI_EMPLOYES_EMP 
WHERE EMP_DEBUT_EMPLOI BETWEEN #03/15/2020# AND #06/01/2022# 

La requête suivante affiche les noms et prénoms des enregistrements issus de la table ENI_EMPLOYES_EMP dont le Nom commence par A.

SELECT EMP_NOM, EMP_PRENOM 
FROM ENI_EMPLOYES_EMP 
WHERE EMP_NOM LIKE 'A*' 

Les calculs dans les requêtes

Il est possible d’effectuer des calculs sur les données à partir des requêtes SQL. Par exemple, déterminer le nombre total d’employés par locaux, ou encore salaire total des employés.

Plusieurs fonctions existent sous SQL (dénombrement COUNT, somme SUM, minimum MIN, maximum MAX, etc.), mais elles sont complétées par d’autres fonctions directement issues du VBA (Left, Right, Mid, DateSerial, etc.).

La requête suivante permet par exemple d’afficher les nom et initiale du prénom de tous les employés.

SELECT EMP_NOM, Left(EMP_PRENOM,1) As Initiale  
FROM ENI_EMPLOYES_EMP 

La clause GROUP BY

Lorsque des calculs sont faits dans une requête, il est parfois nécessaire de regrouper les champs sur lesquels aucun calcul n’est fait. Le calcul ne renverra qu’une seule ligne par groupe. Les regroupements s’effectuent avec la clause GROUP BY.

La requête suivante permet de sommer les salaires totaux pour chaque identifiant de bureau. Les employés sans bureaux rattachés seront exclus du calcul.

SELECT EMP_BUR_ID, SUM(EMP_SALAIRE) AS Salaires_Totaux 
FROM ENI_EMPLOYES_EMP 
WHERE EMP_BUR_ID IS NOT NULL 
GROUP BY EMP_BUR_ID; 

D’une manière générale, tous les champs sur lesquels aucun calcul n’est effectué doivent apparaître dans le regroupement. Si vous omettez un champ dans le regroupement, Access vous l’indiquera au moment d’exécuter la requête. 

La clause HAVING

Tout comme il est possible de filtrer les valeurs dans les enregistrements bruts, des critères de filtres sur les calculs de regroupement sont également possibles. On utilise pour cela la clause HAVING.

Par exemple, si l’on souhaite n’afficher que les locaux dont le nombre d’employés est strictement supérieur à 10 :

SELECT Count(ENI_EMPLOYES_EMP.EMP_ID) AS NombreEmployes, ENI_BUREAUX_BUR.BUR_ID 
FROM ENI_BUREAUX_BUR INNER JOIN ENI_EMPLOYES_EMP ON ENI_BUREAUX_BUR.BUR_ID = ENI_EMPLOYES_EMP.EMP_BUR_ID 
GROUP BY ENI_BUREAUX_BUR.BUR_ID 
HAVING (((Count(ENI_EMPLOYES_EMP.EMP_ID))>10)); 

La clause ORDER BY

Lors de l’affichage des données issues de la requête, il est possible de trier l’ordre d’apparition des résultats. La clause ORDER BY permet de préciser sur quels champs on souhaite effectuer un tri. Il est possible de trier dans deux ordres : l’ordre croissant (ascendant) avec le mot-clé ASC, et l’ordre décroissant (descendant) avec le mot-clé DESC. Si aucun ordre n’est spécifié, l’ordre par défaut appliqué est l’ordre croissant (ASC). Chaque champ peut avoir son ordre de tri spécifique.

La syntaxe SQL est la suivante :

ORDER BY Champ_1 [ASC ou DESC] [, Champ_2 [ASC ou DESC]] 

Par exemple, la requête suivante fera apparaître les employés par ordre de dates de début d’emploi décroissantes et les noms de famille par ordre alphabétique (croissant).

SELECT EMP_NOM, EMP_DEBUT_EMPLOI,  
FROM ENI_EMPLOYES_EMP 
ORDER BY EMP_DEBUT_EMPLOI DESC, EMP_NOM ASC 

Les alias, l’opérateur AS

Il est possible de rajouter autant de colonnes que l’on souhaite dans une requête (dans la limite des 255 champs maximum). Pour cela, on utilise le mot-clé AS. Cet opérateur permet également de nommer comme on le veut un champ calculé.

Exemple d’alias utilisé pour le nombre d’employés par date de début d’emploi :

SELECT COUNT(EMP_ID) AS Nb_Employes, EMP_DEBUT_EMPLOI As 'Date  
Début d''Emploi' 
FROM ENI_EMPLOYES_EMP 
GROUP BY EMP_DEBUT_EMPLOI 

Vous remarquerez qu’il est possible d’utiliser des alias avec des espaces, en les encadrant par des apostrophes - voire des guillemets -, et que si l’alias doit comporter une apostrophe lui-même, il vous faut la doubler dans votre requête pour que la requête soit valide.

La commande INSERT INTO

En plus des requêtes de sélection de données, il est possible de réaliser des requêtes dites actions, évoquées dans les sections suivantes. La première requête action possible est celle d’insertion de nouveaux enregistrements dans les tables. Ce mode correspond au mode Ajout dans l’interface Access. Il existe plusieurs méthodes pour insérer de nouvelles données.

1. L’ajout d’un enregistrement

Il est tout d’abord possible d’ajouter un enregistrement unique, avec la syntaxe suivante :

INSERT INTO Table_Destination (<Liste des Champs>) 
VALUES (<Liste des Valeurs>) 

La liste des champs contient les champs qui seront alimentés, chacun étant séparé des autres par une virgule. Chaque champ alimenté se verra attribuer la valeur issue de la liste des valeurs qui apparaîtra dans le même ordre.

Il est nécessaire d’avoir le même nombre de champs et de valeurs attribuées, et que les types de valeurs renseignées et leur ordre soient identiques, sinon la requête sera mal interprétée, voire rejetée par Access lors de son exécution.

Exemple d’insertion d’un nouveau local :

INSERT INTO ENI_BUREAU_BUR (BUR_NOM, BUR_VILLE) 
VALUES ('Locaux Gatineau', 'Gatineau') 

2. L’ajout issu d’une requête

Dans le cas où vous souhaitez insérer des enregistrements à partir d’une requête, il est possible de le faire avec la syntaxe suivante :

INSERT INTO Table_Destination [(<Liste des Champs>)] 
SELECT <Liste des Champs> 
FROM <Table_Origine> 

Là encore, la liste des champs issus de la table Table_Origine doit correspondre en types et en ordre à ceux à insérer dans...

La commande SELECT INTO

De la même façon que la requête INSERT INTO va ajouter de nouveaux enregistrements dans une table existante, la requête SELECT INTO va créer une nouvelle table en y ajoutant des enregistrements. La syntaxe générale de cette commande est la suivante :

SELECT Champ_1 [, Champ_2] INTO TableDestination 
FROM TableSource 
[WHERE <liste des conditions>] 

Une table TableDestination va être créée à la volée (si la table TableDestination existe déjà, un message d’alerte apparaîtra, indiquant que la table déjà existante sera écrasée). Chaque champ de la requête sera créé dans la table TableDestination, puis les enregistrements issus de la requête SELECT seront ajoutés.

Exemple de requête d’insertion des contrôles qualité datant d’avant 2020 dans une table T_CONTROLES_QUALITE_ARCHIVES :

SELECT * INTO T_CONTROLES_QUALITE ARCHIVES FROM 
ENI_CONTROLES_QUALITE_CTL 
WHERE CTL_DATE_CONTROLE<=#01/01/2020# 

La commande UPDATE

La commande UPDATE est utilisée pour mettre à jour des données déjà présentes dans les tables. Cette commande correspond au type de requête Mise à jour dans Access. Il s’agit également d’une requête Action. La syntaxe générale de cette commande est la suivante :

UPDATE Table_MAJ 
SET Champ_1=valeur_1 [, Champ_2=Valeur_2] 
[WHERE <liste des conditions de mise à jour>] 

Chaque enregistrement qui répond aux conditions posées verra ses champs mis à jour. Si aucune condition n’est posée (la clause WHERE est absente), tous les enregistrements seront mis à jour.

Exemple d’une requête de mise à jour :

UPDATE ENI_EMPLOYES_EMP 
SET EMP_TITRE='Directeur Financier' 
WHERE EMP_ID=3 

Cette requête met à jour le rôle pour l’employé dont l’identifiant est 3.

La commande DELETE

La commande DELETE permet de supprimer des enregistrements. Elle correspond au type de requête Suppression d’Access. La syntaxe générale est la suivante :

DELETE * FROM Table_A_Vider 
[WHERE <liste de conditions>] 

Tous les enregistrements de la table Table_A_Vider qui correspondent aux conditions posées seront supprimés.

Exemple de requête de suppression des contrôles qualité datant d’avant 2012 :

DELETE * FROM ENI_CONTROLES_QUALITE_CTL 
WHERE CTL_DATE_CONTROLE<=#01/01/2012# 

Les autres commandes

La liste des commandes ne se limite pas aux seules sélection, insertion, mise à jour et suppression. Voici la liste des autres commandes SQL supportées par Access.

1. Requête d’analyse croisée

La requête TRANSFORM crée une requête d’analyse croisée. Elle est utilisée dans l’assistant de création de requête.

2. Requête d’union

La syntaxe UNION permet de fusionner le résultat de plusieurs requêtes dont les structures et champs sont identiques.

3. Création/gestion de table

CREATE TABLE

Crée une nouvelle table.

ALTER TABLE

Modifie une structure de table.

DROP TABLE

Supprime une table.

CREATE INDEX

Crée un nouvel index dans une table existante.

DROP INDEX

Supprime un index.

4. Création/gestion des utilisateurs et groupes

Utilisateurs

CREATE USER

Crée un ou plusieurs nouveaux utilisateurs.

ADD USER

Ajoute un utilisateur à un groupe d’utilisateurs existant.

DROP USER

Supprime un ou plusieurs utilisateurs.

Groupes

CREATE GROUP

Crée un ou plusieurs nouveaux groupes d’utilisateurs.

DROP GROUP

Supprime un ou plusieurs groupes existants.

Privilèges

GRANT

Donne des privilèges spécifiques à un utilisateur ou à un groupe d’utilisateurs existant.

REVOKE

Retire des privilèges spécifiques à un utilisateur ou à un groupe d’utilisateurs existant.

Chacune de ces commandes est expliquée via l’aide Access (touche [F1]).