Intro :
Les opérateurs de requêtes se classent en trois catégories :
- Les opérateurs relationnels (« algèbre relationnel ») qui font l’objet de ce chapitre
- Les opérateurs ensemblistes (issus de la théorie des ensembles)(pas d’étude théorique)
- Les opérateurs de calcul
Tous les exemples et exercices figurant sur ce document sont à exécuter avec la base de données « GESNOTES.MDB »
Schéma relationnel du domaine « Gestion des notes » (Cf chap 4)
EPREUVE(Codeépreuve, Désignépreuve, coeff)
ZONE(CodeZone, libelléZone)
CANDIDAT(Num candidat, Non candidat, #CodeEtab)
ETABLISSEMENT(Codeétab, Nométab, #CodeZone)
NOTATION(#Codeépreuve+#NumCandidat, note)
Les opérateurs relationnels sont au nombre de trois :
- la projection
- la sélection
- la jointure
Elle consiste à choisir un ou plusieurs champs (attributs = colonnes) et d’afficher toutes les enregistrements.
Notation en langage algébrique :
R2=PROJECTION(R1, attribut 1, attribut
2,…)
R1
|
Attribut1 |
Attribut2 |
Attribut3 |
Attribut4 |
…. |
|
|
Enregistrement1 |
|
|
|
|
|
|
|
Enregistrement2 |
|
|
|
|
|
|
|
Enregistrement3 |
|
|
|
|
|
|
|
Enregistrement4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Par tableau :
RELATION (source de la requête) |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
R1 |
Projection |
………… |
R2(attribut 1, attribut 2) |
Remarques : Lorsqu’un nom de champ comporte des
espaces, il faut le mettre
En SQL :
SELECT
[Attribut 1], [Attribut 2]
FROM
R1 ;
Application 1 :
On souhaite afficher le nom et les coefficients des épreuves d’examen
Résultat à obtenir :
Désign épreuve |
Coeff |
Philosophie |
1 |
Français |
3 |
Mathématiques |
3 |
Histoire Géo |
1 |
LV1 |
2 |
Economie Droit |
8 |
Comptabilité |
8 |
Par tableau :
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
EPREUVE |
Projection |
|
R1(Désignépreuve,coeff) |
- En QBE (A faire avec ACCESS) : le nom de la requête sera R1
- En SQL : Pour créer une requête en langage SQL dans Access, après avoir ouvert une requête vierge en mode création, cliquez sur le menu Affichage – Mode SQL. Vous pouvez alors saisir la requête. ATTENTION : si le nom du champ comporte un espace il faut le mettre entre [ ]
SELECT Désignépreuve, Coeff
FROM EPREUVE
Enregistrez la requête SQL sous le nom R1SQL
Application 2 : On souhaite obtenir le numéro des candidats ayant passé les épreuves
Problème : Si on utilise la même syntaxe que précédemment, Access va afficher plusieurs fois le même numéro de candidat. Pour n’avoir qu’une seule fois les codes produits, on doit utiliser ici une clause SQL supplémentaire : DISTINCT
Par tableau
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
NOTATION |
PROJECTION DISTINCT |
|
R2(NumCandidat) |
En QBE : Créez la requête dans ACCESS.
Affichez la fenêtre « Propriétés de la requête » et paramétrez la propriété « Valeurs Distinctes » à Oui. Enregistrez la requête sous le nom R2
- En SQL :
SELECT DISTINCT NumCandidat
FROM NOTATION
Créez dans ACCESS une nouvelle requête en saisissant le code SQL ci-dessus. Vous enregistrerez la requête sous le nom R2SQL
Elle
consiste à choisir les lignes qui répondent à une certaine condition (critère)
- Notation en langage algébrique : R2=SELECTION(R1, critère)
- Formulation par tableau :
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
R2 |
SELECTION |
critère |
R2( |
- En langage SQL :
SELECT *
FROM R1
WHERE critère
Le critère se pose par rapport à un champ et utilise des opérateurs de comparaison :
Opérateur de comparaison
En Français (QBE) |
En anglais (SQL) |
Exemple |
>, <, <=, >=, = |
>, <, <=, >=, = |
Codeart>5 Moyeleve>Moyclasse (comparaison entre 2 champs) |
Entre … Et … |
Between … And … |
PUHT Entre 60 Et 100 (fixe un intervalle de valeur) Revient à : PUHT>=60 ET PUHT<=100 |
Comme |
LIKE |
Nomcli Comme ‘[A-C]*’ (Tous les clients dont le nom commence par les lettres A à C quelque soit le reste du nom) |
Dans(valeur1, valeur2,…) |
IN(valeur1,valeur2,…) |
Codeclasse Dans (‘1CGO1’, ‘1CGO2’, ‘TSTT4’) (toutes les lignes pour lesquelles CodeClasse est 1CGO1, |
Combinaison de critères
Si une requête contient plusieurs critères, on utilise :
- le ET logique (pour « multiplier » les critères)
- le OU logique pour « ajouter » les critères
Dans Access :
exemples de critères: soit la relation suivante :
ELEVE(CodeEleve, NomEleve,…, #CodeClasse, #optionobligatoire)
On veut obtenir la liste des élèves de SNDEA ayant choisi l’option IGC.
Formuler le critère à inclure dans la requête pour obtenir le résultat escompté.
CodeClasse= « SNDEA »
ET optionobligatoire= « IGC »
Autre exemple : on veut la liste des élèves de SNDEA ou SNDEC qui ont choisi l’option SES
Formuler le critère à inclure dans la requête pour obtenir le résultat escompté.
(Codeclasse= « SNDEA ou
Codeclasse= « SNDEC ») ET optionobligatoire= « SES »
APPL.ICATIONS sur la sélection (à partir du SLD relationnel du cas « GESNOTES »
Application 3-1
On veut la liste des candidats provenant du lycée n° 230 (tous les champs)
Résultat à obtenir :
Nom Candidat |
Code étab |
FABER |
230 |
CREATIX |
230 |
Formulation de la requête par tableau
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
CANDIDAT |
SELECTION PROJECTION |
Codeétab=230 |
R31(NomCandidat) |
En SQL
SELECT NomCandidat
FROM
CANDIDAT
WHERE
Codeétab=230;
Application 3-2 Combinaison de critères
On veut connaître le code des candidats ainsi que leur note ayant obtenu entre 8 et 14 à l’épreuve 6
Résultat à obtenir :
Num candidat |
Code épreuve |
Note |
3 |
6 |
9 |
9 |
6 |
13 |
12 |
6 |
8 |
16 |
6 |
13 |
Formulation de la requête par tableau
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
NOTATION |
SELECTION PROJECTION |
Codeépreuve=6 et (Note entre 8 et 14) |
R32(NumCandidat,note) |
En SQL
SELECT NumCandidat, Note
FROM
NOTATION
WHERE
Codeépreuve=6 AND (Note BETWEEN 8 AND 14) ;
RMQ au lieu de note BETWEEN 8
AND 14 on peut metre : Note>=8 AND NOTE<=14
Remarque : généralement une sélection est immédiatement suivie d’une projection.
Application 3.3 Requête avec paramètre
Un paramètre de requête est une valeur saisie par l’utilisateur au moment où il exécute la requête. Le paramètre peut alors être utilisé comme critère dans une opération de sélection.
Exemple : On veut afficher le numéro et le nom des candidats provenant d’un lycée préalablement sélectionné
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
CANDIDAT |
SELECTION PROJECTION |
[Saisissez le code du lycée] |
R33(NumCand, NomCand) |
En SQL
SELECT NumCand, NomCand
FROM
CANDIDAT
WHERE Codeétab=[Saisissez le code
du lycée] ;
Pour définir un paramètre dans Access : Menu Requête – Paramètres…
Utilisation du paramètre dans la zone critère :
Lors de l’exécution de la requête :
Application 3-4 : Critère de tri dans une requête
SQL
En SQL, le tri se traduit par la clause ORDER BY nomduchamp ASC/DESC ajoutée à la fin
Pour un tri croissant, l’instruction se termine par ASC (Ascending)(facultatif)
Pour un tri décroissant, l’instruction se termine par DESC (Descending)
Si plusieurs champs sont à trier, il faut les séparer par des virgules :
ORDER BY NomChamp1 ASC ou DESC, NomChamp2 ASC ou DESC…
On veut obtenir la liste des codes élèves et des notes obtenues à l’épreuve d’économie (code épreuve = 6). Cette liste doit être classée de manière à établir un classement de la meilleure note à la moins bonne.
En SQL
SELECT
*
FROM
NOTATION
WHERE
Codeépreuve=6
ORDER
BY Note DESC
Elle
consiste à créer une relation R3 à
partir de deux relations R1 et R2 ayant un attribut en commun. R3 Comportera
les lignes pour lesquelles l’attribut commun a la même valeur.
FORMALISME : R3 = JOINTURE ( R1 , R2 , R1.attribut commun = R2.Attribut commun)
Exemple : on veut obtenir la liste des candidats (numéro, nom, code établissement) leur note et le code des épreuves qu’ils ont passées.
R34
= JOINTURE (CANDIDAT,NOTATION,
CANDIDAT.NumCandidat=NOTATION.NumCandidat)
R34Bis=PROJECTION(R34,NumCand,
NomCand,Codeétab, Note)
Par tableau :
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
CANDIDAT, NOTATION |
Jointure Projection |
Candidat.numCandidat=NOTATION.NumCandidat |
R34(NumCand, NomCand,Codeétab, Note) |
En SQL lorsque deux champs de même nom proviennent de
deux tables, on doit indiquer le nom de la table devant le nom du champ
En SQL :
SELECT Candidat.NumCand, NomCand,Codeétab, Note
FROM CANDIDAT, NOTATION
WHERE Candidat.numCandidat=NOTATION.NumCandidat
Remarque : comme la sélection, la jointure est généralement suivie d’une projection
Reprise de l’exemple précédent :
Application 4 : On veut connaître le nom des candidats ayant passé une épreuve ainsi que le nom de leur établissement d’origine
Par tableau :
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
CANDIDAT NOTATION |
Jointure Projection |
CANDIDAT.Numcandidat=NOTATION.NumCandidat |
R35(NomCandidat, Codeéétab) |
R35 ETABLISSEMENT |
Jointure Projection |
R35.Codeétab=ETABLISSEMENT.Codeétab |
R36(NomCandidat, Nométab) |
Comme le champ notation.numcandidat fait partie d’un
critère de jointure, la table NOTATION doit être incluse dans la clause
FROM
En SQL :
SELECT NomCandidat, Nométab
FROM CANDIDAT, ETABLISSEMENT, NOTATION
WHERE
CANDIDAT.Numcandidat=NOTATION.NumCandidat
AND CANDIDAT.Codeétab=ETABLISSEMENT.Codeétab
Application 5 Création d’un champ calculé
Rappel : les champs calculés ne sont pas repris dans les tables car ils peuvent être obtenus de manière dynamique dans les requêtes.
Un champ calculé se met entre crochet suivi de : et de la « formule de calcul »
Exemple : Dans la base de données « GESNOTES » on souhaiterait afficher le code élève, le code épreuve, la note, le coefficient et la note coefficientée (note * coeff)
TAF :
Formulez la requête par tableau puis en SQL
Par tableau
RELATION |
OPERATEURS |
CONDITION |
RELATION RESULTAT |
EPREUVE NOTATION |
Jointure Projection |
EPREUVE.Codeépreuve=Notation.Codeépreuve |
R37(Codeépreuve,Note,Coeff,NoteCoefficientée :[Note*[Coeff]) |
|
|
|
R38( |
En SQL
SELECT
EPREUVE.Codeépreuve, Note, Coeff, Note*Coeff AS NoteCoefficientée
FROM
EPREUVE, NOTATION
WHERE
EPREUVE.Codeépreuve=Notation.Codeépreuve ;