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