Devoir – Entreprise de déménagements
Ouvrier (nOuv, nom, prenom, taille, poids) Affectation (nOuv, nCamion, dateDeb, dateFin)
Demenagement (nDem, adrDep, villeDep, adrArr, villeArr, date, volume) CamionDem (nCamion, nDem)
Vehicule (nCamion, marque, capacite, nbKm)
Quelques données pour mieux comprendre…
nOuv Prenom nom …
1 Jean Cérien …
2 Jean Bon …
… … … …
Ouvrier
nCamion nDem
100 10
100 20
200 20
… …
CamionDem
nDem villeDep villeArr date volume … 10 Versailles Medon 1/11/2021 35 … 20 Versailles Medon 2/12/2021 45 …
… … … …
Déménagement
nCamion capacité marque …
100 20 Renault …
200 30 Wolks …
… … … …
Véhicule
nOuv nCamion dateDeb dateFin 1 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021 2 200 1/08/2021 31/08/2021
… … … …
Affectation
N’hésitez pas à utiliser ces données pour « tester » vos requêtes
1. Nom et prénom des ouvriers n’ayant été affectés qu’à des camions de marque Renault.
Véhicule
marque ≠
‘Renault’
nCamion = nCamion Affectation
nOuv
-
nOuvAffectation
nOuv= nOuv Ouvrier
nom, prénom
SELECT nom, prenom
FROM Ouvrier O, AffectationA1 WHERE O.nOuv=A1.nOuv AND O.nOuvNOT IN
( SELECT A2.nOuv
FROM Affectation A2, Vehicule V WHERE A2.nCamion=V.nCamion AND marque <> ‘Renault’) ; C’est un ouvrier qui a déjà
été affecté à un chantier, donc table Affectation (on peut avoir des ouvriers qui n’ont jamais été affectés
dans la table Ouvrier).
Aussi possible avec A1.nOuv.
SELECT nom, prenom
FROM Ouvrier O, AffectationA1 WHERE O.nOuv=A1.nOuv AND O.nOuvNOT EXISTS
( SELECT *
FROM Affectation A2, Vehicule V WHERE A2.nCamion=V.nCamion AND marque <> ‘Renault’
AND O.nOuv= A2.nOuv ) ; Aussi possible
avec A1.nOuv.
2. Capacité et nombre de kilomètres des camions ayant réalisé des déménagements le 31 décembre 2020 et le 1er janvier 2021.
CamionDem Demenagement
date =
’31/12/2020’
nDem = nDem
CamionDem
Demenagement
date =
‘1/1/2021’
nDem = nDem
nCamion
∩
nCamionnCamion= nCamion Vehicule
capacité, nbKm SELECT capacite, nbKm
FROM Vehicule V, CamionDem C1, Demenagement D1 WHERE V.nCamion=C1.nCamion
AND C1.nDem = D1.nDem AND D1.date=’2020-12-31’
AND V.nCamionIN
( SELECT C2.nCamion
FROM CamionDemC2, Demenagement D2 WHERE C2.nDem=D2.nDem
AND D2.date=’2021-01-01’) ; SELECT capacite, nbKm
FROM Vehicule V, CamionDem C1, Demenagement D1 WHERE V.nCamion=C1.nCamion
AND C1.nDem = D1.nDem AND D1.date=’2020-12-31’
AND EXISTS( SELECT *
FROM CamionDemC2, Demenagement D2 WHERE C2.nDem=D2.nDem
AND D2.date=’2021-01-01’
AND V.nCamion= D2.nCamion ) ; Aussi possible avec
D1.nCamion.
Aussi possible avec D1.nCamion.
3. Marque des camions impliqués dans le déménagement le plus important (en volume).
Demenagement
Demenagement D1 Demenagement D2
D1.volume < D2 volume
nDem
-
D1.nDemAttention à bien utiliser nDem(et pas nCamion), car un même camion peut participer à plusieurs déménagements (et donc le même camion peut participer au déménagement le + important, mais aussi à d’autres – importants)
nDem = nDem CamionDem
Vehicule
nCamion = nCamion marque SELECT marque
FROM Vehicule V, CamionDem C, Demenagement D WHERE V.nCamion=C.nCamion
AND C.nDem=D.nDem AND D.volume=
( SELECT MAX(volume) FROM Demenagement ) ;
Pour mieux comprendre…
nCamion nDem
100 10
100 20
200 20
CamionDem C
nDem villeDep villeArr date volume … 10 Versailles Medon 1/11/2021 35 … 20 Versailles Medon 2/12/2021 45 … 20 Versailles Medon 2/12/2021 45 …
Déménagement D
Pour mieux comprendre pourquoi il faut utiliser nDem (et pas nCamion), on va regarder sur les données ce qui se passe si on l’utilise…
Pour utiliser nCamion, on doit faire une jointure avec CamionDem
Le déménagement n°20est le plus volumineux. Il a utilisé 2 camions (le n°
100et le n°200).
nDem = nDem
D1.volume < D2.volume
nCamion nDem
100 10
100 10
nDem … volume …
10 … 35 …
10 … 35 …
nCamion nDem
100 20
200 20
nDem … volume …
20 … 45 …
20 … 45 …
D1.volume D2.volume
C1.nCamion D1.nDem C2.nCamion D2.nDem
Si on fait une projection sur C1.nCamion, on perdra le camion n° 100 car il a aussi participé au déménagement n ° 10 (qui est plus petit que le déménagement n° 20).
Pour mieux comprendre…
nDem … volume …
10 … 35 …
20 … 45 …
Déménagement D2 Maintenant, si on utilise nDem comme il faut…
On retrouve alors les 2 camions (le n°
100et le n°200) utilisés par le déménagement n°20.
D1.volume < D2.volume
nDem … volume …
10 … 35 …
10 … 35 …
nDem … volume …
20 … 45 …
20 … 45 …
D1.volume D2.nDem D2.volume D1.nDem
Si on fait une projection sur D1.nDem, on élimine, suite à la différence, le déménagement n ° 10, pour ne garder que le déménagement n° 20.
nDem … volume …
10 … 35 …
20 … 45 …
Déménagement D1 nDem … volume …
10 … 35 …
20 … 45 …
Déménagement
nDem
-
D1.nDemCamionDem
nDem = nDem nCamion nDem
100 10
100 20
200 20
nDem 20
nCamion nDem
100 20
200 20
nDem 20 20
4. Taille et poids des ouvriers de plus de 80 kg ayant travaillé dans tous les camions.
Vehicule
nCamion nOuv,
nCamion Affectation
÷
nOuv= nOuv
Ouvrier
Taille, poids
Poids > 80
SELECT taille, poids FROM Ouvrier O WHERE poids > 80 WHERE NOT EXISTS
( SELECT *
FROM Vehicule V WHERE NOT EXISTS
( SELECT *
FROM Affectation A WHERE A.nOuv=O.nOuv AND A.nCamion=V.nCamion) ) ;
Attention à l’ordre des blocs (et des restrictions, qui doivent venir dans le bon bloc).
5. Capacité et nombre de kilomètres des camions ayant transporté l’ouvrier Jean Bon ou l’ouvrier Jean Cérien pour des déménagements de Versailles à Meudon.
Demenagement
CamionDem
Vehicule Ouvrier
( nom = ‘Bon’ ⌄ nom = ‘Cérien’ )^ prénom = ‘Jean’
villedep = ‘Versailles’ ^ villeArr = ‘Meudon’
nDem = nDem nOuv = nOuv
Affectation
nCamion = nCamion dateDeb ≤ date ≤ dateFin^
nCamion = nCamion capacité, nbKm Attention double jointure (le
déménagement a dû avoir lieu pendant la période d’affectation de l’ouvrier)
Aussi possible en faisant jointure
« nCamion = nCamion » suivie d’une restriction « dateDeb ≤ date ≤ dateFin »
5. Capacité et nombre de kilomètres des camions ayant transporté l’ouvrier Jean Bon ou l’ouvrier Jean Cérien pour des déménagements de Versailles à Meudon.
SELECT capacite, nbKm
FROM Vehicule V, Ouvrier O, Affectation A, CamionDem C, Demenagement D WHERE V.nCamion=C.nCamion
AND A.nCamion=O.nCamion AND A.nOuv=O.nOuv
AND A.date BETWEEN dateDeb and DateFin AND C.nDem=D.nDem
AND villeDep=’Versailles’
AND villeArr=’Meudon’
AND prenom=’Jean’
AND (nom = ‘Bon’ ORnom=’Cerien’ )
Attention aux parenthèses autour du OR (« ou »), pour séparer les « et »
des « ou », y compris en algèbre.
Pour mieux comprendre…
nOuv Prenom nom …
1 Jean Cérien …
2 Jean Bon …
2 Jean Bon …
Ouvrier (après restriction)
nCamion nDem
100 10
100 20
200 20
CamionDem
nDem villeDep villeArr date volume … 10 Versailles Medon 1/11/2021 35 … 20 Versailles Medon 2/12/2021 45 … 20 Versailles Medon 2/12/2021 45 … Déménagement (après restriction)
nOuv nCamion dateDeb dateFin 1 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021 2 200 1/08/2021 31/08/2021 Affectation
Le camion n°200a bien transporté l’ouvrier Jean Bon, mais aucun
déménagement de Versailles à Meudon n’a eu lieu pendant la période de son affectation (l ’affectation était en août alors que le déménagement avec ce camion était en décembre).
Le camion n°200ne devrait PASêtre parmi les réponses…
nOuv Prenom nom …
1 Jean Cérien …
2 Jean Bon …
2 Jean Bon …
Ouvrier (après restriction)
nCamion nDem
100 10
100 20
200 20
CamionDem
nDem villeDep villeArr date … 10 Versailles Medon 1/11/2021 … 20 Versailles Medon 2/12/2021 … 20 Versailles Medon 2/12/2021 … Déménagement (après restriction) nOuv nCamion dateDeb dateFin
1 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021 2 200 1/08/2021 31/08/2021
Affectation Pour mieux comprendre pourquoi il
nous faut une jointure avec 2 conditions, on va regarder sur les données ce qui se passe si on ne fait pas ça…
nCamion = nCamion
nOuv …
1 …
1 …
2 …
2 …
2 …
nOuv nCamion dateDeb dateFin 1 100 1/10/2021 30/11/2021 1 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021 2 200 1/08/2021 31/08/2021
nCamion nDem
100 10
100 20
100 10
100 20
200 20
nDem … date …
10 … 1/11/2021 … 20 … 2/12/2021 … 10 … 1/11/2021 … 20 … 2/12/2021 … 20 … 2/12/2021 …
nOuv Prenom nom …
1 Jean Cérien …
2 Jean Bon …
2 Jean Bon …
Ouvrier (après restriction)
nCamion nDem
100 10
100 20
200 20
CamionDem
nDem villeDep villeArr date … 10 Versailles Medon 1/11/2021 … 20 Versailles Medon 2/12/2021 … 20 Versailles Medon 2/12/2021 … Déménagement (après restriction) nOuv nCamion dateDeb dateFin
1 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021 2 200 1/08/2021 31/08/2021 Affectation
nCamion = nCamion dateDeb ≤ date ≤ dateFin^
nOuv …
1 …
2 …
nOuv nCamion dateDeb dateFin 1 100 1/10/2021 30/11/2021 2 100 1/10/2021 30/11/2021
nCamion nDem
100 10
100 10
nDem … date …
10 … 1/11/2021 … 10 … 1/11/2021 …
Maintenant, on applique la jointure sur les deux conditions (nCamionet dateDeb ≤ date ≤ dateFin)…
On retrouve bien le camion n° 100, qui a transporté les ouvriers dans des déménagements de Versailles à Meudon.
6. Nombre de camions par déménagement au cours de l’année 2020, uniquement pour les déménagements nécessitant au moins 2 camions.
SELECT COUNT(*), D.nDem
FROM CamionDem C, Demenagement D WHERE C.nDem=D.nDem
AND D.date between ‘2020-01-01’ AND ‘2020-12-31’
GROUP BY D.nDem HAVING COUNT(*) >= 2
Aussi possible avec C.nDem.
7. Numéro, marque et capacité des camions ayant effectué des déménagements dont la ville de départ finit par
«Seine » (Ivry sur Seine, Vitry sur Seine, etc.).
SELECT V.nCamion, marque, capacite
FROM Vehicule V, CamionDem C, Demenagement D WHERE D.nDem=C.nDem
AND C.nCamion=V.nCamion AND villeDep LIKE ‘%Seine’
Attention : pas de Group By ici.
8. Numéro, marque et capacité des camions ayant participé à des déménagements de Paris vers Lyon, triés par capacité décroissante.
SELECT V.nCamion, marque, capacite
FROM Vehicule V, CamionDem C, Demenagement D WHERE V.nCamion=C.nCamion
AND C.nDem = D.nDem AND villeDep=’Paris’
AND villeArr=’Lyon’
ORDER BY capaciteDESC
Attention : pas de Group By ici.