Vous êtes sur la page 1sur 9

I.

Récupération élémentaire de données Salaire nom embauche salaire


6900,00F DUPONT 01/05/91 7850,00F
A.
A.Sélection simple (Select) 6950,00F DUVAL 09/06/91 9450,00F
7100,00F MARTIN 09/12/92 8000,00F
1. Liste des données de toutes les divisions 7250,00F GARNIER 01/05/91 15000,00F
7300,00F PAITEL 08/09/91 7900,00F
SELECT * 7500,00F DUPLAT 12/01/92 7100,00F
FROM dept ; 7850,00F GASTON 03/12/91 6950,00F
7900,00F GUILLAUME 03/12/91 9000,00F
Division nom_div budget batiment 8000,00F BOITEL 23/06/91 7300,00F
10 Direction 150000,00F A 8250,00F PIERRE 17/12/93 8000,00F
20 Informatique 650780,00F A 9000,00F JOSEPH 02/05/91 9975,00F
30 Vente 400550,00F B 9450,00F BASILE 25/06/92 9500,00F
40 Production 200000,00F B 9500,00F MARECHAL 12/05/93 6900,00F
(4 rows) 9975,00F nomseterminantpareon 01/01/96 7500,00F
15000,00F (14 rows)
(15 rows)
2. Libellé et budget des divisions
8. Liste des divisions implantées dans le bâtiment A.
SELECT nom_div, budget 6. Liste des différents salaires et des noms des employés
FROM dept ; SELECT nom_div
SELECT DISTINCT salaire, nom FROM dept
Nom_div budget FROM emp ; WHERE batiment = ‘A’ ;
Direction 150000,00F
Informatique 650780,00F Salaire nom Nom_div
Vente 400550,00F 6900,00F MARECHAL Direction
Production 200000,00F 6900,00F PATRICE Informatique
(4 rows) 6950,00F GASTON (2 rows)
7100,00F DUPLAT
7250,00F MARTIAL
3. Liste des villes où sont implantés les bâtiments 7300,00F BOITEL 9. Liste des employés dont la commission est supérieure à 0,00 F.
7500,00F nomseterminantpareon
SELECT batiment, ville 7850,00F DUPONT SELECT nom, com
FROM batiment ; 7900,00F ALLAIN FROM emp
7900,00F PAITEL WHERE com > 0 ;
Batiment ville 8000,00F MARTIN
A Paris 8000,00F PIERRE Nom com
B Rennes 8250,00F WAGNER ALLAIN 300,00F
C Paris 9000,00F GUILLAUME WAGNER 500,00F
(3 rows) 9450,00F DUVAL MARTIAL 1400,00F
9500,00F BASILE (3 rows)
9975,00F JOSEPH
B.
B.Sélection avec élimination de redondances (Distinct) 15000,00F GARNIER
(18 rows) B.
B.Valeurs nulles (Is Null)
4. Liste des différentes villes où sont implantés les bâtiments
La différence s’explique par le fait que, dans la question 6, le mot-clé s’applique au couple 10. Liste des employés qui perçoivent une commission [0 ; + ∞].
SELECT DISTINCT ville de colonnes " salaire / nom ".
FROM batiment ; SELECT nom, com
FROM emp
Ville II. Sélection avec conditions (Where) WHERE com IS NOT NULL ;
Paris
Rennes A.
A.Opérateurs de comparaison Nom com
(2 rows) PAITEL 0,00F
7. Liste des employés non vendeurs avec leur date d’embauche et leur salaire. ALLAIN 300,00F
WAGNER 500,00F
5. Liste des différents salaires des employés SELECT nom, embauche, salaire MARTIAL 1400,00F
FROM emp (4 rows)
SELECT DISTINCT salaire WHERE lowercase(emploi) != ‘vendeur’ ;
FROM emp ;
11. Liste des employés dont la commission est inexistante.

SELECT nom, com


FROM emp
WHERE com IS NULL ;

SQL – Corrigé des questions XSoluces.doc Page 1 sur 9


