Publicité
Microsoft Access est sans doute l'outil le plus puissant de toute la suite Microsoft Office, mais il mystifie (et fait parfois peur) aux utilisateurs avancés d'Office. Avec une courbe d'apprentissage plus abrupte que Word ou Excel, comment quelqu'un est-il censé se concentrer sur l'utilisation de cet outil? Cette semaine, Bruce Epper examinera certains des problèmes suscités par cette question d'un de nos lecteurs.
Un lecteur demande:
J'ai du mal à écrire une requête dans Microsoft Access.
J'ai une base de données avec deux tableaux de produits contenant une colonne commune avec un code de produit numérique et un nom de produit associé.
Je veux savoir quels produits du tableau A se trouvent dans le tableau B. Je veux 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 machines 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 le base de données ainsi que de modifier les composants de base de base de données tels que l'ajout, la suppression ou la modification de tables ou indices.
Point de départ
Si vous ne connaissez pas déjà Access ou un autre SGBDR, je vous suggère de commencer par ces ressources avant de continuer:
- Qu'est-ce qu'une base de données? Qu'est-ce donc qu'une base de données? [MakeUseOf explique]Pour un programmeur ou un passionné de technologie, le concept de base de données est quelque chose qui peut vraiment être pris pour acquis. Cependant, pour beaucoup de gens, le concept d'une base de données elle-même est un peu étranger ... Lire la suite où Ryan Dube utilise Excel pour montrer les bases des bases de données relationnelles.
- Un guide rapide pour commencer avec Microsoft Access 2007 Un guide rapide pour commencer avec Microsoft Access 2007 Lire la suite qui est un aperçu de haut niveau d'Access et des composants qui composent une base de données Access.
- Un didacticiel rapide pour les tableaux dans Microsoft Access 2007 Un didacticiel rapide pour les tableaux dans Microsoft Access 2007 Lire la suite jette un œil à la création de votre première base de données et tables pour stocker vos données structurées.
- Un didacticiel rapide sur les requêtes dans Microsoft Access 2007 Un didacticiel rapide sur les requêtes dans Microsoft Access 2007 Lire la suite examine les moyens de renvoyer des parties spécifiques des données stockées dans les tables de la base de données.
Une compréhension de base des concepts fournis dans ces articles facilitera la digestion des éléments suivants.
Relations et normalisation des bases de données
Imaginez que vous dirigez une entreprise qui vend 50 types différents de widgets dans le monde entier. Vous avez une base de 1 250 clients et au cours d'un mois moyen, vous vendez 10 000 widgets à ces clients. 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 ajoute des milliers de lignes à votre feuille de calcul.
Les images ci-dessus font partie de la feuille de calcul de suivi des commandes que vous utilisez. Supposons maintenant que ces deux clients vous achètent des widgets plusieurs fois par an afin que vous ayez beaucoup plus de lignes pour les deux.
Si Joan Smith épouse Ted Baines et prend son nom de famille, chaque ligne contenant 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 garder vos données de vente cohérentes 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 supprimerions les colonnes Nom du client et Adresse client et les placerions dans une nouvelle table. Dans l'image ci-dessus, j'ai également mieux expliqué les choses pour un accès plus granulaire aux données. Le nouveau tableau contient également une colonne pour une clé primaire (ClientID) - un nombre qui sera utilisé pour accéder à chaque ligne de ce tableau.
Dans la table d'origine où nous avons supprimé ces données, nous ajouterions une colonne pour une clé étrangère (ClientID) qui est ce qui relie à la ligne appropriée contenant les informations pour ce client particulier.
Désormais, lorsque Joan Smith change son nom en Joan Baines, le changement ne doit être effectué qu'une seule fois dans la table Client. Toutes les autres références des tables jointes tireront le nom du client approprié et un rapport qui examinera ce que Joan a acheté pour les 5 dernières années recevront toutes les commandes sous ses noms de jeune fille et de mariage sans avoir à changer 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.
Rejoindre les types
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 permet 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 truqué 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 est pendant le test de charge des serveurs de base de données.
Voyons comment fonctionnent les 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 à incrémentation automatique 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 de 255 caractères maximum.
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.
Ensuite, créez une nouvelle requête en accédant à Créer> Conception de requête. Sélectionnez les deux tables dans la boîte de dialogue Afficher la table et cliquez sur Ajouter, puis 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 (INNER) est sélectionné. L'option 2 est une jointure EXTÉRIEURE GAUCHE et 3 est une jointure EXTÉRIEURE DROITE.
Nous allons d'abord regarder la jointure INNER, donc 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 affichent uniquement des valeurs où ProductID est égal dans les deux tableaux. 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. La même chose s'applique à ProductID = 11. Il existe dans la table ProdA mais pas dans la table ProdB.
En utilisant le bouton Afficher sur le ruban et en basculant vers 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 en mode Création, remplacez le type de jointure par 2 (GAUCHE 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 jeu 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 IF immédiat (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 est 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 comparable à toute autre valeur, y compris une autre valeur Null. En d'autres termes, Null n'est pas égal à Null. Déjà. Pour dépasser cela, 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 Field:. Pour obtenir la création de la colonne "Résultats", vous devez utiliser un alias. Pour ce faire, faites précéder la fonction de «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.
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 le tableau 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 Joel Lee's Comment apprendre Microsoft Access: 5 ressources en ligne gratuites Comment apprendre Microsoft Access: 5 ressources en ligne gratuitesDevez-vous gérer une grande quantité de données? Vous devriez regarder dans Microsoft Access. Nos ressources d'étude gratuites peuvent vous aider à démarrer et à acquérir les compétences pour des projets plus complexes. Lire la suite .
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'énerve également en tentant de jouer de la guitare.