Exercices corrigés sur le langage SQL
Soit la base de données relationnelle des vols quotidiens d’une compagnie aérienne qui contient les tables Avion
, Pilote
et Vol
.
Table Avion (NA : numéro avion de type entier (clé primaire), Nom : nom avion de type texte (12),
Capacite : capacité avion de type entier, Localite : ville de localité de l’avion de type texte (10)
)
Table Pilote (NP : numéro pilote de type entier, Nom : nom du pilote de type texte (25),
Adresse : adresse du pilote de type texte (40)
)
Table Vol (NV : numéro de vol de type texte (6), NP : numéro de pilote de type entier,
NA : numéro avion de type entier, VD : ville de départ de type texte (10),
VA : ville d’arrivée de type texte (10),
HD : heure de départ de type entier, HA : heure d’arrivée de type entier
)
1. Insérer les avions suivants dans la table Avion : (100, 'AIRBUS', 300, 'RABAT'), (101, 'B737', 250, 'CASA'), (102, 'B737', 220, 'RABAT')
2. Afficher tous les avions
3. Afficher tous les avions par ordre croissant sur le nom
4. Afficher les noms et les capacités des avions
5. Afficher les localités des avions sans redondance
6. Afficher les avions dans la localité de Rabat
ou Casa
7. Modifier la capacité de l’avion numéro 101
, la nouvelle capacité est 220
8. Supprimer les avions avec une capacité inférieure à 200
9. Afficher la capacité maximale, minimale, moyenne des avions
10. Afficher les données des avions dont la capacité est la plus basse
11. Afficher les données des avions dont la capacité est supérieure à la capacité moyenne
12. Afficher le nom et l’adresse des pilotes assurant les vols IT100
et IT104
13. Afficher les numéros des pilotes qui sont en service
14. Afficher les numéros des pilotes qui ne sont pas en service
15. Afficher les noms des pilotes qui conduisent un AIRBUS
1. Insérer les avions suivants dans la table Avion :
INSERT INTO Avion (NA, Nom, Capacite, Localite)
VALUES
(100, 'AIRBUS', 300, 'RABAT'),
(101, 'B737', 250, 'CASA'),
(102, 'B737', 220, 'RABAT');
2. Afficher tous les avions :
SELECT * FROM Avion;
3. Afficher tous les avions par ordre croissant sur le nom :
SELECT * FROM Avion ORDER BY Nom ASC;
4. Afficher les noms et les capacités des avions :
SELECT Nom, Capacite FROM Avion;
5. Afficher les localités des avions sans redondance :
SELECT DISTINCT Localite FROM Avion;
6. Afficher les avions dans la localité de Rabat ou Casa :
SELECT * FROM Avion WHERE Localite IN ('RABAT', 'CASA');
7. Modifier la capacité de l'avion numéro 101, la nouvelle capacité est 220 :
UPDATE Avion SET Capacite = 220 WHERE NA = 101;
8. Supprimer les avions avec une capacité inférieure à 200 :
DELETE FROM Avion WHERE Capacite < 200;
9. Afficher la capacité maximale, minimale, moyenne des avions :
SELECT
MAX(Capacite) AS capacite_max,
MIN(Capacite) AS capacite_min,
AVG(Capacite) AS capacite_moyenne
FROM Avion;
10. Afficher les données des avions dont la capacité est la plus basse :
SELECT * FROM Avion WHERE Capacite = (SELECT MIN(Capacite) FROM Avion);
11. Afficher les données des avions dont la capacité est supérieure à la capacité moyenne :
SELECT * FROM Avion WHERE Capacite > (SELECT AVG(Capacite) FROM Avion);
12. Afficher le nom et l'adresse des pilotes assurant les vols IT100 et IT104 :
SELECT Pilote.Nom, Pilote.Adresse
FROM Pilote
JOIN Vol ON Pilote.NP = Vol.NP
WHERE Vol.NV IN ('IT100', 'IT104');
13. Afficher les numéros des pilotes qui sont en service :
SELECT NP FROM Vol;
14. Afficher les numéros des pilotes qui ne sont pas en service :
SELECT NP FROM Pilote WHERE NP NOT IN (SELECT NP FROM Vol);
15. Afficher les noms des pilotes qui conduisent un AIRBUS :
SELECT Pilote.Nom
FROM Pilote
JOIN Vol ON Pilote.NP = Vol.NP
JOIN Avion ON Vol.NA = Avion.NA
WHERE Avion.Nom = 'AIRBUS';
Vous êtes responsable de la gestion des commandes pour un site e-commerce. Vous devez créer une base de données pour stocker les informations sur les commandes, les clients et les produits. Écrivez les requêtes SQL suivantes :
• Créer une table pour stocker les informations sur les clients (\(nom\), \(email\), \(adresse\), etc.)
• Créer une table pour stocker les informations sur les produits (\(nom\), \(description\), \(prix\), etc.)
• Créer une table pour stocker les informations sur les commandes (\(numéro\: de\: commande\), \(date\), \(client\), \(produits\: achetés\), \(quantité\), \(montant\: total\), etc.)
• Sélectionner toutes les commandes d'un client spécifique
• Afficher le montant total des ventes pour une période donnée
• Trouver les 5 produits les plus vendus.
1. Créer une table pour stocker les informations sur les clients :
CREATE TABLE Clients (
ClientID INT PRIMARY KEY,
Nom VARCHAR(50) NOT NULL,
Email VARCHAR(50) UNIQUE NOT NULL,
Adresse VARCHAR(100) NOT NULL,
Telephone VARCHAR(20)
);
2. Créer une table pour stocker les informations sur les produits :
CREATE TABLE Produits (
ProduitID INT PRIMARY KEY,
Nom VARCHAR(50) NOT NULL,
Description TEXT,
Prix DECIMAL(10,2) NOT NULL CHECK (Prix > 0)
);
3. Créer une table pour stocker les informations sur les commandes :
CREATE TABLE Commandes (
CommandeID INT PRIMARY KEY,
ClientID INT FOREIGN KEY REFERENCES Clients(ClientID),
DateCommande DATE NOT NULL,
MontantTotal DECIMAL(10,2) NOT NULL CHECK (MontantTotal > 0)
);
CREATE TABLE LignesCommande (
CommandeID INT FOREIGN KEY REFERENCES Commandes(CommandeID),
ProduitID INT FOREIGN KEY REFERENCES Produits(ProduitID),
Quantite INT NOT NULL CHECK (Quantite > 0),
PRIMARY KEY (CommandeID, ProduitID)
);
4. Sélectionner toutes les commandes d'un client spécifique :
SELECT Commandes.CommandeID, Commandes.DateCommande, Commandes.MontantTotal
FROM Commandes
WHERE Commandes.ClientID = (
SELECT ClientID
FROM Clients
WHERE Nom = 'John Doe'
);
5. Afficher le montant total des ventes pour une période donnée :
SELECT SUM(Commandes.MontantTotal) AS MontantTotalVentes
FROM Commandes
WHERE Commandes.DateCommande BETWEEN '2023-01-01' AND '2023-12-31';
6. Trouver les 5 produits les plus vendus :
SELECT Produits.Nom, SUM(LignesCommande.Quantite) AS UniteesVendues
FROM LignesCommande
JOIN Produits ON LignesCommande.ProduitID = Produits.ProduitID
GROUP BY Produits.Nom
ORDER BY UniteesVendues DESC
LIMIT 5;
Vous êtes responsable de la gestion des ressources humaines d'une entreprise. Vous devez créer une base de données pour stocker les informations sur les employés, les départements et les postes. Écrivez les requêtes SQL suivantes :
• Créer une table pour stocker les informations sur les employés (\(nom\), \(prénom\), \(date\: de\: naissance\), \(date\: d'embauche\), \(poste\), \(département\), \(salaire\), etc.)
• Créer une table pour stocker les informations sur les départements (\(nom\), \(responsable\), etc.)
• Créer une table pour stocker les informations sur les postes (\(nom\), \(description\), \(salaire\: minimum\) et \(maximum\), etc.)
• Sélectionner tous les employés d'un département spécifique
• Afficher le nombre d'employés par département
• Trouver les 3 employés les mieux payés.
1. Créer la table des employés :
CREATE TABLE employes (
id_employe INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
date_naissance DATE,
date_embauche DATE,
poste_id INT,
departement_id INT,
salaire DECIMAL(10,2)
);
2. Créer la table des départements :
CREATE TABLE departements (
id_departement INT PRIMARY KEY,
nom VARCHAR(100),
responsable_id INT
);
3. Créer la table des postes :
CREATE TABLE postes (
id_poste INT PRIMARY KEY,
nom VARCHAR(100),
description TEXT,
salaire_min DECIMAL(10,2),
salaire_max DECIMAL(10,2)
);
4. Sélectionner tous les employés d'un département spécifique :
SELECT employes.nom, employes.prenom, postes.nom AS poste, departements.nom AS departement
FROM employes
JOIN postes ON employes.poste_id = postes.id_poste
JOIN departements ON employes.departement_id = departements.id_departement
WHERE departements.nom = 'Informatique';
5. Afficher le nombre d'employés par département :
SELECT departements.nom, COUNT(employes.id_employe) AS nombre_employes
FROM employes
JOIN departements ON employes.departement_id = departements.id_departement
GROUP BY departements.nom;
6. Trouver les 3 employés les mieux payés :
SELECT employes.nom, employes.prenom, employes.salaire
FROM employes
ORDER BY employes.salaire DESC
LIMIT 3;
Vous êtes responsable de la gestion d'une bibliothèque. Vous devez créer une base de données pour stocker les informations sur les livres, les auteurs et les emprunts. Écrivez les requêtes SQL suivantes :
• Créer une table pour stocker les informations sur les livres (titre, auteur, éditeur, année de publication, genre, disponibilité, etc.)
• Créer une table pour stocker les informations sur les auteurs (nom, prénom, date de naissance, nationalité, etc.)
• Créer une table pour stocker les informations sur les emprunts (numéro d'emprunt, date d'emprunt, date de retour, livre emprunté, emprunteur, etc.)
• Sélectionner tous les livres d'un auteur spécifique
• Afficher le nombre de livres empruntés par un lecteur spécifique
• Trouver les 10 livres les plus empruntés.
1. Créer la table des livres :
CREATE TABLE livres (
id_livre INT PRIMARY KEY,
titre VARCHAR(100),
auteur_id INT,
editeur VARCHAR(50),
annee_publication INT,
genre VARCHAR(50),
disponibilite BOOLEAN
);
2. Créer la table des auteurs :
CREATE TABLE auteurs (
id_auteur INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
date_naissance DATE,
nationalite VARCHAR(50)
);
3. Créer la table des emprunts :
CREATE TABLE emprunts (
id_emprunt INT PRIMARY KEY,
date_emprunt DATE,
date_retour DATE,
livre_id INT,
emprunteur VARCHAR(100)
);
4. Sélectionner tous les livres d'un auteur spécifique :
SELECT livres.titre, livres.annee_publication, livres.genre, livres.disponibilite
FROM livres
JOIN auteurs ON livres.auteur_id = auteurs.id_auteur
WHERE auteurs.nom = 'Dupont' AND auteurs.prenom = 'Jean';
5. Afficher le nombre de livres empruntés par un lecteur spécifique :
SELECT COUNT(*) AS nombre_livres_empruntes
FROM emprunts
WHERE emprunteur = 'Marie Dupont';
6. Trouver les 10 livres les plus empruntés :
SELECT livres.titre, COUNT(emprunts.id_emprunt) AS nombre_emprunts
FROM livres
JOIN emprunts ON livres.id_livre = emprunts.livre_id
GROUP BY livres.titre
ORDER BY nombre_emprunts DESC
LIMIT 10;
Vous travaillez pour une entreprise de vente en gros qui souhaite améliorer la gestion de ses ventes. Créez une base de données qui comprend les tables suivantes :
• Clients (id_client, nom, adresse, ville, pays, téléphone)
• Produits (id_produit, nom, description, prix_unitaire, quantité_en_stock)
• Commandes (id_commande, id_client, date_commande, date_livraison, statut)
• Lignes_de_commande (id_commande, id_produit, quantité, prix_unitaire)
Écrivez les requêtes SQL suivantes :
• Afficher la liste des 10 meilleurs clients en fonction du montant total de leurs achats
• Trouver les 5 produits les plus vendus au cours des 6 derniers mois
• Calculer le chiffre d'affaires mensuel de l'entreprise pour l'année en cours
• Générer un rapport des commandes en retard (date_livraison < date_actuelle) avec le nom du client et le montant total de la commande.
1. Créer les tables :
CREATE TABLE Clients (
id_client INT PRIMARY KEY,
nom VARCHAR(100),
adresse VARCHAR(200),
ville VARCHAR(100),
pays VARCHAR(100),
telephone VARCHAR(20)
);
CREATE TABLE Produits (
id_produit INT PRIMARY KEY,
nom VARCHAR(100),
description TEXT,
prix_unitaire DECIMAL(10,2),
quantite_en_stock INT
);
CREATE TABLE Commandes (
id_commande INT PRIMARY KEY,
id_client INT,
date_commande DATE,
date_livraison DATE,
statut VARCHAR(50),
FOREIGN KEY (id_client) REFERENCES Clients(id_client)
);
CREATE TABLE Lignes_de_commande (
id_commande INT,
id_produit INT,
quantite INT,
prix_unitaire DECIMAL(10,2),
FOREIGN KEY (id_commande) REFERENCES Commandes(id_commande),
FOREIGN KEY (id_produit) REFERENCES Produits(id_produit)
);
2. Afficher la liste des 10 meilleurs clients en fonction du montant total de leurs achats :
SELECT c.nom, SUM(lc.quantite * lc.prix_unitaire) AS montant_total
FROM Clients c
JOIN Commandes co ON c.id_client = co.id_client
JOIN Lignes_de_commande lc ON co.id_commande = lc.id_commande
GROUP BY c.nom
ORDER BY montant_total DESC
LIMIT 10;
3. Trouver les 5 produits les plus vendus au cours des 6 derniers mois :
SELECT p.nom, SUM(lc.quantite) AS quantite_vendue
FROM Produits p
JOIN Lignes_de_commande lc ON p.id_produit = lc.id_produit
JOIN Commandes c ON lc.id_commande = c.id_commande
WHERE c.date_commande >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY p.nom
ORDER BY quantite_vendue DESC
LIMIT 5;
4. Calculer le chiffre d'affaires mensuel de l'entreprise pour l'année en cours :
SELECT
MONTH(date_commande) AS mois,
YEAR(date_commande) AS annee,
SUM(lc.quantite * lc.prix_unitaire) AS chiffre_affaires
FROM Commandes c
JOIN Lignes_de_commande lc ON c.id_commande = lc.id_commande
WHERE YEAR(date_commande) = YEAR(CURDATE())
GROUP BY mois, annee
ORDER BY annee, mois;
5. Générer un rapport des commandes en retard avec le nom du client et le montant total de la commande :
SELECT
c.nom AS nom_client,
SUM(lc.quantite * lc.prix_unitaire) AS montant_total,
co.date_livraison
FROM Clients c
JOIN Commandes co ON c.id_client = co.id_client
JOIN Lignes_de_commande lc ON co.id_commande = lc.id_commande
WHERE co.date_livraison < CURDATE()
GROUP BY c.nom, co.date_livraison
ORDER BY co.date_livraison;
Vous travaillez pour une entreprise qui gère un système de réservation de salles de conférence. Créez une base de données qui comprend les tables suivantes :
• Salles (id_salle, nom, capacité, équipement)
• Réservations (id_réservation, id_salle, date_début, date_fin, id_client, statut)
• Clients (id_client, nom, entreprise, téléphone, email)
Écrivez les requêtes SQL suivantes :
• Afficher la liste des salles disponibles à une date et heure données
• Trouver les 3 clients ayant effectué le plus de réservations au cours des 12 derniers mois
• Générer un rapport des réservations à venir pour la semaine prochaine, avec le nom de la salle, les dates de réservation et le nom du client
• Mettre à jour le statut d'une réservation (annulée, confirmée, etc.) en fonction de l'id de la réservation.
CREATE TABLE Salles (
id_salle INT PRIMARY KEY,
nom VARCHAR(100),
capacite INT,
equipement TEXT
);
CREATE TABLE Clients (
id_client INT PRIMARY KEY,
nom VARCHAR(100),
entreprise VARCHAR(100),
telephone VARCHAR(20),
email VARCHAR(100)
);
CREATE TABLE Reservations (
id_reservation INT PRIMARY KEY,
id_salle INT,
date_debut DATETIME,
date_fin DATETIME,
id_client INT,
statut VARCHAR(50),
FOREIGN KEY (id_salle) REFERENCES Salles(id_salle),
FOREIGN KEY (id_client) REFERENCES Clients(id_client)
);
2. Afficher la liste des salles disponibles à une date et heure données :
SELECT s.nom, s.capacite, s.equipement
FROM Salles s
WHERE s.id_salle NOT IN (
SELECT r.id_salle
FROM Reservations r
WHERE r.date_debut <= '2024-08-06 18:00:00' AND r.date_fin >= '2024-08-06 20:00:00'
);
3. Trouver les 3 clients ayant effectué le plus de réservations au cours des 12 derniers mois :
SELECT c.nom, c.entreprise, COUNT(*) AS nb_reservations
FROM Clients c
JOIN Reservations r ON c.id_client = r.id_client
WHERE r.date_debut >= DATE_SUB(CURDATE(), INTERVAL 12 MONTH)
GROUP BY c.nom, c.entreprise
ORDER BY nb_reservations DESC
LIMIT 3;
4. Générer un rapport des réservations à venir pour la semaine prochaine, avec le nom de la salle, les dates de réservation et le nom du client :
SELECT
s.nom AS nom_salle,
r.date_debut,
r.date_fin,
c.nom AS nom_client
FROM Reservations r
JOIN Salles s ON r.id_salle = s.id_salle
JOIN Clients c ON r.id_client = c.id_client
WHERE r.date_debut BETWEEN DATE_ADD(CURDATE(), INTERVAL 7 DAY) AND DATE_ADD(CURDATE(), INTERVAL 14 DAY)
ORDER BY r.date_debut;
5. Mettre à jour le statut d'une réservation (annulée, confirmée, etc.) en fonction de l'id de la réservation :
UPDATE Reservations
SET statut = 'Confirmée'
WHERE id_reservation = 123;
Vous travaillez pour un service informatique qui souhaite mettre en place un système de suivi des incidents. Créez une base de données qui comprend les tables suivantes :
• Incidents (id_incident, titre, description, date_ouverture, date_fermeture, id_utilisateur, id_technicien, statut)
• Utilisateurs (id_utilisateur, nom, prénom, service, email)
• Techniciens (id_technicien, nom, prénom, specialite)
Écrivez les requêtes SQL suivantes :
• Afficher la liste des incidents ouverts par un utilisateur spécifique
• Trouver les 5 incidents les plus longs à résoudre (date_fermeture - date_ouverture)
• Générer un rapport hebdomadaire des incidents par statut (ouvert, en cours, résolu, etc.)
• Mettre à jour le statut d'un incident et affecter un technicien en fonction de l'id de l'incident.
CREATE TABLE Utilisateurs (
id_utilisateur INT PRIMARY KEY,
nom VARCHAR(100),
prenom VARCHAR(100),
service VARCHAR(100),
email VARCHAR(100)
);
CREATE TABLE Techniciens (
id_technicien INT PRIMARY KEY,
nom VARCHAR(100),
prenom VARCHAR(100),
specialite VARCHAR(100)
);
CREATE TABLE Incidents (
id_incident INT PRIMARY KEY,
titre VARCHAR(100),
description TEXT,
date_ouverture DATETIME,
date_fermeture DATETIME,
id_utilisateur INT,
id_technicien INT,
statut VARCHAR(50),
FOREIGN KEY (id_utilisateur) REFERENCES Utilisateurs(id_utilisateur),
FOREIGN KEY (id_technicien) REFERENCES Techniciens(id_technicien)
);
2. Afficher la liste des incidents ouverts par un utilisateur spécifique :
SELECT i.id_incident, i.titre, i.date_ouverture, i.date_fermeture, i.statut
FROM Incidents i
JOIN Utilisateurs u ON i.id_utilisateur = u.id_utilisateur
WHERE u.id_utilisateur = 123 AND i.statut = 'Ouvert';
3. Trouver les 5 incidents les plus longs à résoudre (date_fermeture - date_ouverture) :
SELECT i.id_incident, i.titre, TIMESTAMPDIFF(DAY, i.date_ouverture, i.date_fermeture) AS duree_resolution
FROM Incidents i
ORDER BY duree_resolution DESC
LIMIT 5;
4. Générer un rapport hebdomadaire des incidents par statut (ouvert, en cours, résolu, etc.) :
SELECT
DATE(i.date_ouverture) AS date_rapport,
i.statut,
COUNT(*) AS nb_incidents
FROM Incidents i
WHERE i.date_ouverture BETWEEN DATE_SUB(CURDATE(), INTERVAL 7 DAY) AND CURDATE()
GROUP BY DATE(i.date_ouverture), i.statut
ORDER BY date_rapport, i.statut;
5. Mettre à jour le statut d'un incident et affecter un technicien en fonction de l'id de l'incident :
UPDATE Incidents
SET statut = 'En cours',
id_technicien = 456
WHERE id_incident = 789;
Vous travaillez pour une entreprise qui souhaite mettre en place un système de gestion des ressources humaines. Créez une base de données qui comprend les tables suivantes :
• Employés (id_employe, nom, prenom, date_naissance, date_embauche, poste, salaire, id_departement)
• Départements (id_departement, nom, responsable)
• Formations (id_formation, nom, description, date_debut, date_fin)
• Participation (id_employe, id_formation, note)
Écrivez les requêtes SQL suivantes :
• Afficher la liste des employés d'un département spécifique, triés par salaire décroissant
• Trouver les 3 employés ayant suivi le plus de formations au cours des 2 dernières années
• Générer un rapport des formations à venir, avec le nom de la formation, les dates et la liste des employés inscrits
• Calculer la masse salariale totale de l'entreprise, par département.
CREATE TABLE Departements (
id_departement INT PRIMARY KEY,
nom VARCHAR(100),
responsable VARCHAR(100)
);
CREATE TABLE Employes (
id_employe INT PRIMARY KEY,
nom VARCHAR(100),
prenom VARCHAR(100),
date_naissance DATE,
date_embauche DATE,
poste VARCHAR(100),
salaire DECIMAL(10,2),
id_departement INT,
FOREIGN KEY (id_departement) REFERENCES Departements(id_departement)
);
CREATE TABLE Formations (
id_formation INT PRIMARY KEY,
nom VARCHAR(100),
description TEXT,
date_debut DATE,
date_fin DATE
);
CREATE TABLE Participation (
id_employe INT,
id_formation INT,
note DECIMAL(5,2),
PRIMARY KEY (id_employe, id_formation),
FOREIGN KEY (id_employe) REFERENCES Employes(id_employe),
FOREIGN KEY (id_formation) REFERENCES Formations(id_formation)
);
2. Afficher la liste des employés d'un département spécifique, triés par salaire décroissant :
SELECT e.id_employe, e.nom, e.prenom, e.salaire
FROM Employes e
WHERE e.id_departement = 123
ORDER BY e.salaire DESC;
3. Trouver les 3 employés ayant suivi le plus de formations au cours des 2 dernières années :
SELECT e.id_employe, e.nom, e.prenom, COUNT(p.id_formation) AS nb_formations
FROM Employes e
JOIN Participation p ON e.id_employe = p.id_employe
WHERE p.date_debut >= DATE_SUB(CURDATE(), INTERVAL 2 YEAR)
GROUP BY e.id_employe
ORDER BY nb_formations DESC
LIMIT 3;
4. Générer un rapport des formations à venir, avec le nom de la formation, les dates et la liste des employés inscrits :
SELECT
f.nom AS formation,
f.date_debut,
f.date_fin,
GROUP_CONCAT(e.nom, ' ', e.prenom) AS employes_inscrits
FROM Formations f
JOIN Participation p ON f.id_formation = p.id_formation
JOIN Employes e ON p.id_employe = e.id_employe
WHERE f.date_debut > CURDATE()
GROUP BY f.id_formation;
5. Calculer la masse salariale totale de l'entreprise, par département :
SELECT
d.nom AS departement,
SUM(e.salaire) AS masse_salariale
FROM Employes e
JOIN Departements d ON e.id_departement = d.id_departement
GROUP BY d.id_departement;
Vous travaillez pour une entreprise de conseil qui souhaite mettre en place un système de gestion de projet. Créez une base de données qui comprend les tables suivantes :
• Projets (id_projet, nom, description, date_debut, date_fin, budget, id_client)
• Tâches (id_tache, id_projet, nom, description, date_debut, date_fin, assignee)
• Clients (id_client, nom, secteur, contact)
• Employés (id_employe, nom, prenom, poste)
Écrivez les requêtes SQL suivantes :
• Afficher la liste des projets d'un client spécifique, avec le budget total et le pourcentage d'avancement
• Trouver les 5 employés les plus sollicités (nombre de tâches assignées)
• Générer un rapport des tâches en retard (date_fin < date_actuelle), avec le nom du projet, le nom de la tâche et l'assignee
• Mettre à jour le budget d'un projet spécifique en fonction de son id.
SELECT
p.id_projet,
p.nom AS projet,
p.budget,
ROUND(100 * SUM(CASE WHEN t.date_fin < CURDATE() THEN 1 ELSE 0 END) / COUNT(t.id_tache), 2) AS pourcentage_avancement
FROM Projets p
JOIN Tâches t ON p.id_projet = t.id_projet
WHERE p.id_client = 123
GROUP BY p.id_projet;
2. Trouver les 5 employés les plus sollicités (nombre de tâches assignées) :
SELECT
e.id_employe,
e.nom,
e.prenom,
COUNT(t.id_tache) AS nb_taches_assignees
FROM Employés e
JOIN Tâches t ON e.id_employe = t.assignee
GROUP BY e.id_employe
ORDER BY nb_taches_assignees DESC
LIMIT 5;
3. Générer un rapport des tâches en retard (date_fin < date_actuelle), avec le nom du projet, le nom de la tâche et l'assignee :
SELECT
p.nom AS projet,
t.nom AS tâche,
e.nom AS assignee
FROM Tâches t
JOIN Projets p ON t.id_projet = p.id_projet
JOIN Employés e ON t.assignee = e.id_employe
WHERE t.date_fin < CURDATE();
4. Mettre à jour le budget d'un projet spécifique en fonction de son id :
UPDATE Projets
SET budget = 500000
WHERE id_projet = 456;
Vous travaillez pour une entreprise de distribution qui souhaite mettre en place un système de gestion de stock. Créez une base de données qui comprend les tables suivantes :
• Produits (id_produit, nom, description, prix_achat, prix_vente, quantite_stock)
• Fournisseurs (id_fournisseur, nom, adresse, contact)
• Commandes (id_commande, id_produit, id_fournisseur, date_commande, quantite, prix_total)
• Ventes (id_vente, id_produit, date_vente, quantite, prix_vente)
Écrivez les requêtes SQL suivantes :
• Afficher la liste des produits en rupture de stock (quantite_stock < seuil_alerte)
• Trouver les 10 produits les plus vendus au cours des 6 derniers mois
• Générer un rapport des commandes passées auprès d'un fournisseur spécifique, avec le nom du produit, la quantité et le prix total
• Mettre à jour la quantité en stock d'un produit spécifique en fonction de son id, après une vente ou une commande.
SELECT
p.id_produit,
p.nom,
p.quantite_stock
FROM Produits p
WHERE p.quantite_stock < 10; -- seuil d'alerte de 10 unités
2. Trouver les 10 produits les plus vendus au cours des 6 derniers mois :
SELECT
p.id_produit,
p.nom,
SUM(v.quantite) AS quantite_vendue
FROM Produits p
JOIN Ventes v ON p.id_produit = v.id_produit
WHERE v.date_vente >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)
GROUP BY p.id_produit
ORDER BY quantite_vendue DESC
LIMIT 10;
3. Générer un rapport des commandes passées auprès d'un fournisseur spécifique, avec le nom du produit, la quantité et le prix total :
SELECT
p.nom AS produit,
c.quantite,
c.prix_total
FROM Commandes c
JOIN Produits p ON c.id_produit = p.id_produit
WHERE c.id_fournisseur = 123
ORDER BY c.date_commande DESC;
4. Mettre à jour la quantité en stock d'un produit spécifique en fonction de son id, après une vente ou une commande :
-- Après une vente
UPDATE Produits
SET quantite_stock = quantite_stock - 5 -- quantité vendue
WHERE id_produit = 456;
-- Après une commande
UPDATE Produits
SET quantite_stock = quantite_stock + 10 -- quantité commandée
WHERE id_produit = 456;
Vous gérez une base de données pour une plateforme de streaming. La base de données contient les tables Utilisateurs
, Films
et Visionnages
.
• Créer une table pour stocker les informations sur les utilisateurs (id_utilisateur, nom, email, date_inscription)
• Créer une table pour stocker les informations sur les films (id_film, titre, genre, année_sortie)
• Créer une table pour stocker les informations sur les visionnages (id_utilisateur, id_film, date_visionnage)
• Afficher la liste des films visionnés par un utilisateur spécifique
• Trouver les 5 films les plus visionnés.
1. Créer la table des utilisateurs :
CREATE TABLE Utilisateurs (
id_utilisateur INT PRIMARY KEY,
nom VARCHAR(50),
email VARCHAR(50) UNIQUE,
date_inscription DATE
);
2. Créer la table des films :
CREATE TABLE Films (
id_film INT PRIMARY KEY,
titre VARCHAR(100),
genre VARCHAR(50),
annee_sortie INT
);
3. Créer la table des visionnages :
CREATE TABLE Visionnages (
id_utilisateur INT,
id_film INT,
date_visionnage DATE,
FOREIGN KEY (id_utilisateur) REFERENCES Utilisateurs(id_utilisateur),
FOREIGN KEY (id_film) REFERENCES Films(id_film)
);
4. Afficher la liste des films visionnés par un utilisateur spécifique :
SELECT Films.titre
FROM Visionnages
JOIN Films ON Visionnages.id_film = Films.id_film
WHERE Visionnages.id_utilisateur = 1; -- Remplacez 1 par l'id de l'utilisateur
5. Trouver les 5 films les plus visionnés :
SELECT Films.titre, COUNT(Visionnages.id_film) AS nombre_visionnages
FROM Visionnages
JOIN Films ON Visionnages.id_film = Films.id_film
GROUP BY Films.titre
ORDER BY nombre_visionnages DESC
LIMIT 5;
Vous gérez une base de données pour une école. Cette base contient des tables Etudiants
, Cours
et Inscription
.
• Créer une table pour stocker les informations sur les étudiants (id_etudiant, nom, prenom, date_naissance)
• Créer une table pour stocker les informations sur les cours (id_cours, titre, description, credits)
• Créer une table pour stocker les inscriptions (id_etudiant, id_cours, date_inscription)
• Afficher tous les cours suivis par un étudiant spécifique
• Compter le nombre d'étudiants inscrits à chaque cours.
1. Créer la table des étudiants :
CREATE TABLE Etudiants (
id_etudiant INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
date_naissance DATE
);
2. Créer la table des cours :
CREATE TABLE Cours (
id_cours INT PRIMARY KEY,
titre VARCHAR(100),
description TEXT,
credits INT
);
3. Créer la table des inscriptions :
CREATE TABLE Inscription (
id_etudiant INT,
id_cours INT,
date_inscription DATE,
FOREIGN KEY (id_etudiant) REFERENCES Etudiants(id_etudiant),
FOREIGN KEY (id_cours) REFERENCES Cours(id_cours)
);
4. Afficher tous les cours suivis par un étudiant spécifique :
SELECT Cours.titre
FROM Inscription
JOIN Cours ON Inscription.id_cours = Cours.id_cours
WHERE Inscription.id_etudiant = 1; -- Remplacez 1 par l'id de l'étudiant
5. Compter le nombre d'étudiants inscrits à chaque cours :
SELECT Cours.titre, COUNT(Inscription.id_etudiant) AS nombre_etudiants
FROM Inscription
JOIN Cours ON Inscription.id_cours = Cours.id_cours
GROUP BY Cours.titre;
Vous êtes responsable de la gestion d'un service de location de voitures. Vous devez créer une base de données incluant les tables Clients
, Voitures
et Locations
.
• Créer une table pour stocker les informations sur les clients (id_client, nom, prenom, email)
• Créer une table pour stocker les informations sur les voitures (id_voiture, marque, modèle, année)
• Créer une table pour stocker les informations sur les locations (id_location, id_client, id_voiture, date_location, date_retour)
• Afficher toutes les locations effectuées par un client spécifique
• Trouver la voiture la plus souvent louée.
1. Créer la table des clients :
CREATE TABLE Clients (
id_client INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
email VARCHAR(50) UNIQUE
);
2. Créer la table des voitures :
CREATE TABLE Voitures (
id_voiture INT PRIMARY KEY,
marque VARCHAR(50),
modele VARCHAR(50),
annee INT
);
3. Créer la table des locations :
CREATE TABLE Locations (
id_location INT PRIMARY KEY,
id_client INT,
id_voiture INT,
date_location DATE,
date_retour DATE,
FOREIGN KEY (id_client) REFERENCES Clients(id_client),
FOREIGN KEY (id_voiture) REFERENCES Voitures(id_voiture)
);
4. Afficher toutes les locations effectuées par un client spécifique :
SELECT Voitures.marque, Voitures.modele, Locations.date_location, Locations.date_retour
FROM Locations
JOIN Voitures ON Locations.id_voiture = Voitures.id_voiture
WHERE Locations.id_client = 1; -- Remplacez 1 par l'id du client
5. Trouver la voiture la plus souvent louée :
SELECT Voitures.marque, Voitures.modele, COUNT(Locations.id_voiture) AS nombre_locations
FROM Locations
JOIN Voitures ON Locations.id_voiture = Voitures.id_voiture
GROUP BY Voitures.id_voiture
ORDER BY nombre_locations DESC
LIMIT 1;
Vous êtes en charge de la gestion d'un magasin de vêtements. Vous devez créer une base de données contenant les tables Produits
, Vendeurs
et Ventes
.
• Créer une table pour stocker les informations sur les produits (id_produit, nom, prix, stock)
• Créer une table pour stocker les informations sur les vendeurs (id_vendeur, nom, prenom, email)
• Créer une table pour stocker les ventes (id_vente, id_produit, id_vendeur, date_vente, quantite)
• Afficher le total des ventes pour un vendeur spécifique
• Trouver le produit le plus vendu.
1. Créer la table des produits :
CREATE TABLE Produits (
id_produit INT PRIMARY KEY,
nom VARCHAR(100),
prix DECIMAL(10,2),
stock INT
);
2. Créer la table des vendeurs :
CREATE TABLE Vendeurs (
id_vendeur INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
email VARCHAR(50) UNIQUE
);
3. Créer la table des ventes :
CREATE TABLE Ventes (
id_vente INT PRIMARY KEY,
id_produit INT,
id_vendeur INT,
date_vente DATE,
quantite INT,
FOREIGN KEY (id_produit) REFERENCES Produits(id_produit),
FOREIGN KEY (id_vendeur) REFERENCES Vendeurs(id_vendeur)
);
4. Afficher le total des ventes pour un vendeur spécifique :
SELECT SUM(Ventes.quantite * Produits.prix) AS total_ventes
FROM Ventes
JOIN Produits ON Ventes.id_produit = Produits.id_produit
WHERE Ventes.id_vendeur = 1; -- Remplacez 1 par l'id du vendeur
5. Trouver le produit le plus vendu :
SELECT Produits.nom, SUM(Ventes.quantite) AS total_vendu
FROM Ventes
JOIN Produits ON Ventes.id_produit = Produits.id_produit
GROUP BY Produits.id_produit
ORDER BY total_vendu DESC
LIMIT 1;
Vous travaillez pour une entreprise de transport. Vous devez créer une base de données incluant les tables Chauffeurs
, Véhicules
et Trajets
.
• Créer une table pour stocker les informations sur les chauffeurs (id_chauffeur, nom, prenom, permis)
• Créer une table pour stocker les informations sur les véhicules (id_vehicule, marque, modele, annee)
• Créer une table pour stocker les trajets (id_trajet, id_chauffeur, id_vehicule, date_trajet, distance)
• Afficher tous les trajets effectués par un chauffeur spécifique
• Calculer la distance totale parcourue par un véhicule spécifique.
1. Créer la table des chauffeurs :
CREATE TABLE Chauffeurs (
id_chauffeur INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
permis VARCHAR(20)
);
2. Créer la table des véhicules :
CREATE TABLE Vehicules (
id_vehicule INT PRIMARY KEY,
marque VARCHAR(50),
modele VARCHAR(50),
annee INT
);
3. Créer la table des trajets :
CREATE TABLE Trajets (
id_trajet INT PRIMARY KEY,
id_chauffeur INT,
id_vehicule INT,
date_trajet DATE,
distance DECIMAL(10,2),
FOREIGN KEY (id_chauffeur) REFERENCES Chauffeurs(id_chauffeur),
FOREIGN KEY (id_vehicule) REFERENCES Vehicules(id_vehicule)
);
4. Afficher tous les trajets effectués par un chauffeur spécifique :
SELECT Trajets.date_trajet, Trajets.distance
FROM Trajets
WHERE Trajets.id_chauffeur = 1; -- Remplacez 1 par l'id du chauffeur
5. Calculer la distance totale parcourue par un véhicule spécifique :
SELECT SUM(Trajets.distance) AS distance_totale
FROM Trajets
WHERE Trajets.id_vehicule = 1; -- Remplacez 1 par l'id du véhicule
Vous gérez une base de données pour un service de livraison. Cette base contient les tables Utilisateurs
, Livraisons
et Produits
.
• Créer une table pour stocker les utilisateurs (id_utilisateur, nom, adresse, téléphone)
• Créer une table pour stocker les informations sur les livraisons (id_livraison, id_utilisateur, date_livraison)
• Créer une table pour stocker les produits (id_produit, nom, prix)
• Afficher toutes les livraisons effectuées pour un utilisateur spécifique
• Calculer le montant total des livraisons effectuées par un utilisateur.
1. Créer la table des utilisateurs :
CREATE TABLE Utilisateurs (
id_utilisateur INT PRIMARY KEY,
nom VARCHAR(50),
adresse VARCHAR(100),
telephone VARCHAR(20)
);
2. Créer la table des livraisons :
CREATE TABLE Livraisons (
id_livraison INT PRIMARY KEY,
id_utilisateur INT,
date_livraison DATE,
FOREIGN KEY (id_utilisateur) REFERENCES Utilisateurs(id_utilisateur)
);
3. Créer la table des produits :
CREATE TABLE Produits (
id_produit INT PRIMARY KEY,
nom VARCHAR(50),
prix DECIMAL(10,2)
);
4. Afficher toutes les livraisons effectuées pour un utilisateur spécifique :
SELECT * FROM Livraisons WHERE id_utilisateur = 1; -- Remplacez 1 par l'id de l'utilisateur
5. Calculer le montant total des livraisons effectuées par un utilisateur :
SELECT SUM(Produits.prix) AS montant_total
FROM Livraisons
JOIN Produits ON Livraisons.id_livraison = Produits.id_produit
WHERE Livraisons.id_utilisateur = 1; -- Remplacez 1 par l'id de l'utilisateur
Vous travaillez pour une compagnie d'assurance. La base de données contient les tables Clients
, Polices
et Sinistres
.
• Créer une table pour stocker les clients (id_client, nom, prenom, date_naissance)
• Créer une table pour stocker les polices d'assurance (id_police, id_client, type_assurance, date_debut)
• Créer une table pour stocker les sinistres (id_sinistre, id_police, date_sinistre, montant)
• Afficher tous les sinistres d'une police spécifique
• Compter le nombre de sinistres pour chaque type d'assurance.
1. Créer la table des clients :
CREATE TABLE Clients (
id_client INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
date_naissance DATE
);
2. Créer la table des polices :
CREATE TABLE Polices (
id_police INT PRIMARY KEY,
id_client INT,
type_assurance VARCHAR(50),
date_debut DATE,
FOREIGN KEY (id_client) REFERENCES Clients(id_client)
);
3. Créer la table des sinistres :
CREATE TABLE Sinistres (
id_sinistre INT PRIMARY KEY,
id_police INT,
date_sinistre DATE,
montant DECIMAL(10,2),
FOREIGN KEY (id_police) REFERENCES Polices(id_police)
);
4. Afficher tous les sinistres d'une police spécifique :
SELECT * FROM Sinistres WHERE id_police = 1; -- Remplacez 1 par l'id de la police
5. Compter le nombre de sinistres pour chaque type d'assurance :
SELECT Polices.type_assurance, COUNT(Sinistres.id_sinistre) AS nombre_sinistres
FROM Polices
LEFT JOIN Sinistres ON Polices.id_police = Sinistres.id_police
GROUP BY Polices.type_assurance;
Vous êtes responsable de la gestion d'un site de réseaux sociaux. Cette base contient les tables Utilisateurs
, Amis
et Messages
.
• Créer une table pour stocker les utilisateurs (id_utilisateur, nom, prenom, date_inscription)
• Créer une table pour stocker les relations d'amitié (id_utilisateur1, id_utilisateur2, date_ami)
• Créer une table pour stocker les messages (id_message, id_envoyeur, id_destinataire, contenu, date_envoi)
• Afficher tous les amis d'un utilisateur spécifique
• Trouver le nombre total de messages échangés entre deux utilisateurs.
1. Créer la table des utilisateurs :
CREATE TABLE Utilisateurs (
id_utilisateur INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
date_inscription DATE
);
2. Créer la table des amis :
CREATE TABLE Amis (
id_utilisateur1 INT,
id_utilisateur2 INT,
date_ami DATE,
PRIMARY KEY (id_utilisateur1, id_utilisateur2)
);
3. Créer la table des messages :
CREATE TABLE Messages (
id_message INT PRIMARY KEY,
id_envoyeur INT,
id_destinataire INT,
contenu TEXT,
date_envoi DATE
);
4. Afficher tous les amis d'un utilisateur spécifique :
SELECT U2.nom, U2.prenom
FROM Amis A
JOIN Utilisateurs U1 ON A.id_utilisateur1 = U1.id_utilisateur
JOIN Utilisateurs U2 ON A.id_utilisateur2 = U2.id_utilisateur
WHERE U1.id_utilisateur = 1; -- Remplacez 1 par l'id de l'utilisateur
5. Trouver le nombre total de messages échangés entre deux utilisateurs :
SELECT COUNT(*) AS nombre_messages
FROM Messages
WHERE (id_envoyeur = 1 AND id_destinataire = 2) OR (id_envoyeur = 2 AND id_destinataire = 1); -- Remplacez 1 et 2 par les ids des utilisateurs
Vous gérez une base de données pour une application de réservation de voyages. Elle contient les tables Voyageurs
, Destinations
et Réservations
.
• Créer une table pour stocker les voyageurs (id_voyageur, nom, prenom, email)
• Créer une table pour stocker les destinations (id_destination, nom, pays, prix)
• Créer une table pour stocker les réservations (id_reservation, id_voyageur, id_destination, date_reservation)
• Afficher toutes les réservations d'un voyageur spécifique
• Calculer le montant total des réservations effectuées par un voyageur.
1. Créer la table des voyageurs :
CREATE TABLE Voyageurs (
id_voyageur INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
email VARCHAR(50) UNIQUE
);
2. Créer la table des destinations :
CREATE TABLE Destinations (
id_destination INT PRIMARY KEY,
nom VARCHAR(100),
pays VARCHAR(50),
prix DECIMAL(10,2)
);
3. Créer la table des réservations :
CREATE TABLE Reservations (
id_reservation INT PRIMARY KEY,
id_voyageur INT,
id_destination INT,
date_reservation DATE,
FOREIGN KEY (id_voyageur) REFERENCES Voyageurs(id_voyageur),
FOREIGN KEY (id_destination) REFERENCES Destinations(id_destination)
);
4. Afficher toutes les réservations d'un voyageur spécifique :
SELECT * FROM Reservations WHERE id_voyageur = 1; -- Remplacez 1 par l'id du voyageur
5. Calculer le montant total des réservations effectuées par un voyageur :
SELECT SUM(Destinations.prix) AS montant_total
FROM Reservations
JOIN Destinations ON Reservations.id_destination = Destinations.id_destination
WHERE Reservations.id_voyageur = 1; -- Remplacez 1 par l'id du voyageur
Vous êtes en charge de la gestion d'une application de livraison de repas. La base contient les tables Restaurants
, Clients
et Commandes
.
• Créer une table pour stocker les restaurants (id_restaurant, nom, adresse, type_cuisine)
• Créer une table pour stocker les clients (id_client, nom, prenom, email)
• Créer une table pour stocker les commandes (id_commande, id_client, id_restaurant, date_commande, montant_total)
• Afficher toutes les commandes d'un client spécifique
• Trouver le restaurant avec le montant total des ventes le plus élevé.
1. Créer la table des restaurants :
CREATE TABLE Restaurants (
id_restaurant INT PRIMARY KEY,
nom VARCHAR(100),
adresse VARCHAR(150),
type_cuisine VARCHAR(50)
);
2. Créer la table des clients :
CREATE TABLE Clients (
id_client INT PRIMARY KEY,
nom VARCHAR(50),
prenom VARCHAR(50),
email VARCHAR(50) UNIQUE
);
3. Créer la table des commandes :
CREATE TABLE Commandes (
id_commande INT PRIMARY KEY,
id_client INT,
id_restaurant INT,
date_commande DATE,
montant_total DECIMAL(10,2),
FOREIGN KEY (id_client) REFERENCES Clients(id_client),
FOREIGN KEY (id_restaurant) REFERENCES Restaurants(id_restaurant)
);
4. Afficher toutes les commandes d'un client spécifique :
SELECT * FROM Commandes WHERE id_client = 1; -- Remplacez 1 par l'id du client
5. Trouver le restaurant avec le montant total des ventes le plus élevé :
SELECT Restaurants.nom, SUM(Commandes.montant_total) AS total_ventes
FROM Commandes
JOIN Restaurants ON Commandes.id_restaurant = Restaurants.id_restaurant
GROUP BY Restaurants.id_restaurant
ORDER BY total_ventes DESC
LIMIT 1;
Les mathématiques ont souvent la réputation d'être une discipline austère et difficile, mais ...
Read more.Plongez dans l'univers fascinant des suites numériques, où chaque terme révèle des patterns surprenants et des applications pratiques dans les mathématiques et au-delà.
Read more.Découvrez comment les fonctions tissent des liens entre les nombres et les concepts, transformant des idées abstraites en outils puissants pour résoudre des problèmes du quotidien.
Read more.Abonnez-vous maintenant et recevez notre newsletter hebdomadaire avec des matériaux éducatifs, de nouveaux cours, des articles intéressants, des livres populaires et bien plus encore !