Data Definition Language (DDL)
Data Definition Language (DDL) - Le langage de définition de données est le sous-langage responsable de la définition de la manière dont les données sont structurées dans une base de données. En SQL, cela correspond à la manipulation des tables via CREATE TABLE
, ALTER TABLE
et DROP TABLE
Remarque
On utilise souvent les interfaces graphiques pour générer le code SQL DDL.
Cependant, il est très important de comprendre le fonctionnement du code DDL, puisque les interfaces graphiques ne font qu’offrir une interface pour générer ce code.
Bien souvent, les interfaces graphiques ne produisent pas le code DDL souhaité… et il faudra être en mesure d’évaluer le code généré et le corriger si nécessaire.
Par ailleurs, le code DDL varie d’un SGBD à l’autre, et il est important de comprendre les spécificités de chaque SGBD pour écrire du code DDL compatible.
Que permet de faire le DDL ?
- Créer et supprimer des schémas relationnels (des bases de données)
- Créer, modifier et supprimer des tables et des colonnes
- Ajouter ou supprimer des contraintes statiques et dynamiques sur les colonnes et les tables
Création d’un schéma relationnel
Une base de données est définie par son schéma.
La création d’un schéma varie d’un SGBD à l’autre, mais la syntaxe de base est la suivante :
- Postgresql :
CREATE SCHEMA clicom;
- MySQL, SQL Server, Oracle :
CREATE DATABASE clicom;
- SQLite : il faut créer un fichier, puis en ligne de commande :
sqlite3 mon_fichier.db
Cette instruction pourra être accompagnée de divers paramètres spécifiant notamment les conditions d’autorisation d’accès
Les schémas sont rassemblés dans un catalogue, qui représente un ensemble de bases de données
Création de tables
La syntaxe de base pour créer une table est la suivante :
1CREATE TABLE table_name (2 column1 datatype,3 column2 datatype,4 column3 datatype,5 ...6);
table_name
: le nom de la table à créercolumn1, column2, column3, ...
: les noms des colonnes de la tabledatatype
: le type de données pour chaque colonne
Création de tables
Exemple :
1CREATE TABLE employees (2 id INT,3 first_name VARCHAR(50),4 last_name VARCHAR(50),5 email VARCHAR(100)6);
Types de données
Les types de données les plus courants pour les colonnes sont :
INT
: entierVARCHAR(n)
: chaîne de caractères de longueurn
TEXT
: chaîne de caractères de longueur variableCHAR(n)
: chaîne de caractères de longueur fixen
DATETIME
: date et heureBOOLEAN
: booléenDATE
: dateTIME
: heureFLOAT
: nombre à virgule flottanteDECIMAL(p, s)
: nombre décimal de précisionp
et de tailles
DOUBLE
: nombre à virgule flottante double précisionBLOB
: données binaires
Types de données
Exemples
1CREATE TABLE employees (2 id INT,3 first_name VARCHAR(50),4 last_name VARCHAR(50),5 email VARCHAR(100)6);
1CREATE TABLE products (2 id INT,3 name VARCHAR(100),4 price DECIMAL(10, 2),5 description TEXT6);
1CREATE TABLE orders (2 id INT,3 order_date DATE,4 total_amount DECIMAL(10, 2),5 is_paid BOOLEAN6);
Les clés primaires
PRIMARY KEY
: définit une colonne ou plusieurs colonnes comme clé primaire
Déclaration sur une seule colonne :
1CREATE TABLE table_name (2 column1 datatype PRIMARY KEY,3 column2 datatype,4 column3 datatype,5 ...6);
Déclaration sur plusieurs colonnes :
1CREATE TABLE table_name (2 column1 datatype,3 column2 datatype,4 column3 datatype,5 ...6 PRIMARY KEY (column1, column2)7);
Les clés étrangères
FOREIGN KEY
et REFERENCES
: définit une colonne comme clé étrangère et la table à laquelle elle fait référence
1CREATE TABLE table_name (2 column1 datatype,3 column2 datatype,4 column3 datatype,5 ...6 FOREIGN KEY (column1) REFERENCES other_table(column_name)7);
Les clés étrangères
Si au moins une des colonnes est facultative, alors il est possible de préciser via la clause MATCH
, la manière dont l’intégrité référentielle sera vérifiée en présence de valeurs NULL
MATCH SIMPLE
: si toute les colonnes de la clé étrangère possèdent une valeur, la contrainte référentielle est évaluée, sinon elle est ignorée :
1FOREIGN KEY (numClient, numFournisseur) references ACHAT(numClient, numFournisseur) MATCH SIMPLE
MATCH FULL
: si les colonnes sont toutes nulles, la contrainte est ignorée. Si elles sont toutes non nulles, elle est évaluée. Dans les autres cas, elle n’est pas satisfaite :
1FOREIGN KEY (numClient, numFournisseur) references ACHAT(numClient, numFournisseur) MATCH FULL
MATCH PARTIAL
: la contrainte est évaluée pour les colonnes non nulles. La table cible doit contenir au moins une ligne dont l’identifiant comporte les valeurs non nulles de la clé étrangère :
1FOREIGN KEY (numClient, numFournisseur) references ACHAT(numClient, numFournisseur) MATCH PARTIAL
Autres contraintes
UNIQUE
: interdit les doublons. Permet de créer des identifiants secondaires.NOT NULL
: interdit les valeurs nullesCHECK
: vérifie une conditionDEFAULT
: définit une valeur par défautAUTO_INCREMENT
: incrémente automatiquement la valeur - En général utilisé pour les clés primaires numériques entièresINDEX
: crée un index sur une colonne. Les index permettent d’accélerer le résultat de requêtes sur des colonnes non identifiantes. Les clés primaires sont automatiquement indexées.
Contraintes statiques
Exemples
1CREATE TABLE customers (2 id INT PRIMARY KEY AUTO_INCREMENT,3 first_name VARCHAR(50) NOT NULL,4 last_name VARCHAR(50) NOT NULL,5 email VARCHAR(100) UNIQUE6);
La colonne
id
est définie comme clé primaire, et elle s’incrémentera automatiquement en démarrant à 1. Les colonnesfirst_name
etlast_name
ne peuvent pas être nulles. La colonne
Contraintes statiques
1CREATE TABLE test (2 col1 INT,3 col2 VARCHAR(50),4 PRIMARY KEY (col1, col2)5);
La combinaison des colonnes
col1
etcol2
est définie comme clé primaire.
Contraintes statiques
1CREATE TABLE products (2 id INT PRIMARY KEY AUTO_INCREMENT,3 pname VARCHAR(100) NOT NULL,4 price DECIMAL(10, 2) NOT NULL,5 pdescription TEXT6);
La colonne
price
doit contenir des valeurs décimales non nulles, avec une précision de 10 chiffres et 2 chiffres après la virgule.
Contraintes statiques
1CREATE TABLE orders (2 id INT PRIMARY KEY AUTO_INCREMENT,3 order_date DATE NOT NULL,4 total_amount DECIMAL(10, 2) NOT NULL,5 is_paid BOOLEAN DEFAULT FALSE,6 customer_id INT,7 FOREIGN KEY (customer_id) REFERENCES customers(id)8);
La colonne
is_paid
est définie par défaut àFALSE
. La colonnecustomer_id
est une clé étrangère qui fait référence à la tablecustomers
.
Contraintes statiques
1CREATE TABLE order_items (2 id INT PRIMARY KEY AUTO_INCREMENT,3 order_id INT,4 product_id INT,5 quantity INT,6 FOREIGN KEY (order_id) REFERENCES orders(id),7 FOREIGN KEY (product_id) REFERENCES products(id)8);
Les colonnes
order_id
etproduct_id
sont des clés étrangères qui font référence aux tablesorders
etproducts
.
Contraintes statiques
1CREATE TABLE employees (2 id INT PRIMARY KEY AUTO_INCREMENT,3 first_name VARCHAR(50) NOT NULL,4 last_name VARCHAR(50) NOT NULL,5 email VARCHAR(100) UNIQUE,6 salary DECIMAL(10, 2) CHECK (salary > 0)7);
La colonne
salary
doit contenir des valeurs décimales non nulles et supérieures à 0.
Modification de tables
Il est possible de modifier une table existante en ajoutant, modifiant ou supprimant des colonnes.
La syntaxe de base pour ajouter une colonne à une table est la suivante :
1ALTER TABLE table_name2ADD column_name datatype;
Modification de tables
Exemples :
Ajout d’une colonne
1ALTER TABLE employees2ADD hire_date DATE;
Changement d’une colonne
1ALTER TABLE employees2MODIFY COLUMN hire_date DATETIME;
Suppression d’une colonne
1ALTER TABLE employees2DROP COLUMN hire_date;
Suppression de tables
La syntaxe pour supprimer une table est la suivante :
1DROP TABLE table_name;
Exercice
Proposez des requêtes SQL pour :
- Créer une table
categories
avec les colonnesnumero
etnom
- Avec une contrainte
PRIMARY KEY
etAUTO_INCREMENT
sur la colonnenumero
- Avec une contrainte
NOT NULL
sur la colonnenom
- Avec une contrainte
- Créer une table
produits_categories
avec les colonnesproduit_numero
etcategory_numero
- Avec des contraintes
FOREIGN KEY
sur les colonnesproduit_numero
etcategory_numero
- Avec des contraintes
Solution
1CREATE TABLE categories (2 numero INTEGER PRIMARY KEY AUTOINCREMENT,3 nom VARCHAR(50) NOT NULL4);5
6CREATE TABLE produits_categories (7 produit_numero INT,8 category_numero INT,9 FOREIGN KEY (produit_numero) REFERENCES produits(numero),10 FOREIGN KEY (category_numero) REFERENCES categories(numero),11 PRIMARY KEY (produit_numero, category_numero)12);