SQL : définition de données

I. Présentation

1) Définition

Le langage de définition de données permet de définir la structure des tables. Trois actions sont possibles :

  • Création de tables, vues et contraintes.
  • Modification des tables, vues et contraintes.
  • Suppression des tables, vues et contraintes.
2) Modèle relationnel pour les exemples

Service (IdServ, NomServ, LieuServ)
- Clé primaire : Id_Serv

Employe (IdEmp, NomEmp, FonctionEmp, DateEmbaucheEmp, SalaireEmp, CommissionEmp, ServiceEmp, SuperieurEmp)
- Clé primaire : IdEmp
- Clé étrangère : ServiceEmp en référence à IdServ de Service

 

II. La création de table

1) L'instruction CREATE TABLE
a) Présentation

CREATE TABLE Nomtable (
  Champ1 TypeDonnées1,
  Champ2 TypeDonnées2,
  …
);

b) Les types de donnée
Type de donnéeType SQLDescription
Alphanumérique CHAR(n) Chaîne de caractères de longueur fixe n (n >16383)
VARCHAR(n) Chaîne de caractères de de n caractères maximum (n < 16383)
Numérique INTEGER ou INT Entier de 32 bits (de -231 à 231-1)
FLOAT Réel (le signe séparateur des décimales est un point)
DECIMAL(n,[d) Nombre de n chiffres [d décimales (facultatif)]
Date / heure DATE Date au format AAAA-MM-JJ
TIME Heure sous la forme HH:MM:SS.SS
TIMESTAMP AAAA-MM-JJ HH:MM:SS
Booléen BOOLEAN 0 ou false pour faux, 1 ou true pour vrai

 

c) Exemple

CREATE TABLE Service (
  NumServ INT,
  NomServ VARCHAR(25),
  LieuServ VARCHAR(20)
);

2) La création des clés
a) Rappel
  • Clé primaire : Champ ou groupe de champs dont chaque valeur est associée à un et un seul enregistrement de la table, unique, et ne peut donc pas être de valeur NULL.
  • Clé étrangère : Champ ou groupe de champs (mais plus rare) permettant d'associer des enregistrements, le plus souvent de tables différentes (fait généralement référence à la clé primaire d'une autre table).
b) Définition

Une clé se définit généralement en même temps que la table (lors de l'utilisation de CREATE TABLE). Mais il est également possible de définir les clés après la création de tous les champs de la table. Elles peuvent aussi être également modifiées plus tard.

CREATE TABLE Nomtable (
chp1 TypeDonnées1,
chp2 TypeDonnées2,

PRIMARY KEY (chp1 [, chp2,...]),
FOREIGN KEY (chp3 [, chp4] REFERENCES TableRef1(ChpRef1)[,
FOREIGN KEY chp5 [, chp6] REFERENCES TableRef2(ChpRef2),...]
);

c) Exemple

CREATE TABLE Employe (
  IdEmp INT,
  NomEmp VARCHAR(15),
  FonctionEmp VARCHAR(15),
  DateEmbaucheEmp DATE,
  SalaireEmp DECIMAL(7,2),
  CommissionEmp DECIMAL(7,2),
  ServiceEmp INT,
  SuperieurEmp INT,
  PRIMARY KEY (IdEmp),
  FOREIGN KEY (ServiceEmp) REFERENCES Service(NumServ),
  FOREIGN KEY (SuperieurEmp) REFERENCES Employe(IdEmp)
);

3) Les autres caractéristiques de champs
a) Caractéristiques possibles

Des caractéristiques peuvent être indiquées lors de la définition des champs, à la suite du type de données :

  • NULL et NOT NULL : indique si le champ doit être obligatoirement défini ou non.
  • UNIQUE : impose que tous les enregistrements aient une valeur différente pour un champ (sans qu'il soit obligatoirement une clé primaire).
  • DEFAULT : indique la valeur par défaut prise par le champ à la création d'un nouvel enregistrement ; il peut d'agir d'une constante numérique ou alphanumérique (sous forme de chaîne de caractères), ou du mot clé Null.
  • CHECK : précise une condition que doit remplir toute valeur saisie du champ (cette condition peut être définie à l'aide d'une sous-requête d'interrogation)
  • AUTO_INCREMENT (sous MySQL) : permet d'auto-incrémenter un champ numérique entier.
b) Exemple

CREATE TABLE Employe (
  IdEmp INT NOT NULL AUTO_INCREMENT,
  NomEmp VARCHAR(15) NOT NULL,
  FonctionEmp VARCHAR(15),
  DateEmbaucheEmp DATE,
  SalaireEmp DECIMAL(7,2) CHECK(salaire >0),
  CommissionEmp DECIMAL(7,2) DEFAULT NULL,
  ServiceEmp INT,
  SuperieurEmp INT,
  PRIMARY KEY (IdEmp),
  FOREIGN KEY (ServiceEmp) REFERENCES Service(NumServ),
  FOREIGN KEY (SuperieurEmp) REFERENCES Employe(IdEmp)
);

4) Les contraintes
a) Présentation

