Académique Documents
Professionnel Documents
Culture Documents
INTRODUCTION AUX
BASES DE DONNEES
Version du 04/01/2022
3
Tarik BOUDAA, ENSA Al Hoceima
6. Spécialisation (héritage) ............................................................................................................ 31
Chapitre 3 : Modèle relationnel ......................................................................................................... 32
1. Introduction ............................................................................................................................... 32
2. Éléments du modèle relationnel ................................................................................................ 32
2.1. Attribut et le domaine d’un attribut : ................................................................................. 32
2.2. Relation, schéma de relation, schéma relationnel, et base de données relationnelle ......... 32
2.3. Clé candidate, clé primaire, et clé étrangère ...................................................................... 33
3. Règles de passage du MCD au MLD ........................................................................................ 33
3.1. Règle 1 : Le traitement des entités..................................................................................... 33
3.2. Règle 2 : Association binaire 1,1 ___x,n (avec x=0 ou x =1) ......................................... 33
3.3. Règle 3 : Association binaire 0,1 ____1,1 ......................................................................... 34
3.4. Règle 4 : Association binaire 0,1 -0,1 ............................................................................... 35
3.5. Règle 5 : Association binaire 0,1___x,n (avec x=0 ou x =1) ............................................ 36
3.6. Règle 6 : Association binaire x,n -x,n (avec x=0 ou x=1) ................................................. 36
3.7. Règle 7 : Associations n-aires ........................................................................................... 37
3.8. Règle 8 : Associations réflexives ...................................................................................... 38
3.9. Règle 9 : Cas d’une entité ayant que la clé comme attribut............................................... 38
3.10. Règle 10 : Cas d’un lien identifiant : ............................................................................. 39
3.11. Règle 11 : Cas de l’agrégat :.......................................................................................... 39
3.12. Règle 11 : Cas de la spécialisation (héritage) : .............................................................. 40
4. Normalisation ............................................................................................................................ 41
Chapitre 4 : Création des tables, insertion et modification des données ........................................ 42
1. Langage SQL ............................................................................................................................. 42
2. Création d’une table .................................................................................................................. 42
3. Contraintes d’intégrité : ............................................................................................................. 43
3.1. Définition des contraintes d’intégrité ................................................................................ 43
3.2. Règles relatives aux contraintes ........................................................................................ 44
3.3. Contrainte au niveau colonne : .......................................................................................... 44
3.4. Contrainte au niveau table : ............................................................................................... 45
4. Création une table avec une sous-interrogation......................................................................... 46
5. Casse et commentaires : ............................................................................................................ 46
6. Suppression d’une table avec DROP TABLE : ......................................................................... 46
7. Modifier une table avec ALTER TABLE ................................................................................. 47
7.1. Ajouter, supprimer, désactiver ou renommer une contrainte ............................................ 47
4
Tarik BOUDAA, ENSA Al Hoceima
7.2. Ajout des colonnes dans une table :................................................................................... 47
7.3. Modifier les colonnes d’une table : ................................................................................... 48
7.4. Supprimer les colonnes d’une table :................................................................................. 48
7.5. Renommer une colonne ..................................................................................................... 48
7.6. Renommer une table .......................................................................................................... 48
8. Type de données Oracle ............................................................................................................ 48
8.1. Type caractères : ................................................................................................................ 48
8.2. Date/Heure......................................................................................................................... 49
8.3. Type numérique ................................................................................................................. 49
9. Insertion d’enregistrements ....................................................................................................... 49
9.1. L’instruction INSERT INTO …VALUES ........................................................................ 49
9.2. Insertion des données par une sélection ............................................................................ 50
10. Modification d’enregistrements............................................................................................. 51
11. Suppression d’enregistrements .............................................................................................. 51
12. Transactions et points de reprise ........................................................................................... 52
Chapitre 5 : Interrogation des données ............................................................................................. 53
1. Syntaxe générale d’une interrogation SQL ............................................................................... 53
1.1. Clause SELECT ................................................................................................................ 53
1.2. Clause FROM .................................................................................................................... 54
1.3. CLAUSE WHERE ............................................................................................................ 54
2. Jointure ...................................................................................................................................... 55
2.1. Jointure naturelle : ............................................................................................................. 56
2.2. Jointures naturelles et la clause WHERE : ........................................................................ 56
2.3. Clause JOIN USING : ....................................................................................................... 56
2.4. Clause ON ......................................................................................................................... 57
2.5. Jointure d'une table avec elle-même .................................................................................. 57
2.6. Jointures impliquant plusieurs tables :............................................................................... 57
2.7. Jointure externes ................................................................................................................ 58
3. CLAUSE ORDER BY .............................................................................................................. 59
4. Utilisation des fonctions prédéfinie ........................................................................................... 60
4.1. Fonctions de groupes : ....................................................................................................... 60
4.2. Clause GROUP BY et HAVING ...................................................................................... 61
4.3. Fonctions monolignes........................................................................................................ 61
5. Opérations ensemblistes ............................................................................................................ 71
5
Tarik BOUDAA, ENSA Al Hoceima
5.1. Opérateur UNION ............................................................................................................. 71
5.2. Opérateur INTERSECT..................................................................................................... 71
5.3. Opérateur EXCEPT (ou MINUS pour Oracle).................................................................. 72
6. Sous-interrogations .................................................................................................................... 72
6.1. Sous-interrogation à une ligne et une colonne................................................................... 72
6.2. Sous-interrogation ramenant plusieurs lignes.................................................................... 73
6.3. Sous-interrogation synchronisée ....................................................................................... 74
6.4. Sous-interrogation ramenant plusieurs colonnes ............................................................... 74
6.5. Clause EXISTS.................................................................................................................. 75
6.6. Sous-interrogation et valeurs NULL ................................................................................. 75
6
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases
de données
1. Introduction
Aujourd’hui, la disponibilité de systèmes de gestion de base de données fiables permet aux
organisations de toutes tailles de gérer des données efficacement, de déployer des applications utilisant
ces données et de les stocker. Les bases de données sont actuellement au cœur du système d’information
des entreprises.
Les bases de données relationnelles constituent l’objet de ce cours. Ces bases sont conçues suivant
le modèle relationnel, dont les fondations théoriques sont solides, et manipulées en utilisant l’algèbre
relationnelle. Il s’agit, à ce jour, de la méthode la plus courante pour organiser et accéder à des ensembles
de données.
Le présent chapitre a comme objectif d’introduire d’une manière intuitive les notions de base
nécessaires à la création des bases de données sans entrer dans les détails théoriques, qui seront étudiés
dans les chapitres avancés de ce cours.
- L’application e-services de l’ENSAH utilise une base de données pour gérer les
informations des étudiants, les rapports de PFE, les cours, …
- Le catalogue électronique de la bibliothèque de l’ENSAH utilise une base de données pour
gérer les livres, les thèmes, les emprunts,…
Chapitre 1 : Introduction aux bases de données
- Une base de données de gestion de l'activité d'une société de transport, comme la CTM,
pourrait permettre la gestion des réservations, des disponibilités des véhicules en fonction
des voyages à effectuer, des affectations des personnels, …
Plus rigoureusement une base de données est un ensemble structuré de données (1) enregistrées
sur des supports accessibles par l’ordinateur (2) pour satisfaire simultanément plusieurs
utilisateurs (3) de manière sélective (4) en un temps opportun(5).
L’utilisation de fichiers classiques pourrait sembler pouvoir apporter une solution au problème de
gestion des données. Mais l’utilisation directe de gros fichiers soulève de gros problèmes :
- Lourdeur d’accès aux données. En pratique, pour chaque accès aux données, même le plus
simple, il faudrait écrire un programme.
- Difficulté de gestion manuelle des fichiers de données.
- Manque de sécurité. Si tout programmeur peut accéder directement aux fichiers, il est
impossible de garantir la sécurité et l’intégrité des données.
- Pas de contrôle de concurrence. Dans un environnement dans lequel plusieurs utilisateurs
accèdent aux mêmes données, des problèmes de concurrence d’accès se posent.
- Problèmes de performance lors d’accès aux gros fichiers de données
- Problèmes de redondance de données : une répétition des données lors de leur insertion
dans les fichiers. Cette redondance est souvent la cause d’anomalies provenant de la
complexité des insertions.
- Incohérence en modification : La redondance de l’information entraîne également des
risques en cas de modification d’une donnée car on oublie fréquemment de modifier toutes
ses occurrences.
- …
Il est donc nécessaire d’avoir recours à un logiciel chargé de gérer les fichiers constituant une base
de données, de prendre en charge les fonctionnalités de protection et de sécurité et de fournir les
différents types d’interfaces nécessaires à l’accès aux données. Ce logiciel très complexe s’appelle le
SGDB, la section suivante est consacrée à la présentation de ce type de logiciel.
8
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases de données
Figure 1
Plus précisément, les systèmes de gestion de bases de données (SGBD) sont des programmes
permettant à l’utilisateur de créer et de gérer des bases de données. Les SGBD sont des logiciels à usage
général qui assurent les processus de définition, de construction, de manipulation et de partage des bases
de données par et entre les différents utilisateurs et applications.
Exemples de SGBD :
Oracle est un SGBD relationnel (et relationnel-objet dans ses dernières versions) très
reconnu pour les applications professionnelles.
9
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases de données
PostgreSQL est un SGBD relationnel et relationnel-objet très puissant qui offre une
alternative open source aux solutions commerciales comme Oracle ou IBM.
MySQL est un SGBD relationnel libre (licence GPL et commerciale), simple d'accès et très
utilisé pour la réalisation de sites Web dynamiques.
Access est un SGBD relationnel Microsoft, qui offre une interface graphique permettant de
concevoir rapidement des applications de petite envergure ou de réaliser des prototypes.
La définition d’une base de données implique une spécification des types de données, des structures
et des contraintes. La construction d’une base de données consiste à enregistrer les données proprement
dites sur un support de stockage contrôlé par le SGBD. La manipulation de la base consiste notamment
à l’interroger afin d’en extraire des informations, à l’actualiser en fonction des modifications du
microcosme considéré et à générer des rapports. Le partage d’une base de données permet à différents
utilisateurs et applications d’y accéder simultanément.
Les SGBD assurent d’autres fonctions importantes, notamment la protection de la base de données
et son entretien à long terme. La protection implique à la fois la protection du système contre les pannes
logicielles et matérielles et la protection sécuritaire contre les accès illicites ou malveillants. Une grande
base de données peut être utilisée de nombreuses années. Le SGBD doit donc être capable d’entretenir
et de faire évoluer ses propres structures dans la durée.
La complexité d’un SGBD tient essentiellement à la diversité des techniques mises en œuvre, à la
multiplicité des composants intervenant dans son architecture, et aux différents types d’utilisateurs
(administrateurs, programmeurs, utilisateurs non informaticiens, ...) qui sont confrontés, à différents
niveaux, au système.
Chaque champ a un type de données, par exemple les champs Nom, Prénom et CIN sont de type
chaîne de caractères et la colonne Age et CNE peuvent être considérés de type numérique.
Une base de données peut être vue comme un ensemble de table :
10
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases de données
Figure 2
Pour donner un exemple concret, voici quelques noms de tables que l'on peut être amené à créer
pour les besoins d’une base de données d’un simple site web :
- News_Tab : stocke toutes les actualités qui sont affichées sur le site ;
- Forum_Tab : stocke tous les messages postés sur le forum ;
- Newsletter_Tab : stocke les adresses e-mail de tous les visiteurs inscrits à la newsletter.
11
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases de données
Dans l’ordre SQL précédent, N colonnes ont été définies. Le mot-clé « type_données » sera à
remplacer par un mot-clé pour définir le type de données (INT, DATE, TEXT …). Pour chaque colonne,
il est également possible de définir des options telles que (liste non-exhaustive) :
NOT NULL : empêche d’enregistrer une valeur nulle pour une colonne.
DEFAULT : attribuer une valeur par défaut si aucune donnée n’est indiquée pour cette
colonne lors de l’ajout d’une ligne dans la table.
PRIMARY KEY : indiquer si cette colonne est considérée comme clé primaire pour un
index.
L’utilisation la plus courante de SQL consiste à lire des données issues de la base de données. Cela
s’effectue grâce à la commande SELECT, qui retourne des enregistrements dans un tableau de résultat.
L’utilisation basique de cette commande s’effectue de la manière suivante:
Exemple 1 :
Nous voulons ajouter sur le site de l’ENSAH un livre d’or. Un livre d'or est un endroit où les visiteurs
inscrivent des remarques sur ce qu'ils pensent du site.
Un commentaire est composé d'un pseudo, d’un nom, d’un email, d'un message et d'une date. On
considère que toutes ces informations sont obligatoires pour un commentaire.
Question :
a. Donner la structure des tables dont aura besoin le développeur du site pour ajouter un livre
d’or.
b. Ecrire le code SQL permettant de créer ces tables
c. Ecrire le code SQL qui va permettre d’afficher tous les commentaires des visiteurs
Réponses :
Puisque un commentaire est composé d'un pseudo, d’un nom, d’un email, d'un message et d'une
date. Nous aurons besoin d’une seule table ayant la structure ci-dessous :
pseudo nom email message date
12
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases de données
Nous pouvons choisir, par exemple, comme nom pour cette table « Ensah_Commentaire ».
Ainsi le code SQL pour créer cette table peut être les suivant :
Pour afficher tous les commentaires il suffira d’utiliser une requête SQL :
Exemple 2 :
Une société de construction automobile désire informatiser sa gestion.
- Pour chaque véhicule, on connait le code d’identification, le poids, le nombre de cylindres.
- De nombreux exemplaires de chaque véhicule sont fabriqués. Pour chacun d’entre eux, on
connait la couleur, le numéro de série et l’année de fabrication.
On demande de fournir la structure des tables de la base de données.
Réponses :
Nous pouvons envisager initialement une table pour y stocker les véhicules et une autre pour stocker
les exemplaires, avec les structures décrite ci-dessous :
La table Vehicule_Tab :
id_vehicule Code_identification poids Nombre_cyclindres
1 101201010 300 16
2 529901880 200 8
La table Exemplaire_Vehicule_Tab :
id_ exemplaire couleur num_serie annee_fabrication
Le problème avec les choix effectués précédent est qu’il n y a aucune relation entre un exemplaire
et le véhicule. Par exemple, nous nous ne pouvons pas savoir pour un exemplaire quel est son poids, ou
son nombre de cylindres.
13
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 1 : Introduction aux bases de données
La solution est d’ajouter une autre colonne dans la table Exemplaire_Vehicule_Tab qui stocke
l’identifiant du véhicule.
1 101201010 300 16
2 529901880 200 8
Ainsi pour chaque exemplaire nous pouvons connaitre son véhicule et ainsi connaitre son poids et
son nombre de cylindres.
Nous allons voir un peu plus loin dans ce cours que ce type de colonne s’appelle une clé étrangère.
Exemple 3 :
Supposons maintenant que nous devons créer une base de données d’une grande entreprise de
transport, nous serons amenées par exemple à gérer, entre autres, les choses suivantes : Gestion du
personnel, Gestion des congés et des absences du personnel, Gestion des compétences du personnel,
Gestion véhicules, Gestion de la maintenance, Gestion de voyages, Gestion des réservations, gestion
des réclamations, Gestion financière de l’entreprise…
Essayons d’imaginer maintenant la structure de tous les tables nécessaires pour une telle base de
données en utilisant l’approche simpliste utilisée dans les deux exemples précédents.
Nous pouvons déduire rapidement que cette approche ne pourra pas aboutir facilement et
efficacement à la définition des structures de toutes les tables nécessaires. C’est pour cette raison qu’il
faut une phase de conception et de modélisation avec un modèle plus proche du monde réel avant de
faire le passage à la structure des tables compréhensibles par le SGBD.
Le chapitre suivant est consacré à l’étude du modèle conceptuel permettant d’aboutir à une
conception rigoureuse du modèle de données avant de passer à l’implémentation réelle de la base de
données sous un SGBD.
14
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base
de données
1. Introduction
Comme nous l’avons constaté dans l’introduction de ce cours, il est difficile de modéliser un
domaine sous une forme directement utilisable par un SGBD. Une ou plusieurs modélisations
intermédiaires sont donc utiles, le modèle entités-associations constitue l’une des premières et des plus
courantes. Ce modèle, permet une description naturelle du monde réel à partir des concepts d’entité et
d’association1. Basé sur la théorie des ensembles et des relations, ce modèle se veut universel et répond
à l’objectif d’indépendance données-programmes. Ce modèle, utilisé pour la phase de conception,
s’inscrit notamment dans le cadre d’une méthode plus générale et très répandue : Merise (Méthode
d’Étude et de Réalisation Informatique pour les Systèmes d’Entreprise).
Merise propose une démarche, dite par niveaux, dans laquelle il s’agit de hiérarchiser les
préoccupations de modélisation qui sont de trois ordres : la conception, l’organisation et la technique.
En effet, pour aborder la modélisation d’un système, il convient de l’analyser en premier lieu de façon
globale et de se concentrer sur sa fonction : c’est-à-dire de s’interroger sur ce qu’il fait avant de définir
comment il le fait. Ces niveaux de modélisation sont organisés dans une double approche
données/traitements. Les trois niveaux de représentation des données, puisque ce sont eux qui nous
intéressent, sont détaillés ci-dessous.
- Niveau conceptuel : le modèle conceptuel des données (MCD) décrit les entités du monde
réel, en termes d’objets, de propriétés et de relations, indépendamment de toute technique
d’organisation et d’implantation des données. Ce modèle se concrétise par un schéma
entités-associations représentant la structure du système d’information, du point de vue des
données.
- Niveau logique : le modèle logique des données (MLD) précise le modèle conceptuel par
des choix organisationnels. Il s’agit d’une transcription (également appelée dérivation) du
MCD dans un formalisme adapté à une implémentation ultérieure, au niveau physique, sous
forme de base de données relationnelle ou réseau, ou autres (cf. section 1.1.2). Les choix
techniques d’implémentation (choix d’un SGBD) ne seront effectués qu’au niveau suivant.
- Niveau physique : le modèle physique des données (MPD) permet d’établir la manière
concrète dont le système sera mis en place (SGBD retenu).
Dans ce cours nous ne nous intéressons à la méthode Merise que dans la perspective de conception d’une
base de données.
Le schéma ci-dessous résume les différentes étapes qui conduisent à l’implémentation d’une base
de données.
Chapitre 2 : Conception d’une base de données
16
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Nom_Type_Entité
attribut 1
attribut 2
…
attribut n
Exemples de type-entité :
Personne, Cinéma, Livre, Acteur, Film, Ecole, etc.
Les attributs du type-entité Personne peuvent êtres par exemples : nom, prénom, date de naissance,
email, …
Exemple de représentation graphique du type-entité Personne :
Personne
nom
prénom
âge
télé
Etudiant
cne
nom
prénom
âge
télé
17
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Un type-association (ou un type-relation) désigne un ensemble de relations qui possèdent les mêmes
caractéristiques. Le type-association décrit un lien entre plusieurs type-entités. Les associations de ce
type-association lient des entités de ces type-entités.
Une association est souvent nommée occurrence ou instance de son type-association.
Les type-entités intervenant dans un type-association sont appelés les participants de ce type-association.
Exemples :
Un exemple d’association peut être l’achat de l’étudiant Mahmoud un exemplaire du livre «Conception
des bases de données».
Dans ce cas le type-association pourra être l’achat d’un livre sur un site e-commerce.
La figure suivante montre la représentation graphique d’un exemple de type-association :
Etudiant Livre
nom titre
prénom Acheter
auteur
âge thème
télé
Les type-associations peuvent avoir des attributs comme dans l’exemple présenté par la figure ci-
dessous :
Etudiant
18
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
- Une personne peut être l’auteur de 0 à n livre, mais un livre ne peut être écrit que par une
personne.
- Un étudiant peut emprunter de 0 à n livre, et un livre pourra être emprunté par 0 ou plusieurs
étudiants à des dates différentes.
Cardinalités
Etudiant Livre
nom 0,n Emprunter 0,n titre
prénom auteur
âge Date emprunt
thème
télé
C’est une association ne comportant que des cardinalités maximales de 1sur chacune de ses pattes. Ce
type d’association est binaire (ne peut pas lier plus de deux entités).
2.7.2. Association 1 vers n
Est une association comportant une cardinalité maximale 1 et une cardinalité maximale n. Ce type
d’association est également binaire.
2.7.3. Association n vers n
Est une association ne comportant que des cardinalités maximales de n sur chacune de ses pattes. Ce
type d’association n’est pas forcement binaire.
En principe seule l’association n vers n qui peut avoir des propriétés (attributs) . Dans ce cas on dit qu’il
s’agit d’une association porteuse d’information.
2.7.4. Identifiant d’un type-association
- L’identifiant d’un type-association n vers n est formé par les identifiants des entités qu’il relie.
- L’identifiant d’un type-association 1 vers n est formé par l’identifiant du type-entité participante
ayant la cardinalité maximale 1.
- L’association 1 vers 1 possède deux identifiants candidats issues des deux entités participantes.
Il suffit de choisir un parmi les deux.
- Les identifiants des types-association sont implicites (non indiqués sur l’association).
19
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Imaginons que l’on veuille connaître la quantité d’articles commandés par des clients, nous nous rendons
compte qu’il faut utiliser une nouvelle propriété Quantité. Cette nouvelle propriété dépend de clients,
d’articles ou des deux ? La bonne réponse est que Quantité dépend des deux entités.
Client
Article
Numéro_Client 1,n
Commander 0,n
Nom Numéro_Article
Quantité
prénom Désignation
Code_Postal prix
Ville
Nous pouvons interpréter ce schéma de la façon suivante : Le client X a commandé la quantité Y
d’articles Z. La figure ci-dessous illustre cette situation :
Etudiant
Livre
CNE 0,n Emprunter 0,n
Nom ISBN
Prénom dateEmprunt Titre
Age DateRetour Auteur
Ville
Comme nous pouvons voir sur la figure suivante la modélisation précédente ne permet pas d’avoir deux
emprunts à des dates différentes (car l’association à un identifiant implicite formé par le couple
(cne,isbn) ) ce qu’est en contradiction avec les règles de gestion des bibliothèques :
Impossible
!
20
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Un attribut est une donnée élémentaire, ce qui exclut des données calculées ou dérivées. Autrement
dit, les propriétés résultantes d’un calcul ne doivent pas apparaître dans le modèle conceptuel des
données.
Règle 2 :
Un type-entité et ses attributs doivent être cohérents entre eux (i.e. ne traiter que d’un seul sujet).
Par exemple, si le modèle doit comporter des informations relatives à des livres et à leurs
emprunteurs, ces informations ne doivent pas coexister au sein d’un même type-entité.
Règle 3 :
Un attribut peut être placé dans un type-association uniquement lorsqu’il dépend de toutes les
entités liées par le type-association
Règle 5 :
Le nom d’une propriété ne doit apparaître qu’une seule fois dans le modèle conceptuel des données.
Si nous établissons une entité Clients et une nommée Prospects, nous ne devons pas retrouver la
propriété Nom dans les deux entités. Il faut préférer la dénomination suivante Nom_client et
Nom_prospect.
21
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
0,1
0,n Livre
Personne Ecrire
titre
idPersonne
auteur
nom
thème
prénom
Emprunter prix
âge
télé 0,n 0,1
Emprunter
0,n
Personne
idPersonne
nom Etre frère
prénom
âge
télé 0,n
Exemple 2 :
Si la relation n’est pas symétrique il faut préciser les rôles sur les pates du type-association.
22
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
parent
Personne
idPersonne 0,n
nom Etre parent
prénom enfant
âge
0,n
télé
Exemple 3 :
0,n
Employé
idEmployé
nom Diriger
prénom
âge
télé 1,1
Client
Article
NUM_Client 0,n
1,n Commander Num_Article
Nom
Date_Achat
Prénom quantité
Prix
1,n
Date
Date
23
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Quantité=1 Quantité=3
Date
12/01/2015
Date
12/12/2014
Association ternaire valide si « les trois pattes sont à n », ce qui peut s’exprimer également par les règles
suivantes :
24
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Exemple :
- qu’un chantier n’est pas forcément réalisé par une seule entreprise :
NoChantier NoEntreprise
- qu’une entreprise ne réalise pas forcément qu’un seul chantier :
NoEntreprise NoChantier
- qu’il n’y a pas forcément qu’un seul type de travail par chantier :
NoChantier CodeType
- qu’il n’y a pas forcément qu’un seul chantier par type de travail :
CodeType NoChantier
- qu’une entreprise n’est pas forcément spécialisée dans un seul type de travail :
NoEntreprise CodeType
- qu’un type de travail n’est pas forcément confié qu’à une seule entreprise :
CodeType NoEntreprise
- qu’une entreprise ne réalise pas forcément qu’un seul chantier par type de travail :
NoEntreprise, CodeType NoChantier
- qu’une entreprise ne réalise pas forcément qu’un seul type de travail par chantier :
NoEntreprise, NoChantier CodeType
- qu’un type de travail à réaliser pour un chantier n’est pas forcément confié qu’à une seule
entreprise : CodeType, NoChantier NoEntreprise
Bien entendu, ce type de validation est grandement facilité lorsque l’association « porte » une propriété
25
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
(C’est-à-dire le triplet NoA, NoB, NoC permet de terminer prop mais aucun sous ensemble de ce triplet
ne permet de déterminer prop)
Les dépendances fonctionnelles seront étudiées en détail dans le chapitre suivant.
Ouvrage
Exemplaire
NUM_ISBN 1,n Posséder (1,1) Num_Exemplaire
Titre
Date_Achat
Nom Auteur
Prix
Prénom Auteur
Nous pouvons considérer qu’une bibliothèque achète plusieurs exemplaires du même livre (6 000
exemplaires). Doit-elle numéroter les exemplaires dans l’ordre séquentiel croisant c’est-à-dire de 1 à 6
000 ou pour chaque ouvrage de 1 au nombre maximal de cet ouvrage présent dans la bibliothèque ?
Il paraît évident que la solution la plus judicieuse est la seconde proposition. Ainsi, la clé d’identification
de l’exemplaire sera la concaténation du Num ISBN et du Num Exemplaire. L’identification d’un
identifiant relatif se traduit par le symbole (R) à côté de la cardinalité ou par les parenthèses sur la
cardinalité : (1,1 )
Pour reconnaître un identifiant relatif, nous pouvons aussi nous poser la question « si je supprime
l’ouvrage X de ma bibliothèque, dois-je supprimer tous les exemplaires ? ». La réponse est bien entendu
oui. Nous pouvons donc dire que l’existence même de l’entité Exemplaire dépend de l’existence de
l’entité Ouvrage (L’entité Exemplaire est dite entité faible).
Une entité faible est une entité dont les occurrences ne peuvent exister que si les occurrences d'une autre
entité existent (contrainte d'identification).
Ainsi, l’identification relative (appelée aussi agrégation) permet de spécifier qu'une entité est nécessaire
pour en identifier une autre. Le type-entité permettant d'identifier est appelée type-entité agrégeant, le
type-entité identifié est appelé type-entité agrégé.
Exemple 2 :
Immeuble
Appartement
idImmeuble 0,n Comporter (1,1)
nomImmeuble numéroApprt
surface
26
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Ce modèle permet que plusieurs appartements possèdent le même numéro puisque l’identifiant du type-
entité Appartement n’est plus numéroApprt, mais le couple (nomImmeuble , numéroApprt)
Remarque :
Les identifiants implicites des types associations sont des exemples d’identifiants relatifs.
Règles concernant le lien identifiant :
Un type-entité concerné par au moins deux liens identifiants peut très bien ne pas comporter d’attribut
souligné.
La cardinalité d’un lien identifiant est forcement 1,1 . Pour préciser qu’il s’agit d’un lien identifiant il
faut mettre cette cardinalité entre parenthèses : (1,1) ou utiliser le symbole (R) à côté de la cardinalité.
L’identifiant relatif n’as pas de présentation particulière mais il est reconnaissable par la présence d’un
lien identifiant
Un agrégat permet de modéliser une situation où un type-association est à l’origine d’un lien vers un
type-entité.
Exemple :
Situation : Dans l’entreprise X, les représentants vendent des produits dans différentes régions. Mais un
produit pour une région donnée n’est vendu que par un seul représentant.
27
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
1) D’après les règles de gestion de l’énoncé, est-il possible que le représentant 3 vende le produit 2
dans la région 5 ?
Réponses :
1- NON car un produit pour une région donnée ne peut être vendu que par un seul représentant, or
le couple Région/Produit (5,2) est assuré par le représentant 2
2- Rien ne s’y oppose conceptuellement parlant, car l’identifiant de l’association vendre est le
triplet (N°Rep, N°Region, N° produit) or ( 3, 5, 2) est différent de (2,5,2) alors il n y a aucun
problème.
Conclusion :
Le MCD précédent ne traduit pas correctement la réalité, il faut recourir à la notion d’agrégat qui permet
d’associer une entité à un couple d’entités (associer un représentant à un couple région/produit) :
28
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Exemple :
Exemple 1 :
29
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Illustration :
On suppose que toute entreprise est spécialisée dans un type de travail. Et on considère la modélisation
suivante :
Puisque quel que soit le chantier, le type de travail effectué par une entreprise donnée est le même, alors
NoEntreprise détermine fonctionnellement CodeType. Ainsi les règles d’une bonne ternaire vues
précédemment ne sont pas respectées. Un modèle cohérent peut être le suivant :
Exemple 2 :
30
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 2 : Conception d’une base de données
Illustration :
Si on suppose que « Par chantier, un type de travail est confié à une seule entreprise » le modèle ci-
dessous ne présente pas une bonne ternaire, puisque la connaissance du chantier et du type de travail
détermine l’entreprise.
6. Spécialisation (héritage)
Les occurrences d’un type-entité se caractérisent toutes par un ensemble de propriétés communes.
Cependant, il arrive des cas où les occurrences se distinguent par des propriétés utiles aux unes mais pas
aux autres, ou des associations spécifiques aux unes mais pas aux autres.
Par exemple, si nous modélisions les étudiants et les professeurs par un même type entité « Personne »
nous allons constater qu’ils auront des propriétés en commun comme le nom, prénom, cin,… mais ils
auront des propriétés différentes comme le code national de l’étudiant qu’est propre à un étudiant et le
code PPR qu’est propre aux professeurs. Egalement l’étudiant appartient à une classe, ce qui traduit
donc une association spécifique de l’étudiant avec un autre type-entité « Classe ».
Dans ce contexte on peut utiliser la spécialisation, ainsi, on décompose l'entité Personne en deux "sous-
entités" en plaçant les propriétés communes (nom, prénom) dans une entité générale ou générique
(Personne) et les propriétés spécifiques aux sous-ensembles dans des entités spécialisées ou spécifiques
(les sous-entités Prof et Etudiant par exemple).
Les entités spécifiques héritent de l'identifiant de l'entité générique et de ses propriétés. Il s’agit d’une
association de type hiérarchique de généralisation/spécialisation.
Prof
Personne
Classe code_PPR
ID
code_CNE nom Etudiant
prenom
code_CNE
Appartenir
31
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
1. Introduction
Dans ce modèle, les données sont représentées par des tables, sans spécification sur la façon dont
les informations sont stockées réellement dans la machine. Les tables constituent donc la structure
logique du modèle relationnel. Au niveau physique, le système est libre d’utiliser n’importe quelle
technique de stockage (fichiers séquentiels, indexage, adressage dispersé, séries de pointeurs,
compression, . . .) dès lors qu’il est possible de relier ces structures à des tables au niveau logique.
Les tables ne représentent donc qu’une abstraction de l’enregistrement physique des données en
mémoire.
De façon informelle, on peut définir le modèle relationnel de la manière suivante :
- les données sont organisées sous forme de tables à deux dimensions, encore appelées relations,
dont les lignes sont appelées n-uplet ou tuple en anglais ;
- les données sont manipulées par des opérateurs de l’algèbre relationnelle ;
- l’état cohérent de la base est défini par un ensemble de contraintes d’intégrité
Une occurrence, ou n-uplets, ou tuples, est une ligne du tableau qui représente la relation
Un schéma relationnel est constitué par l’ensemble des schémas de relation.
Une base de données relationnelle est constituée par l’ensemble des n-uplets des différentes
relations du schéma relationnel.
Entité 2
Entité 1
Exemple :
Equipe Responsable
33
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Entité 2
Entité 1
Deuxième solution :
Une autre solution à proscrire est l'échange des clés primaires entre les 2 entités, ce qui donnerait :
Entité 2
Entité 1
PC(numPC, marque_pc)
CD_ROM CD_ROM(numCD, marque_cd, #numPC)
PC
0,1
Avoir numCD
numPC 1,1
marque_pc Marque_cd
Deuxième solution
Dans ce cas la meilleure solution est que la table CD_ROM reçoit comme clé étrangère NumPC. Car un
CD_Rom est affecté à un et un seul PC. Dans la deuxième solution, un PC pouvant ne pas avoir de
CD_Rom, la clé étrangère numCD peut être nulle, ce qu'il faut éviter au maximum (On évite
généralement au maximum qu’une clé étrangère soit nulle).
34
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Exemple 2 :
Citoyen
Nous allons opter pour la solution 1 car elle permet d’éviter des valeurs nulles pour les clés étrangères,
et elle est suffisante pour matérialiser la relation entre les deux types-entités Citoyen et Candidat :
Citoyen(IdCitoyen, nom,prénom)
Candidat(IdCandidat, Parti, #IdCitoyen)
Dans la relation Candidat, l’attribut IdCitoyen, en plus d’être une clé étrangère, constitue une clé
candidate. On peut donc se passer de la clé IdCandidat.
Une amélioration du schéma relationnel précédent peut donc se présenter ainsi :
Citoyen(IdCitoyen, nom,prénom)
Candidat(#IdCitoyen, Parti)
où IdCitoyen, en plus d’être la clé de la relation Candidat, est une clé étrangère de la relation Citoyen.
Entité 2
Entité 1
Entité1(IdEntité1, Att1_1, Att2_1)
IdEntite1 0,1 Association IdEntite2
0,1
Att1_2 Entité2(IdEntité2, Att1_2, Att2_2)
Att1_1
Att2_2 Association(#IdEntité1, #IdEntité2)
Att2_1
Exemple :
CD_ROM
PC
PC(numPC, marque_pc)
numPC 0,1 Avoir 0,1 numCD CD_ROM(numCD, marque_cd)
marque_pc Marque_cd
PC_CD (#numCD, #numPC)
35
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Première solution :
La première solution assimile la cardinalité 0,1 à une cardinalité 1,1 et donc il y a migration de la clé
primaire de la table côté 1,n vers la table côté 0,1 ce qui laisse la possibilité d'une valeur nulle pour la
clé étrangère.
Deuxième solution :
La deuxième condition consiste à créer une table intermédiaire avec une clé primaire composée.
Si la deuxième solution est la meilleure, la première est souvent mise en œuvre dans la mesure où
le cas d’une cardinalité 0 est rare et correspond généralement à une phase transitoire. C'est pour cela que
la solution à 2 tables reste majoritairement utilisée pour des raisons d'allégement du modèle relationnel.
Exemple :
Equipe Responsable
Cet exemple illustre le fait qu'une équipe est dirigée par un responsable mais qu'elle peut n'être
dirigée par personne.
Avec la première solution :
Responsable (IdResponsable, nom_responsable)
Equipe (IdEquipe, nom_equipe, #idResponsable)
36
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Entité 1 Entité 2
Entité1(IdEntité1, Att1_1, Att2_1)
IdEntite1 x,n Association x,n IdEntite2
Entité2(IdEntité2, Att1_2, Att2_2)
Att1_1 Att1_2
attribut1 Att2_2 Association(#IdEntité1, #IdEntité2,attribut1,
Att2_1
attribut2, …, attribut2,…,attributN)
attributN
Avec x = 0 ou x = 1
Exemple :
Equipe Responsable
Entité 1
Entité 2
IdEntiteN
x,n
x,n Att1_n
Att2_n
Entité 3
IdEntite3
Att1_3
Att2_3
....
37
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Ces associations sont en en fait des associations binaires, leur traitement dépend donc des cardinalités
et elles peuvent donc être traitées par les règles citées précédemment.
Dans le cas des relations réflexives une même propriété va se retrouver deux fois dans la même
relation. Il faut alors donner un nom différent et significatif aux deux attributs correspondants. On a déjà
signalé dans ce cours qu’il faut nommer les branches par des rôles pour pouvoir lire dans le bon sens
l'association. Les rôles aident à nommer les attributs correspondant à l'association.
Exemple 1:
Exemple 2 :
Dans une entreprise, chaque salarié a un seul chef (supérieur hiérarchique direct) sauf le patron, et
chaque chef a au moins un salarié sous ses ordres. Evidemment, certains salariés ne sont chefs de
personnes.
3.9. Règle 9 : Cas d’une entité ayant que la clé comme attribut
Les entités n'ayant que leur identifiant comme attribut ne deviennent pas des relations, mais des
attributs dans les autres relations liées.
38
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Exemple
Avec ce modèle, on mémorise chaque jour pour chaque ouvrier les pièces qu'il a fabriqué et en
quelle quantité. Quand on passe au modèle relationnel, l'entité DATE FABRICATION ne devient pas
une relation, mais un attribut clé dans la relation FABRIQUE issue de l'association.
FABRIQUE(#code_ouvrier, #référence_pièce, date, quantité).
Immeuble
Appartement
Comporter (1,1)
idImmeuble 0,n numéroApprt
nomImmeuble
surface
39
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Personne
ID
nom
adresse
Etudiant Cadre
code_CNE code_PPR
Avec « type » un attribut qui permet de déterminer le type de personne ( 'Etudiant', 'Cadre' ou autre).
Cette solution est utilisable lorsque les spécialisations ne sont pas réellement utilisées.
Elle présente l’inconvénient d’avoir des valeurs null dans les attributs des types entité spéciales (les
entités filles) surtout si les spécialisations ont beaucoup d’attributs ou elles ont des associations
propres avec d’autres types entité.
40
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 3 : Modèle relationnel
Utilisable lorsque la super-entité n’est pas utilisée et elle n’a pas d’associations propres
(Généralisation/spécialisation totale et disjointe).
Avec ID_ CADRE et ID_ETUDIANT deux clés étrangères qui référencent la table Personne.
L’inconvénient de cette stratégie est que pour avoir une information sur une spécialisation (par
exemple le nom d’un étudiant) il faut passer par une jointure avec la table Personne.
Avec ID_ CADRE et ID_ETUDIANT deux clés étrangères qui référencent la table Personne.
L’inconvénient de cette stratégie est que l’information est redondante, et la cohérence est plus
difficile à maintenir.
4. Normalisation
En cours de rédaction
41
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 4 : Création des tables,
insertion et modification des données
1. Langage SQL
SQL (Structured Query Language, traduisez Langage de requêtes structuré) est un langage de définition
de données (LDD, ou en anglais DDL Data Definition Language), un langage de manipulation de
données (LMD, ou en anglais DML, Data Manipulation Language), et un langage de contrôle de données
(LCD, ou en anglais DCL, Data Control Language), pour les bases de données relationnelles.
Créé en 1974, normalisé depuis 1986, le langage est reconnu par la grande majorité des systèmes de
gestion de bases de données relationnelles du marché.
Le tableau ci-dessous décrit les différentes instructions SQL classées par catégorie.
) ;
Chapitre 5 : Interrogation des données
Exemple :
);
3. Contraintes d’intégrité :
3.1. Définition des contraintes d’intégrité
Il y a quatre types de contraintes possibles :
- La contrainte UNIQUE impose une valeur distincte au niveau de la table (les valeurs nulles font
exception à moins que NOT NULL soit aussi appliquée sur les colonnes).
- La contrainte PRIMARY KEY déclare la clé primaire de la table. Les colonnes clés primaires ne
peuvent être ni nulles ni identiques.
- La contrainte FOREIGN KEY déclare une clé étrangère entre une table enfant (child) et une table
père (parent). La directive ON DELETE dispose de deux options : CASCADE propagera la
suppression de tous les enregistrements fils rattachés à l’enregistrement père supprimé, SET NULL
positionnera seulement leur clé étrangère à NULL.
- La contrainte CHECK impose un domaine de valeurs ou une condition simple ou complexe entre
colonnes :
43
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple 1:
CREATE TABLE employees(
employee_id NUMBER(6) CONSTRAINT emp_emp_id_pk PRIMARY KEY,
first_name VARCHAR2(20),
);
Exemple 2
44
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
nom_colonne1,.., nom_colonneN,
Exemple 1:
CREATE TABLE employees(
employee_id NUMBER(6),
first_name VARCHAR2(20),
...
job_id VARCHAR2(10) NOT NULL,
CONSTRAINT emp_emp_id_pk PRIMARY KEY (EMPLOYEE_ID)
);
Exemple 2:
CREATE TABLE Compagnie(
comp CHAR(4),
nrue NUMBER(3),
rue CHAR(20),
ville CHAR(15) DEFAULT 'Paris',
nomComp CHAR(15) NOT NULL,
CONSTRAINT pk_Compagnie PRIMARY KEY(comp)
);
Exemple 3:
CREATE TABLE Pilote(
brevet CHAR(6),
nom CHAR(15),
nbHVol NUMBER(7,2),
compa CHAR(4),
CONSTRAINT pk_Pilote PRIMARY KEY(brevet),
CONSTRAINT nn_nom CHECK (nom IS NOT NULL),
CONSTRAINT ck_nbHVol CHECK (nbHVol BETWEEN 0 AND 20000),
CONSTRAINT un_nom UNIQUE (nom),
CONSTRAINT fk_Pil_compa_Comp FOREIGN KEY (compa)
REFERENCES Compagnie(comp)
);
Remarque :
Nous pouvons afficher les différentes contraintes appliquées sur une table par :
45
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Par exemple :
Nous pouvons ajouter des contraintes après la création de la table avec l’instruction ALTER
TABLE (voir la suite de ce cours).
[(colonne1, colonne2...)]
AS sous_interogation;
Exemple :
CREATE TABLE Department90
AS
SELECT employee_id, last_name, salary*12 ANNSAL, hire_date
FROM employees
WHERE department_id = 90;
L'exemple de la diapositive ci-dessus crée une table nommée Department90, qui contient les
détails de tous les employés qui travaillent dans le département 90. Notez que les données de la table
Department90 proviennent de la table employees.
Prenez soin d'indiquer un alias de colonne lorsque vous sélectionnez une expression. L'alias
ANNSAL est affecté à l'expression SALARY*12. (Un alias dans ce cas est obligatoire)
5. Casse et commentaires :
Dans toute instruction SQL (déclaration, manipulation, interrogation et contrôle des données), il est
possible d’inclure des retours chariots, des tabulations, espaces et commentaires (sur une ligne
précédée de deux tirets --, sur plusieurs lignes entre /* et */).
De même, la casse n’a pas d’importance au niveau des mots-clés de SQL, des noms de tables,
colonnes, index, etc.
Il est impossible de supprimer une table si la table est référencée par une contrainte d'intégrité
référentielle. Une variante Oracle de la commande permet de supprimer les contraintes d'intégrité et
la table :
46
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemples
47
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
col1, col2... sont les noms des colonnes que l'on veut modifier. type1, type2,... sont les nouveaux types
que l'on désire attribuer aux colonnes.
RENAME TO nouveau_nom_table;
48
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
8.2. Date/Heure
9. Insertion d’enregistrements
[(colonne1, colonne2…)]
Exemples
49
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
- Dans cet exemple, toutes les valeurs sont renseignées dans l’ordre de la structure de la table.
Dans l’exemple suivant, l’insertion du pilote initialise la date de naissance au 5 février 1965 (à
zéro heure, zéro minute et zéro seconde), ainsi que la date d’embauche à la date (heures, minutes,
secondes) du moment par la fonction SYSDATE.
50
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple :
UPDATE nom_table
WHERE condition
UPDATE nom_table
WHERE condition
Exemples :
51
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Par exemple, une transaction peut transférer une somme d'argent entre deux comptes d'un client d'une
banque. Elle comporte deux ordres : un débit sur un compte et un crédit sur un autre compte. Si un
problème empêche le crédit, le débit doit être annulé.
Dans la norme SQL, une transaction commence au début d'une session de travail ou juste après la fin de
la transaction précédente. Elle se termine par un ordre explicite de validation (commit) ou d'annulation
(rollback).
L'utilisateur peut à tout moment valider (et terminer) la transaction en cours par la commande COMMIT.
Les modifications deviennent alors définitives et visibles à toutes les autres transactions.
L'utilisateur peut annuler (et terminer) la transaction en cours par la commande ROLLBACK. Toutes les
modifications depuis le début de la transaction seront annulées.
SAVEPOINT nomPoint
On peut ensuite annuler toutes les modifications effectuées depuis un point de reprise s'il y a eu des
problèmes :
ROLLBACK TO nomPoint
On évite ainsi d'annuler toute la transaction et on peut essayer de pallier le problème au lieu d'annuler la
transaction globale.
52
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Ce chapitre présente les techniques d’interrogation des données avec le langage SQL.
Les exemples de code SQL donnée dans cette partie, portent sur le modèle logique présenté ci-dessous :
SELECT [DISTINCT] *
ou
SELECT [DISTINCT] exp1 [[AS] nom1 ], exp2 [[AS] nom2 ], .....
exp1, exp2, ... sont des expressions, nom1, nom2, ... sont des noms facultatifs (alias). Chacun de ces
noms est inséré derrière l'expression, séparé de cette dernière par un espace ou par le mot clé AS
(optionnel) ; ils constitueront le titre de la colonne dans l'affichage du résultat de la sélection. Ces noms
ne peuvent pas être utilisés dans les autres clauses (dans la clause where par exemple).
Le mot clé DISTINCT est utilisé pour éliminer les doublons du résultat de l’interrogation.
Chapitre 5 : Interrogation des données
Exemples :
La requête suivante va provoquer une erreur car on utilise le nom Salaire_Total dans la clause where :
La fonction prédéfinie NVL (exp1, exp2) permet de remplacer les valeurs null par une chaîne dans
les résultats d'une requête. Si expr1 est null, alors NVL renvoie expr2. Si expr1 n'est pas nul, alors
NVL renvoie expr1.
synonyme1, synonyme2,... sont des synonymes attribués facultativement aux tables (alias de tables). On
utilise cette possibilité pour lever certaines ambiguïtés, quand la même table est utilisée de plusieurs
façons différentes dans une même interrogation.
WHERE expression_logique
Une expression logique simple est la comparaison de deux expressions ou plus au moyen d’opérateurs
logiques :
Opérateurs logiques :
Les opérateurs logiques AND et OR peuvent être utilisés pour combiner plusieurs expressions logiques.
54
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
L'opérateur NOT placé devant une expression logique inverse son sens.
Exemples
Sélectionner les noms des employés du département 40 ayant un salaire inférieur à 2100 DH.
Afficher la liste des noms des employés du département 40 ou 30 dont le salaire est supérieur à 20000
DH et les noms des employés qui ne touchent pas de commission.
2. Jointure
On utilise les jointures pour obtenir des données de plusieurs tables. On distingue entre jointure interne
et externe.
Exemples :
Liste des employés avec le nom du département où ils travaillent :
La jointure peut aussi être traduite par la clause WHERE : (Cette façon de faire est encore très souvent
utilisée)
55
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple :
Liste des départements et les villes dans ils se trouvent :
- La table Ville est jointe à la table Departement par la colonne idville, qui est la seule colonne portant
le même nom dans les deux tables. Si d'autres colonnes communes avaient été présentes, la jointure
les aurait toutes utilisées.
- La jointure naturelle ne peut être effectuée que sur les colonnes qui présentent le même nom et le
même type de données dans les deux tables. Si les colonnes présentent le même nom mais des types
de données différents, la syntaxe NATURAL JOIN provoque une erreur.
- Si on utilise une jointure naturelle, il est interdit de préfixer une colonne utilisée pour la jointure par
un nom de table. La requête suivante provoque une erreur :
Pour différencier les noms de colonne présents dans plusieurs tables on utilise des préfixes qui précisent
le nom de la table.
L'utilisation de préfixes désignant la table améliore les performances et améliore la lisibilité des
interrogations.
Il ne faut pas utiliser d'alias sur les colonnes identifiées dans la clause USING et indiquées ailleurs dans
l'instruction SQL.
56
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple :
2.4. Clause ON
Dans le cas général ON pour exprimer une jointure. (Par exemple, si les colonnes de jointure n’ont pas
le même nom ou la condition de jointure n’est pas une égalité).
Exemple :
Exemple :
Liste des employés, avec tous les employés qui gagnent plus :
Exemple
Lister les employés qui ont un supérieur, en indiquant pour chacun le nom de son supérieur :
57
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
JOIN Departement d
ON (d.iddep = e.dep )
JOIN Ville v
ON (d.idville = v.idville);
Dans ce cas les jointures sont effectuées de gauche à droite. La première jointure réalisée est donc
Employe JOIN Departement. La première condition de jointure peut référencer les colonnes des tables
Employe et Departement, mais pas celles de la table Ville. La deuxième condition de jointure peut
référencer les colonnes des trois tables.
Département Employé
NOMEMP DEP
IDDEP NOMDEP
Administration 11 Karimi 11
RH 23 Alami 23
Si on considère la jointure
Lorsqu'une ligne ne satisfait pas à une condition de jointure, elle n'apparaît pas dans le résultat de
l'interrogation. Par exemple, l'ID de département 190 n'apparaît pas, car aucun employé avec cet ID de
département n'est enregistré dans la table Employe.
Pour renvoyer l'enregistrement du département ne comportant aucun employé, on peut utiliser une
jointure externe.
58
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
La jointure externe ajoute des lignes fictives dans une des tables pour faire la correspondance avec les
lignes de l'autre table. Dans l'exemple précédent, une ligne fictive (un employé fictif) est ajoutée dans
la table des employés si un département n'a pas d'employé. Cette ligne aura tous ses attributs null, sauf
celui des colonnes de jointure.
LEFT indique que la table dans laquelle on veut afficher toutes les lignes (la table Departement) est à
gauche de LEFT OUTER JOIN. C'est dans l'autre table (celle de droite) dans laquelle on ajoute des
lignes fictives. De même, il existe RIGHT OUTER JOIN qui est utilisé si on veut afficher toutes les
lignes de la table de droite (après le RIGHT OUTER JOIN) et FULL OUTER JOIN si on veut afficher
toutes les lignes des deux tables.
L'interrogation ci-dessous extrait toutes les lignes de la table Departement, qui est la table de droite,
même s'il n'existe aucune correspondance dans la table Employe.
L'interrogation ci-dessous extrait toutes les lignes de la table Employe, même s'il n'existe aucune
correspondance dans la table Departement. Elle extrait également toutes les lignes de la table
Departement, même s'il n'existe aucune correspondance dans la table Employe.
3. CLAUSE ORDER BY
Les lignes constituant le résultat d'un SELECT sont obtenues dans un ordre indéterminé. La clause
ORDER BY précise l'ordre dans lequel la liste des lignes sélectionnées sera donnée.
L'option facultative DESC donne un tri par ordre décroissant. Par dé-faut, l'ordre est croissant.
Le tri se fait d'abord selon la première expression, puis les lignes ayant la même valeur pour la première
expression sont triées selon la deuxième, etc. Les valeurs nulles sont toujours en tête quel que soit l'ordre
du tri (ascendant ou descendant).
59
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemples
Liste des employés et de leur poste, triée par département et dans chaque département par ordre de
salaire décroissant :
SELECT nomemp, idposte FROM Employe ORDER BY dep, Salaire DESC
Syntaxe générale :
SELECT [column,] group_function(column), ...
FROM table
[WHERE condition]
[GROUP BY column]
[ORDER BY column];
Remarques :
Les valeurs NULL sont ignorées par les fonctions de groupe. Ainsi, SUM(col) est la somme des valeurs
qui ne sont pas égales à NULL de la colonne 'col'. De même, AVG est la somme des valeurs non NULL
divisée par le nombre de valeurs non NULL.
Il faut remarquer qu'à un niveau de profondeur (relativement aux sous-interrogations), d'un SELECT,
les fonctions de groupe et les colonnes doivent être toutes du même niveau de regroupement. Par
exemple, si on veut le nom et le salaire des employés qui gagnent le plus dans l'entreprise, la requête
suivante provoquera une erreur :
Il faut une sous-interrogation car MAX(salaire) n'est pas au même niveau de regroupement que le
simple salaire:
60
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple :
Afficher le nombre d’employé par département :
Clause HAVING :
HAVING condition_logique
Sert à préciser quels groupes doivent être sélectionnés. Elle se place après la clause GROUP BY.
La condition logique suit la même syntaxe que celui de la clause WHERE. Cependant, il ne peut porter
que sur des caractéristiques de groupe : fonction de groupe ou expression figurant dans la clause GROUP
BY.
Exemple :
Le numéro et le salaire maximal des départements dont le salaire maximal est supérieur à 10 000
61
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Functions.html#GUID-
D079EFD3-C683-441F-977E-2C9503089982
Fonction Description
ABS(n) valeur absolue de n
MOD(n1, n2 ) n1 modulo n2
POWER(n, e) n à la puissance e
ROUND(val, n) Arrondit la valeur val à n chiffres après la virgule ou, si n est
omis, supprime les chiffres après la virgule (si la valeur n est
négative, les nombres à gauche de la virgule sont arrondis).
Exemples :
SELECT
GREATEST(120, 151,500,15,78,888,45,87) "La plus grande
valeur",
LEAST(120, 151,500,15,78,888,45,87) "La plus petite
valeur",
SQRT(16) "Racine",
ABS(-3) "valeur absolu",
POWER(2, 3) "Puissance",
sign(-14) "Signe"
FROM DUAL
62
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Fonction ROUND
SELECT
ROUND(45.926, 2) "Résultat 1",
ROUND(45.923,2) "Résultat 2",
ROUND(45.923,2) "Résultat 3",
ROUND(45.923,0) "Résultat 4",
ROUND(45.923,-1) "Résultat 5"
FROM DUAL
Fonction TRUNC
SELECT
TRUNC (45.923,2) 'Résultat 1',
TRUNC (45.923)'Résultat 2',
TRUNC (45.923,-1) 'Résultat 3',
FROM DUAL;
Fonction MOD
SELECT
MOD (122, 100) "Résultat 1",
MOD (1019, 100) "Résultat 2"
FROM DUAL
63
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Fonction Description
UPPER(chaîne ) Convertit les minuscules en majuscules
LOWER(chaîne ) Convertit les majuscules en minuscules
SUBSTR(ch, pos [,longueur Extrait de la chaîne ch une sous-chaîne de longueur
]) longueur commençant en position pos de la chaîne.
Le paramètre longueur est facultatif : par défaut, la sous-
chaîne va jusqu'à l'extrémité de la chaîne.
si la valeur pos est négative, le décompte commence à
partir de la fin
64
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemples :
Fonction LENGTH:
Fonction UPPER
SELECT
UPPER('boUdaA tArik imzouréN') "Résultat"
FROM DUAL
Fonction LOWER
SELECT
LOWER('boUdaA tArik imzouréN') "Résultat"
FROM DUAL
Fonction INITCAP
SELECT
INITCAP('boUdaA tArik imzourEN') "Résultat"
FROM DUAL
65
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Fonction CONCAT
SELECT
CONCAT('boUdaA' , 'tArik imzouréN') "Résultat 1",
CONCAT(CONCAT('boUdaA','Info') , 'tArik imzouréN')
"Résultat 2"
FROM DUAL
Fonction SUBSTR
SELECT
SUBSTR('ABCDEFG',3,4) "Rés 1",
SUBSTR('ABCDEFG',-5,4) "Rés 2",
SUBSTR('ABCDEFG',2) "Rés 3",
SUBSTR('ABCDEFG',3,41) "Rés 4",
SUBSTR('ABCDEFG',-3) "Rés 5"
FROM DUAL
Fonction INSTR
SELECT
INSTR('ABCDEFG' , 'CD') "Rés 1",
INSTR('ABCDEFG' , 'CD' , 4) "Rés 1",
INSTR('ABCDEFG' , 'EF' , 4) "Rés 1",
INSTR('ABCDEFG' , 'E' , 1, 6) "Rés 1",
INSTR('ABCDEFG' , 'B' ,2) "Rés 1"
FROM DUAL
66
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
SELECT
' Boudaa ',
TRIM(' Bou daa ') "Rés 1",
TRIM('Bou daa ') "Rés 2",
TRIM(' Bou daa') "Rés 3",
TRIM(' BOUDAA Boudaa') "Rés 4",
LTRIM(' BOUDAA ') "Rés 5",
RTRIM(' BOUDAA ') "Rés 6"
FROM DUAL
SELECT
' Boudaa ',
TRIM('B' from 'BouBdaaB') "Rés 1",
TRIM('B' from 'BouBdaaB ') "Rés 2",
TRIM('B' from ' BouBdaaB') "Rés 3",
TRIM(leading 'B' from 'BouBdaaB') "Rés 4",
TRIM(trailing 'B' from 'BouBdaaB') "Rés 5",
TRIM(both 'B' from 'BouBdaaB') "Rés 6",
TRIM(both from ' BouB daaB ') "Rés 7"
FROM DUAL
67
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Fonction REPLACE
SELECT
REPLACE(' I Like Java and Spring Framework. Java is a POO
Language', 'Spring', 'EJB') "Rés 1",
TRIM(REPLACE(REPLACE(' I Like Java and Spring Framework',
'Java', 'JavaScript') , 'Spring','Angular')) "Rés 2",
REPLACE(REPLACE(REPLACE(' I Like Java and Spring
Framework', 'Java', 'JavaScript') , 'Spring','Angular') , '
', '') "Rés 2"
FROM DUAL
Exemples :
SELECT
SYSDATE "Ajourd'hui",
to_date(SYSDATE, 'DD/MM/RR HH24:MI:SS') -
to_date('30/12/20 00:00:00', 'DD/MM/RR hh24:mi:ss')
"DATE RESULTANTE",
SYSDATE -1 "DATE HIER",
SYSDATE + 1 "DATE DEMAIN",
ROUND((to_date(SYSDATE, 'DD/MM/RR HH24:MI:SS') -
to_date('30/12/20 00:00:00', 'DD/MM/RR hh24:mi:ss')) / 30
) "Nombre de mois"
FROM DUAL
68
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
si date1 est antérieure à date2, le résultat est négatif. La partie non entière du résultat
représente une partie du mois.
ADD_MONTHS(date, n) : ajoute n mois calendaires à date. La valeur de n doit être un
entier et peut être négative.
EXTRACT({YEAR | MONTH | DAY |HOUR | MINUTE | SECOND} FROM {d | i})
Extrait une partie donnée d’une date ou d’un intervalle.
TO_DATE(chaîneCaractères [, format [, 'NLS_DATE_LANGUAGE=Langue']])
Convertit une chaîne en date suivant un certain format dans un certain langage ;
TO_CHAR(colonneDate [, format [, 'NLS_DATE_LANGUAGE=Langue']]) convertit
une date en chaîne suivant un certain format dans un certain langage ;
MONTHS_BETWEEN et ADD_MONTHS
SELECT
SYSDATE "Ajourd'hui",
MONTHS_BETWEEN (SYSDATE , '30/12/20'),
ADD_MONTHS(SYSDATE , 3)
FROM DUAL
TO_CHAR
SELECT
TO_CHAR(SYSDATE, 'DAY -MONTH - YEAR'),
TO_CHAR(SYSDATE, 'DD/MM/YYYY')
from DUAL;
69
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
TO_DATE
EXTRACT
SELECT
SYSDATE
FROM DUAL
SELECT
TO_CHAR(SYSDATE, 'DD/MM/YYYY HH:mm:ss')
FROM DUAL
70
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
5. Opérations ensemblistes
SELECT
OPERATION_ENSEMBLISTE
SELECT
Exemples :
Afficher les informations relatives au poste actuel et au poste précédent de tous les employés. Affichez
chaque employé une seule fois.
SELECT idemp,idposte
FROM Employe
UNION
SELECT idemp, idposte
FROM HistoriquePoste;
71
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemples :
Afficher l’ID d'employé et l'ID de poste des employés dont le poste actuel est le même que celui qu'ils
occupaient avant :
SELECT idemp,idposte
FROM employees
INTERSECT
SELECT idemp,idposte
FROM HistoriquePoste;
Exemple :
SELECT idemp,idposte
FROM employees
MINUS
SELECT idemp,idposte
FROM HistoriquePoste;
6. Sous-interrogations
Une caractéristique puissante de SQL est la possibilité qu'une condition employée dans une clause
WHERE (expression à droite d'un opérateur de comparaison) comporte un SELECT emboîté.
Par exemple, la sélection des employés ayant même poste que ELHANI peut s'écrire en joignant la table
EMP avec elle-même :
SELECT e.nomemp
FROM Employe e JOIN Employe em ON e.idposte = em.idposte
WHERE em.nomemp = 'ELHANI'
où op est un des opérateurs : = != < > <= >= et exp est toute expression légale.
72
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemples
b- Liste des employés du département 10 ayant même poste que quelqu'un du département VENTES
c- Liste des employés ayant même poste que RAHMA ou un salaire supérieur à celui de AMINA :
73
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple
Liste des noms des employés gagnant plus que tous les employés du département 39 :
Remarque
Exemple
Liste des noms des employés ne travaillant pas dans le même département que leur supérieur.
Il est possible de comparer le résultat d'un SELECT ramenant plusieurs colonnes à une liste de colonnes.
La liste de colonnes figurera entre parenthèses à gauche de l'opérateur de comparaison.
Les expressions figurant dans la liste entre parenthèses seront comparées à celles qui sont ramenées par
le SELECT.
Exemple :
Les noms des employés ayant même poste et même salaire que MOUSSA :
74
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Exemple
Liste le nom des départements qui ont au moins un employé ayant plus de 10.000 comme salaire
Pour chaque ligne de DEPT la sous-interrogation synchronisée est exécutée et si au moins une ligne est
trouvée dans la table EMP, EXISTS prend la valeur vraie et la ligne de DEPT satisfait les critères de
l'interrogation.
Notez que l'interrogation SELECT interne ne doit pas nécessairement renvoyer une valeur spécifique ;
une constante peut donc être sélectionnée. Par exemple nous pouvez exprimer la même requête que celle
précédente par :
Ou
L'opérateur NOT IN renvoie la valeur FALSE si un membre quelconque de l'ensemble est une valeur
NULL.
Par exemple la requête ci-dessous ne retourne aucune valeur, bien que la table DUAL contient des lignes
qui satisfont à la condition WHERE (la table DUAL ne contient qu’une seule valeur qu’est ‘X’):
75
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Ainsi, chaque fois qu'il est probable que des valeurs NULL font partie de l'ensemble de résultats d'une
sous-interrogation avec NOT IN (ou son équivalent <> ALL), il faut faire attention aux valeurs NULL.
Pour illustrer le problème, on considère la table Employé qui contient les données décrites dans la table
ci-dessous :
On considère l'instruction SQL suivante qui tente d'afficher tous les employés qui n’ont pas de
subordonnés.
SELECT *
FROM Employe emp
WHERE emp.idEmp NOT IN (SELECT mgr.sup FROM Employe mgr);
Cette instruction SQL devrait renvoyer 10 lignes. Or, elle ne renvoie aucune ligne :
76
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
Ceci est dû au fait que l'une des valeurs renvoyées par l'interrogation interne étant une valeur NULL
(car la première ligne a une valeur NULL pour l’attribut sup), ainsi l'ensemble de l'interrogation ne
renvoie aucune ligne.
Si nous remplaçons la valeur NULL pour l’attribut sup pour l’employé numéro 1, remarquons que les
10 employés sont bien sélectionnés :
Nous pouvons résoudre ce problème en éliminant les valeurs NULL par une condition dans la clause
WHERE :
SELECT *
FROM Employe emp
WHERE emp.idEmp NOT IN (SELECT mgr.sup FROM Employe mgr WHERE
mgr.sup IS NOT NULL);
Dans le cas qu’une valeur NULL est retournée dans l'ensemble de résultats d'une sous interrogation ne
pose pas de problème pour une comparaison avec l'opérateur IN (ou son équivalent = ANY).
Un autre exemple, l’instruction SQL ci-dessous affiche les employés qui ont des personnes sous leur
responsabilité bien qu’il y a une valeur NULL dans la colonne sup de la table Employé.
SELECT *
FROM Employe emp
WHERE emp.idEmp IN (SELECT mgr.sup FROM
Employe mgr);
77
Tarik BOUDAA, ENSA Al Hoceima
Chapitre 5 : Interrogation des données
On considère la table Employé qui contient les données décrites dans la table ci-dessous :
Si on veut par exemple les employés qui ont la plus grande commission par la requête suivante,
On aura en plus dans la liste tous les employés qui ont une commission NULL. La figure suivante
illustre le résultat de l’exécution de cette requête :
78
Tarik BOUDAA, ENSA Al Hoceima