Formation SGBD - Les Requêtes
Transcription
Formation SGBD - Les Requêtes
Session de Formation Systèmes de Gestion de Bases de données Relationnelles Utilisation de MS ACCESS 2000 I.N.A.T. (Tunisie) 25 septembre – 2 octobre 2001 organisée par l’Institut National des Sciences et Technologies de la Mer avec la collaboration du projet FAO COPEMED Formateur : Alexis Bensch* * Expert Systèmes d’Information Projet FAO COPEMED GCP/REM/057/SPA - Alicante (Espagne) Les requêtes : • Requêtes Sélection sur une seule table • Requêtes Sélection faisant intervenir plusieurs tables • Conditions sous-requêtes • Requêtes de mise à jour de données Relations entre tables et intégrité référentielle COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 les Requêtes Les requêtes servent à sélectionner les données contenues dans les tables selon certains critères. Elles peuvent aussi faire des calculs, ainsi que créer des sources de données pour les formulaires, les états ou même d'autres requêtes (on peut faire une requête sur le résultat d'une autre requête). Elles servent encore à modifier des tables existantes ou à en créer des nouvelles. Les bases de données relationnelles disposent d’un langage standard de requête appelé SQL (Structured Query Language). Ce langage a été mis au point dans les années 70. Il permet : - La maintenance des tables : création, suppression, modification de la structure des tables. - Les manipulations des bases de données : sélection, modification, suppression d'enregistrements. - La gestion des droits d'accès aux tables : contrôle des données : droits d'accès, validation des modifications. Afin de rendre plus accessible ce langage de requêtes aux utilisateurs, ACCESS propose un assistant qui permet d’élaborer des requêtes sans avoir à les écrire en langage SQL. Il est possible de passer à tout moment du mode assistant (appelé mode création) au mode SQL. Dans cette formation, nous utiliserons les deux modes. L’expérience montre qu’un utilisateur averti utilise les deux. Requêtes Sélection sur une seule table L’instruction SELECT est l’instruction SQL de sélection de données. Elle permet de sélectionner ou de calculer des informations selon certains critères, avec possibilité de mettre en relation des tables. Le résultat d’une sélection peut être utilisé de différentes manières : création d’une table, ajout ou suppression d’enregistrements, mise à jour de la valeur de champs. L’instruction SELECT possède 6 clauses : SELECT [ALL | DISTINCT] colonne1[,colonne2] FROM table1[,table2] [WHERE "conditions"] [GROUP BY "liste de colonnes "] champs à extraire tables source critères portant sur la valeur des champs champs utilisés pour regrouper des enregistrements et calculer des statistiques par groupe critères portant sur les statistiques de regroupement tri [HAVING "conditions"] [ORDER BY "liste de colonnes" [ASC | DESC] ] 1 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Requête de Base Toute requête de sélection commence par les deux clauses SELECT et FROM qui sont obligatoires. Les autres clauses sont facultatives. La syntaxe est la suivante : SELECT champ1, champ2, champ3, ... FROM table; L’instruction SELECT ne modifie pas les données contenues dans la base de données ; elle ne fait que les extraire, sous format d’une feuille de données, dont les colonnes sont définies dans la clause SELECT. S'il y a plus d'un champ spécifié, les champs doivent être séparés par des virgules. Les champs sont retournés dans l'ordre spécifié après la clause SELECT, et non pas dans l'ordre qu'ils ont été créés dans la table. Si on veut récupérer tous les champs des enregistrements sélectionnés, la syntaxe est la suivante : SELECT * FROM table; Exercices • • REQ01 : Sélectionner tous les enregistrements de la table STATION en affichant tous les attributs. On utilisera le mode SQL. REQ02 : Sélectionner tous les enregistrements de la table STATION en affichant seulement 3 attributs : le code de la campagne, l'identifiant de la station et la date de la station. On utilisera le mode Création. Démarche : 1. Cliquez sur l’onglet « Requêtes » dans la fenêtre Base de données. 2. Cliquez sur le bouton « Nouveau ». 3. Sélectionnez l’entrée « Mode Création » dans la liste puis cliquez sur le bouton « Ok ». 4. Cliquez sur le bouton « Fermer » dans la boîte de dialogue « Ajouter une table ». 5. Cliquez sur le bouton « SQL » dans la barre d’outils « Création de requête ». 6. Tapez votre code SQL. 7. Sélectionnez « Mode feuille de données » dans le menu « Affichage ». 8. Cliquez sur le bouton « Enregistrer » de la barre d’outils « Création de requête ». puis nommez la requête « REQ01 ». 9. Créer la requête 2 en utilisant l’assistant de création de requête d’ACCESS. Pour cela, créer une nouvelle requête en mode création : 2 COPEMED - Formation SGBD - ACCESS - Tunis, 25 septembre – 2 octobre 2001 une première fenêtre vous permet de choisir les tables sur lesquelles porteront la requête. Pour cet exemple, choisir la table STATION la fenêtre de définition de la requête est ensuite affichée. Dans la partie supérieure de la fenêtre se trouve la table STATION avec la liste de ses champs. Dans la partie inférieure, se trouve la description de la requête. Voici notre requête : Champ utilisé dans la requête Cochée si le champ entre dans la clause SELECT Nous avons un tableau composé de colonnes et de lignes, dans chaque colonne, on indique les champs qui vont apparaître dans le résultat de la requête ou qui vont servir dans la requête. Pour ajouter un champ, on peut, soit le sélectionner dans la table et l'amener avec la souris sur la cellule champ d’une des colonnes, soit cliquer directement sur la cellule "Champ" et sélectionner l’attribut dans la liste proposée établie sur la base de la ou des tables participant à la requête. Un des champs proposé s’appelle '*', ce champ signifie "tous les champs de la table", si on choisi ce champ, tous les champs de la table apparaîtront dans le résultat de la requête, en plus des autres champs que vous aurez choisis. La ligne "Table" sert à sélectionner la table à laquelle appartient le champ sélectionné, dans notre cas, il n'y a qu'une table, le choix est vite fait. La ligne "Afficher" indique si le champ de la colonne correspondante doit être affiché ou non. Pour exécuter la requête, on clique sur l'icône : Access affiche le résultat sous la forme d'une table que l'on peut modifier comme s’il s'agissait d'une table normale, on peut ajouter des enregistrements, les modifier, faire des filtres, des tris, etc... 3 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 La clause ORDER BY Elle détermine l'ordre de tri des enregistrements extraits par l’instruction SELECT. La syntaxe est la suivante : SELECT champ1, champ2, champ3, ... FROM table ORDER BY champ1, champ2, champ3, ... [ASC | DESC] Le mot ASC est facultatif, il indique l'ordre de tri, par défaut c'est DESC (descendant). Exercices • REQ03 : Sélectionner tous les enregistrements de la table STATION en affichant le code de la campagne, l'identifiant de la station et la date de la station, par ordre décroissant sur la date. • REQ04 : Sélectionner tous les enregistrements de la table STATION en affichant le code de la campagne, l'identifiant de la station, la date par ordre décroissant sur la date et croissant sur l'identifiant de la station. Démarche • Une liste de boutons permet de changer le mode de visualisation d’une requête : Mode Création Mode Feuille de données : résultat de la requête Mode SQL • En mode Création, la ligne "Tri" de la fenêtre de définition de la requête indique si le champ correspondant est une clé de tri. Il y a trois sortes de tri : Croissant (de A à Z), Décroissant (de Z à A) et non trié. Si plusieurs champs sont utilisés, le tri se fait toujours de gauche à droite. 4 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 La clause WHERE Cette clause indique quels enregistrements des tables spécifiées dans la clause FROM doivent être pris en compte dans les résultats de l'instruction SELECT. La clause WHERE est facultative. La syntaxe est la suivante : SELECT champ1, champ2, champ3, ... FROM table WHERE condition; En mode Création, la ligne "Critères" indique le critère à appliquer sur le champ de la colonne correspondante. Un champ peut être utilisé comme critère sans pour cela apparaître dans le résultat de la requête. Pour cela, on désactive la case de la ligne "Afficher" dans la colonne du champ considéré. Conditions EXPR opérateur de comparaison EXPR • EXPR : constante, nom de colonne ou une combinaison des deux reliés par des opérateurs arithmétiques : { +, -, *, / } • Opérateur de comparaison : { =, <>, >, <, >=, <= } EXPR [NOT] BETWEEN EXPR AND EXPR Permet de sélectionner les enregistrements dont la valeur d’un champ est comprise entre deux valeurs EXPR [NOT] IN (liste de valeurs) Permet de sélectionner les enregistrements dont la valeur d’un champ fait partie (ou non) d’une liste de valeurs 5 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Nom colonne [NOT] LIKE Chaîne La clause LIKE permet de faire des recherches approximatives sur le contenu d'un champ. Des symboles « joker » peuvent être utilisés pour rendre la recherche plus large : Symbole * ou % ? or _ # [] ! - Exemple wh* trouve what, white, et why *at trouve cat, bat, and what b?ll trouve ball, bell, and bill 1#3 trouve 103, 113, 123 b[ae]ll trouve ball et bell mais pas bill b[!ae]ll trouve bill et bull mais pas bell ou ball b[a-c]d trouve bad, bbd, et bcd Usage Un groupe de caractères un caractère un chiffre un des caractères entre crochet Tous les caractères sauf ceux de la liste. Un des caractères de l’intervalle Note : pour rechercher un des caractères * , ? , # ou [, il faut les placer entre crochets. Les plus utilisés sont * et ?. Par exemple pour représenter tous les noms commençant par S, on utilisera 'S*', tous ceux se terminant par S, on utilisera '*S', et tous ceux comportant la lettre S : '*S*'. Le symbole ? ne remplace qu'un seul caractère. Nom colonne IS [NOT] NULL Permet d’utiliser comme critère de recherché le fait qu’un champ n’est pas de valeur (IS NULL) ou le contraire (IS NOT NULL) 6 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Opérateurs et fonctions Il est possible d’utiliser dans la liste des champs à sélectionner ou dans la construction des expressions de conditions des opérateurs tels que les opérateurs arithmétiques, des opérateurs de concaténation, des fonctions de formatage ou de choix. On trouvera ci-dessous une liste non exhaustive d’opérateurs et de fonctions : Opérateurs arithmétiques : Opérateur Description Permet d'élever un nombre à une puissance. ^ Permet de multiplier deux nombres. * Permet de faire la somme de deux nombres. + Permet de calculer la différence entre deux nombres Renvoi le reste de la division de deux nombres. MOD Division de deux nombres en virgule flottante. / Division entière de deux nombres. \ Opérateurs de concaténation : opérateur Description Permet de provoquer la concaténation de & chaînes de deux expressions. Permet de faire la somme de deux + expressions. Exemple "Salut"’ & "Tout le monde" = "Salut Tout le monde" 4 + 2 = 6. "4" + "2" = "42" Fonctions de chaînes de caractères : Fonction Description Soustrait une chaîne de caractères Left$(CH,NB) de longueur NB de la chaîne CH en partant de la gauche. Soustrait une chaîne de longueur Right$(CH,NB) NB de la chaîne CH en partant de la droite. Renvoie CH convertie en Lcase$(CH) minuscules Renvoie CH convertie en Ucase$(CH) majuscules. Supprime les espaces à gauche et à Trim$(CH) droite de CH. Supprime les espaces à gauche de Ltrim$(CH) CH. Supprime les espaces à droite de Rtrim$(CH) CH. Renvoie une chaîne constituée du String$(NB, CAR) caractère CAR répété NB fois. Renvoie une chaîne comprenant le Space$(NB) nombre d'espaces indiqué par NB. Renvoie une chaîne représentant un Str$(nombre) nombre. 7 Exemple 2^3 = 8 4*2 = 8 4+4 = 8 9-1 = 8 19 MOD 11 = 8 5/2 = 2,5 25 \ 3 = 8 Exemple Left$("CRTS",2) = "CR" Right$("CRTS",2) = "TS" Lcase$("CRts") = "crts" Ucase$("crTs") = "CRTS" Trim$(" CRTS ")= "CRTS" Ltrim$(" CRTS ")= "CRTS " Rtrim$(" CRTS ")= " CRTS" String$(3,"*") = "***" "A" & Space$(2) & "B" = "A B" Str$(4) = "4" COPEMED - Formation SGBD - ACCESS Fonction Mid$(CH,POS,NB) Chr$(CODE) Format$(EXPR, FORMAT) Tunis, 25 septembre – 2 octobre 2001 Description Soustrait de CH une chaîne à partir de POS, de longueur NB. Renvoie un caractère associé au CODE indiqué. Renvoie une chaîne contenant EXPR formatée en fonction des instructions contenues dans FORMAT. Fonctions de date/heure : Fonction Description Renvoie la date système en cours Date$ sous forme de chaîne de caractères. Renvoie la date système en cours Date sous forme de date. DateAdd(INTERVAL, NB, DATE) Permet d'ajouter ou de soustraire à une date un intervalle de temps spécifié. Intervalle DateDiff(Intervalle, Date1, Date2) Day(Date) Month(Date) Year(Date) Now() Time() Hour(Time) Exemple Mid$("CRTS",2,1) = "R" Chr$(65) = "a" Format("HELLO", "<") = "hello". Format("fine", ">") = "FINE" Exemple Date$() = "10/02/2000" Date() = 10/02/2000 Date = 10/10/2000 DateAdd("m",2,Date) = 10/12/2000 signification aaaa Année t Trimestre m Mois a Jour de l'année j Jour e Jour de la semaine ee Semaine h Heure n Minute s Seconde Renvoie le nombre d'intervalles de temps entre Date1 et Date2. Renvoie un nombre entier compris entre 1 et 31, inclus, qui représente le jour du mois. Renvoie un nombre entier compris entre 1 et 12, inclus, qui représente le mois de l'année. Renvoie l'année de la date spécifiée. Renvoie la date et l'heure en cours fournies par la date et l'heure système de votre ordinateur. Indique l'heure système en cours Renvoie l'heure du temps spécifié 8 DateAdd("aaaa",-1 ,Date)= 10/10/1999 DateDiff("j",#1/1/2000#, #5/1/2000#) = 4 (jours) Day(#17/2/00#) = 5 Month(#17/2/00#) = 2 Year(#17/2/00#) = 00 Now() = 17/2/00 10:30:50 Time(#17/2/00#) = 10:31:20 Hour(#10:30:20#) = 10 COPEMED - Formation SGBD - ACCESS Fonctions de choix : Fonction Iif(COND,EXP1_Si_True ,EXP2_Si_False) Choose(Index, Liste) Tunis, 25 septembre – 2 octobre 2001 Description Exemple Renvoie EXP1 ou EXP2 selon Iif(4 > 5, "O", "N") = "N" l'évaluation d'une expression. Sélectionne dans Liste et Choose(2,"B","Z","A") = "Z" renvoie l'élément situé dans la position Index. Exercices • REQ05 : Sélectionner les enregistrements de la table STATION dont la bathymétrie de début (champ START_BATHY) est inférieure à 50 mètres. On affichera seulement les attributs Code Campagne, numéro Station et Bathymétrie Début. • REQ06 : Sélectionner les espèces de la table SPECIES (tous les attributs) dont la famille (champ FAMILY) est "Sparidae" ou "Triglidae". On utilisera l’opérateur IN et on appliquera un tri par famille et genre. • REQ07 : Afficher le code espèce, le genre et le nom espèce de la table espèces qui ont pour nom espèce (champ SPECIES) "atlanticus". Utilisez l'opérateur LIKE • REQ08 : Afficher le code espèce, le genre et le nom espèce de la table SPECIES des espèces dont le nom (champ SPECIES) commence par "AT" • REQ09 : Afficher le code espèce, le genre et le nom espèce de la table espèces que le deuxième caractère de leurs noms espèce est un "T" • REQ10 : Afficher le code espèce, le genre et le nom espèce de la table espèces que le deuxième caractère de leurs noms espèce est un "T" et le dernier est un "a" • REQ11 : Afficher le code espèce, le genre et le nom espèce de la table espèces que le deuxième caractère de leurs noms espèce est un "T" et qui contiennent un "a" après le "T". • REQ12 : Afficher le code de la campagne, l'ID de la station et la date de la table station qui ont été effectué entre le 15 novembre et le 20 décembre 1994. On utilisera l’opérateur BETWEEN et on triera le résultat de la requête par ordre croissant de date. Note: dans une condition de comparaison de date, les dates doivent être écrites sous la forme #mois/jours/année" 9 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Opérateurs logiques Il est possible de combiner plusieurs conditions avec des opérateurs logiques : L'opérateur AND réunit deux ou plusieurs conditions et sélectionne un enregistrement seulement si cet enregistrement satisfait TOUTES les conditions listées. (C'est-à-dire que toutes les conditions séparées par AND sont vraies). L'opérateur OR réunit deux conditions mais sélectionne un enregistrement si UNE des conditions listées est satisfaite. AND et OR peuvent être combinés. L’utilisation de parenthèses permet de regrouper des conditions. Exercices • REQ13 : Afficher le code de la campagne, l'ID de la station et la date de la table STATION qui ont été effectué quand la mer était agitée et au mois de mai. L'état de la mer est indiqué par le champ SEA_COND. Le code pour mer agitée est "A" Note : pour déterminer le mois auquel à été effectué une station, on utilisera la fonction MONTH() qui s'applique à une date et qui renvoie un nombre indiquant le mois de l'année. • REQ14 : Afficher le code de la campagne, l'ID de la station et la date de la table station qui ont été effectuées quand la mer était soit agitée, soit peu agitée (SEA_COND = "PA"). • REQ15 : Afficher le code de la campagne, l'ID de la station et la date de la table station qui ont été effectuées quand la mer n’était ni agitée, ni peu agitée. Remarque : utilisez NOT. • REQ15bis : Afficher le code de la campagne, l'ID de la station et la date de la table STATION qui ont été effectué quand la mer était agitée au mois de mai ou calme au mois de décembre. 10 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Fonctions d’agrégat: Ces fonctions réalisent un calcul sur les enregistrements d’une table : • • • • • SUM () donne la somme des valeurs d'un champ pour tous les enregistrements satisfaisant la condition de la requête. Le champ doit bien sur être de type numérique AVG () donne la moyenne des valeurs d'un champ pour tous les enregistrements satisfaisant la condition de la requête MAX () donne la valeur la plus élevée d'un champ pour tous les enregistrements satisfaisant la condition de la requête MIN () donne la valeur la plus petite d'un champ pur tous les enregistrements satisfaisant la condition de la requête. COUNT (*) Renvoie le nombre d'enregistrements satisfaisant la requête. En mode création, les fonctions d’agrégat doivent être saisies dans la ligne Total qui apparaît en cliquant sur l’icône Σ située dans la barre d’outils. Si utilisées sans la clause de regroupement GROUP BY (voir ci-dessous), le calcul se fait sur tous les enregistrements qui répondent aux conditions de la clause WHERE. La requête ne renverra donc qu'un enregistrement et la clause SELECT ne comportera que des fonctions d'agrégat, ou des constantes. 11 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Alias Il est possible de redéfinir les noms des champs ou expressions dans la clause SELECT. Pour cela, on utilise le mot-clé AS suivi du nom que l’on veut attribuer au champ de la requête. La syntaxe est : SELECT champ1 AS nom1, champ2 AS nom2, etc… FROM… …. Dans l’assistant de requête, l’alias d’un champ (ou d’une expression) est spécifié dans la ligne Champ par le nom de l’alias, suivi de : et du nom du champ Exercices • REQ16 : Calculer les poids minimum et maximum des stations de la campagne CAMP3. On appellera le poids minimum POIDSMIN et le poids maximum POIDSMAX. Le poids capturé sur une station est stocké dans l’attribut TOT_WEIGHT • REQ17: calculer le nombre de stations de la campagne CAMP3. On donnera le nom "Nombre_stations" à ce comptage. 12 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 La clause GROUP BY : Elle combine les enregistrements dont les valeurs des champs spécifiés comme champs de regroupement sont identiques en un seul enregistrement. Pour effectuer un regroupement, tous les champs de la liste de champs SELECT doivent être spécifiés soit dans la clause GROUP BY, soit en tant qu'arguments d'une fonction d’agrégat telle que Sum (la somme d'un champ) ou Count (Compter le nombre d'enregistrements) dans l'instruction SELECT. En mode Assistant de construction de requête, les champs utilisés comme critères de regroupement sont spécifiés par le mot clé « group by » dans la ligne Somme. Exercice • REQ18 : Afficher pour chaque campagne de la base de données le poids minimum, maximum et moyen capturé sur une station. On utilisera le champ STATION.TOT_WEIGHT (poids total capturé exprimé en grammes). Le critère de regroupement sera le champ code campagne (STATION.SRV_CODE). On exprimera les poids en kilo, sans décimal. On rappelle que la fonction INT() permet de convertir un nombre réel en nombre entier. On utilisera les labels suivants pour les statistiques : - PoidsMiniSta pour le poids minimum capturé sur une station - PoidsMoyenSta pour le poids moyen capturé sur une station - PoidsMaxiSta pour le poids minimum capturé sur une station 13 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Condition HAVING : La clause HAVING affiche tous les enregistrements regroupés par la clause GROUP BY qui satisfont aux conditions de la clause HAVING. SELECT colonne1,colonne2, … FROM table1 WHERE "conditions" GROUP BY "liste de colonnes " HAVING "conditions" On utilise donc la clause WHERE pour exclure les lignes qui ne doivent pas être regroupées et la clause HAVING pour filtrer des enregistrements après leur regroupement. REQ19 : Afficher pour chaque campagne de la base de données le poids minimum, maximum et moyen capturé sur une station. On ne sélectionnera que les campagnes pour lesquelles ce poids moyen est supérieur à 20 kg. Les 3 statistiques seront affichées en kilogrammes. On rappelle que dans la base de données l’attribut poids TOT_WEIGHT est stocké en grammes. REQ20 : Afficher pour la campagne « CAMP1 », le nombre d’espèce capturé sur chaque station. On utilisera la table CATCH pour réaliser cette requête. REQ20bis : vérifier qu'il n'y a pas d'enregistrements dans la table CATCH qui ont la même clé (code campagne – code station – code espèce) 14 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Requêtes Sélection faisant intervenir plusieurs tables Faire une requête sur une requête Il est possible d'utiliser une requête préalablement sauvegardée comme une table et faire une requête. REQ21: En utilisant la requête REQ20 comme « table », afficher le nombre moyen d’espèces capturées par station sur la campagne CAMP1 Jointures Pour établir une requête à partir de plusieurs tables, on doit associer les tables concernées. Une jointure ce fait selon le schéma relationnel sur les clés des tables que l’on veut associer. On distingue deux types de jointures : Jointures « Externes » “jointure gauche” : Pour chaque enregistrement de la première table, la requête crée une ligne pour chaque enregistrement associé de la seconde table. Pour les enregistrements de la première table pour lesquels il n’y a pas d’enregistrement associé, la requête crée une ligne avec des valeurs NULL pour les attributs issus de la deuxième table. “jointure droite” : Pour chaque enregistrement de la deuxième table, la requête crée une ligne pour chaque enregistrement associé de la première table. Pour les enregistrements de la seconde table pour lesquels il n’y a pas d’enregistrement associé, la requête crée une ligne avec des valeurs NULL pour les attributs issus de la première table. Syntaxe SQL : Select table1.champ1, table2.champ2, etc.. FROM table1 [ LEFT | RIGHT ] JOIN table2 ON table1.field1 <opérateur de comparaison> table2.field2 WHERE .. L’opérateur de comparaison correspondant à une association selon le modèle relationnel est le « = ». Les champs sur lesquels se font la jointure peuvent ne pas s’appeler de la même manière dans les deux tables mais doivent être de même type. 15 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Equi-jointures Inclut seulement les enregistrements des deux tables pour lesquelles les champs joints sont égaux. Une équi-jointure peut être faite de deux façons en SQL: Avec INNER JOIN : Select table1.champ1, table2.champ2, etc.. FROM table1 INNER JOIN table2 ON table1.field1 <opérateur de comparaison> table2.field2 WHERE .. Avec jointure dans clause WHERE : Select table1.champ1, table2.champ2, etc.. FROM table1, table2 WHERE table1.field1 <opérateur de comparaison> table2.field2 En mode création dans ACCESS : Les jointures sont établies de façon graphique dans la fenêtre des tables. Après avoir ajouté les tables, il suffit de sélectionner le champ de la première table et de le tirer avec la souris vers le champ de l’autre table sur lequel on veut faire la jointure. Ensuite, en double-cliquant sur le trait symbolisant la jointure, on fait apparaître une fenêtre pour changer le type de jointure. On répètera l’opération pour tous les champs définissant la jointure. Exercices : • REQ22 : Afficher les codes des différentes campagnes, avec pour chacune d’elle, le nom du bateau qui l’a exécutée. • REQ23 : Afficher les codes des différentes campagnes, avec pour chacune d’elle le nom du bateau qui l’a faite. On veut connaître les bateaux de la base de données pour lesquels il n’y a pas de campagne. • REQ24 : on veut connaître le ou les engins qui ont été utilisé pour chaque campagne. On affichera le nom de l’engin et le code de la campagne, et le nombre de stations concernées. Si pour certaines stations l’engin n’est pas connu, on veut le savoir. Notez que lorsqu'on utilise plusieurs tables, il faut faire attention que deux tables n'aient pas de champs ayant le même nom, si c'est le cas, et pour les différencier, on utilise, comme dans l'exemple, la notation: table.nom_du_champ. Si on est sur que le nom ne se retrouvera pas dans plusieurs tables, on peut l'utiliser sans le préfixer avec le nom de la table. 16 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 SELECT DISTINCT L'utilisation de DISTINCT dans la clause SELECT d'une requête sélection permet de supprimer les doublons, c'est-à-dire les enregistrements ayant les mêmes valeurs pour l'ensemble des attributs. Exercice REQ34 : Afficher les espèces capturées au cours de la campagne CAMP1, triées par famille, genre et espèce. On fera une jointure entre la table CATCH et la table SPECIES. 17 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Conditions sous-requêtes Ces conditions spéciales de la clause WHERE permettent de comparer une expression au résultat d'une autre requête SELECT (requêtes imbriquées) • EXPR Opérateur de comparaison (requête SELECT renvoyant une seule valeur) La sous requête renvoie une valeur qui est comparée à l’autre expression de la condition. Exercice REQ25 : Afficher le code campagne, le numéro de station, le code et le poids de l’espèce pour les captures dont le poids est supérieur à la moyenne (fonction d'agrégation AVG) plus deux fois l'écart-type (fonction d'agrégation STDEV) des poids de toutes les captures. Remarque : une seule valeur est renvoyée par la sous requête. N'oubliez pas cette règle à propos des sous-requêtes : Lorsque vous faites une sousrequête dans la clause WHERE, la clause SELECT de cette sous-requête doit avoir un nombre et des types de champs correspondants à ceux se trouvant après la clause WHERE de la requête principale. Autrement dit, si par exemple vous avez "WHERE champ = ( SELECT ... );", le résultat du SELECT doit être un seul champ et une seule valeur puisqu'il n'y a qu'un seul champ après le WHERE et que l'opérateur utilisé est "=". De plus, le type des valeurs doit etre le même que celui de l'expression située à gauche de l'opérateur. • EXPR [NOT] IN (requête SELECT) La sous requête renvoie une liste de valeurs qui sont comparées à l’autre expression de la condition. L’opérateur NOT permettra d’inverser le résultat de la condition. Exercices REQ26 : Afficher tous les attributs des campagnes dont le bateau est de pavillon tunisien (SHIP.FLAG= "TUN "). On utilisera l’opérateur IN et une sous-requête REQ27 : Réaliser la même requête en utilisant une jointure 18 COPEMED - Formation SGBD - ACCESS • Tunis, 25 septembre – 2 octobre 2001 EXPR <Opérateur de comparaison> {ANY |[ALL]} (requête SELECT) o >ANY, >=ANY, <ANY, <=ANY, <>ANY, (=ANY identique à IN) : comparaison à "quelconque". o >ALL, >=ALL, <ALL, <=ALL, <>ALL, =ALL : comparaison à "Tout". Exercice REQ28 : Sélectionner les stations de la campagne "CAMP1" dont la capture totale est supérieure à l'une des capture totale des stations de la campagne " CAMP5". On utilisera une sous-requête avec l'opérateur >ANY • • (requête SELECT) [NOT] CONTAINS (requête SELECT) Tester si un ensemble de tuples est inclus (ou n'est pas inclus) dans un autre. (requête SELECT) UNION (requête SELECT) Exercice REQ29: Afficher le nom de tous les bateaux (table SHIP) et les engins de pêches (table GEAR) . 19 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Requêtes de mise à jour de données Requête Création de table Le résultat d’une requête sélection peut être stocké dans une table. Pour cela, on ajoute la clause INTO suivie du nom de la table après la clause SELECT: SELECT … INTO Table 2 FROM … WHERE… Exercice REQ30: Créer une table donnant pour chaque station des campagnes CAMP2 et CAMP1 les informations suivantes : code campagne, code station, état de la mer, nombre d’espèces et poids total capturé. Les champs nombre d’espèces et poids total seront calculés à partir de la table CATCH. On stockera le résultat dans la table EXERCICE. Requête Suppression de table Permet de supprimer les enregistrements d'une table répondant à des conditions spécifiées dans la clause WHERE. La syntaxe SQL est la suivante : DELETE FROM nom_table [WHERE condition] Attention: si la clause WHERE condition est omise => la table est entièrement supprimée. On conseille de réaliser tout d'abord une requête sélection sur les enregistrements que l'on veut éliminer et de la modifier ensuite en requête suppression. Exercice REQ31: Supprimer de la table EXERCICE les stations réalisées par mer agité (SEA_COND = "A") . 20 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Requête Insertion Les enregistrements du résultat de la requête sélection ou l’enregistrement spécifié par la clause VALUE sont insérés dans une table existante. INSERT INTO nom_table [(liste_colonnes)] VALUES (liste_valeurs) Ou INSERT INTO nom_table [(liste_colonnes)] SELECT … Le nombre et les domaines des colonnes doivent être identiques à ceux de la table d'insertion. Exercice REQ32: Ajouter à la table EXERCICE les enregistrements supprimés lors de l’exercice précédent. Note : On utilisera pour cela la CLAUSE INSERT, la requête ayant servie à la création de la table EXERCICE (REQ30), avec une condition supplémentaire pour ne sélectionner que les stations réalisées par mer agitée. Requête modification Modifier certaines valeurs de tuples définis par condition. UPDATE nom_table SET nom_colonne = expression [WHERE condition] Exercice REQ33: Le poids total de la capture d'une station de la table EXERCICE est exprimé en grammes. Le convertir en kilogrammes. 21 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Relations entre tables et intégrité référentielle Lors de l’utilisation de plusieurs tables dans une requête, les jointures doivent être spécifiées. Cependant, ACCESS peut initialiser les jointures si les relations entre les tables ont été décrites. Pour cela, aller dans le menu Outils – Relations Comme dans la fenêtre de mode création d’une requête, les relations sont établies en tirant avec la souris le champ de la table source vers le champ correspondant de la table de destination. Intégrité référentielle : La boite de dialogue d’une relation comporte la case à cocher Appliquer l’intégrité référentielle. Cela permet d’éviter l’incohérence des données : une valeur de la clé de la table source doit exister pour être utilisée dans la table destination. On ne pourra donc pas créer d'enregistrement dans la table destination si la clé de la relation n'existe pas dans la table source. De même, un enregistrement de la table source ne peut être supprimer si la table destination contient un enregistrement ayant pour lesquels les champs joints ont les mêmes valeurs. Exercice Etablir les relations entre les tables de la base de données CAMPAGNES.MBD. On appliquera l'intégrité référentielle. 22 COPEMED - Formation SGBD - ACCESS Tunis, 25 septembre – 2 octobre 2001 Solution : les relations de la base de données Campagnes 23