• I-1 Introduction *
  • I-2 La modélisation relationnelle *
  • I-3 Normalisation du modèle : les formes normales d'un modèle relationnel *
    • I-3-1 Première forme normale *
    • I-3-2 Deuxième forme normale *
    • I-3-3 Troisième forme normale : *
    • I-3-4 Quatrième forme normale *
    • I-3-5 Conclusion de la normalisation *
  • I-4 Les contraintes d'intégrité *
  • I-5 Algèbre relationnelle et langage SQL *
    • I-5-1 Opérations ensemblistes *
      • I-5-1-1 Union *
      • I-5-1-2 Intersection *
      • I-5-1-3 Différence *
      • I-5-1-4 Produit cartésien *
    • I-5-2 Opérations relationnelles *
      • I-5-2-1 Projection *
      • I-5-2-2 Restriction ou sélection *
      • I-5-2-3 Composition ou jointure *
      • I-5-2-4 Jointures internes et externes *
    • I-5-3 Écriture des opérations relationnelles en SQL *
      • I-5-3-1 la projection : *
      • I-5-3-2 la restriction : *
      • I-5-3-3 la jointure (par défaut elle est interne) : *
      • I-5-3-4 les jointures externes *
      • I-5-3-5 opérateur union *
      • I-5-3-6 agrégats *
    • I-5-4 Autres fonctions de SQL *
      • I-5-4-1 fonctions de mise à jour : *
      • I-5-4-2 fonctions de gestions de la base : *
    • I-5-5 Exemples d'opérations *
      • I-5-5-1 sur les relations "étudiants" et études" *
      • I-5-5-2 sur les relations "individus", "vehicules", "modele" *


Quelques références bibliographiques
 
 
Comprendre les Bases de Données Théorie et pratique A.Mesguish B.Normier  Masson 1981
Bases de données et systèmes relationnels C.Delobel M.Adiba  Dunod 1982
Bases de données : Les Systèmes et leurs langages G.Gardarin  Eyrolles  1983
Relational Databases and Knowledge Bases  G.Gardarin P.Valduriez  Addison Wesley 1989
SGBD avancés Bases de données objets, déductives, réparties G.Gardarin P.Valduriez  Eyrolles 1991
Les bases de données avancées. Du modèle relationnel au modèle orienté objet ouvrage collectif coordonnateur Imad Saleh Hermès 1992


I-1 Introduction Le modèle relationnel a été défini par E.F Codd dans les années 70 et de nombreux chercheurs ont contribué à son développement. Les premiers systèmes de gestion de base de données (SGBD ou DBMS en anglais) bâtis sur ce modèle ont été SQL/DS et DB2 de IBM, d'où est né le langage de manipulation de bases relationnelles, SQL (Structured Query Language). Bien d'autres implémentations ont suivi et, actuellement, la plupart des SGBD commercialisés, aussi bien sur micros que sur grands systèmes, se réclament du modèle relationnel.

L'explication d'un tel succès tient dans les avantages que ce modèle apporte, par rapport à ses prédécesseurs de type "hiérarchique", "réseau" ou Codasyl et C.J Date, un des spécialistes fondateurs du relationnel en donne un résumé en un seul mot : "la simplicité".

Simplicité tout d'abord pour l'utilisateur dans la conception, la définition, l'installation de la base de données.

En reprenant la démonstration de Date sur la "simplicité" du modèle relationnel, on peut mettre en évidence la simplicité de la structure des données, la simplicité des opérateurs, l'indépendance entre les données et les applications.

  • Simplicité de la structure des données :
Une base relationnelle est composée de tables et est perçue par l'utilisateur comme un ensemble de tables et rien d'autre. Il faut prendre table au sens de tableau à deux dimensions et, effectivement, le concept de rangement de données dans de tels tableaux est aussi simple et compréhensible que suffisant pour représenter toutes les formes de données ! Dans une table, une ligne (ou rangée) correspond à un enregistrement et une colonne à un champ de cet enregistrement.1
  • Simplicité des opérateurs :
