Vous êtes sur la page 1sur 6

TD3/TP4 SQL*Plus (les jointures)

Matière : Bases de données Classe : 3éme année Génie Informatique


Dr: M.yosra

En se basant sur le Schéma relationnel des tables de HR :


EMPLOYEES (EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL, PHONE_NUMBER,
HIRE_DATE, JOB_ID, SALARY, COMMISSION_PCT,MANAGER_ID, DEPARTMENT_ID)
COUNTRIES(COUNTRY_ID,COUNTRY_NAME,REGION_ID)
DEPARTMENTS(DEPARTMENT_ID,DEPARTMENT_NAME,MANAGER_ID,LOCATION_ID)
JOBS (JOB_ID,JOB_TITLE,MIN_SALARY,MAX_SALARY)
JOB_HISTORY (EMPLOYEE_ID,START_DATE,END_DATE,JOB_ID,DEPARTMENT_ID)
LOCATIONS(LOCATION_ID,STREET_ADDRESS,POSTAL_CODE,CITY,STATE_PROVINCE, COUNTRY_ID)
REGIONS (REGION_ID, REGION_NAME)
(Ne pas oublier qu'elles appartiennent à l'utilisateur HR (préfixer le nom des tables par HR.)

1. Afficher les noms des pays qui appartiennent à la région nommée Americas.

2. Afficher le prénom, le nom, le nom de département des employés qui travaillent dans les
départements 80 et 40. Trier le résultat selon la colonne last_name.
3. Afficher le prénom, le nom, le numéro et le nom de département de chaque employé. Tirer
le résultat selon le numéro de département (department_id).
4. Afficher le prénom, le nom, le nom de département, la ville et la province (state_province)
pour chaque employé.
5. Afficher le nom et le prénom des employés, l’ID et le nom de département pour tous les
départements, y compris ceux qui n’ont pas d’employés.
6. Afficher le nom d’employé et le numéro du département de chaque employé des départements 10
ou 20 ou 30 avec le nom de son directeur. Trier le résultat par ordre croissant selon le numéro du
département.

1
7. Afficher le nom et le prénom ainsi l’ID et le nom de département des employés qui ont ou
n’ont pas de départements.
8. Afficher le résultat suivant pour les employés ayant un salaire >12000

9. Afficher pour les employés affectés à des départements, le nom, le prénom, le nom de poste,
le nom de département.
10. Donnez le salaire moyen du département Finance.
11. Afficher les employés qui n’ont été affectés à aucun département et les départements ou aucun
employé n’a été affecté.
12. Afficher l’ID, le nom complet (prénom et nom) des employés et le nom du pays
(country_name) ou ils travaillent.
13. Afficher le nom, le prénom, le salaire de l’employé, le nom de département et toutesles
villes (city).
14. Affichez le nom et le numéro de chaque employé ainsi que le nom et le numéro de sont
manager. Nommez les colonnes Employée, Employee, emp#, Manager et Mgr#
respectivement.
15. Afficher pour chaque département, le nom de département, le salaire moyen et lenombre
d’employés qui reçoivent des commissions dans ce département.
16. Afficher le nom du pays, la ville et les noms des départements qui s’y trouvent.
17. Afficher le nom de l’employé, le nom de poste (job_title) et la différence entre lesalaire
maximum de ce poste et le salaire de l’employé.
18. Calculer le salaire moyen des employés pour chaque nom de poste (job_title).
19. Donner le nombre d'employés pour chaque poste.
20. Afficher les numéros des départements avec leurs localisations (location_id) et leurs villes (city). On
2
affiche aussi les localisations qui ne contiennent pas des départements
21. Afficher les noms des directeurs ainsi que les noms de leurs départements comme suit :

22. Afficher le nom et la date d’embauche de tous les employés recrutés après l’employé
‘Davies’.

3
Rappel du cours
TYPES DE JOINTURE

Pour sélectionner des lignes provenant de plusieurs tables, il est nécessaire d'utiliser des
jointures dans la requête SQL. Il existe trois types de jointures :
• Jointures internes : utilisent les clauses NATURAL JOIN, USING et ON.
• Jointures externes : utilisent les clauses LEFT OUTER JOIN, RIGHT OUTER JOIN et
FULL OUTER JOIN.
• Jointure croisée : utilise la clause CROSS JOIN.

La syntaxe générale est :


SELECT table1.column, table2.columnFROM table1
[NATURAL JOIN table2] |
[JOIN table2 USING (column_name)] |[JOIN table2
ON (table1.column_name = table2.column_name)]|[LEFT|RIGHT|FULL
OUTER JOIN table2
ON (table1.column_name = table2.column_name)]|[CROSS JOIN table2]

JOINTURE INTERNE

• NATURAL JOIN
La clause NATURAL JOIN est basée sur toutes les colonnes des deux tables ayant le même nom et
le même type.

SELECT department_id, department_name, location_id, city


FROM departments NATURAL JOIN locations

• JOIN…USING
La clause JOIN…USING permet de spécifier explicitement une ou plusieurs colonnes d’équi-
jointure entre parenthèses après le mot-clé USING. Cette colonne doit avoir le même nom dans
les deux tables.

SELECT employee_id, last_name, location_id, department_id


FROM employees JOIN departments USING (department_id)

• JOIN ... ON
La clause JOIN ... ON permet de spécifier explicitement des colonnes de jointure, indépendamment
de leurs noms. C’est la jointure la plus générale et la plus utilisée.

4
SELECT e.employee_id, e.last_name, e.department_id,
d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)

