Comment écrire des requêtes SQL Microsoft Access à partir de zéro

Comment écrire des requêtes SQL Microsoft Access à partir de zéro

Microsoft Access est sans doute l'outil le plus puissant de toute la suite Microsoft Office, mais il mystifie (et effraie parfois) les utilisateurs expérimentés d'Office. Avec une courbe d'apprentissage plus raide que Word ou Excel, comment quelqu'un est-il censé comprendre l'utilisation de cet outil ? Cette semaine, Bruce Epper se penchera sur certains des problèmes suscités par cette question posée par l'un de nos lecteurs.





Un lecteur demande :

J'ai des difficultés à écrire une requête dans Microsoft Access. J'ai une base de données avec deux tables de produits contenant une colonne commune avec un code de produit numérique et un nom de produit associé. Je veux savoir quels produits de la table A peuvent être trouvés dans le tableau B. Je souhaite ajouter une colonne nommée Résultats qui contient le nom du produit du tableau A s'il existe, et le nom du produit du tableau B lorsqu'il n'existe pas dans le tableau A. Avez-vous des conseils ?





Réponse de Bruce :

Microsoft Access est un système de gestion de base de données (SGBD) conçu pour être utilisé sur les ordinateurs Windows et Mac. Il utilise le moteur de base de données Jet de Microsoft pour le traitement et le stockage des données. Il fournit également une interface graphique pour les utilisateurs qui élimine presque le besoin de comprendre le langage de requête structuré (SQL).





SQL est le langage de commande utilisé pour ajouter, supprimer, mettre à jour et renvoyer les informations stockées dans la base de données ainsi que pour modifier les composants de base de données tels que l'ajout, la suppression ou la modification de tables ou d'index.

Point de départ

Si vous n'êtes pas déjà familiarisé avec Access ou un autre SGBDR, je vous suggère de commencer par ces ressources avant de continuer :



  • Alors, qu'est-ce qu'une base de données ? où Ryan Dube utilise Excel pour montrer les bases des bases de données relationnelles.
  • Un guide rapide pour démarrer avec Microsoft Access 2007 qui est une vue d'ensemble de haut niveau d'Access et des composants qui composent une base de données Access.
  • Un didacticiel rapide sur les tables dans Microsoft Access 2007 examine la création de votre première base de données et de vos premières tables pour stocker vos données structurées.
  • Un didacticiel rapide sur les requêtes dans Microsoft Access 2007 examine les moyens de renvoyer des portions spécifiques des données stockées dans les tables de la base de données.

Avoir une compréhension de base des concepts fournis dans ces articles rendra ce qui suit un peu plus facile à digérer.

Relations de base de données et normalisation

Imaginez que vous dirigez une entreprise vendant 50 types de widgets différents dans le monde entier. Vous avez une base de clients de 1 250 et vendez en moyenne 10 000 widgets à ces clients en un mois. Vous utilisez actuellement une seule feuille de calcul pour suivre toutes ces ventes - en fait une seule table de base de données. Et chaque année, des milliers de lignes sont ajoutées à votre feuille de calcul.





Les images ci-dessus font partie de la feuille de calcul de suivi des commandes que vous utilisez. Maintenant, disons que ces deux clients vous achètent des widgets plusieurs fois par an, vous avez donc beaucoup plus de lignes pour les deux.





Si Joan Smith épouse Ted Baines et prend son nom de famille, chaque ligne qui contient son nom doit maintenant être modifiée. Le problème est aggravé si vous avez deux clients différents avec le nom « Joan Smith ». Il est devenu beaucoup plus difficile de maintenir la cohérence de vos données de vente en raison d'un événement assez courant.

En utilisant une base de données et en normalisant les données, nous pouvons séparer les articles en plusieurs tables telles que l'inventaire, les clients et les commandes.

En regardant simplement la partie client de notre exemple, nous supprimons les colonnes Nom du client et Adresse du client et les mettons dans une nouvelle table. Dans l'image ci-dessus, j'ai également mieux réparti les choses pour un accès plus granulaire aux données. La nouvelle table contient également une colonne pour une clé primaire (ClientID) - un nombre qui sera utilisé pour accéder à chaque ligne de cette table.