Toute opération relationnelle sur une table génère une nouvelle table, c'est-à-dire fonctionne sur un ensemble de données sans que l'on ait à se préoccuper de traiter successivement chacune des données récupérées par l'opération. Les opérateurs relationnels, ceux du langage SQL, permettent de décrire le résultat que l'on veut obtenir sans avoir à décrire la procédure nécessaire pour arriver au résultat : on dit que le langage relationnel est "non procédural".

Par exemple, la sélection de l'ensemble de lignes d'une table dont les valeurs répondent à un critère donné se traduit par une seule opération, en utilisant l'opérateur "select...from...where..."

L'utilisateur disposera donc en relationnel d'un langage de manipulation des données simple, d'apprentissage facile.

  • Indépendance des applications vis à vis de l'implantation physique des données, grâce à la séparation entre le niveau logique et le niveau physique de la base : la description logique de la base par son modèle relationnel suffit à définir les applications qui l'utiliseront, sans avoir à connaître son implantation et sa structure physique.
Pour terminer cette introduction au modèle relationnel, nous rappellerons la définition et les caractéristiques d'un SGBD.

Un SGBD est un outil logiciel qui permet, selon un modèle de base de données particulier, de gérer ces données en offrant les fonctionnalités suivantes :

  • un langage de définition des données (LDD), c'est-à-dire un langage de définition du modèle, la décomposition en tables pour le modèle relationnel et la structure de ces tables, avec, selon les systèmes, des outils supplémentaires d'organisation physique des données pour les réglages de performances;
  • un langage de manipulation des données (LMD) pour ajouter, modifier, retrouver, supprimer des données;
  • la gestion des règles assurant l'intégrité des données;
  • la gestion de la confidentialité des données;
  • la gestion des conflits d'accès simultanés aux données;
  • la sécurité de fonctionnement, avec des outils de sauvegardes et reprises de la base.
L'administrateur de la base, c'est-à-dire celui qui la crée, la gère et la maintient fera appel à toutes ces fonctionnalités du SGBD.

L'utilisateur final n'accédera généralement qu'au langage de manipulation des données, soit directement en utilisant le langage standard SQL, soit au travers d'outils plus évolués offerts par le SGBD lui-même ou développés par l'administrateur.

Classiquement, une base de données peut être représentée en trois niveaux :

  • le niveau externe, qui offre à l'utilisateur final un schéma externe particulier, à travers lequel il voit la base,
  • le niveau conceptuel, celui où le monde réel a été traduit par le créateur de la base en un schéma conceptuel, ou modèle,
  • le niveau interne, celui du schéma physique géré par le SGBD.
L'administrateur aura pour rôle la conception du modèle à partir du monde réel à représenter, le réglage du schéma physique pour certaines optimisations de performances, le maintien de la base de données physique, enfin la description des schémas externes à l'usage des utilisateurs finaux.


I-2 La modélisation relationnelle La relation, au sens mathématique, est un sous-ensemble du produit cartésien d'un certain nombre de domaines, un domaine étant lui-même défini comme un ensemble de valeurs :

R=(D1 X D2 X D3)

est la relation R définie sur les domaines D1, D2, D3.

