T4.3 Langage SQL (partie 1)⚓︎
Le langage SQL permet de communiquer avec le SGBD pour exploiter une base de données à l'aide de requêtes. Il comporte plusieurs parties, dont la partie langage de définition des données (LDD) et la partie langage de manipulation des données (LMD) qui sont au programme de NSI (plus ou moins explicitement...).
4.3.1 La définition des données (LDD)⚓︎
▶ Les types de données (Domaines)⚓︎
Non standardisation
Les différents types de données peuvent varier d'un SGBD à l'autre...
Dans le tableau suivant, on donne les types les plus traditionnels (tels qu'on les manipulera avec SQLite et donnés dans les sujets de BAC).
Classe de stockage | Type de donnée représentée |
---|---|
INTEGER |
Nombre entier (sur n bits, selon la taille) |
REAL |
Nombre flottant (8 bits, norme IEEE-754) |
DATE |
Format date, norme ISO AAAA-MM-JJ |
DATETIME |
Format date et heure, norme ISO AAAA-MM-JJ HH:MM:SS.SSS |
TEXT |
Chaîne de caractères codées selon l’encodage spécifié (UTF-8, ...) |
VARCHAR(n) |
Chaîne de caractères limitée à n caractères |
BLOB |
Données brutes, octets, images… stockées au format binaire. |
▶ CREATE TABLE⚓︎
Le mot-clé CREATE TABLE
permet de créer une table (étonnant, non?) en précisant son schéma.
CREATE TABLE livre (
titre TEXT,
editeur VARCHAR(45),
annee INTEGER,
isbn VARCHAR(17) PRIMARY KEY
);
Syntaxe
Si dans une requête SQL la casse n'est pas importante (on aurait très bien pu écrire Create Table
ou create table
), il ne faut pas oublier le « ;
» en fin de requête !
Exercice 1
- Lancer DB Browser for SQLite et créer une nouvelle base de donnée
bibliotheque.db
(ne pas oublier l'extension). Fermer la fenêtre de création. - Dans l'onglet Exécuter le SQL, copier-coller le code précédent, puis exécuter le code (bouton ▶ ou F5).
- Dans l'onglet Structure de la Base de Données, vérifier le schéma de cette table livre.
- De la même façon, créer la table usager en reprenant le schéma du chapitre T4.1.
CREATE TABLE usager (
nom VARCHAR(45),
prenom VARCHAR(30),
id_usager INTEGER PRIMARY KEY
);
Pour définir une clé étrangère dans la création d'une table, on utilisera le mot-clé REFERENCES
en indiquant la table et l'attribut auquel la clé fait référence. Par exemple, pour créer la table emprunt, on commencera par:
CREATE TABLE emprunt (
isbn VARCHAR(17) PRIMARY KEY REFERENCES livre(isbn),
...
);
Exercice 2
Terminer la requête de création de la table emprunt.
CREATE TABLE emprunt (
isbn VARCHAR(17) PRIMARY KEY REFERENCES livre(isbn),
id_usager INTEGER REFERENCES usager(id_usager),
date_retour DATE
);
▶ DROP TABLE⚓︎
Le mot-clé DROP TABLE
permet de supprimer une table.
DROP TABLE emprunt;
DROP TABLE usager;
DROP TABLE livre;
4.3.2 La manipulation des données (LMD) : Requêtes de mise à jour⚓︎
Commençons par créer la table élève suivante (je sais, il y a des erreurs):
id_eleve | prénom | nom | moyenne | maison |
---|---|---|---|---|
1 | Harry | Potter | 17 | Gryffondor |
2 | Hermione | Granger | 9 | Gryffondor |
3 | Luna | Lovegood | 13 | Serdaigle |
4 | Drago | Malefoy | 15 | Poufsouffle |
▶ INSERT⚓︎
Pour insérer dans une table une ligne (un enregistrement, une entité) sous la forme d'un n-uplet de valeurs, on utilise les mots-clés INSERT INTO ... VALUES ...
.
INSERT INTO eleve VALUES
(1, 'Harry', 'Potter', 17, 'Gryffondor');
On peut également insérer plusieurs lignes à la fois, en séparant les n-uplets par des virgules:
INSERT INTO eleve VALUES
(2, 'Hermione', 'Granger', 9, 'Gryffondor'),
(3, 'Luna', 'Lovegood', 13, 'Serdaigle');
Exercice 3
- Dans une nouvelle base de données, créer la table élève.
- Insérer les valeurs dans la table.
- Ajouter la ligne
(4, 'Ron', 'Wisley', 16, 'Gryffondor')
. Que se passe-t-il? Pourquoi? - Ajouter la ligne en rectifiant.
-- 1.
CREATE TABLE eleve (
id_eleve INTEGER PRIMARY KEY,
prenom VARCHAR(30),
nom VARCHAR(30),
moyenne REAL,
maison VARCHAR(15) REFERENCES maison(nom)
);
-- 2.
INSERT INTO eleve VALUES
(1, 'Harry', 'Potter', 17, 'Gryffondor'),
(2, 'Hermione', 'Granger', 9, 'Gryffondor'),
(3, 'Luna', 'Lovegood', 13, 'Serdaigle'),
(4, 'Drago', 'Malefoy', 15, 'Poufsouffle');
-- 3.
INSERT INTO eleve VALUES (4, 'Ron', 'Wisley', 16, 'Gryffondor');
-- 4.
INSERT INTO eleve VALUES (5, 'Ron', 'Wisley', 16, 'Gryffondor');
L'insertion de la ligne (4, 'Ron', 'Wisley', 16, 'Gryffondor')
provoque une erreur (violation de la contrainte de relation) car une valeur de 4 existe déjà dans la table eleve pour l'attribut id_eleve
qui est une clé primaire.
Astuce hors-programme
On peut déléguer la gestion des clés primaires avec l'instruction AUTOINCREMENT
.
CREATE TABLE eleve (
id INTEGER PRIMARY KEY AUTOINCREMENT,
prenom VARCHAR(30),
nom VARCHAR(30),
moyenne REAL,
maison VARCHAR(12)
);
INSERT INTO eleve (prenom, nom, moyenne, maison) VALUES
('Harry', 'Potter', 17, 'Gryffondor'),
('Hermione', 'Granger', 9, 'Gryffondor'),
('Luna', 'Lovegood', 13, 'Serdaigle'),
('Drago', 'Malefoy', 15, 'Poufsouffle');
Exercice 4
-
Dans la base de données précédente, créer les tables professeur puis maison en suivant les schémas:
- professeur(id_prof
Int
, nomString
, coursString
) - maison(nom
String
, dortoirString
, #id_profInt
)
- professeur(id_prof
-
Insérer dans la table professeur les lignes
(1, 'Rogue', 'potion'), (2, 'Macgonagall', 'métamorphose'), (3, 'Flitwick', 'sortilège'), (4, 'Chourave', 'botanique')
. -
Insérer dans la table maison les lignes
('Gryffondor', 'tour', 2), ('Poufsouffle', 'sous-sol', 4), ('Serpentard', 'cachot', 1)
. - Insérer dans la table maison la ligne
('Serdaigle', 'tour', 5)
. Que se passe-t-il? Pourquoi?
-- 1.
CREATE TABLE professeur (
id_prof INTEGER PRIMARY KEY,
nom VARCHAR(30),
cours VARCHAR(25)
);
CREATE TABLE maison (
nom VARCHAR(15) PRIMARY KEY,
dortoir VARCHAR(15),
id_prof INTEGER REFERENCES professeur(id_prof)
);
-- 2.
INSERT INTO professeur VALUES
(1, 'Rogue', 'potion'),
(2, 'Macgonagall', 'métamorphose'),
(3, 'Flitwick', 'sortilège'),
(4, 'Chourave', 'botanique')
;
-- 3.
INSERT INTO maison VALUES
('Gryffondor', 'tour', 2),
('Poufsouffle', 'sous-sol', 4),
('Serpentard', 'cachot', 1)
;
-- 4.
INSERT INTO maison VALUES ('Serdaigle', 'tour', 5);
L'insertion provoque une erreur (violation de la contrainte de référence) car id_prof
est une clé étrangère et la valeur 5 n'existe pas dans la table professeur à laquelle elle fait référence.
▶ UPDATE⚓︎
Le mot-clé UPDATE
permet d'actualiser une ou plusieurs valeurs d'une ligne (ou de plusieurs lignes).
UPDATE eleve SET moyenne = 19
WHERE nom = 'Granger';
Remarques
- On a précisé la ligne où la modification doit avoir lieu avec la clause
WHERE
. Sans cette clause, toutes les valeurs de l'attribut moyenne auraient été modifiées. - On peut modifier plusieurs attributs en les séparant par une virgule après le mot-clé
SET
.
Exercice 5
- Rectifier la maison de Drago Malefoy (Serpentard, pour les incultes).
- En une seule requête, rectifier l'orthographe de Ron Weasley et augmenter sa moyenne de 0.5 point (on peut faire un calcul sur l'attribut).
-- 1.
UPDATE eleve SET maison = 'Serpentard'
WHERE prenom = 'Drago';
-- 2.
UPDATE eleve SET nom = 'Weasley', moyenne = moyenne + 0.5
WHERE id = 5;
▶ DELETE⚓︎
À utiliser avec précaution, le mot-clé DELETE
permet de supprimer une ou plusieurs lignes.
DELETE FROM eleve
WHERE nom = 'Malefoy';
Sans la clause WHERE
, toutes les lignes de la table auraient été supprimées par la requête DELETE FROM eleve;
.
Exercice 6
Supprimer tous les élèves qui ne sont pas de la maison Gryffondor.
DELETE FROM eleve
WHERE maison != 'Gryffondor';