Dans la table d'origine où nous avons supprimé ces données, nous ajouterions une colonne pour une clé étrangère (ClientID) qui correspond à la ligne appropriée contenant les informations pour ce client particulier.

Désormais, lorsque Joan Smith change son nom en Joan Baines, la modification ne doit être effectuée qu'une seule fois dans la table Client. Toute autre référence à partir de tables jointes extraira le nom de client approprié et un rapport qui examine ce que Joan a acheté au cours des 5 dernières années obtiendra toutes les commandes sous ses noms de jeune fille et de mariage sans avoir à modifier la façon dont le rapport est généré. .

Comme avantage supplémentaire, cela réduit également la quantité globale de stockage consommée.

Types de jointure

SQL définit cinq types de jointures différents : INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER et CROSS. Le mot clé OUTER est facultatif dans l'instruction SQL.

Microsoft Access autorise l'utilisation de INNER (par défaut) , LEFT OUTER, RIGHT OUTER et CROSS. FULL OUTER n'est pas pris en charge en tant que tel, mais en utilisant LEFT OUTER, UNION ALL et RIGHT OUTER, il peut être falsifié au prix de plus de cycles CPU et d'opérations d'E/S.

La sortie d'une jointure CROSS contient chaque ligne de la table de gauche associée à chaque ligne de la table de droite. La seule fois où j'ai vu une jointure CROSS utilisée, c'est lors des tests de charge des serveurs de base de données.

Jetons un coup d'œil au fonctionnement des jointures de base, puis nous les modifierons en fonction de nos besoins.

Commençons par créer deux tables, ProdA et ProdB, avec les propriétés de conception suivantes.

L'AutoNumber est un entier long qui s'incrémente automatiquement et qui est affecté aux entrées au fur et à mesure qu'elles sont ajoutées à la table. L'option Texte n'a pas été modifiée, elle accepte donc une chaîne de texte jusqu'à 255 caractères.

Maintenant, remplissez-les avec des données.

Pour montrer les différences dans le fonctionnement des 3 types de jointure, j'ai supprimé les entrées 1, 5 et 8 de ProdA.

Prochain, créer une nouvelle requête en allant à Créer > Conception de requête . Sélectionnez les deux tables dans la boîte de dialogue Afficher la table et cliquez sur Ajouter , alors proche .

Cliquez sur ProductID dans la table ProdA, faites-le glisser vers ProductID dans la table ProdB et relâchez le bouton de la souris pour créer la relation entre les tables.

Cliquez avec le bouton droit sur la ligne entre les tableaux représentant la relation entre les éléments et sélectionnez Propriétés de jointure .

Par défaut, le type de jointure 1 (INTÉRIEUR) est sélectionné. L'option 2 est une jointure EXTÉRIEURE GAUCHE et 3 est une jointure EXTÉRIEURE DROITE.

Nous examinerons d'abord la jointure INNER, alors cliquez sur OK pour fermer la boîte de dialogue.

Dans le concepteur de requêtes, sélectionnez les champs que nous voulons voir dans les listes déroulantes.

