Chapitre 223 minDébutant
La base d'exemple : schéma et script
Par Josselyn C., prof de BTS SIO. Mis à jour le .
À la fin de ce chapitre, tu sauras
- passer du MCD au schéma relationnel de la base
parc; - lire le script de création et le jeu de données ;
- explorer une base inconnue avec
SHOW TABLESetDESCRIBE.
3 exercices corrigés1 schéma
La base parc est la base de données d'exemple de tout le cours SQL : le parc informatique et l'assistance d'une PME fictive, en sept tables. Ce chapitre donne son schéma relationnel, le script MySQL qui la crée et la remplit, et les commandes pour explorer une base inconnue. Les autres chapitres l'appellent la base fil rouge : leurs exemples et leurs résultats en dépendent.
Le contexte
Sorbier Logistique est une entreprise fictive de 14 salariés ; elle compte 6 services. Son service informatique compte trois personnes : Antoine Mercier, le responsable, et deux techniciens, Chloé Lambert et Moussa Diallo. Ils gèrent le parc (postes, logiciels, licences) et l'assistance : chaque demande d'un salarié devient un ticket, et chaque passage d'un technicien sur ce ticket devient une intervention.
Tu arrives en alternance dans ce service. La base parc contient tout ce qui précède. C'est exactement ce que gère un outil comme GLPI (cours GLPI et gestion de parc) : le cas parle autant à un futur administrateur réseau qu'à un futur développeur.
Du MCD au schéma relationnel
La base vient d'un modèle conceptuel de données (MCD). Les règles de passage au modèle relationnel sont détaillées dans le cours Merise ; voici celles qui ont produit la base :
- chaque entité devient une table, son identifiant devient la clé primaire ;
- une association de type « 1,1 vers 0,n » (un employé appartient à un seul service, un service a zéro ou plusieurs employés) devient une clé étrangère du côté « 1,1 » :
employe.id_service; - une association avec une cardinalité « 0,1 » donne une clé étrangère facultative : un poste est affecté à zéro ou un employé, d'où
poste.id_employe, qui accepteNULL; - une association « plusieurs à plusieurs » devient une table dont la clé primaire est composée des deux clés étrangères : un poste porte plusieurs logiciels, un logiciel est installé sur plusieurs postes, d'où la table
installation; - une association réflexive (un employé encadre d'autres employés) devient une clé étrangère vers la même table :
employe.id_responsable.
Le schéma relationnel complet, au format des sujets :
service (id_service, code, libelle, etage)
employe (id_employe, nom, prenom, email, telephone, date_embauche, #id_service, #id_responsable)
poste (id_poste, num_inventaire, type_poste, marque, modele, date_achat, prix_achat, #id_employe)
logiciel (id_logiciel, nom, editeur, categorie, nb_licences)
installation (#id_poste, #id_logiciel, date_installation)
ticket (id_ticket, titre, date_ouverture, date_cloture, priorite, statut, #id_demandeur, #id_poste)
intervention (id_intervention, #id_ticket, #id_technicien, date_intervention, duree_min, compte_rendu)
- employe.id_service en référence à service.id_service ; employe.id_responsable en référence à employe.id_employe
- poste.id_employe en référence à employe.id_employe
- installation.id_poste en référence à poste.id_poste ; installation.id_logiciel en référence à logiciel.id_logiciel
- ticket.id_demandeur en référence à employe.id_employe ; ticket.id_poste en référence à poste.id_poste
- intervention.id_ticket en référence à ticket.id_ticket ; intervention.id_technicien en référence à employe.id_employe
La table employe est la plus reliée : quatre clés étrangères pointent vers elle (le responsable, l'utilisateur d'un poste, le demandeur d'un ticket, le technicien d'une intervention) et elle pointe elle-même vers service. Tu la retrouveras dans presque toutes les jointures.
Le script de création et le jeu de données
Le script crée les sept tables et les remplit. Deux façons de l'exécuter :
- télécharge le fichier parc.sql, puis lance
mysql -u root -p < parc.sqldans le dossier où il se trouve (avec Docker, la commandedocker exec -ide l'installation) ; - ou ouvre le script ci-dessous, copie-le avec le bouton Copier et colle-le à l'invite du client
mysql, dans l'onglet SQL de phpMyAdmin, ou dans DBeaver avec « Exécuter le script » (Alt+X).
Tu comprendras chaque ligne au chapitre 3 ; pour l'instant, lis les commentaires.
Afficher le script complet (198 lignes)Masquer la réponse
-- Base fil rouge « parc » : parc informatique et assistance de Sorbier Logistique (entreprise fictive)
-- MySQL 8.4 LTS ou MariaDB 10.11 et plus (compatible 10.6). Rejouable : la base est supprimée puis recréée.
DROP DATABASE IF EXISTS parc;
CREATE DATABASE parc CHARACTER SET utf8mb4;
USE parc;
CREATE TABLE service (
id_service INT AUTO_INCREMENT PRIMARY KEY,
code VARCHAR(8) NOT NULL UNIQUE,
libelle VARCHAR(50) NOT NULL,
etage TINYINT -- NULL : pas encore de bureau attribué
);
CREATE TABLE employe (
id_employe INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(50) NOT NULL,
prenom VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
telephone VARCHAR(20), -- facultatif
date_embauche DATE NOT NULL,
id_service INT NOT NULL,
id_responsable INT, -- NULL pour la directrice
CONSTRAINT fk_employe_service FOREIGN KEY (id_service)
REFERENCES service (id_service),
CONSTRAINT fk_employe_responsable FOREIGN KEY (id_responsable)
REFERENCES employe (id_employe) ON DELETE SET NULL
);
CREATE TABLE poste (
id_poste INT AUTO_INCREMENT PRIMARY KEY,
num_inventaire CHAR(7) NOT NULL UNIQUE, -- PC-0001
type_poste VARCHAR(10) NOT NULL,
marque VARCHAR(30) NOT NULL,
modele VARCHAR(50) NOT NULL,
date_achat DATE NOT NULL,
prix_achat DECIMAL(8,2) NOT NULL,
id_employe INT, -- NULL : poste en stock
CONSTRAINT ck_poste_type CHECK (type_poste IN ('fixe', 'portable')),
CONSTRAINT ck_poste_prix CHECK (prix_achat >= 0),
CONSTRAINT fk_poste_employe FOREIGN KEY (id_employe)
REFERENCES employe (id_employe) ON DELETE SET NULL
);
CREATE TABLE logiciel (
id_logiciel INT AUTO_INCREMENT PRIMARY KEY,
nom VARCHAR(60) NOT NULL UNIQUE,
editeur VARCHAR(60) NOT NULL,
categorie VARCHAR(20) NOT NULL,
nb_licences SMALLINT, -- NULL : logiciel libre, rien à décompter
CONSTRAINT ck_logiciel_licences CHECK (nb_licences >= 0)
);
CREATE TABLE installation (
id_poste INT NOT NULL,
id_logiciel INT NOT NULL,
date_installation DATE NOT NULL,
PRIMARY KEY (id_poste, id_logiciel),
CONSTRAINT fk_installation_poste FOREIGN KEY (id_poste)
REFERENCES poste (id_poste) ON DELETE CASCADE,
CONSTRAINT fk_installation_logiciel FOREIGN KEY (id_logiciel)
REFERENCES logiciel (id_logiciel)
);
CREATE TABLE ticket (
id_ticket INT AUTO_INCREMENT PRIMARY KEY,
titre VARCHAR(100) NOT NULL,
date_ouverture DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
date_cloture DATETIME, -- NULL tant que le ticket n'est pas résolu
priorite VARCHAR(10) NOT NULL DEFAULT 'normale',
statut VARCHAR(10) NOT NULL DEFAULT 'ouvert',
id_demandeur INT NOT NULL,
id_poste INT, -- NULL : demande sans poste précis
CONSTRAINT ck_ticket_priorite CHECK (priorite IN ('basse', 'normale', 'haute', 'critique')),
CONSTRAINT ck_ticket_statut CHECK (statut IN ('ouvert', 'en_cours', 'resolu')),
CONSTRAINT ck_ticket_dates CHECK (date_cloture IS NULL OR date_cloture >= date_ouverture),
CONSTRAINT fk_ticket_demandeur FOREIGN KEY (id_demandeur)
REFERENCES employe (id_employe),
CONSTRAINT fk_ticket_poste FOREIGN KEY (id_poste)
REFERENCES poste (id_poste) ON DELETE SET NULL
);
CREATE TABLE intervention (
id_intervention INT AUTO_INCREMENT PRIMARY KEY,
id_ticket INT NOT NULL,
id_technicien INT NOT NULL,
date_intervention DATETIME NOT NULL,
duree_min SMALLINT NOT NULL,
compte_rendu VARCHAR(255),
CONSTRAINT ck_intervention_duree CHECK (duree_min > 0),
CONSTRAINT fk_intervention_ticket FOREIGN KEY (id_ticket)
REFERENCES ticket (id_ticket) ON DELETE CASCADE,
CONSTRAINT fk_intervention_technicien FOREIGN KEY (id_technicien)
REFERENCES employe (id_employe)
);
-- Jeu de données
INSERT INTO service (id_service, code, libelle, etage) VALUES
(1, 'DIR', 'Direction', 3),
(2, 'COMPTA', 'Comptabilité', 2),
(3, 'COMM', 'Commercial', 1),
(4, 'LOGI', 'Logistique', 0),
(5, 'INFO', 'Informatique', 2),
(6, 'JURI', 'Juridique', NULL);
-- Chaque responsable est inséré avant les personnes qu'il encadre.
INSERT INTO employe (id_employe, nom, prenom, email, telephone, date_embauche, id_service, id_responsable) VALUES
(1, 'Garnier', 'Hélène', 'helene.garnier@sorbier.example', '01 99 00 10 01', '2012-03-01', 1, NULL),
(2, 'Morel', 'Karim', 'karim.morel@sorbier.example', '01 99 00 20 01', '2014-09-15', 2, 1),
(3, 'Lefèvre', 'Julie', 'julie.lefevre@sorbier.example', '01 99 00 20 02', '2019-01-07', 2, 2),
(4, 'Benali', 'Sofiane', 'sofiane.benali@sorbier.example', '01 99 00 30 01', '2015-04-01', 3, 1),
(5, 'Roux', 'Camille', 'camille.roux@sorbier.example', '01 99 00 30 02', '2021-05-17', 3, 4),
(6, 'Petit', 'Thomas', 'thomas.petit@sorbier.example', NULL, '2024-03-11', 3, 4),
(7, 'Faure', 'Nadia', 'nadia.faure@sorbier.example', '01 99 00 40 01', '2013-06-03', 4, 1),
(8, 'Girard', 'Lucas', 'lucas.girard@sorbier.example', '01 99 00 40 02', '2017-02-20', 4, 7),
(9, 'Bonnet', 'Inès', 'ines.bonnet@sorbier.example', NULL, '2022-10-03', 4, 8),
(10, 'Mercier', 'Antoine', 'antoine.mercier@sorbier.example', '01 99 00 50 01', '2016-11-02', 5, 1),
(11, 'Lambert', 'Chloé', 'chloe.lambert@sorbier.example', '01 99 00 50 02', '2020-09-01', 5, 10),
(12, 'Diallo', 'Moussa', 'moussa.diallo@sorbier.example', '01 99 00 50 03', '2023-09-04', 5, 10),
(13, 'Rousseau', 'Léa', 'lea.rousseau@sorbier.example', '01 99 00 40 03', '2024-06-10', 4, 8),
(14, 'Martin', 'Paul', 'paul.martin@sorbier.example', NULL, '2026-09-01', 2, 2);
INSERT INTO poste (id_poste, num_inventaire, type_poste, marque, modele, date_achat, prix_achat, id_employe) VALUES
(1, 'PC-0001', 'fixe', 'Dell', 'OptiPlex 7010', '2019-02-14', 689.00, 3),
(2, 'PC-0002', 'portable', 'Lenovo', 'ThinkPad T14', '2023-01-10', 1149.00, 1),
(3, 'PC-0003', 'fixe', 'Dell', 'OptiPlex 7010', '2019-02-14', 689.00, 2),
(4, 'PC-0004', 'portable', 'HP', 'EliteBook 840', '2021-06-03', 1029.00, 4),
(5, 'PC-0005', 'portable', 'HP', 'EliteBook 840', '2021-06-03', 1029.00, 5),
(6, 'PC-0006', 'portable', 'Lenovo', 'ThinkPad T14', '2024-03-18', 1189.00, 6),
(7, 'PC-0007', 'fixe', 'HP', 'ProDesk 400', '2020-09-22', 579.00, 7),
(8, 'PC-0008', 'fixe', 'HP', 'ProDesk 400', '2020-09-22', 579.00, 8),
(9, 'PC-0009', 'fixe', 'HP', 'ProDesk 400', '2020-09-22', 579.00, 13),
(10, 'PC-0010', 'portable', 'Dell', 'Latitude 5440', '2024-03-18', 1099.00, 10),
(11, 'PC-0011', 'portable', 'Dell', 'Latitude 5440', '2024-03-18', 1099.00, 11),
(12, 'PC-0012', 'portable', 'Lenovo', 'ThinkPad T14', '2025-09-01', 1249.00, 12),
(13, 'PC-0013', 'fixe', 'Dell', 'OptiPlex 7010', '2019-02-14', 689.00, NULL),
(14, 'PC-0014', 'portable', 'Lenovo', 'ThinkPad T14', '2026-09-15', 1249.00, NULL),
(15, 'PC-0015', 'fixe', 'HP', 'ProDesk 400', '2022-11-08', 619.00, 4);
INSERT INTO logiciel (id_logiciel, nom, editeur, categorie, nb_licences) VALUES
(1, 'Microsoft 365', 'Microsoft', 'bureautique', 12),
(2, 'LibreOffice', 'The Document Foundation', 'bureautique', NULL),
(3, 'Firefox', 'Mozilla', 'navigateur', NULL),
(4, 'Sage 100 Comptabilité', 'Sage', 'gestion', 3),
(5, 'Odoo', 'Odoo SA', 'gestion', 8),
(6, 'KeePassXC', 'KeePassXC Team', 'sécurité', NULL),
(7, 'Wireshark', 'Wireshark Foundation', 'réseau', NULL),
(8, 'Acrobat Pro', 'Adobe', 'bureautique', 2);
INSERT INTO installation (id_poste, id_logiciel, date_installation) VALUES
(1, 3, '2019-02-14'), (1, 1, '2019-02-14'), (1, 4, '2019-02-14'),
(2, 3, '2023-01-10'), (2, 1, '2023-01-10'), (2, 6, '2023-01-10'),
(3, 3, '2019-02-14'), (3, 1, '2019-02-14'), (3, 4, '2019-02-14'), (3, 5, '2023-05-15'),
(4, 3, '2021-06-03'), (4, 1, '2021-06-03'), (4, 5, '2023-05-15'),
(5, 3, '2021-06-03'), (5, 1, '2021-06-03'), (5, 5, '2023-05-15'),
(6, 3, '2024-03-18'), (6, 1, '2024-03-18'), (6, 5, '2024-03-18'),
(7, 3, '2020-09-22'), (7, 2, '2020-09-22'), (7, 5, '2023-05-15'),
(8, 3, '2020-09-22'), (8, 2, '2020-09-22'), (8, 5, '2023-05-15'),
(9, 3, '2020-09-22'), (9, 2, '2020-09-22'),
(10, 3, '2024-03-18'), (10, 1, '2024-03-18'), (10, 6, '2024-03-18'), (10, 7, '2024-03-18'),
(11, 3, '2024-03-18'), (11, 1, '2024-03-18'), (11, 6, '2024-03-18'), (11, 7, '2024-03-18'),
(12, 3, '2025-09-01'), (12, 1, '2025-09-01'), (12, 6, '2025-09-01'), (12, 7, '2025-09-01'),
(13, 3, '2019-02-14'), (13, 2, '2019-02-14'),
(15, 3, '2022-11-08'), (15, 1, '2022-11-08'), (15, 5, '2023-05-15');
INSERT INTO ticket (id_ticket, titre, date_ouverture, date_cloture, priorite, statut, id_demandeur, id_poste) VALUES
(1, 'Écran noir au démarrage', '2026-09-02 08:47:00', '2026-09-02 11:15:00', 'haute', 'resolu', 3, 1),
(2, 'Imprimante du 2e étage hors ligne', '2026-09-03 09:30:00', '2026-09-04 16:00:00', 'normale', 'resolu', 2, NULL),
(3, 'Mot de passe Odoo oublié', '2026-09-08 14:05:00', '2026-09-08 14:30:00', 'basse', 'resolu', 5, 5),
(4, 'Créer le compte de Paul Martin', '2026-08-28 10:00:00', '2026-08-31 17:00:00', 'normale', 'resolu', 2, NULL),
(5, 'Odoo très lent', '2026-09-15 10:20:00', '2026-09-17 12:00:00', 'haute', 'resolu', 4, 4),
(6, 'Ventilateur bruyant', '2026-09-22 15:40:00', NULL, 'basse', 'en_cours', 8, 8),
(7, 'Installer Sage pour Paul Martin', '2026-09-23 09:00:00', NULL, 'normale', 'ouvert', 14, NULL),
(8, 'Pièce jointe trop lourde', '2026-10-01 11:12:00', '2026-10-01 11:40:00', 'normale', 'resolu', 6, 6),
(9, 'Rançongiciel suspecté', '2026-10-05 08:05:00', '2026-10-06 18:30:00', 'critique', 'resolu', 7, 7),
(10, 'Écran noir au démarrage', '2026-10-12 08:50:00', '2026-10-12 10:05:00', 'haute', 'resolu', 3, 1),
(11, 'Accès VPN impossible', '2026-10-19 19:30:00', NULL, 'haute', 'en_cours', 4, 4),
(12, 'Clavier cassé', '2026-10-21 13:00:00', NULL, 'basse', 'ouvert', 13, 9),
(13, 'Lenteurs réseau à l''entrepôt', '2026-10-26 07:45:00', NULL, 'critique', 'en_cours', 7, NULL),
(14, 'Batterie à remplacer', '2026-10-27 16:20:00', NULL, 'normale', 'ouvert', 1, 2);
INSERT INTO intervention (id_intervention, id_ticket, id_technicien, date_intervention, duree_min, compte_rendu) VALUES
(1, 1, 11, '2026-09-02 09:10:00', 45, 'Câble vidéo défectueux remplacé'),
(2, 1, 11, '2026-09-02 10:50:00', 20, 'Pilote graphique mis à jour'),
(3, 2, 12, '2026-09-03 10:15:00', 30, 'File d''impression purgée'),
(4, 2, 12, '2026-09-04 15:20:00', 40, 'Pilote réinstallé sur le serveur d''impression'),
(5, 3, 11, '2026-09-08 14:20:00', 10, 'Mot de passe réinitialisé'),
(6, 4, 10, '2026-08-31 15:30:00', 60, 'Compte et boîte mail créés'),
(7, 5, 12, '2026-09-15 11:00:00', 90, 'Analyse : index manquants dans la base Odoo'),
(8, 5, 10, '2026-09-17 09:00:00', 120, 'Index créés, temps de réponse normal'),
(9, 6, 12, '2026-09-23 10:00:00', 15, 'Ventilateur à remplacer, pièce commandée'),
(10, 8, 11, '2026-10-01 11:20:00', 15, 'Lien de partage envoyé à la place'),
(11, 9, 10, '2026-10-05 08:20:00', 240, 'Poste isolé du réseau, analyse antivirus'),
(12, 9, 12, '2026-10-05 13:30:00', 180, 'Réinstallation complète du poste'),
(13, 9, 11, '2026-10-06 09:00:00', 150, 'Données restaurées depuis la sauvegarde'),
(14, 10, 11, '2026-10-12 09:05:00', 55, 'Carte graphique remplacée'),
(15, 11, 12, '2026-10-20 09:00:00', 35, 'Certificat VPN expiré, renouvellement demandé'),
(16, 13, 10, '2026-10-26 08:00:00', 90, 'Commutateur de l''entrepôt redémarré'),
(17, 13, 12, '2026-10-27 08:30:00', 60, 'Câble réseau endommagé repéré');
Le jeu de données est petit pour que tu puisses vérifier chaque résultat à la main, mais il contient volontairement les cas qui piègent les requêtes :
| Cas particulier | Où le trouver | Utile pour |
|---|---|---|
| Un service sans employé | Juridique (6), qui n'a pas non plus d'étage | Jointure externe, NULL |
| Des employés sans téléphone | Thomas Petit, Inès Bonnet, Paul Martin | IS NULL, COUNT(colonne) |
| Des employés sans poste | Inès Bonnet, Paul Martin | Anti-jointure |
| Un employé avec deux postes | Sofiane Benali (PC-0004 et PC-0015) | Doublons après jointure |
| Des postes en stock | PC-0013 et PC-0014 | Clé étrangère NULL |
| Un poste sans aucun logiciel | PC-0014, tout neuf | Jointure externe |
| Un logiciel jamais installé | Acrobat Pro | Anti-jointure, NOT EXISTS |
| Des logiciels libres, sans licence à compter | nb_licences à NULL | Agrégats et NULL |
| Une licence restante seulement | Odoo : 7 installations pour 8 licences | Transactions et verrous |
| Des tickets sans intervention | Tickets 7, 12 et 14 | Jointure externe, NOT EXISTS |
| Des tickets sans poste | Tickets 2, 4, 7 et 13 | Piège de NOT IN |
| Une hiérarchie sur quatre niveaux | Garnier, Faure, Girard, Bonnet et Rousseau | Auto-jointure, CTE récursive |
Explorer une base inconnue
Le jour de l'examen ou en stage, tu tombes sur une base que tu n'as pas créée. Commence toujours par la regarder.
SHOW DATABASES; -- les bases du serveur
USE parc; -- choisir la base de travail
SHOW TABLES; -- les tables de la base courante
DESCRIBE employe; -- les colonnes d'une table
SHOW CREATE TABLE employe; -- l'instruction complète qui a créé la table
SHOW INDEX FROM employe; -- les index de la table
DESCRIBE employe (ou DESC employe) affiche :
| Field | Type | Null | Key | Default | Extra |
|---|---|---|---|---|---|
| id_employe | int | NO | PRI | NULL | auto_increment |
| nom | varchar(50) | NO | NULL | ||
| prenom | varchar(50) | NO | NULL | ||
| varchar(100) | NO | UNI | NULL | ||
| telephone | varchar(20) | YES | NULL | ||
| date_embauche | date | NO | NULL | ||
| id_service | int | NO | MUL | NULL | |
| id_responsable | int | YES | MUL | NULL |
La colonne Key résume les index : PRI pour la clé primaire, UNI pour une contrainte d'unicité, MUL pour un index qui accepte les doublons. Les deux clés étrangères ont un index MUL : InnoDB le crée automatiquement (les index créés automatiquement). MariaDB affiche int(11) au lieu de int : la largeur d'affichage des entiers est obsolète depuis MySQL 8.0.17 et n'a jamais limité les valeurs.
Les commandes SHOW sont propres à MySQL et MariaDB. La base système information_schema, elle, est normalisée : PostgreSQL et SQL Server l'ont aussi. Elle décrit toutes les bases sous forme de tables que tu interroges avec SELECT. Par exemple, pour lister toutes les clés étrangères de la base parc (les colonnes referenced_table_name et referenced_column_name sont une extension de MySQL et MariaDB ; ailleurs, la même information demande une jointure avec referential_constraints) :
SELECT table_name AS table_enfant,
column_name AS colonne,
referenced_table_name AS table_parent,
referenced_column_name AS colonne_parent
FROM information_schema.key_column_usage
WHERE table_schema = 'parc'
AND referenced_table_name IS NOT NULL
ORDER BY table_enfant, colonne;
| table_enfant | colonne | table_parent | colonne_parent |
|---|---|---|---|
| employe | id_responsable | employe | id_employe |
| employe | id_service | service | id_service |
| installation | id_logiciel | logiciel | id_logiciel |
| installation | id_poste | poste | id_poste |
| intervention | id_technicien | employe | id_employe |
| intervention | id_ticket | ticket | id_ticket |
| poste | id_employe | employe | id_employe |
| ticket | id_demandeur | employe | id_employe |
| ticket | id_poste | poste | id_poste |
Exercices
Exercice 1 sur 3 Colonnes facultatives Réussi À revoir
Quelle instruction affiche la structure de la table ticket ? Dans son résultat, quelles colonnes acceptent NULL et pourquoi ce choix a-t-il un sens métier ?
Voir la réponseMasquer la réponse de l'exercice 1
DESCRIBE ticket;
Deux colonnes ont YES dans la colonne Null :
date_cloture: un ticket en cours n'a pas encore de date de clôture ;id_poste: certaines demandes ne concernent aucun poste précis (créer un compte, une imprimante réseau).
Tu avais trouvé ?
Exercice 2 sur 3 Les contraintes CHECK Réussi À revoir
MySQL 8 range les contraintes CHECK dans la table information_schema.check_constraints, qui a notamment les colonnes constraint_schema, constraint_name et check_clause. Écris la requête qui affiche le nom de chaque contrainte CHECK de la base parc, triées par nom. Combien en trouves-tu ?
Voir la réponseMasquer la réponse de l'exercice 2
SELECT constraint_name AS contrainte, check_clause AS condition_verifiee
FROM information_schema.check_constraints
WHERE constraint_schema = 'parc'
ORDER BY contrainte;
Sept contraintes : ck_intervention_duree, ck_logiciel_licences, ck_poste_prix, ck_poste_type, ck_ticket_dates, ck_ticket_priorite et ck_ticket_statut. La colonne check_clause montre la condition telle que MySQL l'a réécrite, avec des backquotes autour des noms de colonnes.
Tu avais trouvé ?
Exercice 3 sur 3 Lire le jeu de données Réussi À revoir
Sans écrire de requête, en lisant seulement les INSERT du script :
- Quels employés n'ont aucun poste ?
- Qui est le responsable direct d'Inès Bonnet, et qui est le responsable de ce responsable ?
- Combien reste-t-il de licences Odoo disponibles ?
Voir la réponseMasquer la réponse de l'exercice 3
- Inès Bonnet (9) et Paul Martin (14) : aucun poste ne porte leur identifiant dans
id_employe. - Inès Bonnet a
id_responsable = 8, Lucas Girard. Lucas Girard aid_responsable = 7, Nadia Faure. - Odoo (
id_logiciel = 5) a 8 licences. Il est installé sur les postes 3, 4, 5, 6, 7, 8 et 15, soit 7 installations : il reste une licence. Tu feras ce calcul en SQL avec une jointure.
Tu avais trouvé ?