Vous êtes sur la page 1sur 55

SQL

COURS DE JOINTURE/SOUS REQUÊTES/VUES


OBJECTIFS
 Jointures
 Les relations entre tables :
 Clé primaire / Clé étrangère
 Types des relations
 Intégrité référentielle
 Les sous requêtes
 Les vues
JOINTURE – DÉFINITIONS
 La jointure est une opération qui consiste à apparier des enregistrements
de deux tables ou plus.
 C‘est un produit cartésien entre deux tables (ou plus) suivi d'une
sélection selon le critère de jointure

SELECT table1.column, table2.column


FROM table1, table2
WHERE table1.column1 = table2.column2;

 La condition de jointure s’écrit après la clause WHERE


JOINTURE
EMPLOYEES DEPARTMENTS

Clé étagère Clé primaire


JOINTURE – EXEMPLE
SELECT *
FROM employees, department
WHERE  employees.d_id = departments.department_id
JOINTURE - CONSIGNES
 Utilisez des préfixes qui précisent le nom de la table pour
différencier les noms de colonnes appartenant à plusieurs tables.
 Différenciez des colonnes de même nom appartenant à plusieurs
tables en utilisant des alias de colonne.
 En SQL, une jointure peut être définie en indiquant plusieurs tables
derrière une clause FROM séparées par des virgules (jointure
implicite) ou bien en utilisant le mot-clé JOIN (jointure explicite).
JOINTURE – TYPES (CROSS JOIN)
 La commande CROSS JOIN est un type de jointure sur 2 tables SQL qui permet de retourner le
produit cartésien des 2 tables
SELECT 'Cross Join', e.ename, e.salary, d.dname
FROM employees AS e
CROSS JOIN departments as d

 Méthode alternative pour retourner les mêmes résultats


SELECT 'Cross Join', e.ename, e.salary, d.dname
FROM employees e, departments d

 Si une table A contient 10 lignes et une table B contient 5 lignes, le CROSS JOIN ou le produit
cartésien va produire 50 résultats (10 x 5 = 50). En général la commande CROSS JOIN est combinée
avec la commande WHERE pour filtrer les résultats qui respectent certaines conditions.
JOINTURE – TYPES (CROSS JOIN)
JOINTURE – TYPES (INNER JOIN)
 La jointure interne, qui se fait grâce à la commande INNER JOIN ou JOIN est une jointure qui
permet de sélectionner les enregistrements ayant des correspondances entre les tables jointes.

SELECT *
FROM Table1
INNER JOIN Table2 ON Table1.id= Table2.fk_id
JOINTURE – TYPES (INNER JOIN)
SELECT EMPLOYEES.ENAME, EMPLOYEES.SALARY, DEPARTMENTS.DNAME
FROM EMPLOYEES, DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID=DEPARTMENTS.DEPARTMENT_ID;

SELECT EMPLOYEES.ENAME, EMPLOYEES.SALARY, DEPARTMENTS.DNAME


FROM EMPLOYEES
JOIN DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID=DEPARTMENTS.DEPARTMENT_ID;

SELECT EMPLOYEES.ENAME, EMPLOYEES.SALARY, DEPARTMENTS.DNAME


FROM EMPLOYEES
INNER JOIN DEPARTMENTS
WHERE EMPLOYEES.DEPARTMENT_ID=DEPARTMENTS.DEPARTMENT_ID;
JOINTURE – TYPES (INNER JOIN)
SELECT EMPLOYEES.ENAME, EMPLOYEES.SALARY, DEPARTMENTS.DNAME
FROM EMPLOYEES
INNER JOIN DEPARTMENTS
ON EMPLOYEES.DEPARTMENT_ID=DEPARTMENTS.DEPARTMENT_ID;
JOINTURE – TYPES (JOINTURE
EXTERNE)
 La jointure externe permet de ressortir toutes les lignes d'une table en