Lorsque nous exécutons la requête (le point d'exclamation rouge dans le ruban), il affichera le champ ProductName des deux tables avec la valeur de la table ProdA dans la première colonne et ProdB dans la seconde.

Notez que les résultats n'affichent que les valeurs où ProductID est égal dans les deux tables. Même s'il existe une entrée pour ProductID = 1 dans la table ProdB, elle n'apparaît pas dans les résultats car ProductID = 1 n'existe pas dans la table ProdA. Il en va de même pour ProductID = 11. Il existe dans la table ProdA mais pas dans la table ProdB.

En utilisant le bouton Afficher sur le ruban et en passant à la vue SQL, vous pouvez voir la requête SQL générée par le concepteur utilisée pour obtenir ces résultats.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Pour revenir à la vue Conception, remplacez le type de jointure par 2 (LEFT OUTER). Exécutez la requête pour voir les résultats.

Comme vous pouvez le voir, chaque entrée de la table ProdA est représentée dans les résultats, tandis que seules celles de ProdB qui ont une entrée ProductID correspondante dans la table ProdB apparaissent dans les résultats.

L'espace vide dans la colonne ProdB.ProductName est une valeur spéciale (NULL) car il n'y a pas de valeur correspondante dans la table ProdB. Cela s'avérera important plus tard.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Essayez la même chose avec le troisième type de jointure (RIGHT OUTER).

Les résultats montrent tout de la table ProdB alors qu'elle affiche des valeurs vides (appelées NULL) où la table ProdA n'a pas de valeur correspondante. Jusqu'à présent, cela nous rapproche le plus des résultats souhaités dans la question de notre lecteur.

SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Utilisation de fonctions dans une requête

Les résultats d'une fonction peuvent également être renvoyés dans le cadre d'une requête. Nous voulons qu'une nouvelle colonne nommée « Résultats » apparaisse dans notre ensemble de résultats. Sa valeur sera le contenu de la colonne ProductName de la table ProdA si ProdA a une valeur (elle n'est pas NULL), sinon elle doit être extraite de la table ProdB.

La fonction immédiate IF (IIF) peut être utilisée pour générer ce résultat. La fonction prend trois paramètres. La première est une condition qui doit être évaluée à une valeur True ou False. Le deuxième paramètre est la valeur à renvoyer si la condition est True, et le troisième paramètre est la valeur à renvoyer si la condition est False.

La construction de fonction complète pour notre situation ressemble à ceci :

IIF(ProdA.ProductID Is Null, ProdB.ProductName,ProdA.ProductName)

Notez que le paramètre de condition ne vérifie pas l'égalité. Une valeur Null dans une base de données n'a pas de valeur pouvant être comparée à une autre valeur, y compris une autre valeur Null. En d'autres termes, Null n'est pas égal à Null. Déjà. Pour contourner ce problème, nous vérifions plutôt la valeur à l'aide du mot-clé 'Is'.

Nous aurions également pu utiliser 'Is Not Null' et changer l'ordre des paramètres True et False pour obtenir le même résultat.

Lorsque vous placez cela dans le Concepteur de requêtes, vous devez taper la fonction entière dans l'entrée Champ :. Pour qu'il crée la colonne 'Résultats', vous devez utiliser un alias. Pour ce faire, préfacez la fonction avec « Résultats : » comme le montre la capture d'écran suivante.

Le code SQL équivalent pour ce faire serait :

SELECT ProdA.ProductName, ProdB.ProductName, IIF(ProdA.ProductID Is Null,ProdB.ProductName,ProdA.ProductName) AS Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Maintenant, lorsque nous exécutons cette requête, elle produira ces résultats.

sites d'achat en ligne bon marché pour l'électronique

Ici, nous voyons pour chaque entrée où la table ProdA a une valeur, cette valeur est reflétée dans la colonne Résultats. S'il n'y a pas d'entrée dans la table ProdA, l'entrée de ProdB apparaît dans Résultats, ce qui est exactement ce que notre lecteur a demandé.

Pour plus de ressources pour apprendre Microsoft Access, consultez Comment apprendre Microsoft Access de Joel Lee : 5 ressources en ligne gratuites .

Partager Partager Tweeter E-mail Cela vaut-il la peine de passer à Windows 11 ?

Windows a été repensé. Mais est-ce suffisant pour vous convaincre de passer de Windows 10 à Windows 11 ?

Lire la suite
Rubriques connexes
  • Productivité
  • Demandez aux experts
A propos de l'auteur Bruce Epper(13 articles publiés)

Bruce joue avec l'électronique depuis les années 70, les ordinateurs depuis le début des années 80, et répond avec précision aux questions sur la technologie qu'il n'a pas utilisée ni vue tout le temps. Il s'agace aussi en essayant de jouer de la guitare.

Plus de Bruce Epper

Abonnez-vous à notre newsletter

Rejoignez notre newsletter pour des conseils techniques, des critiques, des ebooks gratuits et des offres exclusives !

Cliquez ici pour vous abonner