Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
I. Introduction
Les bases de données sont actuellement au cœur du système d'information des
entreprises. Les systèmes de gestion de bases de données, initialement disponibles
uniquement sur des "mainframes", peuvent maintenant être installés sur tous les
types d'ordinateurs y compris les ordinateurs personnels.
Mais attention, souvent on désigne, par abus de langage, sous le nom "bases de
données" des ensembles de données qui n'en sont pas.
C'est à ces questions, entre autres, que cet ouvrage essaie d'apporter des réponses.
Dans un premier temps, et de façon informelle, on peut considérer une Base de
Données (BD) comme une grande quantité de données, centralisées ou non, servant
pour les besoins d'une ou plusieurs applications, interrogeables et modifiables par un
groupe d'utilisateurs travaillant en parallèle.
La prise de décision est une part importante de la vie d'une société. Mais elle
nécessite d'être bien informé sur la situation et donc d'avoir des informations à jour
et disponibles immédiatement.
Les utilisateurs, quant à eux, ne veulent plus de systèmes d'information constitués
d'un ensemble de programmes inflexibles et de données inaccessibles à tout non
spécialiste ; ils souhaitent des systèmes d'informations globaux, cohérents,
directement accessibles (sans qu'ils aient besoin soit d'écrire des programmes soit de
demander à un programmeur de les écrire pour eux) et des réponses immédiates aux
questions qu'ils posent. On a donc recherché des solutions tenant compte à la fois des
désirs des utilisateurs et des progrès techniques. Cette recherche a abouti au concept
de base de données.
Indépendance physique
La façon dont les données sont définies doit être indépendante des structures de
stockages utilisées.
Le modèle relationnel 3
Indépendance logique
Un même ensemble de données peut être vu différemment par des utilisateurs
différents. Toutes ces visions personnelles des données doivent être intégrées dans
une vision globale.
Définition
Un Système de Gestion de Bases de Données (SGBD) est un logiciel de haut niveau
qui permet de manipuler les informations stockées dans une base de données. La
complexité d’un SGBD est essentiellement issue de la diversité des techniques mises
en œuvre, de la multiplicité des composants intervenant dans son architecture, et des
différents types d’utilisateurs (administrateurs, programmeurs, non
informaticiens, ...) qui sont confrontés, à différents niveaux, au système.
Voici quelques exemples illustrant tous les cas de figure qu’il faudrait envisager dans
un cours exhaustif :
– Les modèles de données : entité-relation, réseau, hiérarchique, relationnel, orienté-
objet, modèles sémantiques.
– Les langages de requêtes : fondements théoriques (logiques du premier ordre, du
point fixe, algèbres diverses) et les langages comme SQL, SQL3, Datalog, OQL, etc.
– Les techniques de stockage : sur disque (optique), sur bande.
– L’organisation des fichiers : index, arbre-B, hachage, ...
– L’architecture : centralisée, distribuée, sur d’autres bases accessibles par réseau.
– Les techniques d’évaluation et d’optimisation de requêtes.
– La concurrence d’accès et les techniques de reprise sur pane.
Pour mettre un peu d’ordre dans tout cela, on peut se raccrocher à une architecture
standard conforme à la plus grande partie des SGBD existant, et offrant l’avantage de
bien illustrer les principales caractéristiques d’un SGBD.
Cette architecture distingue trois niveaux correspondant d’une part à trois
représentations équivalentes de l’information, d’autre part aux champs
d’interventions respectifs des principaux acteurs. Pour ces derniers, nous utiliserons
la terminologie suivante :
– Utilisateur naïf : du non spécialiste des SGBD au non informaticien.
– Concepteur et programmeur d’application : à partir des besoins des différents
utilisateurs, écrit l’application pour des utilisateurs “naïfs”.
– Utilisateur expert : informaticien connaissant le fonctionnement interne d’un SGBD
et chargé d’administrer la base.
Chaque niveau du SGBD remplit (réalise) un certain nombre de fonctions :
Le modèle relationnel 5
Optimisation
L’optimisation (d’une requête) s’appuie sur l’organisation physique des données. Les
principaux types d’organisation sont les fichiers séquentiels, les index (denses.
secondaires, arbres B) et le regroupement des données par hachage.
Un module particulier du SGBD, l’optimiseur, tient compte de cette organisation et
des caractéristiques de la requête pour choisir le meilleur séquencement des
opérations.
Concurrence d’accès
Plusieurs utilisateurs doivent pouvoir accéder en même temps aux mêmes données.
Le SGBD doit savoir :
– Gérer les conflits si les deux font des mises-à-jour.
Le modèle relationnel 6
Le plan du cours
Le cours comprend trois parties consacrées successivement à la conception d’une
base de données relationnelles, aux langages de requêtes relationnels, enfin à la
pratique d’un SGBD relationnel.
Langages relationnels
Les langages d’interrogation et de manipulation de données suivants sont présentés :
l’algèbre relationnelle qui fournit un petit ensemble d’opérateurs permettant
d’exprimer des requêtes complexes et le langage SQL, norme SQL2.
Introduction
"La conception et l'utilisation de bases de données relationnelles sur micro-
ordinateurs n'est pas un domaine réservé aux informaticiens". C'est en tout cas ce
Le modèle relationnel 7
que pensent beaucoup d'utilisateurs en voyant ce type de logiciel intégré aux suites
bureautiques les plus connues.
Plusieurs étapes sont nécessaires à la mise en place d'une base de données, dès lors
que l'on a précisément défini ses besoins (ce qui n'est déjà pas chose facile !) : la
création de la structure de la base sous forme de tables (tableaux de données) reliées
entre elles par des données clés, la conception des requêtes qui permettront
d'extraire ou de mettre à jour les informations qu'elle contient, la conception de
l'interface homme-machine (écrans et états) qui rendra plus conviviale la saisie et la
restitution des informations.
Bon nombre d'utilisateurs qui voient les matériels informatiques et les logiciels
changer tous les trois mois, seraient surpris d'apprendre que l'algèbre relationnelle a
été définie par Codd en 1970.
Elle est à l'origine du langage SQL (Structured Query Language) d'IBM, langage
d'interrogation et de manipulation de tous les SGBDR actuels (Oracle, Ingres, DB2,
MS SQLServer, MySQL, MS Access et tous les autres).
Elle est également mise en œuvre de manière plus conviviale à travers le langage
QBE (Query By Example) que l'on retrouve seulement sur certains SGBDR (Access
par exemple) et qui n'est pas présenté ici.
Tous les opérateurs sont présentés à l'aide d'exemples clairs. Pris séparément, ils sont
faciles à appréhender. La rédaction de requêtes (combinaison d'opérateurs) est
illustrée par des exercices concrets.
Le langage SQL n'est abordé que dans le cadre des opérations évoquées ci-dessus.
Seule l'instruction SELECT et ses multiples aspects sont donc présentés.
Le modèle relationnel 9
Le Modèle Relationnel
L'exemple suivant, relatif à la gestion simplifiée des étapes du Tour de France
97, va nous servir à introduire le vocabulaire lié au modèle relationnel.
Le modèle relationnel 10
CodePays NomPays
ALL ALLEMAGNE
AUT AUTRICHE
BEL BELGIQUE
DAN DANEMARK
ESP ESPAGNE
FRA FRANCE
G-B GRANDE BRETAGNE
ITA ITALIE
P-B PAYS-BAS
RUS RUSSIE
SUI SUISSE
Le modèle relationnel 11
… …
Comme nous pouvons le constater, le modèle relationnel est un modèle
d'organisation des données sous forme de Tables (Tableaux de valeurs) ou chaque
Table représente une Relation, au sens mathématique d'Ensemble.
C'est ainsi que dans l'exemple présenté, figurent l'ensemble des Equipes, des Coureurs, des
Etapes, des Temps réalisés par les coureurs à chacune des étapes, et enfin l'ensemble des pays.
Les colonnes des tables s'appellent des attributs et les lignes des n-uplets (où n est
le degré de la relation, c'est à dire le nombre d'attributs de la relation).
Un attribut ne prend qu'une seule valeur pour chaque n-uplet.
L'ordre des lignes et des colonnes n'a pas d'importance.
Chaque table doit avoir une clé primaire constituée par un ensemble minimum
d'attributs permettant de distinguer chaque n-uplet de la Relation par rapport à
tous les autres. Chaque ensemble de valeurs formant la clé primaire d'un n-uplet
est donc unique au sein d'une table.
Dans certains cas, plusieurs clés primaires sont possibles pour une seule table. On
parle alors de clés candidates. Il faut alors en choisir une comme clé primaire.
Les liens sémantiques (ou règles de gestion sur les données) existants entre les
ensembles sont réalisés par l'intermédiaire de clés étrangères faisant elles-mêmes
référence à des clés primaires d'autres tables.
C'est ainsi que dans la table COUREURS, la clé étrangère CodeEquipe (faisant
référence à la clé primaire de même nom dans la table EQUIPES) traduit les deux
règles de gestion suivantes :
C'est ainsi que la table des TEMPS réalisés à chaque étape par chacun des
coureurs exprime les deux règles de gestion suivantes :
Le modèle relationnel est le plus souvent décrit sous la forme suivante, les clés
primaires étant soulignées et les clés étrangères marquées par un signe distinctif
(ici *).
Opération PROJECTION
Et en langage SQL
SELECT DISTINCT liste d'attributs FROM table ;
SELECT liste d'attributs FROM table ;
Exemples :
SELECT DISTINCT Espèce FROM Champignons ;
Exemples :
CHAMPIGNONS
R1 = PROJECTION (CHAMPIGNONS, Espèce)
Espèce
Rosé des prés
Coulemelle
R2 = PROJECTION (CHAMPIGNONS, Espèce, Catégorie)
Espèce Catégorie
Rosés des prés Conserve
Rosé des prés Sec
Coulemelle Frais
Cet opérateur ne porte que sur 1 relation.
Il permet de ne retenir que certains attributs spécifiés d'une relation.
On obtient tous les n-uplets de la relation à l'exception des doublons.
Le modèle relationnel 14
Opération SELECTION
Et en langage SQL
Exemple :
La condition de sélection exprimée derrière la clause WHERE peut être spécifiée à l'aide :
Autres exemples :
SELECT *
FROM ETUDIANT
WHERE Age IN (19, 20, 21, 22, 23) ;
SELECT *
FROM ETUDIANT
WHERE Age BETWEEN 19 AND 23 ;
SELECT *
FROM ETUDIANT
WHERE CodePostal LIKE '42%' ; // sous Access : LIKE "42*"
SELECT *
FROM ETUDIANT
WHERE CodePostal LIKE '42___' ; // sous Access : LIKE "42???"
SELECT *
FROM ETUDIANT
WHERE Ville IS NULL ; // Etudiants pour lesquels la ville n'est pas renseignée
SELECT *
FROM ETUDIANT
WHERE Ville IS NOT NULL ; // Etudiants pour lesquels la ville est renseignée
Le modèle relationnel 15
SELECT *
FROM ETUDIANT
WHERE Age >= ALL (SELECT Age FROM ETUDIANT) ; // Etudiant(s) le(s)
plus âgé(s)
Exemple :
CHAMPIGNONS
R3 = SELECTION (CHAMPIGNONS, Catégorie = "Sec")
Et en langage SQL
En SQL de base :
Exemple :
Avec la clause INNER JOIN (jointure dite interne) à partir du SQL2, supportée
aujourd'hui par tous les SGBDR :
SELECT *
FROM table1 INNER JOIN table2 ON table1.attribut1=table2.attribut1 INNER JOIN
table3 ON table2.attribut2=table3.attribut3... ;
Le mot clé INNER est facultatif sur la plupart des SGBDR (sauf MS Access).
Cette notation rend plus lisible la requête en distinguant clairement les conditions de
jointures, derrière ON, et les éventuelles conditions de sélection ou restriction,
derrière WHERE.
De plus, l'oubli d'un ON (et donc de la condition de jointure) empêchera l'exécution
de la requête, alors qu'avec l'ancienne notation, l'oubli d'une condition de jointure
derrière WHERE, n'empêche pas l'exécution de la requête, produisant alors un bien
coûteux produit cartésien entre les tables !
SELECT *
FROM Produit A INNER JOIN Détail_Commande B ON A.CodePrd=B.CodePrd ;
Le modèle relationnel 17
La norme SQL2 définit aussi l' équi-jointure naturelle, joignant les 2 tables sur
l'ensemble des attributs qu'elles ont en commun, mais en ne gardant qu'une seule
colonne pour chaque attribut joint, contrairement aux 2 expressions précédentes :
SELECT *
FROM table1 NATURAL JOIN table2 ;
Il est aussi possible de restreindre (ou préciser) le ou les attributs de jointure avec
USING :
SELECT *
FROM table1 INNER JOIN table2 USING (attribut1) ;
NATURAL JOIN et USING ne sont pas supportés par tous les SGBDR.
Dans le cas d'une jointure externe gauche A->B, toute les lignes de la table A sont
incluses même s'il ne leur correspond pas de ligne dans la table B.
SELECT *
FROM Produit A LEFT OUTER JOIN Détail_Commande B ON
A.CodePrd=B.CodePrd ;
Tous les produits apparaissent même si certains n'ont pas fait l'objet de commande
(exemple : 588J). Les colonnes manquantes sont alors complétées par des valeurs
NULL.
Libellé
CodePrd Prix unitaire N°cde CodePrd quantité
HD 1,6 Go
590A 1615 97001 590A 2
Scanner HP
588J 1700 97002 515J 1
LBP 660
515J 1820 97003 515J 3
Libellé
A.CodePrd Prix unitaire N°cde B.CodePrd quantité
HD 1,6 Go
590A 1615 97001 590A 2
LBP 660
515J 1820 97002 515J 1
LBP 660
515J 1820 97003 515J 3
Cet opérateur porte sur 2 relations qui doivent avoir au moins un attribut
défini dans le même domaine (ensemble des valeurs permises pour un
attribut).
La condition de jointure peut porter sur l'égalité d'un ou de plusieurs
attributs définis dans le même domaine (mais n'ayant pas forcément le
même nom).
Les n-uplets de la relation résultat sont formés par la concaténation des n-
uplets des relations d'origine qui vérifient la condition de jointure.
Remarque : Des jointures plus complexes que l'équijointure peuvent être réalisées en
généralisant l'usage de la condition de jointure à d'autres critères de comparaison
que l'égalité (<,>, <=,>=, <>).
Le modèle relationnel 19
Opération UNION
Et en langage SQL
Exemple :
Exemple :
E1 : Enseignants élus au CA E2 : Enseignants représentants syndicaux
n° enseignant nom_enseignant n°enseignant nom_enseignant
DUPONT DUPONT
1 1
DURAND MARTIN
3 4
MARTIN MICHEL
4 6
BERTRAND
5
nom_enseignant
n°enseignant
DUPONT
1
DURAND
3
MARTIN
4
BERTRAND
5
MICHEL
6
Le modèle relationnel 20
Cet opérateur porte sur deux relations qui doivent avoir le même nombre
d'attributs définis dans le même domaine (ensemble des valeurs permises
pour un attribut). On parle de relations ayant le même schéma.
La relation résultat possède les attributs des relations d'origine et les n-
uplets de chacune, avec élimination des doublons éventuels.
Opération INTERSECTION
Et en langage SQL
En SQL de base, plusieurs possibilités :
Exemple :
ou
Exemple :
nom_enseignant nom_enseignant
n° enseignant n°enseignant
DUPONT DUPONT
1 1
DURAND MARTIN
3 4
MARTIN MICHEL
4 6
BERTRAND
5
DUPONT
1
MARTIN
4
Opération DIFFERENCE
Et en langage SQL
Le modèle relationnel 22
ou encore, avec la jointure externe (SQL2), si par exemple vous utilisez une version
de MySQL qui ne dispose ni du EXCEPT, ni de la possiblité de SELECT imbriqués
Exemple :
ou
ou encore
Pour mieux comprendre cette dernière version, voici le résultat renvoyé par la
jointure externe gauche entre E1 et E2 :
1 DUPONT 1 DUPONT
3 DURAND NULL NULL
4 MARTIN 4 MARTIN
5 BERTRAND NULL NULL
Exemple :
nom_enseignant nom_enseignant
n° enseignant n°enseignant
DUPONT DUPONT
1 1
DURAND MARTIN
3 4
MARTIN MICHEL
4 6
BERTRAND
5
On désire obtenir la liste des enseignants du CA qui ne sont pas des représentants
syndicaux.
nom_enseignant
n°enseignant
DURAND
3
BERTRAND
5
Et en langage SQL
Exemple :
Exemple :
Gestion financière
5
DUPONT Informatique
101 2
DUPONT Mathématiques
101 3
MARTIN Informatique
102 2
MARTIN Mathématiques
102 3
La plupart des requêtes (ou interrogations) portant sur une base de données
relationnelle ne peuvent pas être réalisées à partir d'une seule opération mais en
enchaînant successivement plusieurs opérations.
Exemple
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées
par *
R1=SELECTION(COMMANDE, Date=10/06/97)
R2=JOINTURE(R1, CLIENT, R1.CodeClient=CLIENT.CodeClient)
R3=PROJECTION(R2, CodeClient, NomClient)
Soit le modèle relationnel suivant relatif à une base de données sur des
représentations musicales :
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par
*
Questions :
2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.
3 - Donner la liste des noms des musiciens et des titres des représentations
auxquelles ils participent.
4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la journée
du 14/09/96.
Et en langage SQL...
2 - Donner la liste des titres des représentations ayant lieu à l'opéra Bastille.
R1 = SELECTION(REPRESENTATION, lieu="Opéra Bastille")
R2 = PROJECTION(R1, titre_représentation)
Et en langage SQL...
3 - Donner la liste des noms des musiciens et des titres des représentations
auxquelles ils participent.
R1 = JOINTURE(MUSICIEN, REPRESENTATION,
Musicien.n°représentation=Représentation.n°représentation)
R2 = PROJECTION(R1, nom, titre_représentation)
Et en langage SQL...
Le modèle relationnel 27
4 - Donner la liste des titres des représentations, les lieux et les tarifs pour la
journée du 14/09/96.
R1 = SELECTION(PROGRAMMER, date=14/09/96)
R2 = JOINTURE(R1, REPRESENTATION,
R1.n°représentation=Représentation.n°représentation)
R3 = PROJECTION(R2, titre_représentation, lieu, tarif)
Et en langage SQL...
Opération CALCULER
Et en langage SQL
Exemple :
Exemple
LIGNE_COMMANDE
96008 A10 10 83
96008 B20 35 32
96009 A10 20 83
96010 A15 4 110
96010 B20 55 32
On désire obtenir le chiffre d'affaires total Ht, ainsi que le nombre total de produits
commandés :
R1=CALCULER(LIGNE_COMMANDE, Somme(Quantité*PuHt), Somme(Quantité))
Somme(Quantité*PuHt) Somme(Quantité)
5810 124
Les calculs et/ou comptage portent sur la relation R0.
La relation résultat ne comportera qu'une ligne avec autant de colonnes que
de résultats demandés ou pourra simplement être considérée comme un
nombre N utilisable ultérieurement en tant que tel dans le cas où un seul
résultat est attendu.
Opération REGROUPER_ET_CALCULER
Et en langage SQL
Exemple :
La clause GROUP BY est obligatoire dès qu'il y a à la fois des attributs et des
fonctions d'agrégation derrière la clause SELECT.
Sur la plupart des SGBDR, tous les attributs placés derrière la clause SELECT
doivent être présents derrière la clause GROUP BY. La proposition inverse n'est
pas vraie.
Le modèle relationnel 29
Il est possible de sélectionner des lignes issues d'un regroupement (grâce à la clause
HAVING) et même de les trier.
Exemple : on souhaite, parmi l'ensemble des commandes, ne retenir que celles dont
le montant total hors taxes est supérieur à 10000. De plus on souhaite les voir
apparaître par ordre décroissant de leurs montants respectifs.
Il n'est pas toujours possible de placer une fonction derrière la clause ORDER BY.
Mais les colonnes projetées derrière la clause SELECT étant implicitement
numérotées de 1 à n, il est facile d'y faire référence. Ceci explique la présence du
chiffre 2 derrière le ORDER BY de l'exemple : il fait référence à
SUM(Quantité*PuHt).
Exemple
LIGNE_COMMANDE
N°BonCommande MontantHt
96008 1950
96009 1660
Le modèle relationnel 30
96010 2200
Et en langage SQL
La fonction de comptage
Opération TRI
Et en langage SQL
Exemple :
Remarque : par défaut le tri se fait par ordre croissant si l'on ne précise pas ASC ou
DESC.
Exemple :
CHAMPIGNONS
Espèce Catégorie Conditionnement
Rosé des prés Conserve Bocal
Rosé des prés Sec Verrine
Coulemelle Frais Boîte
Rosé des prés Sec Sachet plastique
Un attribut calculé est un attribut dont les valeurs sont obtenues par des opérations
arithmétiques portant sur des attributs de la même relation.
Le calcul est spécifié lors d'une projection ou lors de l'utilisation d'une fonction.
Attributs renommés
Et en langage SQL
Attributs calculés
Attributs renommés
Exemple
LIGNE_COMMANDE
Le modèle relationnel 33
Soit le modèle relationnel suivant relatif à la gestion des notes annuelles d'une
promotion d'étudiants :
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par
*
Questions :
2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus
basse ?
3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?
7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la
moyenne générale de la promotion ?
Et en langage SQL...
2 - Quelles sont, parmi l'ensemble des notes, la note la plus haute et la note la plus
basse ?
R=CALCULER(EVALUER, Minimum(Note), Maximum(Note))
Et en langage SQL...
3 - Quelles sont les moyennes de chaque étudiant dans chacune des matières ?
R1=REGROUPER_ET_CALCULER(EVALUER, N°Etudiant, CodeMat, MoyEtuMat :
Moyenne(Note))
R2=JOINTURE(R1, MATIERE, MATIERE.CodeMat=R1.CodeMat)
R3=JOINTURE(R2, ETUDIANT, ETUDIANT.N°Etudiant=R2.N°Etudiant)
MOYETUMAT=PROJECTION(R3, N°Etudiant, Nom, Prénom, LibelléMat, CoeffMat,
MoyEtuMat)
Et en langage SQL...
utilisation).
Sous Access, il ne faut pas utiliser la commande CREATE VIEW mais
seulement enregistrer la requête. Il est alors possible de s'en resservir comme
une table.
Et en langage SQL...
7 - Quels sont les étudiants qui ont une moyenne générale supérieure ou égale à la
moyenne générale de la promotion ?
idem question 5 et 6 puis :
R=SELECTION(MGETU, MgEtu>=MG)
Et en langage SQL...
Le modèle relationnel 36
Opération DIVISION
Et en langage SQL
Cependant il est toujours possible de trouver une autre solution, notamment par
l'intermédiaire des opérations de calcul et de regroupement.
Dans l'exemple présenté, on souhaite trouver les athlètes qui participent à toutes les
épreuves. En algèbre relationnelle une autre solution que la division pourrait être :
N=CALCULER(EPREUVE, Comptage())
R1=REGROUPER_ET_CALCULER(PARTICIPER, Athlète, Nb:Comptage())
R2=SELECTION(R1, Nb=N)
R3=PROJECTION(R2, Athlète)
et en SQL :
On pourra trouver cette solution imparfaite par rapport aux solutions plus "propres"
généralement données pour la division, solutions souvent basées sur une double
négation et mettant en oeuvre plusieurs SELECT imbriqués et corrélés (très coûteux
en temps d'exécution). Approfondissons les choses avec un autre jeu d'essai
volontairement plus contraignant :
PARTICIPER EPREUVE
Athlète Epreuve Epreuve
Dupont 200 m 200 m
Dupont 400 m 400 m
Dupont 110 m H 110 m H
Dupont 100 m 200 m
Martin 200 m
Martin 400 m
Martin 110 m H
Bertrand 200 m
Le modèle relationnel 37
Bertrand 400 m
Michel 200 m
On peut alors vouloir obtenir :
1) les athlètes ayant participé au moins à toutes les épreuves de la table EPREUVE
(Dupont et Martin)
2) les athlètes qui ont participé uniquement aux épreuves de la table EPREUVE et à
aucune autre (Division "exacte"), ici Martin.
Dans le 1er cas, la solution n'est guère plus compliquée :
Dans le 2ème cas, il est encore possible de répondre assez "simplement" à la question
sur la base d'une jointure externe (SQL2) et en utilisant la particularité des fonctions
d'agrégation d'ignorer les valeurs nulles. Voici cette solution :
SELECT Athlète
FROM PARTICIPER A LEFT JOIN (SELECT DISTINCT Epreuve FROM
EPREUVE) B ON A.Epreuve = B.Epreuve
GROUP BY Athlète
HAVING COUNT(*) = (SELECT COUNT(DISTINCT Epreuve) FROM EPREUVE)
AND COUNT(B.Epreuve) = (SELECT COUNT(DISTINCT Epreuve) FROM
EPREUVE) ;
Martin 3 3
Bertrand 2 2
Michel 1 1
Seul Martin a les 2 résultats égaux au nombre d'épreuves différentes (et vérifie donc
la condition exprimée derrière le HAVING). CQFD !
Je vous laisse comparer avec l'autre type de solution (plus élégante) basée sur la
double négation et les SELECT imbriqués et corrélés :
SELECT Athlète FROM PARTICIPER A
WHERE NOT EXISTS (SELECT * FROM EPREUVE
WHERE NOT EXISTS (SELECT * FROM PARTICIPER B
WHERE (A.Athlète = B.Athlète)
AND (B.Epreuve =
EPREUVE.Epreuve)))
GROUP BY Athlète
HAVING COUNT(*) = (SELECT COUNT (DISTINCT Epreuve) FROM EPREUVE)
;
Exemple :
Cet opérateur porte sur 2 relations qui doivent avoir au moins un attribut
défini dans le même domaine.
Tous les attributs du diviseur (ici EPREUVE) doivent être des attributs du
dividende (ici PARTICIPER).
La relation dividende doit avoir au moins une colonne de plus que la
relation diviseur.
La relation résultat, le quotient, possède les attributs non communs aux deux
relations initiales et est formée de tous les n-uplets qui, concaténés à chacun
des n-uplets du diviseur (ici EPREUVE) donne toujours un n-uplet du
dividende (ici PARTICIPER).
Le modèle relationnel 39
Soit le modèle relationnel suivant relatif à la gestion simplifiée des étapes du Tour de
France 97, dont une des étapes de type "contre la montre individuel" se déroula à
Saint-Etienne :
Remarque : les clés primaires sont soulignées et les clés étrangères sont marquées par
*
Questions :
3 - Quel est le nombre de kilomètres total des étapes de type "Haute Montagne" ?
4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?
5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
6 - Quel est le classement général des coureurs (nom, code équipe, code pays et
temps des coureurs) à l'issue des 13 premières étapes sachant que les bonifications
ont été intégrées dans les temps réalisés à chaque étape ?
R1=SELECTION(EQUIPE, NomEquipe="FESTINA")
R2=JOINTURE(R1, COUREUR, R1.CodeEquipe=COUREUR.CodeEquipe)
R3=JOINTURE(R2, PAYS, R2.CodePays=PAYS.CodePays)
R4=PROJECTION(R3, NuméroCoureur, NomCoureur, NomPays)
Et en langage SQL...
SELECT SUM(Nbkm)
FROM ETAPE A INNER JOIN TYPE_ETAPE B ON
A.CodeType=B.CodeType
WHERE LibelléType="HAUTE MONTAGNE" ;
4 - Quels sont les noms des coureurs qui n'ont pas obtenu de bonifications ?
R1=PROJECTION(COUREUR, NuméroCoureur)
R2=PROJECTION(ATTRIBUER_BONIFICATION, NuméroCoureur)
R3=DIFFERENCE(R1,R2)
R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur)
R5=PROJECTION(R4, NomCoureur)
Et en langage SQL...
C.NuméroCoureur=A.NuméroCoureur
WHERE A.NuméroCoureur IS NULL ;
5 - Quels sont les noms des coureurs qui ont participé à toutes les étapes ?
R1=PROJECTION(PARTICIPER, NuméroCoureur, NuméroEtape)
R2=PROJECTION(ETAPE, NuméroEtape)
R3=DIVISION(R1, R2)
R4=JOINTURE(R3, COUREUR, R3.NuméroCoureur=COUREUR.NuméroCoureur)
R5=PROJECTION(R4, NomCoureur)
ou
N=CALCULER(ETAPE, Comptage())
R1=REGROUPER_ET_CALCULER(PARTICIPER, NuméroCoureur, Nb:Comptage())
R2=SELECTION(R1, Nb=N)
R3=JOINTURE(R2, COUREUR, R2.NuméroCoureur=COUREUR.NuméroCoureur)
R4=PROJECTION(R3, NomCoureur)
Et en langage SQL...
SELECT NomCoureur
FROM PARTICIPER A INNER JOIN COUREUR B ON
A.NuméroCoureur=B.NuméroCoureur
GROUP BY NuméroCoureur, NomCoureur
HAVING COUNT(*)=(SELECT COUNT(*) FROM ETAPE) ;
6 - Quel est le classement général des coureurs (nom, code équipe, code pays et
temps des coureurs) à l'issue des 13 premières étapes sachant que les bonifications
ont été intégrées dans les temps réalisés à chaque étape ?
R1=SELECTION(PARTICIPER, NuméroEtape=13)
R2=PROJECTION(R1, NuméroCoureur)
-> R2 représente l'ensemble des coureurs présents jusqu'à la 13ème étape (ce qui va
permettre de ne pas prendre en compte dans le classement ceux qui ont abandonné
avant !)
R3=JOINTURE(R2, PARTICIPER,
R2.NuméroCoureur=PARTICIPER.NuméroCoureur)
R4=SELECTION(R3, NuméroEtape<=13)
R5=REGROUPER_ET_CALCULER(R4, NuméroCoureur,
Total:Somme(TempsRéalisé))
R6=JOINTURE(R5, COUREUR, R5.NuméroCoureur=COUREUR.NuméroCoureur)
R7=PROJECTION(R6, NomCoureur, CodeEquipe, CodePays, Total)
R8=TRI(R7, Total)
Et en langage SQL...
Le modèle relationnel 42