Définition de données
2025-10-03
SQL est un monde à part entière
On peut :
Interroger des données par des requêtes (déjà vu en partie)
Administrer les bases de données :
Créer celles-ci : définition des tables (schémas, etc), contraintes..
Créer de nouvelles données, en insérer, supprimer, mettre à jour, etc
Créer et gérer les utilisateurs, leurs droits sur les objets de la base,
…
Dans ce cours : création des tables (version simplifiée) et des données
CREATE TABLE ...Permet de définir :
Les noms et les domaines (type) des attributs ainsi que des contraintes d’intégrité comme :
Contraintes de clés primaires (PRIMARY KEY)
Contraintes référentielles (clés étrangères FOREIGN KEY, par exemple)
Des contraintes assez générales (de contrôle des données)
Des index (pour la recherche et l’exécution efficaces)
Chaque relation est définie par un nom de relation et une liste d’attributs
Chaque attribut est défini par un nom d’attribut et un type de données
Schéma:
Valeurs par défaut
Pour dateliv, c’est la date courante lors de l’insertion de la ligne dans la table,
Pour quantite, c’est une constante.
worldworld avec clé primaire composéeAttention
Une clé peut être composée de plusieurs attributs
world (suite)CREATE TABLE world.country (
countrycode bpchar(3) NOT NULL,
name_country text NOT NULL,
continent text NOT NULL,
region text NOT NULL,
surfacearea float4 NOT NULL,
indepyear int2 NULL,
population_country int4 NOT NULL,
lifeexpectancy float4 NULL,
gnp numeric(10, 2) NULL,
gnpold numeric(10, 2) NULL,
localname text NOT NULL,
governmentform text NOT NULL,
headofstate text NULL,
capital int4 NULL,
code2 bpchar(2) NOT NULL,
CONSTRAINT country_continent_check CHECK (
((continent = 'Asia'::text) OR (
continent = 'Europe'::text) OR
(continent = 'North America'::text) OR
(continent = 'Africa'::text) OR
(continent = 'Oceania'::text) OR
(continent = 'Antarctica'::text) OR
(continent = 'South America'::text))),
CONSTRAINT country_pkey PRIMARY KEY (countrycode)
);Suppression n’est pas vidange
Supprimer une table, c’est supprimer son contenu (vidange) mais aussi son schéma
On peut gérer le contenu des tables directement dans le langage SQL :
Ajouter des tuples à une table : INSERT INTO ...
Mettre à jour des tuples d’une relation : UPDATE ...
Supprimer des tuples : DELETE FROM ...
Attention
NULLINSERT INTO world.Country
(countrycode, name_country, continent,
region, surfacearea, indepyear, population_country,
lifeexpectancy, gnp, gnpold,
localname, governmentform, headofstate, capital, code2)
VALUES(
'SYL', 'Syldavia', 'Europe',
'Eastern Europe', 200000, 1918, 21345717, 81.2, 25213, 24878,
'Syldavie', 'Constitutional Monarchy', 'Ottokar II', 0, 'SY'
);La dernière partie du constructeur multiligne, qui commence avec VALUES est souvent appelée la liste de valeurs.
Une liste de valeurs peut être définie sans référence à une table existante et définir à la volée une nouvelle table virtuelle/éphémère.
Note
Quand on utilise VALUES pour définir une table virtuelle, il faut spécifier le nom des colonnes.
Par défaut, les types des colonnes sont inférés. Si l’inférence de type n’est pas possible, il faut effectuer explicitement des conversions de type comme ici avec ::timestamptz.
+----------+--------------+--------+------------+------------+
| numliv | nomf | nomp | dateliv | quantite |
|----------+--------------+--------+------------+------------|
| 1 | fournisseur1 | x21 | 2019-07-13 | 2 |
| 2 | <null> | <null> | 2018-07-29 | 10 |
+----------+--------------+--------+------------+------------+On peut faire une insertion par le biais d’une requête,
La clause VALUES est remplacée par une requête,
Les résultats de la requête sont insérés comme valeurs dans la table.
Pour respecter les contraintes d’unicité, le mot clé DISTINCT peut être nécessaire, en particulier lorsqu’il y a une jointure.
CREATE TABLE monschema.city ()
INHERITS (world.city) ;
CREATE TABLE monschema.country ()
INHERITS (world.country) ;
INSERT INTO monschema.country (
SELECT *
FROM world.country
WHERE continent = 'Europe'
);
INSERT INTO monschema.city (
SELECT ci.*
FROM world.city ci NATURAL JOIN
world.country co
WHERE co.continent = 'Europe'
) ;On peut mettre à jour des tuples d’une table par le biais d’une requête UPDATE.
Note
<expression de valeur> peut être :
NULL,SET ou FROM,Avertissement
On ne peut pas utiliser la notation nom_table.nom_attribut dans la clause SET.
Augmentation du prix d’une pièce
FROMOn peut avoir besoin de plusieurs tables pour sélectionner les tuples à mettre à jour.
La syntaxe à utiliser varie un peu selon le SGBD.
Avec PostgreSQL, on écrira les tables suplémentaires dans une clause FROM (JOIN possible si au moins deux tables supplémentaires).
Mise en garde
Si, pour une même ligne de la table Piece, plusieurs lignes de la table Livraison vérifient la condition, la mise à jour n’est effectuée qu’une seule fois.
UPDATE avec CTEIl est parfois pratique d’écrire une CTE pour définir les couples (identifiant, nouvelle valeur).
Important
L’oubli de la clause where supprime toutes les données de la table.
On supprime dans Fournisseur les tuples correspondant au fournisseur nommé 'FastDelivery'
USINGOn peut avoir besoin de plusieurs tables pour sélectionner les tuples à supprimer.
La syntaxe à utiliser varie un peu selon le SGBD. PostgreSQL ne supporte pas l’utilisation de JOIN dans la clause FROM d’une instruction DELETE.
On écrira les tables suplémentaires dans une clause USING (JOIN possible si au moins deux tables supplémentaires).
Avertissement
La requête précédente pose-t’elle problème ?
Les identifiants de l’attribut country.capital pour les pays vérifiant country.region = 'Eastern Europe' AND country.indepyear = 1991 ne seront plus référencés dans la table city.
On a vu comment créer des tables (de façon simplifiée) et gérer le contenu de celles-ci,
On peut spécifier bien plus de contraintes dans la partie création de tables,
L’ajout ou la suppression de données n’est pas libre : les contraintes (de clés notamment) doivent être satisfaites après l’exécution des mises à jours.
SQL : Définition de données, Insertion, …

MA15E045 – Bases de Données – L3 MIASHS – UParis Cité