La réalisation (l'extension) de cette relation est représentée par une table à 3 colonnes D1, D2, D3, dont les lignes seront concrétisées par les différentes valeurs possibles prises dans les domaines D1, D2, D3 :
R
 

D1
D2
D3
d1,1 
d1,2
d1,3
d2,1 
d2,2
d2,3

Le modèle relationnel consiste à représenter par une relation, ou table, chaque type d'objet ou entité du monde réel, en prenant pour colonnes les constituants caractéristiques de l'objet.

Chaque colonne de la table a un identificateur, ou nom de colonne, ou "attribut", qui représente un des constituants de l'entité.

Par exemple, pour modéliser l'entité "personne", on prendra comme constituants son nom, son prénom, sa date de naissance, sa ville, son département et on définira la table "personne" avec ses colonnes :

personne (nom , prénom , date-naissance , ville , département).

Les domaines correspondant aux identificateurs de colonnes peuvent être définis par les ensembles de valeurs suivants :

nom : chaîne de 1 à 30 caractères alphabétiques

prénom : chaîne de 1 à 30 caractères alphabétiques

date-naissance : ensemble des dates depuis le 1er janvier 1900 jusqu'au 1er janvier 1994

ville : ensemble des noms de villes (ou chaîne de 1 à 40 caractères)

département : entier compris entre 1 et 98
Les personnes réelles que nous voudrons introduire dans cette table seront constituées chacune par une ligne de la table, par exemple :
 

Dupont  Jean  27/2/49 Pontoise  78 
Hache  Arthur  13/8/68 Paris  75 

Les noms de colonnes (columns en anglais), constituants de l'objet, sont encore appelés attributs (attributes en anglais).

Les lignes de la tables, ou rangées, (rows en anglais), sont encore appelées n-uplets (ou tuples en anglais), selon la terminologie relationnelle.

Pour définir une table du modèle, il faut :

  • donner un nom de table,
  • donner le nom des colonnes et leurs domaines de valeurs.
Exemple de création de table en langage SQL : create table personne (nom char(30),

prenom char(30),

date-naissance date,

ville char(40),

departement integer);


I-3 Normalisation du modèle : les formes normales d'un modèle relationnel Partant des données que l'on veut gérer, plusieurs choix de modèles relationnels sont possibles. La décomposition du monde réel à modéliser en entités ou objets est intuitivement assez évidente, mais il faut également pouvoir exprimer par le modèle les liens logiques qui existent entre ces objets et le choix n'est pas toujours trivial.

Par exemple, en plus des données de personnes que nous avions prévues ci-dessus, nous pouvons avoir à gérer également des données relatives au transport, par exemple le ou les véhicules que possède chaque personne.

Faut-il ajouter à la relation individus les attributs correspondant aux véhicules ou faut-il en faire une autre relation ?

Ce type de choix peut et doit être mené selon les règles de normalisation établies pour le modèle relationnel. Ces règles ont pour but de constituer un modèle évitant les redondances inutiles de données et facilitant la gestion, la mise à jour des données. Elles définissent des "formes normales", dont nous allons voir les 4 premiers niveaux.

I-3-1 Première forme normale Une relation est en première forme normale si tout attribut contient une valeur atomique. Les attributs à occurrence multiple sont interdits.

Le respect de cette règle est obligatoire dans un SGBD réellement relationnel : les colonnes d'une table ne peuvent être multivaluées.

Donc, pour représenter les voitures appartenant aux personnes, il n'est pas possible de constituer une colonne "type de voiture" dans la table personne, le nombre de voitures possédées pouvant être variable. Nous devrons créer une deuxième table "voiture-possédée" où le type sera une colonne à valeur simple.

Pour que le modèle ait un sens, il faudra bien entendu tenir compte de l'association entre la voiture et son propriétaire et garder, dans la table "voiture-possédée" les colonnes faisant référence à la personne propriétaire.

exemple :

personne( nom, prénom, date-naissance, ville, departement)

voiture-possédée( nom, prénom, type, date-achat, marque, couleur)

Ceci introduit un concept essentiel du modèle relationnel : la clé d'une relation. Toute relation, ou table, en relationnel strict, doit comporter, parmi l'ensemble de ses colonnes, un sous-ensemble formant une clé unique : dire, par exemple, que le couple (c1, c2) est la clé de la relation R signifie que les valeurs des autres colonnes c3,...cn de R sont déterminées de façon unique par la valeur du couple (c1, c2).

Dans la table "personne", on pourrait dire que le couple (nom, prénom) forme la clé, à condition que l'on ne puisse avoir deux personnes ayant même nom et même prénom. C'est cette clé de la table personne qui doit être rappelée dans la table "voiture-possédée" pour faire l'association entre les deux tables. On dit que le couple (nom, prénom) dans la table "voiture-possédée" est une clé étrangère (foreign key en anglais), liée à la clé primaire (nom, prénom) de la table "personne".

Dans la table "voiture-possédée", la clé primaire peut être constituée par les trois colonnes nom, prénom, type (à condition qu'une personne ne puisse posséder plus d'une voiture d'un type donné).

Il est parfois nécessaire de redéfinir la structure d'une table pour assurer qu'elle contient une clé primaire : par exemple, dans le cas de la table "personne", il est sans doute préférable d'avoir une colonne d'identification de la personne dont on est sûr qu'elle est unique, par exemple son code INSEE, pour éviter le cas où nom et prénom ne seraient pas discriminants.

De même, on peut ajouter une colonne "rang" à la table "voiture-possédée" pour être sûr de constituer une clé unique.

Ce qui donne le schéma suivant :

personne (insee, nom, prenom, date-naissance, ville, departement)

voiture-possédée (insee, rang, type, date-achat, marque, couleur)

nb : les colonnes clés sont soulignées.

La désignation de la clé de la relation, ou clé primaire est obligatoire dans certains SGBD relationnels. Elle ne l'est pas dans INGRES mais la définition de cette clé doit être présente à l'esprit de celui qui conçoit le modèle car elle conditionne, comme on va le voir, la normalisation des tables.

Les étapes suivantes de normalisation des relations vont consister en une décomposition des tables de façon à respecter certaines règles de dépendances entre les colonnes clés et les colonnes non clés, ce qui permettra d'éliminer les redondances de données et les problèmes de mise à jour.


I-3-2 Deuxième forme normale On a vu que, dans la première forme normale, toute valeur d'une colonne dépend de la valeur de la clé.

Une relation est en deuxième forme normale si et seulement si :

  • elle est en première forme normale,
  • toute colonne qui n'appartient pas à une clé dépend pleinement de la clé et ne peut se déduire d'un sous-ensemble de cette clé.
Considérons par exemple la table "commande" suivante :

commande (nom-fournisseur, adresse-fournisseur, article, quantité, prix)

La clé primaire est constituée par le couple (nom-fournisseur, article).

Or, l'adresse du fournisseur ne dépend que de son nom. Cette table n'est donc pas en 2FN (2ème forme normale) et devra être décomposée en deux tables :

fournisseur (nom-fournisseur, adresse)

commande (nom-fournisseur, article, quantité, prix)

On évite ainsi des redondances et des problèmes de mise à jour si l'adresse du fournisseur change.


I-3-3 Troisième forme normale : Une relation est dite 3FN, en troisième forme normale, si et seulement si :
  • elle est en deuxième forme normale,
  • une valeur de colonne n'appartenant pas à la clé ne dépend pas d'une colonne non clé.
La table "voiture-possédée" ne répond pas à cette règle, car la marque de la voiture ne dépend que de son type.

Pour respecter la troisième forme normale, il faudra décomposer cette relation en deux nouvelles relations :

voiture-possédée (insee, rang, type, date-achat, couleur)

marque-voiture (type, marque)

On voit là encore l'intérêt de la normalisation pour les mises à jour et l'élimination des redondances : on peut mettre à jour les voitures possédées sans toucher à la relation marque-voiture, la marque de voiture n'est pas répétée dans chaque ligne de voiture-possédée ayant même type.


I-3-4 Quatrième forme normale Le respect de la règle de 3FN est encore insuffisant pour éliminer les redondances et les anomalies de mises à jour.

Supposons que, pour un même type de voiture, le modèle existe en plusieurs couleurs, rouge, vert, bleu, et en plusieurs versions : normale, décapotable, break.

Par exemple :

un type R18 a un modèle en version normale et un modèle en version break, un type AX a un modèle en version normale et un modèle en version décapotable;

le type R18 existe en couleur rouge et bleu, le type AX existe en couleur rouge et vert.

On pourrait constituer une table "choix_modèle" de la façon suivante :

choix_modèle( type, couleur, version)

La table choix-modèle contiendrait les lignes suivantes :
 

R18  rouge  normale 
R18  rouge  break 
R18  bleu  normale 
R18  bleu  break 
AX  rouge  normale 
AX  rouge  décapotable
AX  vert  normale 
AX  vert  décapotable

Pour une valeur de type, on a toutes les valeurs possibles de couleur et, pour chacune de ces valeurs, toutes les valeurs possibles de version, mais couleur et version sont indépendantes entre elles : on dit que l'on a une dépendance multivaluée entre la colonne "type" et la colonne "couleur" et une dépendance multivaluée entre la colonne "type" et la colonne "version".

On voit l'inconvénient de cette forme puisque, si l'on supprime une valeur possible de la colonne "version", par exemple décapotable pour le type AX, il faut supprimer toutes les lignes où apparaissent AX et décapotable.

Pour éviter ce genre de problèmes, il faut passer à la quatrième forme normale, qui se définit théoriquement ainsi :

Une relation est en quatrième forme normale si et seulement si les seules dépendances multivaluées élémentaires sont celles dans lesquelles une clé détermine la valeur d'une colonne.

Ici, les colonnes sur lesquelles portent des dépendances multivaluées font partie de la clé, donc la table n'est pas en 4FN et il faut la décomposer en deux tables :

choix_couleur( type, couleur)

choix_version( type, version)


I-3-5 Conclusion de la normalisation Plus le degré d'une forme normale est élevé, moins les anomalies liées aux opérations de mises à jour se produisent, ceci parce que les constituants élémentaires du schéma se trouvent être de plus en plus indépendants les uns des autres.

Toutefois, il arrive que l'on ne poursuive pas au maximum la normalisation du modèle car elle peut dégrader les performances à l'interrogation. En effet, la décomposition d'une table en plusieurs autres peut conduire à scruter plusieurs tables pour une recherche donnée (on dit faire une jointure), ce qui peut être pénalisant en temps de recherche.


I-4 Les contraintes d'intégrité Le modèle d'une base de données relationnelle implique, par sa conception, un certain nombre de contraintes d'intégrité qui traduisent les propriétés sémantiques des données :

- la contrainte de clé primaire d'une relation implique la non duplication des lignes, c'est-à-dire que chaque objet du monde réel peut être enregistré sans ambiguïté par une seule ligne, un seul "tuple";

- la contrainte de domaine restreint les valeurs possibles d'une colonne à un ensemble de valeurs prédéfinies;

- on peut ajouter à une colonne la contrainte de non-nullité qui implique que cette colonne ne peut pas avoir de valeur nulle, c'est-à-dire ne peut pas être indéfinie ou inutilisable;

- la contrainte d'intégrité référentielle spécifie les liens qui doivent exister entre deux tables, par la correspondance d'une ou plusieurs colonnes communes à ces deux tables, cette ou ces colonnes constituant ce qui est appelée une clé étrangère.

Avec INGRES, la contrainte de clé primaire n'est pas obligatoire et n'a pas à être donnée lors de la création de la table, même s'il est bon de l'avoir définie dans la conception du modèle car elle est nécessaire au processus de normalisation.

Les contraintes de domaine et de non-nullité sont gérées en langage SQL, lors de la création de la table.

Le domaine est défini par le type de la colonne, soit dans INGRES :
 
integer entier long,
smallint entier court,
float8(float) réel long,
float4 réel court,
decimal (dec, numeric) réel à virgule fixe,
char(n) chaîne de n caractères,
varchar(n) chaîne de n caractères maximum, de longueur variable,
date date
byte données binaires

Une autre contrainte d'intégrité sur les données peut être ajoutée pour spécifier une condition que doit respecter la valeur d'une colonne. Ce qui signifiera qu'une mise à jour de la colonne ne respectant pas cette contrainte sera rejetée.

exemple :

create integrity on employe is salaire >= 6000 ; La définition de contraintes d'intégrité référentielles n'est pas prise en compte dans le standard SQL, ni dans INGRES de façon directe. Elle est possible dans INGRES par le biais de règles de gestion (ou triggers).

La contrainte d'intégrité référentielle est, par exemple, de dire qu'une ligne d'une table voiture-possédée ne peut exister si la personne à laquelle elle se rapporte n'existe pas.

Avec INGRES et son extension base de connaissances, on peut définir des règles qui sont des mécanismes par lesquels on invoque une procédure spécifique à chaque fois qu'une condition est vraie : par exemple, on fera en sorte de supprimer toutes les lignes de voiture-possédée se référant à une personne si cette personne est enlevée de la base :

create rule maj afterdeletefrom personne

execute procedure del_voitures (insee = old.insee);


I-5 Algèbre relationnelle et langage SQL L'algèbre relationnelle, inventée par Codd, est une collection d'opérations formelles sur les relations (ou tables).

Une opération relationnelle conduit à construire une nouvelle relation (ou table), résultat d'une opération sur une ou plusieurs relations (ou tables) opérandes.

L'algèbre relationnelle comprend les opérations classiques de la théorie des ensembles : union, intersection, différence.

I-5-1 Opérations ensemblistes

I-5-1-1 Union

l'union (R U S) de deux tables R et S ayant même schéma, c'est-à-dire mêmes lignes, est une table T contenant l'ensemble des lignes appartenant à R et des lignes appartenant à S I-5-1-2 Intersection l'intersection (R n S) de deux tables R et S de même schéma est une table T contenant les lignes communes à R et S I-5-1-3 Différence la différence (R - S) de deux tables R et S de même schéma est une table T contenant les lignes de R n'appartenant pas à S I-5-1-4 Produit cartésien On définit le produit cartésien (T = R * S) de deux tables R et S par la table T constituée par la concaténation une par une de chaque ligne de S à chaque ligne de R.

exemple :

R= étudiant ( nom, prenom)

S= études (bac, filière)

R


nom 
prenom 
Dupont 
Alain 
Perec 
Georges
Fort 
Paul 

S


bac 
filière
littéraire
économie 
sciences
sciences

T = R * S


nom 
prenom 
bac 
filière
Dupont 
Alain 
littéraire
Dupont 
Alain 
économie 
Dupont 
Alain 
sciences
Dupont 
Alain 
sciences
Perec 
Georges
littéraire
Perec 
Georges
économie 
Perec 
Georges
sciences
Perec 
Georges
sciences
Fort 
Paul 
littéraire
Fort 
Paul 
économie 
Fort 
Paul 
sciences
Fort
Paul 
sciences
I-5-2 Opérations relationnelles Les opérations relationnelles comportent la projection et la restriction, qui sont des opérations unaires, et la composition ou jointure, qui est un produit cartésien suivi d'une restriction. I-5-2-1 Projection la projection consiste à créer une table T à partir d'une table R, en ne gardant qu'un certain nombre de colonnes de la table R.

exemple : la projection de R sur le nom donne une table ne contenant que la colonne "nom"; les doubles, s'ils existent, sont éliminés.
 

nom
Dupont
Perec
Fort
I-5-2-2 Restriction ou sélection la restriction consiste à sélectionner les lignes d'une table R pour lesquelles une colonne vérifie une certaine propriété.

exemple : la restriction de R pour la condition "prénom de plus de 4 lettres" donne les 2 premières lignes.

R


nom
prenom
Dupont
Alain
Perec
Georges
I-5-2-3 Composition ou jointure Cette opération, essentielle en relationnel, consiste à combiner 2 (ou plus) tables pour obtenir une table résultat, en concaténant 2 à 2 les lignes des deux tables initiales (c'est le produit cartésien) et en ne gardant (restriction) que les lignes dont 2 colonnes (ou plus) dans les tables initiales vérifient une certaine propriété.

exemple :

le produit cartésien vu ci-dessus donne toutes les possibilités d'études pour chacun des étudiants;

supposons maintenant que les étudiants enregistrés aient passé leur bac et que l'on ait l'attribut "bac" dans la relation "étudiants", ce qui donnerait :

R2
 

nom
prenom
bac
Dupont 
Alain 
Perec 
Georges
Fort 
Paul 

On peut créer la table T2 donnant les filières possibles pour chaque étudiant en fonction du bac, en faisant la jointure de la table R2 avec la table S, sur la propriété : le bac de l'étudiant est le même que le bac de la table "études".

Donc, du produit cartésien précédent, on ne garde que les lignes suivantes :

T2


nom 
prenom 
bac 
filière
Dupont 
Alain 
sciences
Perec 
Georges
littéraire
Fort 
Paul 
littéraire
I-5-2-4 Jointures internes et externes On peut définir des types de jointures dits internes et externes correspondant à différentes façons de faire la sélection du produit cartésien.

La jointure interne est la jointure classique vue ci-dessus : on combine toutes les lignes de R à toutes les lignes de S pour lesquelles la valeur de l'attribut "bac" est identique dans les deux tables.

Si la table R contenaient des lignes dont la valeur de l'attribut "bac" n'existait pas dans la table S, ces lignes n'apparaîtraient pas dans la jointure interne.

De même si la table S contenaient des lignes dont la valeur de l'attribut "bac" n'existait pas dans la table R, ces lignes n'apparaîtraient pas dans la jointure interne.

exemple :

        R3
nom
prenom
bac
Dupont 
Alain 
Perec 
Georges
Truche
Jacques
X
Fort 
Paul 
        S3
bac 
filière
littéraire
économie 
sciences
sciences
économie 

résultat de la jointure interne :

        T3-interne
nom 
prenom 
bac 
filière
Dupont 
Alain 
sciences
Perec 
Georges
littéraire
Fort 
Paul 
littéraire

La jointure externe donne une table résultat comprenant des lignes qui ne sont pas en correspondance entre les deux tables origines.

Elle est dite "externe à gauche" si on prend toutes les lignes de la table de gauche de l'opération de jointure, par exemple T3-gauche = R3*S3
 

nom 
prenom 
bac 
filière
Dupont 
Alain 
sciences
Perec 
Georges
littéraire
Truche
Jacques
X
 
Fort 
Paul 
littéraire

Elle est dite "externe à droite" si on prend toutes les lignes de la table de droite de l'opération de jointure, par exemple T3-droite = R3*S3
 

nom
prenom 
bac 
filière
Dupont 
Alain 
sciences
Perec 
Georges
littéraire
Fort 
Paul 
littéraire
   
E
économie

Elle est dite "externe complète" si on prend toutes les lignes des deux tables de l'opération de jointure, par exemple T3-externe-complète = R3*S3
 

nom 
prenom 
bac 
filière
Dupont 
Alain 
sciences
Perec 
Georges
littéraire
Truche
Jacques
X
 
Fort 
Paul 
littéraire
   
E
économie


I-5-3 Écriture des opérations relationnelles en SQL Le langage SQL standard permet les opérations suivantes : I-5-3-1 la projection : select col_1, col_2,...col_n from table_t ; I-5-3-2 la restriction : select col_1,... from table_t where qualification ;

avec tri des résultats :

select * from table_t where qualification

order by col_1, col_2...;

avec qualification = expression conj expression...

avec expression = attribut_i op valeur

conj est un opérateur de connexion ( and, or)

op est un opérateur de comparaison ( =, <, >, <>, != , <=, >= )

* est une convention pour sélectionner toutes les colonnes.

I-5-3-3 la jointure (par défaut elle est interne) :

select t1.col_1, t1.col_n, t2.col_1, t2.col_n

from table_1 t1, table_2 t2

where t1.col_i = t2.col_j ;

[-------------------]

qualification multi-colonnes

t1 et t2 sont des abréviations, synonymes de table_1 et table_2. autre forme de jointure :

select col_1,... from table_1

where col_i in

(select col_j from table2)

Dans cet exemple de jointure, comme dans la plupart des cas, les deux colonnes mises en correspondance doivent être égales : on dit que l'on fait une équi-jointure.

On peut également envisager tout type d'opérateur de comparaison entre les colonnes mises en jointure.

On peut aussi faire une jointure sur plus de deux colonnes appartenant aux deux tables.

Enfin, on est parfois amené à faire la jointure d'une table sur elle-même (auto-jointure).

I-5-3-4 les jointures externes select t1.col_1, t1.col_n, t2.col_1, t2.col_n

from table_1 t1 left join table_2 t2

on t1.col_i = t2.col_j ;

ou select t1.col_1, t1.col_n, t2.col_1, t2.col_n

from table_1 t1 right join table_2 t2

on t1.col_i = t2.col_j ;

ou select t1.col_1, t1.col_n, t2.col_1, t2.col_n

from table_1 t1 full join table_2 t2

on t1.col_i = t2.col_j ;

I-5-3-5 opérateur union
l'opérateur union permet de faire l'union de deux tables résultats dont les schémas sont identiques :

exemple :

select nom from personne

union

select nom from employe

I-5-3-6 agrégats
Dans un ordre select, on peut utiliser des fonctions de calculs d'agrégats qui s'appliquent, sur une colonne, à un ensemble ou à des sous-ensembles de lignes :
 
count comptage de lignes résultats
sum somme de valeurs
avg moyenne
max maximum
min minimum

exemple : on fait le calcul des moyennes de salaires, par catégorie :

select categorie, avg(salaire) from employe

group by categorie


I-5-4 Autres fonctions de SQL

I-5-4-1 fonctions de mise à jour :

insert, delete, update sont des fonctions respectivement d'insertion, de suppression, de modification. I-5-4-2 fonctions de gestions de la base : Ces fonctions permettent de gérer les tables, les contraintes d'intégrité, les vues qui sont des représentations des données sous forme de tables construites à partir des tables de la base.

create table

create integrity

create view

...

Toutes ces fonctions sont développées dans le chapitre SQL.


I-5-5 Exemples d'opérations

I-5-5-1 sur les relations "étudiants" et études"

étudiants ( nom, prenom, bac)

études ( bac, filière)

sélection des étudiants ayant un bac A :

select * from étudiants where bac = "A" ; recherche des filières possibles pour chaque étudiant : select r.nom, s.filiere from étudiants r, études s

where r.bac = s.bac ;

I-5-5-2 sur les relations "individus", "vehicules", "modele"
individus ( insee, nom, prenom, date_naissance, departement)

vehicules ( insee, rang, type, age)

modele ( type, marque, puissance)

sélection des individus ayant plus d'un véhicule :

select distinct insee from vehicules where rang > 1 ; recherche des départements des individus ayant plus d'un véhicule : select distinct i.departement

from individus i, vehicules v

where i.insee = v.insee and v.rang > 1 ;

recherche de l'age et de la puissance des véhicules de rang 2 : select v.age, m.puissance

from vehicules v , modele m

where v.rang = 2 and v.type = m.type ;

recherche de l'age et de la puissance des véhicules appartenant aux individus du département "78" : select v.age, m.puissance

from vehicules v, modele m, individus i

where v.insee = i.insee and i.departement = "78"

and v.type = m.type ;

recherche des deux types de véhicules de rang 1 et 2 appartenant au même individu :

(il s'agit ici de faire une auto-jointure de la relation "vehicules")

select v1.type, v2.type

from vehicules v1, vehicules v2

where v1.insee = v2.insee and v1.rang = 1 and

v2.rang = 2 ;


 
 
 
 

.