ou
nom com nom emploi salaire embauche
DUPONT SELECT matricule, nom, emploi DUPONT DIRECTEUR 7850,00F 01/05/91
DUVAL FROM emp GARNIER PRESIDENT 15000,00F 01/05/91
MARTIN WHERE uppercase(varchar(nom)) NOT LIKE ‘_U%T’ ; GASTON SECRETAIRE 6950,00F 03/12/91
GARNIER GUILLAUME ANALYSTE 9000,00F 03/12/91
DUPLAT Le joker % est obligatoire pour pouvoir traiter les blancs non significatifs de fin de zone. (4 rows)
GASTON N’oubliez pas que le type de donnée de la colonne nom est char et non varchar.
nd
GUILLAUME Une autre solution serait de rajouter un blanc significatif devant le 2 %. Pour notre jeu
BOITEL nd
d’essais, le blanc marquera la véritable fin du nom et le 2 % traitera les blancs non 19. Liste des employés dont le matricule du chef n’est pas 7839, 7782 ou 7698.
PIERRE significatifs qui pourront suivre.
JOSEPH SELECT nom, mat_chef
BASILE matricule Nom emploi FROM emp
PATRICE 7782 DUVAL DIRECTEUR WHERE mat_chef NOT IN (7839, 7782, 7698) ;
MARECHAL 7788 MARTIN ANALYSTE
Nomseterminantpareon 7839 GARNIER PRESIDENT Nom mat_chef
(14 rows) 7844 PAITEL SECREATAIRE MARTIN 7566
7900 GASTON SECREATAIRE DUPLAT 7566
7902 GUILLAUME ANALYSTE GUILLAUME 7566
C.
C.Intervalles (Between...And...) 7934 BOITEL SECREATAIRE PIERRE 7566
7369 PIERRE PUPITREUR (4 rows)
12. Liste des employés qui perçoivent entre 100 et 300 F de commission 7499 ALLAIN VENDEUR
7521 WAGNER VENDEUR
SELECT matricule, nom, com 7566 JOSEPH DIRECTEUR 20. Nom, emploi et date d’embauche des employés qui ne sont ni secrétaire, ni
FROM emp 7654 MARTIAL VENDEUR pupitreur.
WHERE com BETWEEN 100 AND 300 ; 7658 BASILE CHEF PUBLICITE
7769 PATRICE VENDEUR SELECT nom, emploi, embauche
Matricule nom com 7738 MARECHAL CHEF PUBLICITE FROM emp
7499 ALLAIN 300,00F 10101 Nomseterminantpareon secretaire WHERE lowercase (emploi) NOT IN (‘secretaire’,’pupitreur’) ;
(1 row) (16 rows)
Nom emploi embauche
DUPONT DIRECTEUR 01/05/91
13. Liste des divisions alphabétiquement comprises entre la division informatique 16. Liste des divisions dont le libellé contient ‘TI’ DUVAL DIRECTEUR 09/06/91
et celle des ventes.. MARTIN ANALYSTE 09/12/92
SELECT nom_div GARNIER PRESIDENT 01/05/91
SELECT nom_div FROM dept GUILLAUME ANALYSTE 03/12/91
FROM dept WHERE lowercase(nom_div) LIKE ‘%ti%’ ; ALLAIN VENDEUR 20/05/91
WHERE lowercase (nom_div) BETWEEN 'informatique' AND 'vente'; WAGNER VENDEUR 22/05/91
Nom_div JOSEPH DIRECTEUR 02/05/91
nom_div Direction MARTIAL VENDEUR 28/05/91
Informatique Informatique BASILE CHEF PUBLICITE 25/06/92
Vente Production PATRICE VENDEUR 12/12/93
Production (3 rows) MARECHAL CHEF PUBLICITE 12/05/93
(3 rows) (12 rows)

17. Liste des employés dont le nom se termine par ‘ON’


14. Divisions pourvues d’un budget exclu de l’intervalle [150000 - 200000] F. F.
F.Conditions de connexions (And / Or)
SELECT matricule, nom
SELECT nom_div, budget FROM emp 21. Nom, emploi et salaire des employés embauchés le 01/05/91 ou le 03/12/91
FROM dept WHERE lowercase (varchar (nom) ) LIKE ‘%on’;
WHERE budget NOT BETWEEN 150000 AND 200000 ; SELECT nom, emploi, salaire, embauche
Matricule nom FROM emp
Nom_div budget 7900 GASTON WHERE embauche = ‘01/05/91’
Informatique 650780,00F 10101 Nomseterminantpareon OR embauche = ’03/12/91’ ;
Vente 400550,00F (2 rows)
(2 rows) nom emploi salaire embauche
DUPONT DIRECTEUR 7850,00F 01/05/91
E.
E.Listes (In) GARNIER PRESIDENT 15000,00F 01/05/91
D.
D.Correspondance des caractères (Like) GASTON SECRETAIRE 6950,00F 03/12/91
18. Nom, emploi, et salaire des employés embauchés le 01/05/91 ou le 03/12/91 GUILLAUME ANALYSTE 9000,00F 03/12/91
15. Matricule, nom, emploi pour les employés dont le nom n’a pas comme (4 rows)
deuxième lettre un (U, u) et ne se termine pas par (T, t). SELECT nom, emploi, salaire, embauche
FROM emp Ce résultat est identique à celui de la question 18. L’opérateur IN permet de grouper
SELECT matricule, nom, emploi WHERE embauche IN (‘01/05/91’,’03/12/91’) ; plusieurs tests concernant une même colonne par rapport à des valeurs et combinés par
FROM emp l’opérateur logique OR.
WHERE uppercase(nom) NOT LIKE ‘_U%T %’ ;

SQL – Corrigé des questions XSoluces.doc Page 2 sur 9