correspondance ou non avec la table à laquelle elle est jointe.
 La commande de la jointure externe est : OUTER, elle est facultative avec LEFT
ou RIGHT
 La jointure externe peut être d’un seul côté, à gauche (LEFT) ou à droite
(RIGHT), ou bilatérale (FULL, mais pas géré par MySQL...)
 Les mots clés LEFT et RIGHT font référence à la situation de la table dans l'ordre
de lecture de la requête SQL
JOINTURE – TYPES (LEFT OUTER
JOIN)
 La commande LEFT JOIN (aussi appelée LEFT OUTER JOIN permet de lister tous les résultats de la
table de gauche A (left = gauche) même s’il n’y a pas de correspondance dans la table B.

SELECT * FROM A LEFT JOIN B ON A.id = B.fk_id

SELECT * FROM A LEFT OUTER JOIN B ON A.id = B.fk_id


JOINTURE – TYPES (LEFT OUTER
JOIN)
SELECT *
FROM employees
LEFT OUTER JOIN departments
ON EMPLOYEES.D_ID = DEPARTMENTS.DEPARTMENT_ID

Ces deux employés ne sont pas affectés à un


département
JOINTURE – TYPES (RIGHT OUTER
JOIN)
 La commande RIGHT JOIN (aussi appelée RIGHT OUTER JOIN permet de lister tous les résultats de la
table de droite B même s’il n’y a pas de correspondance dans la table A.

SELECT * FROM A RIGHT JOIN B ON A.id = B.fk_id

SELECT * FROM A RIGHT OUTER JOIN B ON A.id = B.fk_id


JOINTURE – TYPES (RIGHT OUTER
JOIN)
SELECT *
FROM employees
RIGHT OUTER JOIN departments
ON EMPLOYEES.D_ID = DEPARTMENTS.DEPARTMENT_ID

Liste des départements qui ne contiennent


aucun employé
JOINTURE – TYPES (FULL OUTER
JOIN)
 La commande FULL JOIN (ou FULL OUTER JOIN) retourne toutes les lignes de la table de gauche
(table 1) et de la table de droite (table 2).

SELECT * FROM table1 FULL JOIN table2 ON table1.id = table2.fk_id

 La commande FULL JOIN n’existe pas en MySQL mais il existe une alternative pour avoir le même
résultat
SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.fk_id
UNION
SELECT * FROM table1 RIGHT JOIN table2 ON table1.id = table2.fk_id
JOINTURE – TYPES (FULL OUTER
JOIN)
SELECT * FROM employees
LEFT OUTER JOIN departments ON EMPLOYEES.D_ID = DEPARTMENTS.DEPARTMENT_ID
UNION
SELECT * FROM employees
RIGHT OUTER JOIN departments ON EMPLOYEES.D_ID = DEPARTMENTS.DEPARTMENT_ID
JOINTURE – TYPES (SELF JOIN)
 Un SELF JOIN correspond à une jointure d’une table avec elle-même. Ce type de requête n’est
pas si commun mais très pratique dans le cas où une table lie des informations avec des
enregistrements de la même table.

SELECT t1.colonne1, t1.colonne2, t2.colonne1, t2.colonne2


FROM table AS t1 JOIN table AS t2
ON t2.fk_id = t1.id

 Exemple : on a une table employé dans laquelle est renseigné le numéro du manager de
l’employé et on veut avoir les noms des employés avec leurs noms de managers
JOINTURE – TYPES (SELF JOIN)
SELECT e1.ename AS Employe, e2.ename AS Manager
FROM employees AS e1
JOIN employees AS e2 ON e1.id_manager = e2. employee_id
JOINTURE – UTILISER LES ALIAS
 Pensez à utiliser les alias afin de simplifier les interrogations.
 L'utilisation des préfixes désignant la table améliore les performances.

SELECT e.employee_id, e.ename, e.d_id,


d.departements_id, d.dname
FROM employees e , deparetments d
WHERE e.d_id = d.departement_id;
SQL
RELATIONS ENTRE TABLES
CLE PRIMAIRE/CLE ETRANGERE
 La clé primaire est un champ ou un ensemble de champs identifiant d’une
manière unique un enregistrement (une ligne) dans une table
 Une clé étrangère (appelée aussi clé de référence) est une clé qui fait la liaison
entre deux tables
 Une clé primaire dans une table A peut jouer le rôle d’une clé étrangère dans
une table B
 Les valeurs existant dans un champ qui est déclaré comme une clé étrangère
doivent obligatoirement exister dans la table dans laquelle il joue le rôle d’une
clé primaire
CLE PRIMAIRE/CLE ETRANGERE-
EXEMPLE

CREATE TABLE employees (


employee_id INT(11) NOT NULL AUTO_INCREMENT,
CREATE TABLE departments ( ename VARCHAR(255) NOT NULL,
department_id INT(11) NOT NULL AUTO_INCREMENT, d_id INT(11) NOT NULL,
dname VARCHAR(255) NOT NULL, salary DECIMAL(7,2) NOT NULL,
PRIMARY KEY (department_id)) ENGINE=INNODB; PRIMARY KEY (employee_id),
FOREIGN KEY (d_id) REFERENCES departments
(departmentt_id)) ENGINE=INNODB;
TYPE DE RELATION - UN A UN
 Une relation de ‘un à un’ détermine que pour chaque enregistrement d'une
table, il ne peut y avoir que zéro ou un seul enregistrement d'une autre table qui
lui est lié
 Ce type de relation est symbolisé par (1 – 1)
 On prend l’exemple de la table person qui ne peut avoir qu’une seule adresse
principale dans la table primary-address
 La clé primaire de la table person fera référence d’une clé étrangère dans la
table primary-address
TYPE DE RELATION - UN A UN

CREATE TABLE primary_address (


CREATE TABLE person ( primary_address_id INT NOT NULL,
person_id INT NOT NULL AUTO_INCREMENT, address VARCHAR(255) NOT NULL,
pname VARCHAR(255) NOT NULL, p_id INT NOT NULL,
PRIMARY KEY (person_id)); PRIMARY KEY (primary_address_id),
FOREIGN KEY (p_id) REFERENCES person (person_id)) ;
TYPE DE RELATION - UN A UN
TYPE DE RELATION - UN A
PLUSIEURS
 Une relation de un à plusieurs détermine que plusieurs enregistrements de la
table principale sont en relation avec une seule valeur de la table secondaire.
 Ce type de relation est symbolisé par (1 – N)
 On prend l’exemple de la table department, un département peut contenir
plusieurs employés, c’est-à-dire que dans la table employees plusieurs employés
auront le même d_id
 La table employees aura comme clé étrangère (d_id) la clé primaire de la table
departments
TYPE DE RELATION - UN A
PLUSIEURS

CREATE TABLE employees (


employee_id INT(11) NOT NULL AUTO_INCREMENT,
CREATE TABLE departments ( ename VARCHAR(255) NOT NULL,
department_id INT(11) NOT NULL AUTO_INCREMENT, d_id INT(11) NOT NULL,
dname VARCHAR(255) NOT NULL, salary DECIMAL(7,2) NOT NULL,
PRIMARY KEY (department_id)) ENGINE=INNODB; PRIMARY KEY (employee_id),
FOREIGN KEY (d_id) REFERENCES departments
(departmentt_id)) ENGINE=INNODB;
TYPE DE RELATION - UN A
PLUSIEURS
TYPE DE RELATION - PLUSIEURS A
PLUSIEURS
 Dans une relation plusieurs-à-plusieurs, un enregistrement d'une table donnée est
lié à plusieurs enregistrements d'une seconde table, est vis versa , c’est-à-dire qu’un
enregistrement de cette seconde table est lié à plusieurs enregistrements de la
première table.

 Ce type de relation est symbolisé par (N – N)

 On prend l’exemple des tables student et course, un étudiant peut étudier


plusieurs cours , est un cours peut être étudié par plusieurs étudiants
TYPE DE RELATION - PLUSIEURS A
PLUSIEURS
 Pour ce cas de figure on aura une 3ème table qui va faire la liaison entre la
table student et course:

 Les clés primaires de la table student et course seront des clés étrangères
dans la table de liaison
 La clé primaire de la table de liaison sera la combinaison des deux clés
étrangères
 On peut bien sûr ajouter d’autres champs à la table de liaison comme par
exemple date_debut_cours
TYPE DE RELATION - PLUSIEURS A
PLUSIEURS
CREATE TABLE student ( CREATE TABLE course (
student_id INT NOT NULL AUTO_INCREMENT, course_id INT NOT NULL AUTO_INCREMENT,
sname VARCHAR(255) NOT NULL, cname VARCHAR(255) NOT NULL,
PRIMARY KEY (student_id) PRIMARY KEY (course_id)
) ENGINE=INNODB; ) ENGINE=INNODB;

CREATE TABLE student_course (


student_course_id INT NOT NULL AUTO_INCREMENT,
s_id INT NOT NULL,
c_id INT NOT NULL,
PRIMARY KEY (student_course_id),
FOREIGN KEY (s_id) REFERENCES student (student_id),
FOREIGN KEY (c_id) REFERENCES course (course_id)
) ENGINE=INNODB;
TYPE DE RELATION - PLUSIEURS A
PLUSIEURS
INTEGRITE REFERENTIELLE -
DEFINITION
 La contrainte de la clé étrangère implique que les données dans cette colonne
doivent obligatoirement exister dans la table dont laquelle cette colonne joue le
rôle d’une clé primaire
 Par exemple les valeurs de la clé étrangère ‘d_id’ de la table employees ne doit
contenir que des valeurs valides, c’est à dire les valeurs qui existent dans la
colonne ‘department_id’ de la table departments
 On ne peut pas ajouter à un employé un id département ‘d_id’ qui n’existe pas
dans la table departments sinon on aura une erreur d’exécution de la requête
 La table departments ne peut pas être supprimée tant qu’il y a un
enregistrement dans la table employees qui fait référence à un d_id (id
département)
INTEGRITE REFERENTIELLE -
EXEMPLE

INSERT INTO employees(employee_id, ename, salary, d_id) VALUES (6, 'newperson', '5000.00', 10);

// LA RÉFÉRENCE '10' N'EXISTE PAS DANS LA TABLE DES DÉPARTEMENTS


ERROR 1452 (23000): CANNOT ADD OR UPDATE A CHILD ROW: A FOREIGN KEY CONSTRAINT FAILS (`MYDB`.`EMPLOY
EES`, CONSTRAINT `EMPLOYEES_IBFK_1` FOREIGN KEY (`D_ID`) REFERENCES `DEPARTMENTS` (`DEPARTMENT_ID`))
INTEGRITE REFERENTIELLE
 La clause ON DELETE CASCADE ou ON UPDATE CASCADE active la suppression
et la modification automatique des enregistrements

CREATE TABLE employees (


employee_id INT(11) NOT NULL AUTO_INCREMENT,
ename VARCHAR(255) NOT NULL,
d_id INT(11) NOT NULL,
salary DECIMAL(7,2) NOT NULL,
PRIMARY KEY (employee_id),
FOREIGN KEY (d_id) REFERENCES departments (department_id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB;
INTEGRITE REFERENTIELLE -
EXEMPLE
DELETE FROM departments WHERE department_id = 4;

SELECT * FROM departments;

SELECT * FROM employees;


SQL
SOUS REQUÊTES
SOUS-REQUETES
 Une sous-requête (aussi appelée « requête imbriquée » ou « requête en cascade ») comme
son nom l’indique est une requête SELECT imbriqué dans une instruction SELECT, INSERT,
UPDATE ou DELETE.
INSTRUCTION ( SELECT, INSERT, UPDATE OU
DELETE)
SELECT

SELECT * FROM table1


WHERE id IN
(SELECT id FROM table2);

Sous- requête
SOUS-REQUETES – CONDITION DE
SELECTION
SELECT .…
Requête
FROM .…
externe
WHERE [ Expression ] Opérateur (SELECT ….
FROM …. Requête
WHERE ….); imbriquée

 Dans cette requête, Opérateur peut correspondre :


 Soit à IN ou NOT IN
 Soit à un opérateur de comparaison (=, <, <=, >, >=, <> ou !=).
 Soit à la combinaison des operateurs ALL, ANY (ou SOME) et d'un opérateur de
comparaison (=, <, <=, >, >=, <> ou !=).
Soit a EXISTS ou NOT EXISTS
SOUS-REQUETES – ANY / SOME
 La commande ANY (ou SOME) permet de comparer une valeur avec le résultat d’une sous-
requête
SELECT * FROM table1
WHERE colonne1 > ANY ( SELECT colonne
FROM table2
WHERE condition2 )

 Cette requête se traduit par : sélectionner toutes les colonnes de table1, où la condition est
supérieure à n’importe quel résultat de la sous-requête.
 Les opérateurs conditionnels peuvent être les suivants : =, <, >, <>, !=,<=, >=, !> ou !<.
SOUS-REQUETES – ANY / SOME
SELECT colonne1 FROM table1
WHERE colonne1 > ANY ( SELECT colonne1
FROM table2)

 Supposons que colonne1 est égal à 10 :


 La condition est vrai (cf. TRUE) si table2 contient {21,14,7} car il y a au moins une valeur
‘7’ inférieure à 10
 La condition est fausse (cf. FALSE) si table2 contient {20,10} car aucune valeur n’est
strictement inférieure à 10
 La condition est non connue (cf. UNKNOW) si table2 est vide
 La commande IN est équivalente à l’opérateur = suivi de ANY.
SOUS-REQUETES – ALL
 La commande ALL permet de comparer une valeur avec l’ensemble des valeurs d’une sous-
requête
SELECT * FROM table1
WHERE colonne1 > ALL ( SELECT *
FROM table2
WHERE condition2 )

 Cette requête se traduit par : sélectionner toutes les colonnes de table1, où colonne1 est
supérieure à tous les résultats de la sous-requête
 Les opérateurs conditionnels peuvent être les suivants : =, <, >, <>, !=,<=, >=, !> ou !<.
SOUS-REQUETES – ALL
SELECT colonne1 FROM table1
WHERE colonne1 > ALL ( SELECT colonne1
FROM table2)

 Supposons que colonne1 est égal à 10 :


 La condition est vrai (cf. TRUE) si table2 contient {-5,0,+5} car toutes les valeurs sont
inférieure à 10
La condition est fausse (cf. FALSE) si table2 contient {12,6,NULL,-100} car au moins une
valeur ‘12’ est inférieure à 10
La condition est non connue (cf. UNKNOW) si table2 est vide.
SOUS-REQUETES – IN et NOT IN
 La commande IN permet de comparer une valeur si elle est égal à l’une des valeurs d’une sous-requête

SELECT * FROM table1


WHERE colonne1 IN (SELECT *
FROM table2
WHERE condition2 )
 Cette requête se traduit par : sélectionner toutes les colonnes de table1, où colonne1 est égal à l’une des
résultats de la sous-requête.

SELECT * FROM table1


WHERE colonne1 NOT IN (SELECT *
FROM table2
WHERE condition2 )
 Cette requête se traduit par : sélectionner toutes les colonnes de table1, où colonne1 n’est pas égal à
tous les résultats de la sous-requête.
SOUS-REQUETES – EXISTS
 La commande EXISTS s’utilise dans une clause conditionnelle pour savoir s’il y a une présence
ou non de lignes lors de l’utilisation d’une sous-requête.

SELECT nom_colonne1 FROM table1


WHERE EXISTS (SELECT nom_colonne2
FROM table2
WHERE nom_colonne3 = 10)

 Dans l’exemple ci-dessus, s’il existe au moins une ligne dans table2 dont nom_colonne3 et égal
à 10, alors la sous-requête retournera au moins un résultat. Et donc, la condition sera vérifiée et
la requête principale retournera les résultats de la colonne nom_colonne1 de table1.
SOUS-REQUETES – NOT EXISTS
 La commande NOT EXISTS fonctionne comme EXISTS, sauf que la clause WHERE, dans laquelle
ce paramètre est utilisé, est remplie lorsque la sous-requête ne retourne aucune ligne.

SELECT nom_colonne1 FROM table1


WHERE NOT EXISTS (SELECT nom_colonne2
FROM table2
WHERE nom_colonne3 = 10)

 Dans l’exemple ci-dessus, s’il n’y a aucune ligne dans table2 dont nom_colonne3 et égal à 10,
alors la sous-requête ne retournera aucun résultat. Et donc, la condition sera vérifiée et la
requête principale retournera les résultats de la colonne nom_colonne1 de table1.
SOUS-REQUETES – FICHIER DE LA REQUETE
PRINCIPALE
 Une sous-requête peut être utilisée en tant que fichier de la requête principale, les sous-
requêtes sont valides dans la clause FROM d'une commande SELECT.

SELECT *
FROM (SELECT * FROM table1) AS T1

 La clause AS est obligatoire, car les tables de la clause FROM doivent avoir un nom.
 Toutes les colonnes de la sous-requête doivent avoir des noms distincts.
SQL
VUES
VUES – PRESENTATION
 Une commande SELECT peut être conservée dans une variable appelée
"vue".
 Une vue est une table virtuelle :
 elle n'a pas d'existence physique ;
 elle est recalculée à chaque utilisation ;
 elle est équivalente à une requête.
VUES – CREATION
CREATE [OR REPLACE] VIEW Nom_Vue [(ColonneA,ColonneB,…)]
AS SELECT … ;

 Nom_Vue : identifie la vue c’est l’équivalent du nom d’une table.


 [ColonneA,ColonneB,…] : les noms des colonnes de la vue , ils doivent être au même ordre que
ceux de la requête SELECT. On peut aussi utiliser les alias dans la requête SELECT sinon les
colonnes de la vue auront les mêmes noms que ceux des tables.
 Requete_select : ici on spécifie la requête SELECT qui va retourner les données de la vue
VUES – UTILISATION
 Utilisation: Une vue s’utilise comme une table.
 Consultation du code d’une vue :

SHOW CREATE VIEW Nom_Vue\G

 Modification d’une vue :

CREATE OR REPLACE VIEW V_Employee ALTER VIEW Nom_Vue


AS SELECT ….; AS SELECT …;

 Suppression d’une vue :


DROP VIEW Nom_Vue;
VUES – EXEMPLE
Tous les employés qui ont un salaire supérieure à 4000 :

CREATE OR REPLACE VIEW v_HighSalaryEmployees AS


SELECT ename, salary FROM employees
WHERE salary > 4000;

Tous les employés qui ont un salaire inférieur à 3000 :

CREATE OR REPLACE VIEW v_LowSalaryEmployees AS


SELECT ename, salary FROM employees
WHERE salary < 4000;
VUES – RESTRICTION
 La requête de création d’une vue peut être n'importe quelle requête SELECT, à quelques
exceptions :
 Il n'est pas possible d'utiliser une requête SELECT dont la clause FROM contient une sous-
requête SELECT.

CREATE VIEW V_Emp AS


SELECT employee_id,ename FROM (SELECT * FROM employees
WHERE d_id=1)

Cette requête renvoie une erreur d’exécution


 La requête ne peut pas faire référence à des variables utilisateur, des variables système, ni
même des variables locales.

Vous aimerez peut-être aussi