Il est possible d’attribuer un nom par défaut aux contraintes PRIMARY KEY, UNIQUE, CHECK et FOREIGN par le SGBD. Ces noms vont s'afficher en cas d'erreur sur ces contraintes. On définit ces noms de contrainte en plaçant CONSTRAINT NomContrainte devant la définition de la contrainte.

b) Exemple

CREATE TABLE Employe (
  IdEmp integer NOT NULL AUTO_INCREMENT,
  NomEmp varchar(15) NOT NULL,
  FonctionEmp VARCHAR(15),
  DateEmbaucheEmp DATE,
  SalaireEmp DECIMAL(7,2) CHECK(salaire >0),
  CommissionEmp DECIMAL(7,2) DEFAULT NULL,
  ServiceEmp INTEGER,
  SuperieurEmp INTEGER,
  CONTRAINT ClePrimEmp PRIMARY KEY (IdEmp),
  CONSTRAINT CleServ FOREIGN KEY (ServiceEmp) REFERENCES Service(NumServ),
  CONSTRAINT CleSuperieur FOREIGN KEY (SuperieurEmp) REFERENCES Employe(IdEmp)
);

5) Insertion de lignes à la création

Il est possible de créer une table en insérant directement des lignes lors de la création. Ces lignes à insérer peuvent être récupérées d'une table existante grâce aux instructions AS SELECT.

CREATE TABLE Nomtable (
  Champ1 TypeDonnées1,
  Champ2 TypeDonnées2,
  …
) AS SELECT...
     FROM...
     [WHERE... GROUP BY... HAVING... ORDER BY...];

 

III. Les vues

1) Définition

Une vue est une table virtuelle qui stocke les enregistrements résultat d'une requête d'interrogation afin qu'ils soient en permanence disponibles. Pour ces tables, on a la possibilité de renommer les colonnes. Une fois la vue créée, elle est utilisable comme n'importe quelle table.

CREATE VIEW NomVue [(NomChp1, NomChp2,...)]
AS SELECT...
FROM...
[WHERE... GROUP BY... HAVING... ORDER BY...];

2) Utilité des vues

L'utilisation des vues permet de fournir aux utilisateurs des données correspondant à leurs besoins :

  • Sans qu'ils aient à réaliser des requêtes parfois complexes ;
  • En leur délivrant les données, y compris calculées, qui leur sont nécessaires ;
  • Sans leur donner accès à des données qui leur sont inutiles, voir confidentielles.
3) Exemple

CREATE VIEW SubordonnésDe27047
AS SELECT Employe.*
FROM Employe
WHERE SuperieurEmp = 27047;

 

IV. Suppression d'une table ou d'une vue

DROP TABLE NomTable;

DROP VIEW NomVue;

 

V. Modification de tables

1) Ajout de champs ou de contraintes à une table
a) ALTER... ADD

Pour ajouter un ou plusieurs champs :

ALTER TABLE NomTable
ADD Chp1 TypeChp1 [,...];

Pour ajouter une contrainte :

ALTER TABLE NomTable
ADD FOREIGN KEY chp1 REFERENCES TableRef(ChpRef);

b) Exemple

ALTER TABLE Service
ADD BudgetServ DECIMAL(7,2) CHECK(BudgetServ>0);

2) Suppression de champs ou de contraintes d'une table
a) ALTER... DROP

Pour supprimer un ou plusieurs champs (possible seulement si le champ ne fait partie d'une vue ou d'un index et qu'il n'est pas l'objet d'une contrainte d'intégrité) :

ALTER TABLE NomTable
DROP Chp1 [,...];

Pour supprimer une contrainte :

ALTER TABLE NomTable
DROP PRIMARY KEY NomContrainte;

ALTER TABLE NomTable
DROP FOREIGN KEY NomContrainte;

b) Exemple

ALTER TABLE Service
DROP BudgetServ;

3) Modification de champs d'une table
a) ALTER... CHANGE / ALTER... MODIFY

ALTER associé à CHANGE (avec renommage du champ) ou MODIFY (sans renommage du champ) modifie le type ou autres caractéristiques éventuelles du champ.

ALTER TABLE NomTable
CHANGE AncienNomChp NouveauNomChp TypeDonnées,...;

ALTER TABLE NomTable
MODIFY Champ TypeDonnées,...;

Attention : en modifiant des champs, il peut y avoir des incompatibilités pour les données déjà saisies.

b) Exemples

ALTER TABLE Service
CHANGE LieuServ CPServ integer;

ALTER TABLE Employe
MODIFY CommissionEmp float;