2 SQL LMD
2 SQL LMD
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
01- Requêtes LMD
INSERT :
La commande INSERT permet d'insérer une ou plusieurs lignes de données dans une table selon la
syntaxe suivante :
INSERT INTO nom_table(colonne1,colonne2,...)
VALUES (valeur1,valeur2,...);
On doit spécifier :
• Le nom de la table ainsi qu’une liste de ses colonnes séparées par des virgules entre parenthèses.
• La liste de valeurs à insérer dans ces colonnes, séparées par des virgules.
Il faut noter que :
• Le nombre de colonnes et de valeurs doit être le même. De plus, les positions des colonnes doivent correspondre aux positions de leurs
valeurs.
• Pour les colonnes qui ne figurent pas dans la liste spécifies MySQL insert les valeurs par default ou alors NULL si elles ne sont pas spécifiées.
• Si une colonne est définie comme une colonne AUTO_INCREMENT, MySQL génère un entier séquentiel chaque fois qu'une ligne est insérée
dans la table.
4
01- Requêtes LMD
INSERT : Insérer plusieurs lignes
Pour insérer plusieurs lignes dans une table à l'aide d'une seule instruction INSERT, on utilise la
syntaxe suivante :
Les lignes à ajouter dans la table sont séparées par des virgules dans la clause VALUES.
5
01- Requêtes LMD
INSERT : Exemples
• Soit la table « Produit » créée à partir de la requête suivante :
CREATE TABLE Produits (
Num_Produit VARCHAR(18) PRIMARY KEY,
description VARCHAR(40) DEFAULT ‘Non specifie’,
cout DECIMAL(10,2 ) NOT NULL CHECK (cout >= 0), prix DECIMAL(10,2) NOT
NULL CHECK (prix >= cout),
Date_ajout DATE
);
One veut ajouter le produit suivant : Numéro du Produit est P12, Son prix est 14 et le cout 12.
• Voici la commande à exécuter :
INSERT INTO
Produits(num_produit,description,cout,prix,date_ajout)
VALUES (‘P13’,’’,120,140,’2022-01-01’),
(‘P100’,’Laptop’,5000,6000,CURRENT_DATE)
;
7
01- Requêtes LMD
INSERT : Exemples
Voici le contenu de la table après l’exécution de ces requêtes :
• On remarque que :
• La description non spécifiée dans le premier insert a été remplacée par la valeur par défaut : ‘Non
spécifié’
• Pour insérer une valeur de date dans une colonne, il faut utiliser le format ‘YYYY-MM-DD’ ou :
• YYYY représente une année à quatre chiffres.
• MM représente un mois à deux chiffres.
• DD représente un jour à deux chiffres.
• Nous avons utilisé la fonction CURRENT_DATE()qui retourne la date système.
8
01- Requêtes LMD
Ajout depuis une sélection:
Il s’agit de valeurs extraites d’une autre table.
Très utile dans le cas de migration de données.
On peut intégrer des fonctions de conversion et des calculs intermédiaires afin de modifier les
données de la source avant de les stocker dans la table cible.
Bost
9
01- Requêtes LMD
UPDATE :
L'instruction UPDATE permet de mettre à jour les données d'une table. Elle sert à modifier les valeurs dans
une ou plusieurs colonnes d'une seule ligne ou de plusieurs lignes ,
UPDATE nom_table
SET
nom_colonne1 = expr1,
nom_colonne2 = expr2,
...
[WHERE
condition];
• On doit spécifier :
• Le nom de la table dont on souhaite mettre à jour les données.
• La colonne qui va être mise à jour et la nouvelle valeur dans la clause SET. Pour mettre à jour les valeurs dans plusieurs
colonnes, on utilise une liste d'affectations séparées par des virgules.
• En option, Définir une condition dans la clause WHERE. Si cette étape est omise, l'instruction UPDATE modifiera toutes les
lignes de la table. 10
01- Requêtes LMD
UPDATE :
• la syntaxe complète est :
11
01- Requêtes LMD
UPDATE : Exemples
• Rappelons la table Produits :
UPDATE Produits
SET
Date_ajout ='2021-12-31'
WHERE Num_Produit='P12';
12
01- Requêtes LMD
UPDATE : Exemples
• Modifier les données de telle façon que Description =’Non specifie’ et Prix = 1.5*cout :
UPDATE Produits
SET
Description = 'Non specifie',
Prix = 1.5*Cout ;
WHERE Num_Produit='P12';
13
01- Requêtes LMD
14
01- Requêtes LMD
DELETE :
L’instruction DELETE permet de supprimer une ou plusieurs lignes d’une table en utilisant la
syntaxe suivante :
16
TP1 : Requêtes LMD
Soit le schéma relationnel suivant :
17
Solution
1-
INSERT INTO AVIONS (numav,TypeAv, CapAv, VilleAv)
VALUES (34,'Airbus',200,'Tanger');
Travail à faire:
Écrire les requêtes de mise à jour suivantes:
1) Créer la base de données.
2) La base est vierge. Réalisez l'insertion d'un jeu de données de 3
enregistrements dans les différentes tables. Les données
seront définies par vous-même à votre convenance.
3) Augmentez de 10% tous les prix des analyses.
4) Il a été défini un prix planché de 80 DHs pour toutes les
analyses ayant un prix inférieur à 80 DHs. Mettez à jour la
table ANALYSE.
5) Le client dont le code est "c1" vient de fournir son numéro de téléphone (0611111111). Mettre à jour la
table correspondante.
6) Suite à un bug informatique, des entrées ont été saisies le 01 février 2022 au lieu du 1er février 2021. Mettez à jour la
base.
7) Afin de préparer la nouvelle campagne, de nouvelles analyses ont été définies.
Ces nouvelles analyses sont disponibles dans une table ANALYSECOLYSTEROL dont la structure (champs, types de
donnée) est identique à TYPEANALYSE. Mettez à jour la table TYPEANALYSE à partir de la tableANALYSECOLYSTEROL.
CHAPITRE 2
Réaliser des requêtes SQL
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
02 - Requêtes de sélection
SELECT :
L’instruction SELECT permet de consulter les données et de les présenter triées et/ou regroupées suivant certains
critères.
L’instruction SELECT basique est comme suit :
SELECT [Liste_select]
FROM nom_table;
• Dans cette syntaxe, il faut :
• Spécifier une ou plusieurs colonnes à partir desquelles on veut sélectionner des données après le mot-clé SELECT :
Pour sélectionner toutes les colonnes de la table, on utilise « SELECT * » , Sinon on spécifie les noms des colonnes
séparés par une virgule (,).
• Spécifier le nom de la table à partir de laquelle on veut sélectionner des données après le mot-clé FROM.
• N.B : Lors de l'exécution de l'instruction SELECT, MySQL évalue la clause FROM avant la clause SELECT :
FROM SELECT
21
02 - Requêtes de sélection
SELECT :
• Exemples de requêtes SELECT simples :
22
02 - Requêtes de sélection
SELECT :
Options de la Requête SELECT :
• La requête SQL plus avancées prend la forme suivante :
23
02 - Requêtes de sélection
DISTINCT :
DISTINCT est une option qui permet de supprimer les lignes en double.
24
02 - Requêtes de sélection
WHERE :
WHERE définit la liste de conditions que les données recherchées doivent vérifier. La condition de recherche
est une combinaison d'une ou plusieurs expressions utilisant l'opérateur logique AND, OR et NOT.
L'instruction SELECT inclura toute ligne qui satisfait la condition de recherche dans le jeu de résultats.
WHERE est aussi utilisé dans UPDATE ou DELETE pour spécifier les lignes à mettre à jour ou à supprimer.
25
02 - Requêtes de sélection
GROUP BY :
La clause GROUP BY regroupe un ensemble de lignes dans un ensemble de lignes récapitulatives par valeurs de
colonnes ou d'expressions. La clause GROUP BY renvoie une ligne pour chaque groupe, ceci réduit le nombre
de lignes dans le jeu de résultats.
En pratique, on utilise souvent la clause GROUP BY avec des fonctions d'agrégation telles que SUM, AVG,
MAX, MIN et COUNT. La fonction d'agrégation qui apparaît dans la clause SELECT fournit les informations de
chaque groupe.
Exemple :
26
02 - Requêtes de sélection
HAVING :
La clause HAVING est utilisée dans l'instruction SELECT pour spécifier des conditions de filtre
pour un groupe de lignes ou d'agrégats. Elle est souvent utilisée avec GROUP BY pour filtrer les
groupes en fonction d'une condition spécifiée. Si la clause GROUP BY est omise, HAVING se
comporte comme la clause WHERE.
27
02 - Requêtes de sélection
ORDER BY :
La clause ORDER BY est utilisée pour trier les lignes du jeu de résultats. Elle peut porter sur plusieurs
colonnes, chacune suivie, en option, de l’ordre de tri utilise croissant ASC ou décroissant DESC.
L’ordre de tri par default étant ASC.
Exemple :
28
TP3: Requêtes de sélection sur une table
Objectifs:
Créer des requêtes mettant en œuvre les opérations de projection et de sélection sur une table.
Mettre en œuvre les opérations de tri ainsi que l’expression des conditions sur sélection.
Soit le schéma relationnel suivant :
EMPLOYEE (EMPNO, EMPNOM, FONCTION, DTAEEMB, CHEF# , SALAIRE, DEPTNO#)
DEPARTEMENT (DEPTNO, DEPTNOM, LIEU)
PROJET (PCODE, PNOM)
PARTICIPER (PCODE#, EMPNO#)
1. Donner le MCD de ce modèle relationnel
À l'aide de script SQL déterminer
2. Créer la base de données
3. Créer les tables de ce schéma en précisant les contraintes de clés aux tables de la base.
4. Réalisez l'insertion d'un jeu de données de 3 enregistrements dans les différentes tables
5. Les noms des départements
6. Les numéros et noms des départements en renommant les attributs par « Numéro département » et « Nom
département »
7. La liste de toutes les propriétés des employés
8. Les fonctions des employés
9. Les fonctions des employés sans double
CHAPITRE 2
Réaliser des requêtes SQL
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
03- Expression du SGBD
31
03- Expression du SGBD
32
03- Expression du SGBD
33
03- Expression du SGBD
35
03- Expression du SGBD
37
03- Expression du SGBD
Exemple :
38
03- Expression du SGBD
Exemples :
La liste des produits dont la description La liste des produits qui ont ‘2’ dans la case
commence par ‘L’ avant dernière de leur Num_Produit.
39
03- Expression du SGBD
Les fonctions i
ntégrées
Name MYSQL : Fonctions les plus utilisées de manipulation de dates
Description
CURDATE () Renvoie la date actuelle.
CURRENT_DATE() Renvoie la date actuelle.
NOW () Renvoie la date et l'heure actuelles d'exécution de l'instruction.
SYSDATE () Renvoie la date et l'heure actuelles
La différence avec NOW() est que SYSDATE() retourne l'heure à laquelle elle est effectivement appelée, alors que
NOW() retourne l'heure de début de script.
DAY (date) Obtient le jour du mois d'une date spécifiée.
MONTH (date) Renvoie un entier qui représente un mois d'une date spécifiée.
YEAR (date) Renvoie l'année pour une date spécifiée
LAST_DAY (date) Renvoie le dernier jour du mois d'une date spécifiée
DAYNAME (date) Obtient le nom d'un jour de la semaine pour une date spécifiée.
WEEK (date) Renvoie le numéro de semaine d'une date
WEEKDAY (date) Renvoie un index des jours de la semaine pour une date.
DAYOFWEEK (date) Renvoie l'index des jours de la semaine pour une date.
DATEDIFF (date1,date2) Calcule le nombre de jours entre deux valeurs DATE.
DATE_SUB (date, INTERVAL nb uniteDeTemps) Soustrait une valeur d'heure d'une valeur de date.
TIMEDIFF (heure1, heure2) Calcule la différence entre deux valeurs TIME ou DATETIME.
TIMESTAMPDIFF (unité,expr1,expr2) Calcule la différence entre deux valeurs DATE ou DATETIME.
46
03- Expression du SGBD
Les fonctions intégrées MYSQL : Fonctions les plus utilisées de manipulation de dates
Name Description
DATE_ADD (date, INTERVAL nb uniteDeTemps) Ajoute une valeur de temps à la valeur de date.
DATE( ) Extrait une date à partir d’une chaîne contenant une valeur au format DATE ou DATETIME [MySQL]
EXTRACT (part FROM date) Extrait une partie à partir d'une date donnée.
DATE_FORMAT (date, format) Formate une valeur de date en fonction d'un format de date spécifié.
Voici quelques-uns des spécificateurs de format :
%% Le caractère '%'
%d Jour du mois, numérique (00..31)
%m Mois de l'année, numérique (01..12)
%Y Année, sur 4 chiffres (YYYY)
%H Heures, sur 24 heures (00..23)
%i Minutes (00..59)
%s Secondes (00..59)
%T Heure complète (hh:mm:ss)
STR_TO_DATE (chaine, format) Convertit une chaîne en une valeur de date et d'heure basée sur un format spécifié.
FROM_DAYS() Convertit un nombre de jour en une date [MySQL]
SEC_TO_TIME( secondes ) Convertir un nombre de secondes en une heure et minutes au format HH:MM:SS
TO_DAYS( ) Retourne le nombre de jour à partir d’une date
47
03- Expression du SGBD
48
03- Expression du SGBD
Exemple
03- Expression du SGBD
Production :
50
03- Expression du SGBD
Production
51
TP3 (suite): Expression du SGBD
Objectifs:
Créer des requêtes mettant en œuvre les opérations de projection et de sélection
sur une table.
Mettre en œuvre les opérations de tri ainsi que l’expression des conditions sur
sélection.
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
04- Fonctions d’agrégation du SGBD
Une fonction d'agrégation effectue un calcul sur plusieurs valeurs et renvoie une seule valeur.
Les fonctions d’agrégation les plus utilisés : SUM, AVG, COUNT, MAX et MIN.
Les fonctions d'agrégation sont souvent utilisées avec la clause GROUP BY pour calculer une valeur agrégée
pour chaque groupe, par exemple la valeur moyenne par groupe ou la somme des valeurs dans chaque
groupe.
La fonction SUM() :
• La fonction SUM() retourne la somme des valeurs d’une colonne.
• L'image suivante illustre l'utilisation de la fonction d'agrégation SUM() avec une clause GROUP BY :
Nom
A
Valeur
10
∑
SELECT Nom SUM
A 20 Nom, (Valeur)
B 40 SUM(Valeur) A 30
FROM
C 20 Sample_table B 40
C 50 GROUP BY C 70
Nom;
55
04- Fonctions d’agrégation du SGBD
La fonction SUM() :
Exemple :
56
04- Fonctions d’agrégation du SGBD
La fonction AVG() :
La fonction AVG() retourne la moyenne des valeurs d’une colonne.
Exemple :
57
04- Fonctions d’agrégation du SGBD
La fonction COUNT() :
La fonction COUNT() retourne le nombre d’enregistrements sélectionnés.
Exemple :
58
04- Fonctions d’agrégation du SGBD
La fonction MAX/MIN :
Les fonctions MAX() et MIN() retournent respectivement le maximum et le minimum
des valeurs des enregistrements sélectionnés.
Exemple :
59
TP 3 (suite): Fonctions d’agrégation du SGBD
Objectifs :
Créer des requêtes manipulant des chaînes de caractères
Créer des requêtes manipulant des dates
Créer des requêtes manipulant des fonctions de calculs
EMPLOYEE (EMPNO, EMPNOM, FONCTION, DTAEEMB, CHEF# , SALAIRE, DEPTNO#)
DEPARTEMENT (DEPTNO, DEPTNOM, LIEU)
PROJET (PCODE, PNOM)
PARTICIPER (PCODE#, EMPNO#)
1) Les noms des employés (les deux premières lettres du nom en majuscule, les autres lettres en minuscules).
2) La date d’embauche des employés (afficher le jour de la semaine en lettres, le mois en lettres et l’année).
3) Augmenter le salaire des employés ayant plus de 10 ans d’ancienneté par 20%.
4) Afficher les départements en remplaçant les valeurs de l’attribut LIEU Assilah par Tanger.
5) Afficher les départements en remplaçant les valeurs NULL de l’attribut LIEU par Tanger.
6) La moyenne des salaires de tous les employés
7) La moyenne des salaires des ouvriers
8) Le plus haut salaire et le plus bas salaire des employés
9) Le nombre des employés du département 10
10) Le nombre de différentes fonctions occupées par les employés du département 10
11) La moyenne des salaires par département
12) Pour chaque département le salaire annuel moyen des employés qui ne sont ni directeurs ni présidents
13) Pour chaque fonction de chaque département le nombre d’employés et le salaire moyen
14) Les salaires moyens pour les fonctions comportant plus de 2 employés
15) Les numéros des départements avec au moins deux secrétaires
16) Pour chaque projet le nombre des employés qui y participent
CHAPITRE 2
Réaliser des requêtes SQL
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
05- Une sous-requête
Une sous-requête est une requête imbriquée dans une autre requête telle que SELECT, INSERT,
UPDATE ou DELETE.
Une sous-requête est appelée « requête interne » tandis que la requête qui contient la sous-
requête est appelée une requête externe. La requête dite interne est évaluée pour chaque ligne
de la requête externe.
Une sous-requête peut être utilisée partout où une expression est utilisée et doit être fermée
entre parenthèses.
Exemples :
• La table Produits :
62
05- Une sous-requête
Sous-Requête Mono-ligne :
On utilise des opérateurs de comparaison, par exemple =, >, < pour comparer une seule valeur renvoyée
par la sous-requête avec l'expression dans la clause WHERE.
63
05- Une sous-requête
Afficher la liste des produits de la table Produits qui existent sur la table Sales :
Select * from Produits
where Num_produit IN (Select Num_produits from Sales)
64
05- Une sous-requête
Afficher les produits dont le cout est Inferieur à tous les prix des produits.
Select Num_produit, Description from Produits where cout < ALL (Select Prix from Produits)
65
05- Une sous-requête
Afficher les Produits dont le prix est inferieur à un des couts de produits :
Select Num_produit, Description from Produits
where prix < ANY (Select cout from Produits)
66
05- Une sous-requête
Afficher les produits avec une colonne supplémentaire indiquant si le produit est présent la table Sales :
Select P.Num_produit, P.Description,
EXISTS(Select * from Sales S Where P.Num_produit = S.Num_Produit) as existe
From Produits P
67
TP3 (suite): les sous-requêtes
Soit le schéma relationnel suivant :
EMPLOYEE (EMPNO, EMPNOM, FONCTION, DTAEEMB, CHEF# , SALAIRE, DEPTNO#)
DEPARTEMENT (DEPTNO, DEPTNOM, LIEU)
PROJET (PCODE, PNOM)
PARTICIPER (PCODE#, EMPNO#)
Travail à réaliser :
1) Les noms des employés qui gagnent plus que ‘ALAMI’ (Sans utiliser une jointure)
2) Les salaires moyens pour les fonctions comportant plus de 2 employés
3) Les noms des départements avec au moins deux secrétaires.
4) Le nom du département qui a le maximum d’employés.
5) Nom des employés travaillant dans un département avec au moins un ingénieur.
6) Nom des départements où ne travaillent que des ingénieurs
7) La liste des employés qui ont participé dans tous les projets
8) Les noms des employés qui ont un nom en commun. Autrement dit pour qu'un employé soit
sélectionné, il faut qu'un autre employé porte le même nom.
CHAPITRE 2
Réaliser des requêtes SQL
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
06- Requêtes de l’union
Opérateur UNION
L'opérateur UNION permet de combiner deux ou plusieurs ensembles de résultats de
requêtes en un seul ensemble de résultats. Voici la syntaxe d’utilisation de l'opérateur
UNION :
SELECT column_list1
UNION [DISTINCT | ALL]
SELECT column_list2
UNION [DISTINCT | ALL]
SELECT column_list3
...
06- Requêtes de l’union
Opérateur UNION
Le diagramme de Venn suivant illustre l'union de deux ensembles de résultats provenant
des tables Group1 et Group2 :
72
06- Requêtes de l’union
Opérateur UNION
Par défaut, l'opérateur UNION supprime les lignes en double même si on ne spécifie pas
l'opérateur DISTINCT. GROUP1 GROUP2
ID ID
Soient les deux tables : 1 2
2 3
3 4
La requête UNION :
06- Requêtes de l’union
Opérateur UNION
Si on utilise UNION ALL explicitement, les lignes dupliquées, sont affichées dans le résultat.
Du fait que UNION ALL ne gère pas les doublons, il s'exécute plus rapidement que UNION
DISTINCT.
06- Requêtes de l’union
Opérateur INTERSECT
L'opérateur INTERSECT compare les ensembles de résultats de deux requêtes ou plus et
renvoie les lignes distinctes générées par les deux requêtes.
MySQL ne prend pas en charge l'opérateur INTERSECT. Cependant, On peut l’émuler en
utilisant les jointures.
Opérateur INTERSECT
Contrairement à l'opérateur UNION, l'opérateur INTERSECT renvoie l'intersection entre
deux cercles.
Donc la requête : ID
(SELECT ID FROM Group1) 2
Retourne :
INTERSECT [ALL | DISTINCT] 3
(SELECT ID FROM Group2)
Notez que MySQL prend en charge INTERSECT l'opérateur dans MySQL 8.0.31
06- Requêtes de l’union
ID
Retourne : 1
77
06- Requêtes de l’union
78
TP3 (suite): Requêtes de l’union
Soit le schéma relationnel suivant :
EMPLOYEE (EMPNO, EMPNOM, FONCTION, DTAEEMB, CHEF# , SALAIRE, DEPTNO#)
DEPARTEMENT (DEPTNO, DEPTNOM, LIEU)
PROJET (PCODE, PNOM)
PARTICIPER (PCODE#, EMPNO#)
1) Les Fonctions des employés ayant le nom ‘ALAMI’ et ayant salaire inferieur à 10000
2) Les départements sauf de la ville casa
3) Les noms des employés sauf qui ont le chef 2
4) La liste des employés qui ont participé dans les projets
5) Les noms des projets en cours ( affectés aux employés)
6) Les noms des départements avec au moins deux secrétaires.
7) Nom des départements où ne travaillent que des ingénieurs
CHAPITRE 2
Réaliser des requêtes SQL
1. Requêtes LMD
2. Requêtes de sélection
3. Expression du SGBD
4. Fonctions d’agrégation du SGBD
5. Sous requêtes
6. Requêtes de l’union
7. Jointures
07- Jointures
Une base de données relationnelle se compose de plusieurs tables liées entre elles à
l'aide de colonnes communes, appelées clés étrangères.
Dans l’exemple Centre de Formation déjà présenté dans ce cours nous trouvons que
les deux tables « Etudiant » et « Inscription » sont liées a l’aide de la colonne :
numCINEtu
Afin d’avoir plus d’information sur les étudiants ou les inscriptions, on a besoin de chercher dans les deux
tables à la fois. D’où la nécessité des jointures.
81
07- Jointures
La jointure consiste à rechercher entre deux tables ayant un attribut commun (même
type et même domaine de définition) tous les tuples (toutes les lignes) pour lesquels
ces attributs ont la même valeur.
méthode ensembliste
Schéma de construction :
La requête à l’intérieur des parenthèses est dite requête interne ou sous-requête. Elle
est évaluée en premier, constituant ainsi un premier ensemble dont on réalisera
l’intersection (IN) avec l’ensemble issu de l’évaluation de la requête externe.
07- Jointures
méthode ensembliste
Méthode prédicative
La requête comporte une seule instruction SELECT qui traite plusieurs tables dont la liste apparaît
dans la clause FROM.
La traduction de la jointure se fait par une équation de jointure (égalité entre 2 attributs) exprimée au
niveau de la clause FROM.
MySQL prend en charge les types de jointures suivants :
• INNER JOIN (Jointure interne)
• LEFT JOIN (Joindre gauche)
• RIGHT JOIN (Joindre à droite)
• CROSS JOIN (Jointure croisée)
Pour joindre des tables, On utilise la clause de jointure dans l'instruction SELECT après la clause FROM.
Notez que MySQL ne prend pas en charge la jointure FULL OUTER JOIN.
07- Jointures
INNER JOIN
INNER JOIN joint deux tables en fonction d'une condition connue sous le nom de prédicat de
jointure.
Elle spécifie ainsi toutes les paires correspondantes de lignes renvoyées et ignore les lignes
n'ayant pas de correspondance entre les deux tables. La clause INNER JOIN ne retient que les
lignes des deux tables pour lesquelles l'expression exprimée au niveau de ON se vérifie.
Exemple :
Produits Sales
86
07- Jointures
INNER JOIN
Afin d’avoir pour chaque produit vendu, son prix, sa description et la quantité qui a
été vendue, nous avons besoin de joindre les deux tables comme suit :
87
07- Jointures
INNER JOIN
Résultat de la requête :
07- Jointures
INNER JOIN
Dans cet exemple, INNER JOIN utilise les valeurs des colonnes de « Num_Produit » dans
les tables « Produits » et « Sales » pour faire la correspondance.
Le diagramme de Venn suivant illustre la jointure interne :
89
07- Jointures
INNER JOIN
Si la colonne de jointure a le même nom dans les deux tables objets de la jointure, on
peut utiliser la syntaxe suivante :
SELECT
P.Num_Produit, P.Description, P.prix, S.quantite
FROM
Produits P
INNER JOIN Sales S USING (Num_Produit);
90
07- Jointures
LEFT JOIN
• Lors de la jointure de deux tables à l'aide d'une jointure gauche, les concepts de tables gauche et
droite sont introduits.
• La jointure gauche sélectionne les données à partir de la table de gauche. Pour chaque ligne de la
table de gauche, la jointure de gauche est comparée à chaque ligne de la table de droite.
• Si les valeurs des deux lignes satisfont la condition de jointure, la clause de jointure gauche crée
une nouvelle ligne dont les colonnes contiennent toutes les colonnes des lignes des deux tables
et inclut cette ligne dans le jeu de résultats.
• Si les valeurs des deux lignes ne correspondent pas, la clause de jointure gauche crée toujours
une nouvelle ligne dont les colonnes contiennent les colonnes de la ligne de la table de gauche et
NULL pour les colonnes de la ligne de la table de droite.
• En d'autres termes, la jointure gauche sélectionne toutes les données de la table de gauche, qu'il
existe ou non des lignes correspondantes dans la table de droite.
07- Jointures
LEFT JOIN
Exemple :
SELECT
P.Num_Produit, P.Description, P.prix, S.quantite
FROM
Produits P
LEFT JOIN Sales S ON P.Num_Produit=S.Num_Produit;
92
07- Jointures
LEFT JOIN
RIGHT JOIN
La clause de jointure droite est similaire à la clause de jointure gauche sauf que le
traitement des tables gauche et droite est inversé. La jointure droite commence à
sélectionner les données de la table de droite au lieu de la table de gauche : RIGHT
JOIN sélectionne toutes les lignes de la table de droite et fait correspondre les lignes
de la table de gauche.
Si une ligne de la table de droite n'a pas correspondances dans la table de gauche, la
colonne de la table de gauche aura NULL dans le jeu de résultats final.
94
07- Jointures
RIGHT JOIN
Exemple :
SELECT
S.Num_Produit, S.Quantite, P.prix
FROM
Sales S
Right JOIN Produits P ON
P.Num_Produit=S.Num_Produit;
95
07- Jointures
RIGHT JOIN
96
07- Jointures
97
07- Jointures
SELF JOIN
L'auto-jointure est souvent utilisée pour interroger des données hiérarchiques ou pour comparer une
ligne avec d'autres lignes dans la même table.
Pour effectuer une auto-jointure, on utilise des alias de la table pour ne pas répéter deux fois le
même nom de table dans la même requête.
N.B : Référencer une table deux fois ou plus dans une requête sans utiliser d'alias de table provoquera
une erreur.
Exemple :
• La table « People » est définie ainsi :
• La colonne IdParent définit le père de chaque personne, qui est aussi un élément de la table » People »
07- Jointures
SELF JOIN
Afin d’avoir la liste des personnes et leurs parents, il faut utiliser une auto-jointure.
Au moyen de INNER JOIN :
SELECT c.Nom as Fils, p.nom as Pere FROM people c
INNER JOIN people p on c.idParent = p.idPersonne;
99
07- Jointures
SELF JOIN
Afin d’avoir la liste des personnes et leurs parents, il faut utiliser une auto-jointure.
Au moyen de LEFT JOIN :
Le résultat comprend même les personnes qui n’ont pas un père défini.
Exemple :
100
TP3 (suite) : Jointures
Soit le schéma relationnel suivant :
EMPLOYEE (EMPNO, EMPNOM, FONCTION, CHEF#, SALAIRE, DEPTNO#)
DEPARTEMENT (DEPTNO, DEPTNOM, LIEU)
PROJET (PCODE, PNOM)
PARTICIPER (PCODE#, EMPNO#)
À l'aide de SQL déterminer :
1) Le nom de la ville dans laquelle travaille ‘ALAMI’
2) Les noms des employés, fonctions et les noms des départements 20 et 30
3) Les noms des employés et les noms de leur chef.
4) Les noms et salaires des employés qui gagnent moins que leurs chefs (afficher aussi les noms des
chefs)
5) Les noms des employés et les noms des projets auxquels ils participent
6) Liste des projets auxquels participent ‘BENNIS Ali’
7) Liste des ingénieurs qui participent au projet ‘Gestion pharmacie’
8) Les noms de tous les employés et les noms des projets auxquels ils participent (même s’ils ne
participent à aucun projet)
9) Les noms de tous les directeurs et les noms des projets auxquels ils participent (même s’ils ne
participent à aucun projet)