SELECT e.employee_id, e.last_name, e.department_id,


d.department_id, d.location_id
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)
WHERE e.manager_id = 149

-- Au lieu de la clause WHERE on peut écrire : AND e.manager_id = 149

• JOINTURES MULTIPLES
Il n'y a aucune restriction sur le nombre de tables qui peuvent être liées à l'aide des jointures.

SELECT employee_id, city, department_name


FROM employees e
JOIN departments d ON d.department_id = e.department_id
JOIN locations l ON d.location_id = l.location_id

• AUTO-JOINTURE
C’est la jointure d’une table avec elle-même comme si c’était une autre table. Ce type de requête n’est
pas si commun mais très pratique dans le cas où on veut joindre des enregistrements d'une table à
d'autres enregistrements de cette même table. Pour ce faire, il faut utiliser des alias.
SELECT e.last_name emp, m.last_name mgr
FROM employees e JOIN employees m
ON (e.manager_id = m.employee_id)

• NON EQUI-JOINTURE
Contrairement à l'équi-jointure qui consiste à opérer une jointure avec une condition d'égalité, la non
équi-jointure utilise n'importe quelle condition de jointure entre deux tables, exceptée la stricte
égalité.

SELECT e.last_name, e.salary, j.grade_level


FROM employees e JOIN job_grades j
ON e.salary BETWEEN j.lowest_sal AND j.highest_sal

JOINTURE EXTERNE

Une jointure externe permet de sélectionner les lignes ayant des correspondances entre les deux
tables jointes ainsi que les lignes n'ayant pas de correspondance dans la table à droite, ou dans la
table à gauche ou dans les deux tables jointes.
5
SELECT e.last_name, d.department_id, d.department_name
FROM employees e JOIN departments d
ON (e.department_id = d.department_id)

Cette requête retourne 106 lignes. C’est le nombre d’employés affectés aux différents départements.

• LEFT OUTER JOIN


SELECT e.last_name, d.department_id, d.department_name
FROM employees e LEFT OUTER JOIN departments d
ON (e.department_id = d.department_id)

Cette requête retourne 107 lignes. C’est le nombre de tous les employés même ceux qui ne sont
pas affectés aux départements.

• RIGHT OUTER JOIN


SELECT e.last_name, d.department_id, d.department_name
FROM employees e RIGHT OUTER JOIN departments d
ON (e.department_id = d.department_id)

Cette requête retourne 122 lignes. C’est le nombre de tous les départements même ceux qui ne
correspondent pas à des employés.

• FULL OUTER JOINS


SELECT e.last_name, d.department_id, d.department_name FROM
employees e FULL OUTER JOIN departments d ON (e.department_id =
d.department_id)

Cette requête retourne 123 lignes. Elles contiennent les employés affectés aux départements et ceux
non affectés ainsi que les départements qui ne correspondent pas à des employés.

JOINTURE CROISEE

La jointure croisée génère un produit cartésien entre les tables. Pour éviter le produit cartésien, il faut
que le nombre de conditions de jointure soit supérieur ou égal à N, avec N est le nombre de tables
jointes.

SELECT count(*) FROM employees


Retourne 107 lignes.

SELECT count(*) FROM departments


Retourne 27 lignes.

SELECT count(*) FROM employees CROSS JOIN departments


Retourne 2889 lignes (107*27).

Vous aimerez peut-être aussi