-- Création des tables avec intégrité référentielle
CREATE TABLE Departement (
DNO INT PRIMARY KEY,
DNOM VARCHAR(255),
DIR INT,
VILLE VARCHAR(255),
FOREIGN KEY (DIR) REFERENCES Employes(ENO)
);
CREATE TABLE Employes (
ENO INT PRIMARY KEY,
ENOM VARCHAR(255),
PROF VARCHAR(255),
DATEEMB DATE,
SAL DECIMAL(10, 2),
COMM DECIMAL(10, 2),
DNO INT,
FOREIGN KEY (DNO) REFERENCES Departement(DNO)
);
-- Insertion des données en exemple
INSERT INTO Departement (DNO, DNOM, DIR, VILLE) VALUES
(1, 'Commercial', 30, 'Dakar'),
(2, 'Production', -20, 'Thies'),
(3, 'Développement', 40, 'Saint Louis');
INSERT INTO Employes (ENO, ENOM, PROF, DATEEMB, SAL, COMM, DNO) VALUES
(10, 'Joseph.', 'Ingénieur', '2008-10-01', 4000.00, 3000.00, 3),
(20, 'Lamine', 'Technicien', '2008-10-01', 3000.00, 2000.00, 2),
(30, 'Salifou', 'Vendeur', '2002-05-01', 5000.00, 5000.00, 1),
(40, 'Fatou', 'Ingénieur', '2009-03-01', 5000.00, NULL, 3),
(50, 'Marième', 'Secrétaire', '2010-03-01', 7000.00, NULL, 1);
-- Exécution des requêtes demandées
-- Q1 : Donner les noms des directeurs des départements 1 et 3. Attention :
directeur n'est pas une profession!
SELECT ENOM
FROM Employes
WHERE ENO IN (SELECT DIR FROM Departement WHERE DNO IN (1, 3));
-- Q2 : Donner les noms des employés travaillant dans un département avec au moins
un ingénieur.
SELECT ENOM
FROM Employes
WHERE DNO IN (SELECT DNO FROM Employes WHERE PROF = 'Ingénieur');
-- Q3 : Donner le salaire et le nom des employés gagnant plus qu'un (au moins un)
ingénieur.
SELECT ENOM, SAL
FROM Employes
WHERE SAL > (SELECT MAX(SAL) FROM Employes WHERE PROF = 'Ingénieur');
-- Q4 : Donner le salaire et le nom des employés gagnant plus qu'un (au moins un)
ingénieur.
SELECT ENOM, SAL
FROM Employes
WHERE SAL > (SELECT MAX(SAL) FROM Employes WHERE PROF = 'Ingénieur');
-- Q5 : Donner le salaire et le nom des employés gagnant plus que tous les
ingénieurs.
SELECT ENOM, SAL
FROM Employes
WHERE SAL > ALL (SELECT SAL FROM Employes WHERE PROF = 'Ingénieur');
-- Q6 : Donner les noms des employés et les noms de leurs directeurs.
SELECT [Link] AS "Employé", [Link] AS "Département", [Link] AS "Directeur"
FROM Employes E
INNER JOIN Departement D ON [Link] = [Link]
LEFT JOIN Employes DIR ON [Link] = [Link];
-- Q7 : Trouver les noms des employés ayant le même directeur que Salifou FALL.
SELECT [Link]
FROM Employes E
INNER JOIN Departement D ON [Link] = [Link]
WHERE [Link] IN (SELECT DIR FROM Departement WHERE DNOM IN (SELECT DNOM FROM
Employes WHERE ENOM = 'Salifou'));
-- Q8 : Donner le nom et la date d'embauche des employés embauchés avant leur
directeur; donner également le nom et la date d'embauche de leur directeur.
SELECT [Link], [Link], [Link] AS "Département", [Link] AS "Directeur",
[Link] AS "Date embauche directeur"
FROM Employes E
INNER JOIN Departement D ON [Link] = [Link]
INNER JOIN Employes DIR ON [Link] = [Link]
WHERE [Link] < [Link];
-- Q9 : Donner les départements qui n'ont pas d'employés.
SELECT DNOM
FROM Departement
WHERE DNO NOT IN (SELECT DISTINCT DNO FROM Employes);
-- Q10 : Donner les noms des employés du département COMMERCIAL embauchés le même
jour qu'un employé du département PRODUCTION.
SELECT [Link]
FROM Employes E1, Employes E2
WHERE [Link] = (SELECT DNO FROM Departement WHERE DNOM = 'Commercial')
AND [Link] = (SELECT DNO FROM Departement WHERE DNOM = 'Production')
AND [Link] = [Link];