Vous êtes sur la page 1sur 4

Chapitre 19 : la slection simple en SQL 1 - Introduction Nous avons vu au chapitre prcdent qu'il tait possible, dans le SGBD Access,

de manipuler les tables en langage SQL. Cependant, les commandes correspondantes sont considres comme des requtes, et il n'est pas possible de basculer entre le mode graphique et le mode SQL. En effet, le mode graphique s'obtient lorsque l'objet "Tables" est slectionn, alors que le mode SQL requiert que l'objet "Requtes" soit actif. En ce qui concerne les requtes, la situation est nettement plus satisfaisante. La plupart des commandes SQL relatives aux requtes sont connues du moteur d'Access, et on bascule sans problme du mode graphique au mode SQL (l'objet "Requtes" tant slectionn). Il existe cependant quelques exceptions, que nous tudierons au chapitre 21. Il s'agit des oprations ensemblistes, pour lesquelles il n'existe pas d'interface graphique. Ces trois oprations sont : l'union de deux tables, pour laquelle l'oprateur UNION fonctionne ; l'intersection de deux tables, pour laquelle l'oprateur INTERSECT ne fonctionne pas ; la diffrence de deux tables, pour laquelle les oprateurs EXCEPT et MINUS ne fonctionnent pas. Selon notre habitude, nous utiliserons le SGBD Access comme support pratique de ce tutoriel (ou tutorial, ou cours en ligne). 2 - La slection simple Crons, dans l'interface graphique, la requte qui extrait de la table "Personnes" (contenant une liste de personnes) les deux champs "Nom" et "Prnom". Cliquons sur la petite flche situe droite de l'outil "Affichage", et dans la liste droulante, choisissons "Mode SQL". La commande (ou instruction) suivante s'affiche : SELECT Personnes.Nom, Personnes.Prnom FROM Personnes; La requte simple commence par la clause "SELECT", suivie du nom des champs, puis continue avec la clause "FROM", suivie du nom de la table laquelle appartiennent les champs. Le point-virgule marque la fin de la commande. La syntaxe relative aux noms des champs consiste crire le nom de la table, suivi d'un point et du nom du champ. Cette faon de procder s'appelle la qualification. Dans le cas prsent, cette qualification est redondante, et nous pouvons trs bien crire : SELECT Nom, Prnom FROM Personnes; La politique la plus raisonnable consiste qualifier les champs chaque fois qu'une ambigut existe (mme nom de champ dans deux tables diffrentes, lors d'une requte multi-table), et de ne pas les qualifier dans le cas contraire. Nous avons vu au chapitre prcdent qu'il existait des restrictions svres sur les noms des tables et des champs en SQL. Pour s'en affranchir, il faut mettre les noms des champs, et celui de la table, entre crochets pour viter les ennuis. Les expressions : SELECT [Personnes].[Nom], [Personnes].[Prnom] FROM [Personnes];

SELECT [Nom], [Prnom] FROM [Personnes]; sont parfaitement valables. Par prudence, certains professionnels utilisant les SGBD prfrent s'abstenir de tout caractre accentu, remplacent systmatiquement l'espace par le caractre de soulignement, et vitent d'utiliser les termes rservs. Rappelons que l'implmentation de SQL par Access accepte les caractres accentus pour les noms des champs et des tables. Attention aux dtails de syntaxe ! Comme tous les langages informatiques, SQL a ses petites manies qui empoisonnent les utilisateurs. L'interface graphique a ceci de bon qu'elle nous dbarrasse de ces problmes stupides -- en plus du fait qu'elle nous permet de crer des requtes plus simplement et plus rapidement. On notera que, dans Access, le point-virgule qui marque la fin d'une commande n'est pas indispensable. 3 - La requte avec cration de table Rcuprons la requte prcdente dans l'interface graphique, faisons en sorte qu'elle cre une table appele "Essai", puis basculons en mode SQL. Nous obtenons : SELECT Personnes.Nom, Personnes.Prnom INTO Essai FROM Personnes; Nous voyons que la cration de la table est effectue grce la clause INTO, suivi du nom de la table. En SQL version Oracle, on crirait plutt : INSERT INTO Essai SELECT Personnes.Nom, Personnes.Prnom FROM Personnes; Dans Access, cette syntaxe fonctionne condition que la table "Essai" prexiste, et contienne au moins les champs "Nom" et "Prnom" avec les mmes proprits que dans la table "Personnes". Access effectue alors une requte ajout des deux premires colonnes de la table "Personnes" la table "Essai". 4 - Le tri simple ou multiple Nous pouvons demander que le rsultat de la requte soit tri sur un ou plusieurs champs. Rcuprons la requte prcdente dans l'interface graphique, faisons en sorte que le rsultat soit tri sur les noms d'abord, sur les prnoms ensuite, et basculons en mode SQL. Nous obtenons : SELECT Personnes.Nom, Personnes.Prnom FROM Personnes ORDER BY Personnes.Nom, Personnes.Prnom; Nous voyons que le tri (dans l'ordre croissant) s'obtient grce la clause ORDER BY, suivi des noms des champs. Le tri multiple est effectu dans l'ordre d'numration des champs. Le tri d'un champ dans l'ordre dcroissant s'obtient en faisant suivre le nom de ce champ par l'oprateur DESC. L'exemple suivant effectue un tri croissant sur les noms, suivi d'un tri dcroissant sur les prnoms : SELECT Personnes.Nom, Personnes.Prnom FROM Personnes ORDER BY Personnes.Nom, Personnes.Prnom DESC;