nom salaire emploi
22. Liste des employés qui ne perçoivent pas de commission Nom Emploi MARTIN 8000,00F ANALYSTE
SELECT nom, com GUILLAUME ANALYSTE GUILLAUME 9000,00F ANALYSTE
FROM emp PIERRE PUPITREUR WAGNER 8250,00F VENDEUR
WHERE com is null WAGNER VENDEUR (3 rows)
OR com = 0 ; PATRICE VENDEUR
(4 rows)
nom com 29. Nom, salaire et métier des employés dans les catégories des analystes et des
DUPONT vendeurs qui ont un salaire supérieur à 8000 F (sans utiliser l’opérateur ensembliste IN).
DUVAL 26. Code des différentes divisions qui embauchent des employés dont le nom
MARTIN comporte un (U, u) en deuxième lettre et dont le salaire est exclu de l’intervalle SELECT nom, salaire, emploi
GARNIER [7200-8900] F FROM emp
PAITEL 0,00F WHERE ( uppercase(emploi) = ‘ANALYSTE’
DUPLAT SELECT DISTINCT division OR
GASTON FROM emp uppercase(emploi) = ‘VENDEUR’ )
GUILLAUME WHERE lowercase(nom) LIKE ‘_u%’ AND salaire > 8000 ;
BOITEL AND salaire NOT BETWEEN 7200 AND 8900 ;
PIERRE
JOSEPH division
BASILE 10
PATRICE 20
MARECHAL (2 rows)
Nomseterminantpareon
(15 rows)
27. Matricule, nom, emploi et salaire du Président et des Directeurs des employés
Grâce à l’opérateur logique OR (ou), on obtient enfin LA solution à la question. (vous utiliserez l'opérateur IS NULL pour rechercher le Président)

SELECT matricule, nom, emploi, salaire


23. Liste des employés dont le nom commence par (DU, du) et dont le salaire est FROM emp
compris entre 7000 F et 9000 F. WHERE mat_chef IS NULL
OR uppercase(emploi) = ‘DIRECTEUR’ ;
SELECT nom, salaire
FROM emp matricule nom emploi salaire
WHERE uppercase(nom) LIKE ‘DU%’ 7698 DUPONT DIRECTEUR 7850,00F
AND salaire BETWEEN 7000 AND 9000 ; 7782 DUVAL DIRECTEUR 9450,00F
7839 GARNIER PRESIDENT 15000,00F
nom salaire 7566 JOSEPH DIRECTEUR 9975,00F
DUPONT 7850,00F (4 rows)
DUPLAT 7100,00F
(2 rows)
28. Nom, salaire et métier des employés dans la catégorie des analystes et nom,
salaire et métier des employés dans la catégorie des vendeurs qui ont un salaire supérieur à
24. Liste des employés dont le nom se termine par (ON, on). Vous n'utiliserez 8000 F (sans utiliser l’opérateur ensembliste IN).
aucune des fonctions de conversion vues jusqu'ici.
SELECT nom, salaire, emploi
SELECT matricule, nom FROM emp
FROM emp WHERE uppercase(emploi) = ‘ANALYSTE’
WHERE nom LIKE ‘%ON %‘ OR nom LIKE ‘%ON’ OR uppercase(emploi) = ‘VENDEUR’
OR nom LIKE ‘%on %’ OR nom LIKE ‘%on’ ; AND salaire > 8000 ;

matricule Nom
7900 GASTON
10101 Nomseterminantpareon
(2 rows)
nde
Le résultat est identique à celui de la 2 solution proposée à la question 17.

25. Liste des analystes, des vendeurs et des pupitreurs dont le nom comporte le
lettre (E, e). Vous n'utiliserez aucune des fonctions de conversion vues jusqu'ici.

SELECT nom, emploi


FROM emp
WHERE (nom LIKE ‘%E%’ OR nom LIKE ‘%e%’)
AND (emploi IN (‘ANALYSTE’, ‘VENDEUR’, ‘PUPITREUR’)
OR (emploi IN (‘analyste’, ‘vendeur’, ‘pupitreur’)) ;

SQL – Corrigé des questions XSoluces.doc Page 3 sur 9


nom salaire emploi
GUILLAUME 9000,00F ANALYSTE nom_div Budget col3
WAGNER 8250,00F VENDEUR Direction 150000,00F 180000,00F
(2 rows) Production 200000,00F 240000,00F
(2 rows)
Dans le case de la requête 28, la condition de salaire s’applique uniquement aux vendeurs.
Donc, la requête ramène les données demandées concernant les analystes puis les vendeurs
dont le salaire est supérieur à 8000 F. B.
B.Renommer les entêtes de colonnes (As)
Dans le case de la requête 29, la condition de salaire s’applique aux analystes et aux
vendeurs. Donc, la requête ramène les données demandées concernant les analystes et les 32. Matricule, nom, salaire augmenté de 5 % dénommé SALAIRE 1999 pour les
vendeurs dont le salaire est supérieur à 8000 F. employés qui gagnent moins de 7200 F.
On constate bien que l’utilisation des parenthèses change un résultat.
SELECT matricule, nom, (salaire * 1,05) AS " SALAIRE 1999 "
FROM emp
III. Calculs et présentation de résultats WHERE salaire < 7200 ;

A.
A.Opérateurs arithmétiques (+, -, *, /) Matricule nom salaire 1999
7876 DUPLAT 7455,00F
30. Revenu global et emploi pour les secrétaires et les vendeurs. Vous calculerez le revenu 7900 GASTON 7297,50F
global une fois sans utiliser la fonction IFNULL, une autre fois en utilisant cette fonction et 7769 PATRICE 7245,00F
en attribuant une commission égale à 0 par défaut. 7738 MARECHAL 7245,00F
(4 rows)
SELECT nom, emploi, salaire + com
FROM emp
WHERE lowercase(emploi) IN ('secretaire', 'vendeur') ; 33. Calculer le rapport salaire/commission pour chaque employé qui perçoit une
commission ( ]0 ; + ∞[ ). Vous donnerez un titre à la colonne calculée.
Nom Emploi Col3
PAITEL SECRETAIRE 7900,00F SELECT nom, salaire, com, float4 (salaire / com) AS " Rapport Salaire/Com "
DUPLAT SECRETAIRE FROM emp
GASTON SECRETAIRE WHERE com > 0;
BOITEL SECRETAIRE
ALLAIN VENDEUR 8200,00F Nom salaire com rapport salaire/com
WAGNER VENDEUR 8750,00F ALLAIN 7900,00F 300,00F 26,33
MARTIAL VENDEUR 8650,00F WAGNER 8250,00F 500,00F 16,50
PATRICE SECRETAIRE MARTIAL 7250,00F 1400,00F 5,18
Nomseterminantpareo SECRETAIRE (3 rows)
n
(9 rows)
C.
C.Chaînes de caractères dans les résultats
SELECT nom, emploi, salaire + ifnull (com, 0)
FROM emp 34. Annoncez le Président des employés.
WHERE lowercase(emploi) IN ('secretaire', 'vendeur') ;
SELECT ‘Le Président de la société est :‘, nom
Nom Emploi Col3 FROM emp
PAITEL SECRETAIRE 7900,00F WHERE mat_chef IS NULL ;
DUPLAT SECRETAIRE 7100,00F
GASTON SECRETAIRE 6950,00F col1 Nom
BOITEL SECRETAIRE 7300,00F Le Président de la société est : GARNIER
ALLAIN VENDEUR 8200,00F (1 row)
WAGNER VENDEUR 8750,00F
MARTIAL VENDEUR 8650,00F
PATRICE SECRETAIRE 6900,00F 35. Pour les analystes et vendeurs, annoncez leur nom, leur emploi et leur salaire.
Nomseterminantpareo SECRETAIRE 7500,00F
n SELECT ‘Le salarié’, nom, ‘travaille comme‘, emploi, ‘pour’, salaire
(9 rows) FROM emp
WHERE uppercase(emploi) IN (‘ANALYSTE’, ‘VENDEUR’) ;

31. Augmentation de 20 % du budget pour les divisions dont le libellé comporte la col1 Nom col3 Emploi col5 salaire
lettre (C, c). Le salarié MARTIN travaille comme ANALYSTE pour 8000,00F
Le salarié GUILLAUM travaille comme ANALYSTE pour 9000,00F
SELECT nom_div, budget, budget*1,2 E
FROM dept Le salarié ALLAIN travaille comme VENDEUR pour 7900,00F
WHERE uppercase (nom_div) LIKE ‘%C%’ ; Le salarié WAGNER travaille comme VENDEUR pour 8250,00F
Le salarié MARTIAL travaille comme VENDEUR pour 7250,00F
Le salarié PATRICE travaille comme VENDEUR pour 6900,00F
(6 rows)

SQL – Corrigé des questions XSoluces.doc Page 4 sur 9


75000 Paris
D.
D.Tri / Ordonnancement (Order By) IV. Jointures (2 rows)

36. Liste des chefs de publicité et directeurs dans l’ordre décroissant de l’emploi. A.
A.Jointure interne 43. Quels sont les différents noms de division (dans l’ordre croissant) où l’on
trouve des postes de Directeur ?
SELECT matricule, nom, emploi 39. Donner les différentes divisions et leur budget où l’on trouve des postes
FROM emp d’analyste et de vendeur. L'usage de l'opérateur ensembliste IN vous strictement défendu SELECT nom_div
WHERE uppercase (emploi) IN (‘CHEF PUBLICITE’, ’DIRECTEUR’) pour cette question. FROM emp e, dept d
ORDER BY emploi DESC ; WHERE e.division = d.division
SELECT DISTINCT nom_div, budget, emploi AND uppercase (emploi) = ‘DIRECTEUR’
matricule nom Emploi FROM dept, emp ORDER BY nom_div ;
7738 MARECHAL CHEF PUBLICITE WHERE dept.division = emp.division
7658 BASILE CHEF PUBLICITE AND (uppercase (emploi) = ‘ANALYSTE’ Division
7566 JOSEPH DIRECTEUR OR uppercase (emploi) = ‘VENDEUR’) ; Direction
7698 DUPONT DIRECTEUR Informatique
7782 DUVAL DIRECTEUR nom_div budget emploi Vente
(6 rows) Informatique 650780,00F ANALYSTE (3 rows)
Vente 400550,00F VENDEUR
(2 rows) 44. Nom, salaire (renommé) et salaire majoré de 4% (renommé) des employés de
37. Triez les employés dans l’ordre croissant de leur emploi et dans l’ordre la division informatique. On fera apparaître l’augmentation détaillée comme suit : salaire,
décroissant de leur salaire en utilisant la position des colonnes. majoration, salaire majoré.
40. Liste des chefs de publicité (matricule, nom, salaire) travaillant à Paris.
SELECT nom, emploi, salaire SELECT nom, salaire AS actuel, (salaire*0,04) AS majoration, salaire * 1,04 AS majoré
FROM emp SELECT matricule, nom, salaire FROM dept d, emp e
ORDER BY 2, 3 DESC ; FROM dept, emp, batiment WHERE d.division = e.division
WHERE dept.division = emp.division AND lowercase (nom_div) = ‘informatique’ ;
AND batiment.batiment = dept.batiment
nom emploi salaire AND uppercase (emploi) = ‘CHEF PUBLICITE’ nom actuel majoration majoré
GUILLAUME ANALYSTE 9000,00F AND lowercase (ville) = ‘paris’ ; JOSEPH 9975,00F 399,00F 10374,00F
MARTIN ANALYSTE 8000,00F MARTIN 8000,00F 320,00F 8320,00F
BASIILE CHEF PUBLICITE 9500,00F matricule nom salaire DUPLAT 7100,00F 284,00F 7384,00F
MARECHAL CHEF PUBLICITE 6900,00F 7658 BASILE 9500,00F MARTIN 8000,00F 320,00F 8320,00F
JOSEPH DIRECTEUR 9975,00F 7738 MARECHAL 6900,00F GUILLAUME 9000,00F 360,00F 9360,00F
DUVAL DIRECTEUR 9450,00F (2 rows) (5 rows)
DUPONT DIRECTEUR 7850,00F
GARNIER PRESIDENT 15000,00F
PIERRE PUPITREUR 8000,00F 41. Liste des employés (nom, emploi, salaire, com) de la division des ventes par C.
C.Auto-jointure
PAITEL SECRETAIRE 7900,00F ordre croissant de salaire et décroissant de commission.
BOITEL SECRETAIRE 7300,00F 45. Afficher le nom et le salaire des employés avec le nom et le salaire de leur chef
DUPLAT SECRETAIRE 7100,00F SELECT nom, emploi, salaire, com respectif et, pour ces chefs, le nom et le salaire de leur chef respectif.
GASTON SECRETAIRE 6950,00F FROM dept, emp
WAGNER VENDEUR 8250,00F WHERE dept.division = emp.division SELECT e.nom, e.salaire, e1.nom, e1.salaire, e2.nom, e2.salaire
ALLAIN VENDEUR 7900,00F AND nom_div = ‘Vente’ FROM emp e, emp e1, emp e2
MARTIAL VENDEUR 7250,00F ORDER BY salaire, 4 DESC ; WHERE e.mat_chef = e1.matricule
PATRICE VENDEUR 6900,00F AND e1.mat_chef = e2.matricule ;
nomseterminantpareon secretaire 7500,00F Nom emploi salaire com
(18 rows) PATRICE VENDEUR 6900,00F nom Salaire nom salaire nom salaire
GASTON SECRETAIRE 6950,00F BASILE 9500,00F DUVAL 9450,00F GARNIER 15000,00F
MARTIAL VENDEUR 7250,00F 1400,00F GASTON 6950,00F DUPONT 7850,00F GARNIER 15000,00F
38. Liste des employés de la division 30 dans l’ordre décroissant de leur "revenu Nomseterminantpareon secretaire 7500,00F WAGNER 8250,00F DUPONT 7850,00F GARNIER 15000,00F
global" ( 0 ≤ com ≤ +∞ ) (la colonne calculée apparaîtra sous cette appellation). DUPONT DIRECTEUR 7850,00F MARECHAL 6900,00F DUVAL 9450,00F GARNIER 15000,00F
ALLAIN VENDEUR 7900,00F 300,00F nomseterminantpareon 7500,00F DUPONT 7850,00F GARNIER 15000,00F
SELECT nom, salaire + com AS " revenu global " PAITEL SECRETAIRE 7900,00F 0,00F MARTIAL 7250,00F DUPONT 7850,00F GARNIER 15000,00F
FROM emp WAGNER VENDEUR 8250,00F 500,00F PATRICE 6900,00F DUPONT 7850,00F GARNIER 15000,00F
WHERE com IS NOT NULL (8 rows) DUPLAT 7100,00F JOSEPH 9975,00F GARNIER 15000,00F
ORDER BY " revenu global " ; BOITEL 7300,00F DUVAL 9450,00F GARNIER 15000,00F
PIERRE 8000,00F JOSEPH 9975,00F GARNIER 15000,00F
nom Revenu global B.
B.Alias ALLAIN 7900,00F DUPONT 7850,00F GARNIER 15000,00F
WAGNER 8750,00F MARTIN 8000,00F JOSEPH 9975,00F GARNIER 15000,00F
MARTIAL 8650,00F 42. Liste des différents codes postaux et villes des employés ne gagnant pas entre GUILLAUME 9000,00F JOSEPH 9975,00F GARNIER 15000,00F
ALLAIN 8200,00F 5000 F et 8000 F. PAITEL 7900,00F DUPONT 7850,00F GARNIER 15000,00F
PAITEL 7900,00F (14 rows)
(4 rows) SELECT DISTINCT code_postal, ville
FROM emp, e, dept d, batiment b
La clause de tri s'appliquant sur la table résultat, on peut utiliser le titre donné à la colonne. WHERE e.division = d.division
AND b.batiment = d.batiment
AND salaire NOT BETWEEN 5000 AND 8000 ;

Code_postal ville
35000 Rennes

SQL – Corrigé des questions XSoluces.doc Page 5 sur 9


53. Nom et revenu global (salaire+com) des employés travaillant dans les divisions
Il manque les occurrences concernant JOSEPH, DUPONT et DUVAL qui sont les trois 49. Liste des personnels travaillant à Rennes et gagnant plus de 8000 F. de Rennes. Attribuez 0 (zéro) en cas de commission nulle.
nde
tuples qui ne peuvent pas vérifier la 2 partie de la condition
SELECT nom, emploi, salaire SELECT nom, salaire + ifnull (com, 0) as revenu_global
FROM emp FROM emp
46. Afficher le nom, le salaire, l’emploi des personnels gagnant plus que leur WHERE division = ( SELECT division WHERE division IN (SELECT division
propre chef. FROM dept FROM dept
WHERE batiment = ( SELECT batiment WHERE batiment = ( SELECT batiment
SELECT e.nom, e.salaire, e.emploi FROM batiment FROM batiment
FROM emp e, emp ec WHERE lowercase (ville) = ‘rennes')) WHERE lowercase (ville) = ‘rennes’))
WHERE e.mat_chef = ec.matricule AND salaire > 8000 ; nom revenu_global
AND e.salaire > ec.salaire ; PAITEL 7900,00F
nom emploi Salaire ALLAIN 8200,00F
Nom salaire emploi WAGNER VENDEUR 8250,00F WAGNER 8750,00F
WAGNER 8250,00F VENDEUR (1 row) MARTIAL 8650,00F
ALLAIN 7900,00F VENDEUR DUPONT 7850,00F
PAITEL 7900,00F SECRETAIRE GASTON 6950,00F
BASILE 9500,00F CHEF PUBLICITE 50. Liste des employés dont M. Garnier est le chef (par sous requête). On affichera PATRICE 6900,00F
(4 rows) le matricule, le nom et l’emploi pour les employés et pour le chef dans la même requête. Nomseterminantpareon 7500,00F
(8 rows)
SELECT e.matricule, e.nom, e.emploi, e1.matricule, e1.nom, e1.emploi
47. Afficher les divisions dont le budget est inférieur ou égal aux budgets des FROM emp e, emp e1
autres divisions. Vous éliminerez ensuite les comparaisons entre mêmes divisions. WHERE e.mat_chef = e1.matricule C.
C.Sous-requête avec le mot-clé ANY
AND e.mat_chef = (SELECT matricule
SELECT d.nom_div, d.budget, d1.nom_div, d1.budget FROM emp 54. Liste des divisions dont le budget est supérieur à celui d’une division
FROM dept d, dept d1 WHERE uppercase (nom) = ‘GARNIER’) ; employant du personnel dont le nom débute par ‘GA’.
WHERE d.division != d1.division
AND d.budget <= d1.budget ; matricule nom emploi Matricule nom nom SELECT division, nom_div, budget
7698 DUPONT DIRECTEUR 7839 GARNIER PRESIDENT FROM dept
nom_div Budget nom_div budget 7782 DUVAL DIRECTEUR 7839 GARNIER PRESIDENT WHERE budget > ANY
Direction 150000,00F Informatique 650780,00F 7566 JOSEPH DIRECTEUR 7839 GARNIER PRESIDENT (SELECT budget
Direction 150000,00F Vente 400550,00F (3 rows) FROM dept
Direction 150000,00F Production 200000,00F WHERE division IN
Vente 400550,00F Informatique 650780,00F (SELECT division
Production 200000,00F Informatique 650780,00F B.
B.Sous-requête avec le mot-clé IN FROM emp
Production 200000,00F Vente 400550,00F WHERE uppercase (nom) LIKE ‘GA%’)) ;
(6 rows) 51. Liste des employés des divisions ayant un budget inférieur à 380000 F. Division nom_div Budget
20 Informatique 650780,00F
SELECT nom, emploi 30 Vente 400550,00F
FROM emp 40 Production 200000,00F
V. Sous-requêtes WHERE division IN ( SELECT division (3 rows)
FROM dept
A.
A.Sous-requête avec les opérateurs de comparaison
WHERE budget < 380000) ;
55. Nom, emploi, salaire des personnels qui touchent plus qu’au moins un des
48. Liste des directeurs et secrétaires des divisions dont le budget est compris entre
nom Emploi salariés de la Direction
400000 F et 700000 F.
DUVAL DIRECTEUR
GARNIER PRESIDENT SELECT nom, emploi, salaire, nom_div
SELECT nom, emploi
BOITEL SECRETAIRE FROM emp e, dept d
FROM emp
BASILE CHEF PUBLICITE WHERE e.division = d.division
WHERE lowercase (emploi) IN (‘secretaire’,’directeur’)
MARECHAL CHEF PUBLICITE AND salaire > ANY ( SELECT salaire
AND division = ( SELECT division
(5 rows) FROM emp e, dept d
FROM dept
WHERE e.division = d.division
WHERE budget BETWEEN 400000 AND 700000) ;
AND lowercase (nom_div) = ‘direction’) ;
52. Libellé et budget des divisions non localisées dans le département 75. nom emploi salaire nom_div
nom emploi
DUVAL DIRECTEUR 9450,00F Direction
DUPLAT SECRETAIRE
SELECT nom_div, budget GARNIER PRESIDENT 15000,00F Direction
JOSEPH DIRECTEUR
FROM dept BOITEL SECRETAIRE 7300,00F Direction
DUPONT DIRECTEUR
WHERE batiment NOT IN ( SELECT batiment BASILE CHEF PUBLICITE 9500,00F Direction
PAITEL SECRETAIRE
FROM batiment MARTIN ANALYSTE 8000,00F Informatique
GASTON SECRETAIRE
WHERE code_postal LIKE ‘75___’) ; DUPLAT SECRETAIRE 7100,00F Informatique
nomseterminantpareon secretaire
GUILLAUME ANALYSTE 9000,00F Informatique
(6 rows)
Nom_div budget PIERRE PUPITREUR 8000,00F Informatique
Vente 400550,00F JOSEPH DIRECTEUR 9975,00F Informatique
Production 200000,00F DUPONT DIRECTEUR 7850,00F Vente
(2 rows) PAITEL SECRETAIRE 7900,00F Vente
GASTON SECRETAIRE 6950,00F Vente

SQL – Corrigé des questions XSoluces.doc Page 6 sur 9


(12 rows)(Suite résultat requête 55) Autre traduction possible :
ALLAIN VENDEUR 7900,00F Vente 59. Dans quels bâtiments ne sont pas installées les divisions qui emploient des SELECT AVG (salaire + ifnull (com, 0)) AS " moy. revenus globaux "
WAGNER VENDEUR 8250,00F Vente salariés ? FROM emp ;
MARTIAL VENDEUR 7250,00F Vente
nomseterminantpareon secretaire 7500,00F Vente SELECT * moy. revenus globaux
(16 rows) FROM batiment b 8495,83F
WHERE NOT EXISTS ( SELECT * (1 row)
FROM dept d
D.
D.Sous-requête avec le mot-clé ALL WHERE b.batiment = d.batiment Là, les résultats des questions 62 et 63 ne peuvent plus être comparés.
AND EXISTS ( SELECT *
56. Liste des bâtiments (avec les divisions) où sont installées les divisions dont le FROM emp e
budget est supérieur aux budgets des divisions employant du personnel dont le nom débute WHERE e.division = d.division)) ; 64. Compter le nombre d’employés qui comportent la lettre (T, t) dans leur nom.
par un B.
batiment rue ville code_postal SELECT COUNT(*) AS " noms en ..T.. "
SELECT division, nom_div, budget, d.batiment C 7 Place de la Nation Paris 75011 FROM emp
FROM dept d, batiment b (1 row) WHERE uppercase (nom) LIKE ‘%T%’ ;
WHERE d.batiment = b.batiment
AND budget > ALL (SELECT budget noms en ..t..
FROM dept VI. Organiser les données et synthétiser les résultats 9
WHERE division IN (SELECT division (1 row)
FROM emp A.
A.Fonctions d'agrégation
WHERE nom LIKE ‘B%’ ));
Pour toutes les questions qui suivent, les colonnes de calculs seront renommées. 65. Liste des employés ayant un salaire supérieur au salaire moyen de la société.
division nom_div Budget batiment
20 Informatique 650780,00F A 60. Donner la moyenne des différents salaires des employés. SELECT nom, emploi, salaire, embauche
30 Vente 400550,00F B FROM emp
40 Production 200000,00F B SELECT AVG (DISTINCT salaire) AS " moy. diff. salaires " WHERE salaire > ( SELECT AVG (salaire)
(3 row) FROM emp ; FROM emp) ;

57. Nom, emploi, salaire des personnels qui touchent plus que tous les salariés du moy. diff. salaires Nom emploi salaire embauche
département Informatique. 8528,33F DUVAL DIRECTEUR 9450,00F 09/06/91
(1 row) GARNIER PRESIDENT 15000,00F 01/05/91
SELECT nom, emploi, salaire GUILLAUME ANALYSTE 9000,00F 03/12/91
FROM emp 61. Donner la moyenne des salaires des employés. JOSEPH DIRECTEUR 9975,00F 02/05/91
WHERE salaire > ALL ( SELECT salaire BASILE CHEF PUBLICITE 9500,00F 25/06/92
FROM emp SELECT AVG (salaire) AS " moyenne salaires " (5 rows)
WHERE division = ( SELECT division FROM emp ;
FROM dept
lowercase(nom_div) = Moyenne salaires 66. Compter le nombre de divisions différentes qui emploient soit des analystes,
'informatique') ; 8373,61F soit des vendeurs dont le salaire varie entre 4000 F et 8000 F et qui ne touchent pas de
(1 row) commission ( [0 ; + ∞ [ ).
nom Emploi Salaire
GARNIER PRESIDENT 15000,00F 62. Donner la moyenne des revenus globaux des employés (en conservant les SELECT COUNT (DISTINCT division) as résultat
(1 row) commissions pouvant être à NULL). FROM emp
WHERE uppercase (emploi) = 'ANALYSTE'’
SELECT AVG (salaire + com) AS " moy. revenus globaux " OR (uppercase (emploi) = 'VENDEUR'
E.
E.Prédicat EXISTS FROM emp ; AND salaire BETWEEN 4000 AND 8000
AND com IS NULL) ;
58. Quelles divisions (libellé, budget) emploient des salariés à plus de 9000 F ? moy. revenus globaux
8375,00F Résultat
SELECT nom_div, budget (1 row) 2
FROM dept d (1 row)
WHERE EXISTS ( SELECT *
FROM emp e 63. Donner la moyenne des revenus globaux des employés (en éliminant les
WHERE e.division = d.division commissions pouvant être à NULL). 67. Nombre de divisions implantées à Rennes.
AND salaire > 9000) ;
SELECT AVG (salaire + com) AS " moy. revenus globaux " SELECT count(*) as nb_div_Rennes
Division nom_div budget batiment FROM emp FROM dept d, batiment b
10 Direction 150000,00F A WHERE com IS NOT NULL ; WHERE d.batiment = b.batiment
20 Informatique 650780,00F A AND lowercase (ville) = 'rennes' ;
(2 rows) moy. revenus globaux
8375,00F nb_div_rennes
(1 row) 2
(1 row)
On constate, en effet, que la fonction d’agrégation AVG ignore la valeur NULL que peut
posséder une donnée numérique utilisée dans des calculs.

SQL – Corrigé des questions XSoluces.doc Page 7 sur 9


68. Donner les divisions ayant le plus fort et le plus faible budget.
Ville Col2 Col3 C.
C.Condition de regroupement (Having)
SELECT * Paris 10 6
FROM dept Rennes 8 4 76. Afficher les emplois communs à toutes les divisions.
WHERE budget = ( SELECT MAX (budget) (2 rows)
FROM dept) SELECT emploi
OR budget = ( SELECT MIN (budget) 73. Donner la moyenne salariale par division (nom de division) et par ville. Vous FROM emp
FROM dept) ; donnerez un titre représentatif à la moyenne salariale. GROUP BY emploi
HAVING count (distinct division) = ( SELECT count (distinct division)
division nom_div budget batiment SELECT ville, nom_div, avg (salaire) as salaire_moyen FROM emp) ;
10 Direction 150000,00F A FROM emp e, dept d, batiment b
20 Informatique 650780,00F A WHERE e.division = d.division Emploi
(2 rows) AND b.batiment = d.batiment DIRECTEUR
GROUP BY ville, nom_div ; SECRETAIRE
(2 rows)
69. Masse salariale des employés travaillant à Paris. Ville nom_div salaire_moyen
Paris Direction 9630,00F Autre solution :
SELECT SUM (salaire) AS " masse salaires paris " Paris Informatique 8415,00F SELECT DISTINCT e.emploi
FROM emp e, dept d, batiment b Rennes Vente 7562,50F FROM emp e, emp ec
WHERE d.division = e.division (3 rows) WHERE e.emploi = ec.emploi
AND b.batiment = d.batiment AND e.division != ec.division
AND lowercase (ville) = ‘paris’ ;
74. Donner par division le nombre de salariés embauchés entre début 1993 et fin
masse salaires paris 1996. 77. Quelles sont les divisions dont le salaire moyen de ses employés est supérieur
90225,00F au salaire moyen des employés de la société ?
(1 row) SELECT nom_div, count(matricule)
FROM emp dept SELECT nom_div
WHERE emp.division = dept.division FROM emp e, dept d
70. Masse budgétaire des divisions employant des vendeurs ou des analystes. AND embauche between ‘01/01/1993’ and ‘31/12/1996’ WHERE e.division = d.division
GROUP BY nom_div GROUP BY nom_div
SELECT SUM (budget) AS résultat_70 HAVING AVG (salaire) > (SELECT AVG (salaire) FROM emp) ;
FROM dept nom_div Col2
WHERE division IN ( SELECT division Direction 1 Nom_div
FROM emp Informatique 1 Direction
WHERE emploi IN (‘ANALYSTE’, ‘VENDEUR’)) ; Vente 2 Informatique
(3 rows) (2 rows)
résultat_70
1051330,00F
(1 row) 75. Liste des salariés qui ont le plus grand salaire de leur division. 78. Moyenne salariale et nombre d'employés pour les emplois dont la moyenne
salariale dépasse 8000 F.
SELECT nom, nom_div
71. Donner la somme des différents budgets, la masse salariale et le rapport de ces FROM emp e, dept d SELECT emploi, AVG(salaire), COUNT(matricule)
deux calculs pour toutes les divisions du département d’Ile-de-France (75). WHERE e.division = d.division FROM emp
AND salaire = ( SELECT max(salaire) GROUP BY emploi
SELECT SUM (DISTINCT budget) AS "masse budgétaire", FROM emp HAVING AVG(salaire) > 8000
SUM (salaire) AS "masse salariale", GROUP BY division)
float4 (SUM (DISTINCT budget) / SUM (salaire)) AS rapport AND e.division = d.division ; Emploi Col2 Col3
FROM emp e, dept d ANALYSTE 8500,00F 2
WHERE e.division = d.division nom nom_div CHEF PUBLICITE 8200,00F 2
AND batiment IN ( SELECT batiment WAGNER Vente DIRECTEUR 9091,67F 3
FROM batiment JOSEPH Informatique PRESIDENT 15000,00F 1
WHERE code_postal LIKE '75___') ; GARNIER Direction
(3 rows)
Masse budgétaire masse salariale rapport
800780,00F 90225,00F 8,880 Autre solution :
(1 row) SELECT nom, nom_div
FROM emp e, dept d
WHERE salaire = ( SELECT max(salaire)
B.
B.Regroupement (Group By) FROM emp
WHERE emp.division = d.division)
72. Nombre de salariés et nombre d’emplois distincts par ville. AND e.division = d.division ;

SELECT ville, count(matricule), count(distinct emploi)


FROM emp e, dept d, batiment b
WHERE e.division = d.division
AND b.batiment = d.batiment
GROUP BY ville ;

SQL – Corrigé des questions XSoluces.doc Page 8 sur 9


Ancien chapitre : Travailler avec les valeurs nulles (IfNull)

Question : Donner la moyenne des revenus globaux des employés parisiens sachant que si
leur commission est indéterminée, elle sera fixée à 6000 F par défaut. Vous utiliserez une
jointure simple et une sous-requête.

SELECT AVG (salaire + IFNULL (com, 6000)) as moyenne_revenus


FROM emp e, dept d
WHERE d.division = e.division
AND batiment IN ( SELECT batiment
FROM batiment
WHERE ville = ‘Paris’);

moyenne_revenus
15022,50F
(1 row)

SQL – Corrigé des questions XSoluces.doc Page 9 sur 9