Chapitre 112 minDébutant
C'est quoi SQL et une base relationnelle ?
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- dire ce qu'une base de données apporte face à un tableur ;
- expliquer le rôle du SGBD dans une architecture client-serveur ;
- repérer les clés primaires et étrangères d'un schéma relationnel ;
- classer une instruction SQL dans sa famille : LDD, LMD ou LCD.
3 exercices corrigés
SQL (Structured Query Language) est le langage normalisé qui sert à créer une base de données relationnelle, à y ranger des données et à les retrouver. Ce chapitre explique ce qu'est une base relationnelle, le rôle du SGBD et des clés, et les familles d'instructions SQL. Il se termine par l'installation de MySQL sur ta machine.
Fichier, tableur ou base de données
Le service informatique d'une PME suit son parc dans un tableur : une ligne par poste, avec le nom de l'utilisateur, son service, son téléphone et la liste des logiciels installés. Tant qu'il y a vingt postes et une seule personne pour tenir le fichier, ça marche. Ensuite, les ennuis arrivent.
- Redondance. Karim a deux postes : son service et son téléphone sont recopiés sur deux lignes.
- Incohérence. Karim change de numéro. Quelqu'un corrige une ligne, oublie l'autre. Laquelle croire ?
- Accès concurrents. Deux techniciens ouvrent le fichier en même temps. Le dernier qui enregistre écrase le travail de l'autre.
- Contrôle. Rien n'empêche d'écrire « environ 600 » dans la colonne du prix, ou d'affecter un poste à une personne qui n'existe pas.
- Sécurité. Qui ouvre le fichier voit tout, y compris les données personnelles.
Une base de données relationnelle range chaque information une seule fois, dans la bonne table, et relie les tables par des clés. Un logiciel spécialisé, le SGBD, fait respecter les règles et gère les accès.
| Problème | Avec un tableur | Avec un SGBD |
|---|---|---|
| Redondance | Valeurs recopiées sur chaque ligne | Chaque information stockée une fois, reliée par des clés |
| Cohérence | Aucune règle | Types, NOT NULL, UNIQUE, CHECK, clés étrangères |
| Accès concurrents | Le dernier enregistrement gagne | Transactions et verrous (chapitre 13) |
| Sécurité | Tout ou rien | Droits par compte, table et colonne (chapitre 14) |
| Volume | 1 048 576 lignes au maximum par feuille Excel | Des millions de lignes, accélérées par des index |
| Panne | Fichier corrompu, version perdue | Journaux, sauvegardes, réplication (chapitre 17) |
Le SGBD et l'architecture client-serveur
Un SGBD (système de gestion de bases de données) est le logiciel qui stocke les données, exécute les requêtes, vérifie les contraintes, gère les transactions et contrôle les droits. Il fonctionne en client-serveur : le serveur (le programme mysqld pour MySQL) écoute par défaut sur le port TCP 3306. Les clients se connectent avec un compte et un mot de passe, envoient des requêtes SQL et reçoivent les résultats.
Un client, c'est la ligne de commande mysql, une interface graphique comme phpMyAdmin ou DBeaver, ou ton application PHP, Node.js ou C#. Le serveur ne fait aucune différence : il reçoit du SQL.
| SGBD | Licence | Où tu le croises |
|---|---|---|
| MySQL (8.4 LTS) | Libre (GPL) et édition commerciale d'Oracle | Hébergeurs web, piles LAMP, sujets du BTS |
| MariaDB | Libre (GPL), dérivé de MySQL depuis 2009 | Paquet par défaut de Debian, serveurs GLPI |
| PostgreSQL | Libre (licence PostgreSQL) | Applications récentes, données géographiques, cloud |
| SQL Server | Propriétaire (Microsoft), édition Express gratuite | Environnements Windows et .NET, sujets d'E7 sur le chiffrement |
| Oracle Database | Propriétaire | Grandes entreprises, banques, administrations |
| SQLite | Domaine public, sans serveur : la base est un fichier | Applications mobiles, navigateurs, logiciels embarqués |
Tous parlent SQL, un langage normalisé par l'ISO depuis 1987. Chacun ajoute ses extensions : les bases du langage restent les mêmes partout, les fonctions de dates ou la syntaxe d'auto-incrément changent.
Le modèle relationnel
Le modèle relationnel a été proposé par Edgar F. Codd en 1970. Il range les données dans des relations, que SQL appelle des tables.
| Terme du modèle | Terme SQL | Sens |
|---|---|---|
| Relation | Table | Un ensemble de lignes de même structure |
| Attribut | Colonne | Une propriété : le nom, le prix, la date d'achat |
| Tuple | Ligne (enregistrement) | Une occurrence : un employé précis |
| Domaine | Type et contraintes | L'ensemble des valeurs permises pour un attribut |
| Degré | Nombre de colonnes | 4 pour la table service ci-dessous |
| Cardinalité | Nombre de lignes | 6 pour la table service ci-dessous |
Voici la table service de la base d'exemple que tu vas utiliser tout au long du cours :
| id_service | code | libelle | etage |
|---|---|---|---|
| 1 | DIR | Direction | 3 |
| 2 | COMPTA | Comptabilité | 2 |
| 3 | COMM | Commercial | 1 |
| 4 | LOGI | Logistique | 0 |
| 5 | INFO | Informatique | 2 |
| 6 | JURI | Juridique | NULL |
NULL signifie « valeur absente » : le service juridique vient d'être créé et n'a pas encore de bureau. Ce n'est ni zéro ni une chaîne vide (NULL et la logique à trois valeurs).
Deux propriétés du modèle ont des conséquences directes sur tes requêtes. Une relation ne contient pas deux lignes identiques : c'est la clé primaire qui le garantit. Et les lignes n'ont pas d'ordre : si tu veux un résultat trié, tu dois l'écrire avec ORDER BY.
Les clés
Clé candidate. Un ensemble minimal de colonnes dont la valeur identifie chaque ligne. La table service en a deux : id_service et code. La table employe aussi : id_employe et email.
Clé primaire (PRIMARY KEY). La clé candidate choisie pour identifier les lignes. Elle est unique et jamais NULL : c'est l'intégrité d'entité. On préfère souvent une clé artificielle, un entier généré automatiquement (id_employe), à une clé naturelle comme l'email : l'entier est court, stable, et ne change pas quand la personne change d'adresse.
Clé composée. Une clé primaire faite de plusieurs colonnes. La table installation dit quel logiciel est installé sur quel poste : sa clé est le couple (id_poste, id_logiciel). Un même poste apparaît plusieurs fois, un même logiciel aussi, mais un couple n'apparaît qu'une fois.
Clé étrangère (FOREIGN KEY). Une colonne qui fait référence à la clé primaire d'une autre table, ou de la même table. Dans employe, la colonne id_service contient le numéro du service de la personne. Le SGBD refuse un numéro de service qui n'existe pas : c'est l'intégrité référentielle.
Lire un schéma relationnel comme dans les sujets
Les sujets d'examen donnent la base sous forme de schéma relationnel textuel. La clé primaire y est soulignée et chaque clé étrangère est précédée d'un #. Le Markdown ne sait pas souligner : dans ce cours, la clé primaire est en gras.
service (id_service, code, libelle, etage)
employe (id_employe, nom, prenom, email, telephone, date_embauche, #id_service, #id_responsable)
- id_service : clé étrangère en référence à id_service de service
- id_responsable : clé étrangère en référence à id_employe de employe
La deuxième clé étrangère porte un autre nom que la colonne qu'elle référence : id_responsable contient l'identifiant d'un employé, le responsable. C'est une association réflexive. Lis toujours les lignes de contraintes sous le schéma : le nom d'une colonne ne suffit pas à savoir vers quelle table elle pointe.
Certains sujets ajoutent un dictionnaire de données, un tableau qui détaille chaque colonne. Pour la table employe :
| Colonne | Type | Contraintes | Description |
|---|---|---|---|
| id_employe | INT | Clé primaire, auto-incrément | Identifiant interne |
| nom | VARCHAR(50) | Obligatoire | Nom de famille |
| prenom | VARCHAR(50) | Obligatoire | Prénom |
| VARCHAR(100) | Obligatoire, unique | Adresse professionnelle | |
| telephone | VARCHAR(20) | Facultatif | Ligne directe |
| date_embauche | DATE | Obligatoire | Date d'arrivée |
| id_service | INT | Obligatoire, clé étrangère | Service de rattachement |
| id_responsable | INT | Facultatif, clé étrangère | Responsable direct (NULL pour la directrice) |
Les familles d'instructions SQL
| Famille | Rôle | Instructions |
|---|---|---|
| LDD, langage de définition des données | Créer et modifier la structure | CREATE, ALTER, DROP, TRUNCATE, RENAME |
| LMD, langage de manipulation des données | Ajouter, modifier, supprimer des lignes | INSERT, UPDATE, DELETE |
| LID, langage d'interrogation des données | Lire | SELECT |
| LCD, langage de contrôle des données | Gérer les droits | GRANT, REVOKE |
| Contrôle des transactions | Valider ou annuler un groupe d'opérations | START TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT |
Beaucoup d'ouvrages rangent SELECT dans le LMD. Le référentiel du BTS SIO parle de « langage d'interrogation de données » : les deux classements existent, retiens surtout qui fait quoi.
Installer ton environnement
Il te faut un serveur et un client. Trois façons d'obtenir le serveur :
- Docker (recommandé si tu l'as déjà) : un conteneur jetable, la même version que tout le monde.
- Un paquet de ton système :
sudo apt install mariadb-serversous Debian ou Ubuntu, l'installeur MySQL sous Windows,brew install mysql@8.4sous macOS. - Une pile tout-en-un sous Windows (XAMPP, WampServer, Laragon) : elle installe Apache, PHP et MySQL ou MariaDB d'un coup. Pratique pour PHP, mais vérifie la version du SGBD fournie.
# MySQL 8.4 dans un conteneur, accessible sur le port 3306 de ta machine
docker run --name mysql-cours -e MYSQL_ROOT_PASSWORD=change-moi -p 3306:3306 -d mysql:8.4
# Ouvrir le client en ligne de commande dans le conteneur
docker exec -it mysql-cours mysql -u root -p
# Exécuter un fichier de ta machine (parc.sql, le script de la base d'exemple) dans le conteneur
docker exec -i mysql-cours sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < parc.sql
Dans la dernière commande, -i transmet le fichier parc.sql au conteneur, et le mot de passe vient de la variable fixée au docker run : sans terminal, le client ne pourrait pas te le demander.
Côté client, tu as le choix :
| Client | Type | Remarque |
|---|---|---|
mysql (ou mariadb) | Ligne de commande | Toujours disponible sur un serveur, indispensable en SISR |
| phpMyAdmin | Interface web | Fournie par les piles WAMP, LAMP et par les hébergeurs |
| DBeaver | Application de bureau | Gratuite, se connecte aussi à PostgreSQL, SQL Server et SQLite |
| MySQL Workbench | Application de bureau | Éditée par Oracle, dessine aussi les schémas |
Exercices
Exercice 1 sur 3 Repérer les clés Réussi À revoir
Voici le schéma de la table des postes, au format des sujets :
poste (id_poste, num_inventaire, type_poste, marque, modele, date_achat, prix_achat, #id_employe)
- Quelle est la clé primaire ?
- Quelle autre colonne pourrait servir de clé candidate ?
- Quelle est la clé étrangère et vers quelle table pointe-t-elle ?
- Un poste en stock n'est affecté à personne. Quelle valeur prend sa clé étrangère ?
Voir la réponseMasquer la réponse de l'exercice 1
id_poste, soulignée dans un sujet.num_inventaire: chaque poste porte une étiquette unique (PC-0001). Dans la base, elle est déclaréeUNIQUEetNOT NULL.id_employe, qui référenceid_employedans la tableemploye.NULL. La colonne doit donc accepter les valeurs nulles : la clé étrangère est facultative.
Tu avais trouvé ?
Exercice 2 sur 3 Les défauts d'un tableur Réussi À revoir
Un technicien suit les tickets dans ce tableau :
| n° | titre | demandeur | service du demandeur | étage du service |
|---|---|---|---|---|
| 1 | Écran noir | Julie Lefèvre | Comptabilité | 2 |
| 2 | Imprimante | Karim Morel | Comptabilité | 2 |
| 5 | Odoo lent | Sofiane Benali | Commercial | 1 |
- Que se passe-t-il si la comptabilité déménage au 3e étage ?
- Comment enregistrer le nouveau service Juridique, qui n'a encore ouvert aucun ticket ?
- Que perd-on si l'on supprime le ticket 5 ?
Voir la réponseMasquer la réponse de l'exercice 2
- Tu dois modifier toutes les lignes des tickets de la comptabilité. Si une ligne est oubliée, la base devient incohérente : c'est une anomalie de mise à jour.
- Impossible sans inventer un faux ticket : c'est une anomalie d'insertion.
- On perd la seule trace de l'étage du service commercial : c'est une anomalie de suppression.
La solution relationnelle sépare les informations en trois tables, ticket, employe et service, reliées par des clés étrangères. C'est l'objet de la normalisation (repérer une table mal conçue et cours Merise).
Tu avais trouvé ?
Exercice 3 sur 3 Classer les instructions Réussi À revoir
Range chaque instruction dans sa famille (LDD, LMD, LID, LCD ou contrôle des transactions) : ALTER TABLE, GRANT, UPDATE, ROLLBACK, SELECT, TRUNCATE, DELETE, REVOKE, CREATE VIEW, COMMIT.
Voir la réponseMasquer la réponse de l'exercice 3
- LDD :
ALTER TABLE,TRUNCATE,CREATE VIEW - LMD :
UPDATE,DELETE - LID :
SELECT - LCD :
GRANT,REVOKE - Contrôle des transactions :
ROLLBACK,COMMIT
TRUNCATE vide une table comme un DELETE sans condition, mais c'est bien une instruction du LDD : elle recrée la table et ne s'annule pas (DROP, TRUNCATE et DELETE).
Tu avais trouvé ?