5 - L'limination des doublons

Comme nous l'avons vu au chapitre 8, la requte simple peut crer des doublons, et il est possible de remdier de faon simple cette situation en jouant sur les proprits de la requte. Crons dans l'interface graphique une requte de slection simple qui concerne le seul champ "Nom" de la table "Personnes". Modifions la proprit "Valeurs distinctes" de "Non" "Oui", puis basculons en mode SQL. Nous obtenons : SELECT DISTINCT Personnes.Nom FROM Personnes; Nous voyons que l'limination des doublons s'obtient l'aide de l'oprateur DISTINCT plac juste aprs la clause SELECT. Une syntaxe plus ancienne est galement comprise par Access, mais elle ne semble plus gure utilise : SELECT DISTINCT(Nom) FROM Personnes; Pour viter de crer des doublons sur deux champs, la commande SQL s'crit : SELECT DISTINCT Personnes.Nom, Personnes.Prnom FROM Personnes;

6 - La requte avec cration de champ Reprenons l'exemple dj trait au chapitre 8, lequel consiste concatner le nom avec le prnom, en les sparant par un espace. Appelons "Nom_complet" le nouveau champ. En mode SQL, nous obtenons : SELECT [Nom] & " " & [Prnom] AS Nom_complet FROM Personnes; La faon d'extraire le contenu des champs et d'exprimer la concatnation varient d'un SGBD l'autre. Cependant, la possibilit de crer un nouveau champ (et d'en dfinir le contenu partir de champs existants) se retrouve dans tous les SGBD dignes de ce nom. 7 - La requte multi-fonctionnelle En dfinitive, nous pouvons regrouper toutes les oprations prcdentes (requte simple, cration de table, cration de champ, tri et limination des doublons) en une seule requte, dont voici le code SQL (en version Access) : SELECT DISTINCT [Nom] & " " & [Prnom] AS Nom_complet INTO Liste_de_noms FROM Personnes ORDER BY [Nom] & " " & [Prnom];

8 - Les requtes embotes Nous avons vu au chapitre 8 qu'il est possible de crer dans Access une requte partir du rsultat d'une autre requte, condition que cette dernire ne cre pas de table. En mode SQL, la commande s'crit : SELECT Requte1.Nom FROM Requte1; On ne peut pas rver plus simple pour emboter deux requtes ! Cette belle simplicit ne se retrouve pas en SQL pur et dur, o l'embotement de deux requtes est d'une criture plutt complexe. Que l'on en juge : si la premire requte (encore appele sous-requte, ou sous-

interrogation) ramne une valeur numrique unique (rsultat d'une opration du type comptage, sommation, calcul de moyenne, etc.), on utilise les oprateurs arithmtiques usuels : =, <, >, >=, <= et <> ; si la premire requte ramne une seule ligne, on utilise les oprateurs IN, ALL, ou ANY suivant les cas ; si la premire requte est susceptible de ramener plusieurs lignes, on utilise EXISTS ou NON EXISTS. Bonjour les erreurs ! 9 - Conclusion Le chapitre 11 est consacr la slection simple, mise en oeuvre l'aide de l'interface graphique d'Access. Le prsent chapitre 19 suit pratiquement le mme plan, mais utilise le langage SQL. La comparaison entre ces deux chapitres nous amne faire une double constatation : le langage SQL est d'un usage assez facile, sauf en ce qui concerne l'embotement des requtes. Pour raliser l'embotement, l'utilisation de l'interface graphique d'Access est beaucoup plus simple. Cette situation rsulte du fait que le SQL mis en oeuvre par Access permet d'voquer une requte par son nom, ce qui n'est pas le cas du SQL usuel ; Access fournit un moyen didactique commode pour aborder l'tude du langage SQL.