Vous êtes sur la page 1sur 41

ENSIT

Chapitre VI

Le langage SQL:

Langage d’Interrogation des Données

1
Langage d’Interrogation des Données

• SELECT est la commande de base du SQL destinée à extraire des


données d’une BD ou calculer de nouvelles données à partir
d’existantes.

• La syntaxe générale d'une commande SELECT :

SELECT [DISTINCT ou ALL] * ou liste de colonnes


FROM nom(s) de table(s)
[WHERE prédicats]
[GROUP BY ordre des groupes]
[HAVING condition]
[ORDER BY ] liste de colonnes

2
Langage d’Interrogation des Données
1. La clause SELECT

• SELECT permet de spécifier les attributs que l’on désire voir


apparaître dans le résultat de la requête.

• L’opérateur * permet de récupérer automatiquement tous les attributs


de la table générée par la clause FROM de la requête.
Exemple
SELECT * FROM EMP ;
Cette commande permet d’afficher la table EMP.

• L’opérateur DISTINCT permet d’éliminer les doublons dans la


réponse.
Exemple
SELECT DISTINCT POSTE FROM EMP;
3
Langage d’Interrogation des Données
• Il est possible d’utiliser les opérateurs mathématiques de base (i.e. +,
-, * et /) pour générer de nouvelles colonnes à partir d’une ou
plusieurs colonnes existantes.

Exemple
Pour afficher le salaire annuel des employés, on peut utiliser la
requête suivante:

SELECT nome, sal*12 FROM EMP;

• L’opérateur AS permet de renommer une colonne ou de nommer une


colonne créée dans la requête.

Exemple

SELECT nome, sal*12 AS SalaireAnnuel FROM EMP; 4


Langage d’Interrogation des Données
2. La clause FROM
• Cette clause spécifie les tables sur lesquelles porte la requête.
Exemples
SELECT Nemp, Nome FROM EMP;
SELECT * FROM EMP, DEPT; Produit Cartésien entre les relations
EMP et DEPT.
• L’opérateur AS permet de renommer une table ou de nommer une
table créée dans la requête.

Exemple
SELECT * from employe as emp;
OU
SELECT * from employe emp;
• Les tables mentionnées dans la clause FROM peuvent très bien
correspondre à des tables résultantes d’une requête, spécifiée entre
parenthèses, plutôt qu’à des tables existantes dans la base de
5
données.
Langage d’Interrogation des Données

• Il faut toujours nommer les tables correspondant à des sous-requêtes


en utilisant l’opérateur AS.

Exemple
SELECT * FROM (SELECT * FROM table_1) AS t1, table_2

3. La clause WHERE

• La clause WHERE permet de spécifier quelles sont les lignes à


sélectionner dans une table ou dans le produit cartésien de plusieurs
tables.
• Elle est suivie d'un prédicat (expression logique ayant la valeur vrai
ou faux) qui sera évalué pour chaque ligne. Les lignes pour lesquelles
le prédicat est vrai seront sélectionnées.

6
Langage d’Interrogation des Données
Les prédicats simples

• Un prédicat simple est la comparaison de deux expressions ou plus


au moyen d'un opérateur logique :

WHERE exp1 = exp2


WHERE exp1 != exp2
WHERE exp1 < exp2
WHERE exp1 > exp2
WHERE exp1 <= exp2
WHERE exp1 >= exp2
WHERE exp1 BETWEEN exp2 AND exp3
WHERE exp1 LIKE exp2
WHERE exp1 NOT LIKE exp2
WHERE exp1 IN (exp2, exp3,...)
WHERE exp1 NOT IN (exp2, exp3,...)
WHERE exp IS NULL
WHERE exp IS NOT NULL 7
Langage d’Interrogation des Données
• Les trois types d'expressions (arithmétiques, caractères, ou dates)
peuvent être comparées au moyen des opérateurs d'égalité ou d'ordre (=, !=,
<, >, <=, >=).
• Pour les types date, la relation d'ordre est l'ordre chronologique; pour les
types caractères, la relation d'ordre est l'ordre lexicographique.
• exp1 BETWEEN exp2 AND exp3 est vrai si exp1 est compris entre exp2 et
exp3, bornes incluses

SELECT NOME,SAL FROM EMP WHERE SAL BETWEEN 300 AND 500;
• exp1 IN (exp2 , exp3...) est vrai si exp1 est égale à l'une des expressions de
la liste entre parenthèses.

SELECT * FROM DEPT WHERE LIEU IN (‘TUNIS’, ‘GABES’, ‘SOUSSE’);


• exp1 LIKE exp2 teste l'égalité de deux chaînes en tenant compte des
caractères jokers dans la 2ème chaîne :
_ remplace un seul caractère.
% remplace une chaîne de caractères de longueur quelconque.
8
SELECT * FROM EMP WHERE NOME LIKE ‘M%’;
Langage d’Interrogation des Données
• exp IS [NOT] NULL est vrai si l'expression a la valeur NULL (ou
l'inverse avec NOT).
SELECT * FROM DEPT WHERE LIEU IS NOT NULL;

Les opérateurs logiques


• Les opérateurs logiques AND et OR peuvent être utilisés pour
combiner plusieurs prédicats.
Exemples

SELECT NOME FROM EMP


WHERE NDEPT = 30 AND SAL > 500;

SELECT * FROM EMP


WHERE (POSTE = 'DIRECTEUR' OR POSTE = 'SECRETAIRE')
AND DEPT = 10;
9
Langage d’Interrogation des Données
La jointure naturelle  

• La jointure naturelle de R1 et R2 permet de rapprocher les tuples de R1


et R2 afin de former une troisième relation qui contient l’ensemble de
tous les tuples obtenus en concaténant un tuple de R1 et un tuple de R2
ayant mêmes valeurs pour les attributs en commun.

Exemple
Nemp Nome Prene Sal Poste Ndept
100 Bjaoui Ali 450 Secrétaire 1
101 Bjaoui Mohamed 560 Ingénieur 2
102 Gharbi Salwa 700 Secrétaire 2

La relation Emp
10
Langage d’Interrogation des Données

Ndept Nomd
1 Finance
2 Marketing
3 Comptabilité

La relation Dept

La jointure naturelle entre la relation Dept et la relation Emp

Nemp Nome Prene Sal Poste Ndept Nomd


100 Bjaoui Ali 450 Secrétaire 1 Finance
101 Bjaoui Mohamed 560 Ingénieur 2 Marketing
102 Gharbi Salwa 700 Secrétaire 2 Marketing

11
Jointure de la table sur elle
même
• Lister les noms des employés qui ont un supérieur, en indiquant
pour chacun le nom de son supérieur :

EMP(MATR, NOME, PRENOME, #SUP)

SELECT EMP.NOME EMPLOYE, SUPE.NOME SUPERIEUR


FROM EMP, EMP SUPE
WHERE EMP.SUP = SUPE.MATR;

12
Langage d’Interrogation des Données

Généralement, la jointure naturelle est exprimée comme suit:


SELECT NOME, NOMD
FROM EMP, DEPT
WHERE EMP.NDEPT = DEPT.NDEPT;

• La version SQL2 peut exprimer la jointure par JOIN ON


SELECT NOME, NOMD
FROM EMP JOIN DEPT ON EMP.NDEPT = DEPT.NDEPT;

On peut aussi utiliser le mot-clé NATURAL JOIN pour exprimer une jointure
naturelle.

Exemple
SELECT NOME, NOMD
FROM EMP NATURAL JOIN DEPT;

13
Langage d’Interrogation des Données
La théta-jointure  
• La thêta-jointure de R1 et R2 permet de rapprocher les tuples de
deux relations afin de former une troisième relation qui contient
l’ensemble de tous les tuples obtenus en concaténant un tuple de R1
et un tuple de R2 vérifiant la condition Ai  Bi avec :
-   {=, <, >, ,   }.
- Ai est un attribut de R1 et Bi est un attribut de R2

Exemple 1
A B C D E
1 a 1 b a
1 b 2 b c
3 a 4 a a

La relation R1 La relation R2 14
Langage d’Interrogation des Données

La théta-jointure de R1 et R2 vérifiant la condition A ≤ C

A B C D E
1 a 1 b a
1 a 2 b c
1 a 4 a a
1 b 1 b a
1 b 2 b c
1 b 4 a a
3 a 4 a a

15
Langage d’Interrogation des Données

EN SQL, la théta-jointure de R1 et R2 est exprimée comme suit:


SELECT * FROM R1, R2
WHERE R1.A <= R2.C;

• La version SQL2 peut exprimer la théta-jointure par JOIN ON


SELECT *
FROM R1 JOIN R2 ON R1.A <=R2.C;

Exemple 2

Nom et salaire des employés gagnant plus que l’employé numéro12546


SELECT E1.NOME, E1.SAL
FROM EMPLOYE E1 JOIN EMPLOYE E2
ON E1.SAL > E2.SAL
WHERE E2.NEMP = 12546;
16
Langage d’Interrogation des Données
Autres types de jointures

17
Langage d’Interrogation des Données
INNER JOIN
Comme il s'agit de la plus commune des jointures c'est celle qui s'exerce
par défaut si on ne précise pas le type de jointure. Après le mot clef ON,
on doit préciser le critère de jointure.

Exemple
Imaginons une application qui possède une table Client ainsi qu’une table
Commande qui contient toutes les commandes effectuées par les clients.

18
Langage d’Interrogation des Données
INNER JOIN

La table Client
Id_client Nom Prenom
1 Bjaoui Ali
2 Bjaoui Mohamed
3 Gharbi Salwa
4 Amari Meriem

La table Commande

Id_client NumFacture Date_achat Prix_total


1 100 10/11/2016 500
1 101 20/12/2016 200.5
2 103 11/02/2017 300
2 104 25/03/2017 150 19
Langage d’Interrogation des Données
INNER JOIN
Pour afficher toutes les commandes associées aux utilisateurs, il est
possible d’utiliser la requête suivante :

SELECT client.id_client, nom, prenom, numFacture, date_achat, prix_total


FROM client INNER JOIN commande ON client.id_client = commande.id_client;

Le résultat de cette requête est:

Id_client Nom prenom NumFacture Date_achat Prix_total


1 Bjaoui Ali 100 10/11/2016 500
1 Bjaoui Ali 101 20/12/2016 200.5
2 Bjaoui Mohamed 103 11/02/2017 300
2 Bjaoui Mohamed 104 25/03/2017 150

20
Langage d’Interrogation des Données
LEFT JOIN aussi appelée LEFT OUTER JOIN
Cette commande permet de lister tous les résultats de la table de gauche
même si il n’ya pas de correspondance dans la deuxième table.

Dans le cas de non correspondance de la table A avec la table B, les


colonnes de la table B vaudront NULL.

21
LEFT JOIN
Pour lister tous les clients avec leurs commandes et afficher également les
clients qui n’ont pas effectués d’achats, il est possible d’utiliser la requête
suivante :

Exemple
SELECT client.id_client, nom, prenom, numFacture, date_achat, prix_total
FROM client LEFT JOIN commande ON client.id_client = commande.id_client;
Le résultat de cette requête est:
Id_client Nom prenom NumFacture Date_achat Prix_total
1 Bjaoui Ali 100 10/11/2016 500
1 Bjaoui Ali 101 20/12/2016 200.5
2 Bjaoui Mohamed 103 11/02/2017 300
2 Bjaoui Mohamed 104 25/03/2017 150
3 Gharbi Salwa

4 Amari Meriem 22
Langage d’Interrogation des Données
RIGHT JOIN aussi appelée RIGHT OUTER JOIN

Cette commande permet de lister tous les résultats de la table de droite


même si il n’ya pas de correspondance dans la première table.

Dans le cas de non correspondance de la table B avec la table A, les


colonnes de la table A vaudront NULL.

23
Langage d’Interrogation des Données
RIGHT JOIN
Pour lister toutes les commandes des clients et également ceux qui n’ont
pas effectués d’achats, il est possible d’utiliser la requête suivante :

Exemple
SELECT client.id_client, numfacture, date_achat, prix_total, nom, prenom
FROM commande RIGHT JOIN client ON commande.id_client= client.id_client;

Le résultat de cette requête est:


Id_client NumFacture Date_achat Prix_total Nom prenom
1 100 10/11/2016 500 Bjaoui Ali
1 101 20/12/2016 200.5 Bjaoui Ali
2 103 11/02/2017 300 Bjaoui Mohamed
2 104 25/03/2017 150 Bjaoui Mohamed
3 Gharbi Salwa

4 Amari Meriem
24
Langage d’Interrogation des Données

FULL JOIN aussi appelée FULL OUTER JOIN

Cette commande permet de combiner les résultats des deux tables, les
associer entre eux grâce à une condition et remplir avec des valeurs nulles
si la condition n’est pas respectée.

25
Langage d’Interrogation des Données
Les sous-Interrogations

• SQL permet l’imbrication de sous-requêtes au niveau de la clause


WHERE.
• Le résultat d’une requête peut être une valeur simple.
WHERE exp op (select…)
ou op est un opérateur de comparaison (=, <, >, >=, <=, !=)
Exemple 1 Liste des employés travaillant dans le même département que
BEJAOUI
SELECT NOME FROM EMP WHERE NDEPT = (SELECT NDEPT FROM EMP
WHERE NOME = ‘BEJAOUI');
Exemple 2: Liste des employés travaillant à LYON et ayant même poste
que GHARBI
SELECT NOME, POSTE
FROM EMP, DEPT
WHERE EMP.NDEPT = DEPT.NDEPT AND LIEU = 'LYON'
AND POSTE = (SELECT POSTE FROM EMP 26
WHERE NOME = ‘GHARBI');
Langage d’Interrogation des Données
• Une sous-requête peut ramener à plusieurs lignes si l’opérateur de
comparaison admet à sa droite un ensemble de valeurs
• Les opérateurs utilisés pour comparer une valeur à un ensemble de
valeurs sont:
- L’opérateur IN
- Les opérateurs obtenus en ajoutant ANY ou ALL à la suite des
opérateurs de comparaison classique =, !=, <, >, <=, >=.
• ANY : la comparaison retourne vraie si elle est vraie pour au moins un
élément de l'ensemble (elle est donc fausse si l'ensemble est vide).
• ALL : la comparaison retourne vraie si elle est vraie pour tous les
éléments de l'ensemble (elle est vraie si l'ensemble est vide).
L'opérateur IN est équivalent à = ANY, et l'opérateur NOT IN est équivalent à !=
ALL.
Exemple Liste des employés gagnant plus que tous les employés du
département 30
SELECT NOME, SAL FROM EMP
WHERE SAL > ALL (SELECT SAL FROM EMP 27
WHERE NDEPT=30);
Langage d’Interrogation des Données
• La clause EXISTS prend la valeur vraie s'il existe au moins une ligne
satisfaisant les conditions de la sous-requête.
Exemple

SELECT NOMD FROM DEPT D SELECT NOMD FROM DEPT D


WHERE EXISTS (SELECT * FROM EMP WHERE D.NDEPT IN (SELECT NDEPT
WHERE NDEPT = D.NDEPT FROM EMP

AND SAL > 1000); WHERE SAL>1000);

Les Fonctions de groupes


AVG : moyenne
SUM : somme
MIN : plus petite des valeurs
MAX : plus grande des valeurs
VARIANCE : variance
STDDEV : écart type (déviation standard)
COUNT(*) : nombre de lignes
COUNT(col ) : nombre de valeurs non nulles de la colonne 28

COUNT(DISTINCT col ) : nombre de valeurs non nulles différentes


Langage d’Interrogation des Données

Exemple1
SELECT COUNT(*) FROM EMP;

Exemple2
SELECT NOME, SAL FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP);

Les clauses GROUP BY et HAVING


• Il est possible de partitionner une table en des groupes où chaque
groupe représente un ensemble de tuples ayant une valeur commune.
• Cette clause est spécifiée juste après la clause WHERE ou après la
clause FROM si la clause WHERE n’existe pas.

Exemple1
SELECT NDEPT, COUNT(*)
FROM EMP
GROUP BY NDEPT; 29
Langage d’Interrogation des Données

Exemple2
SELECT NDEPT, COUNT(*) FROM EMP
WHERE POSTE = 'SECRETAIRE'
GROUP BY NDEPT;

• Une restriction peut être appliquée après le calcul des groupes en


utilisant la clause HAVING.

Exemple
SELECT NDEPT, COUNT(*)
FROM EMP
WHERE POSTE = 'SECRETAIRE'
GROUP BY NDEPT HAVING COUNT(*) > 1;

30
Langage d’Interrogation des Données

La clause ORDER BY

• La clause ORDER BY spécifie l'ordre dans lequel la liste des tuples


sélectionnés sera donnée.
ORDER BY exp1 [DESC], exp2 [DESC],etc;

• Le mot-clé DESC indique que le tri est décroissant. Par défaut, le tri
est croissant.

Exemples

SELECT NDEPT, NOMD FROM DEPT ORDER BY NOMD;

SELECT NOME, POSTE FROM EMP ORDER BY NDEPT, SAL DESC;

31
Langage d’Interrogation des Données
Les opérateurs ensemblistes

Opérateur UNION
• Cet opérateur permet de fusionner deux sélections de tables afin
d’obtenir un ensemble de lignes représentant la réunion des lignes des
deux sélections. (Les tables doivent avoir le même schéma).

SELECT * FROM EMP1 WHERE POSTE='INGENIEUR'


UNION
SELECT * FROM EMP;

Opérateur INTERSECT
• Cet opérateur permet de générer les tuples communs à deux
interrogations. (Les tables doivent avoir le même schéma)

SELECT NDEPT FROM EMP1


INTERSECT
32
SELECT NDEPT FROM EMP2;
Langage d’Interrogation des Données

Opérateur MINUS
• L’opérateur MINUS dans Oracle permet de supprimer d’une
sélection les lignes obtenues dans une deuxième sélection. (Les
tables doivent avoir le même schéma).

Exemple

Liste des départements qui ont des employés dans la première filiale mais
pas dans la deuxième.

SELECT NDEPT FROM EMP1


MINUS
SELECT NDEPT FROM EMP2;

33
Langage d’Interrogation des Données
La gestion des valeurs nulles

•Un SGBD Relationnel indique l’absence d’une valeur d’un


attribut par le marqueur NULL, qui signifie une valeur
inconnue.

•Le résultat d’une expression comportant une valeur NULL


est évalué à NULL.

•Les fonctions de groupes ne traitent pas les valeurs nulles

•La fonction NVL permet de convertir une valeur NULL en


une valeur spécifiée.

34
Langage d’Interrogation des Données
Exemple

SELECT ne, sal + comm as salaireTotal


FROM employe;

Le résultat est:
ne sal Comm salaireTotal
100 1250 1400 2650
101 950
102 1600 300 1900
103 2000

• Dans la suite, la fonction NVL est utilisée pour convertir les valeurs
NULL en 0.

35
Langage d’Interrogation des Données

SELECT ne, sal + NVL(comm,0) as salaireTotal


FROM employe;

Le résultat est:
ne sal Comm salaireTotal
100 1250 1400 2650
101 950 950
102 1600 300 1900
103 2000 2000

36
Rappel sur la division
Division
• Soient deux relations R(A1,…,An,X1 …Xk) et S(X1 …Xk) tel que tous
les attributs de S sont des attributs de R.

• La division de R par S, notée R  S, permet de créer une nouvelle


relation composée des attributs A1,…,An et tel que chaque tuple de
cette relation est associé dans R à toutes les occurrences de la
relation S.

Exemple:
NomC NomP
Bjaoui Brique NomP
Brique NomC
Bjaoui Ciment
Ciment Bjaoui
Chettaoui Brique

La relation Commande La relation Produit Commande  Produit


37
Langage d’Interrogation des Données
La division
• Il n’existe pas d’opérateur de division dans SQL
• Comment répondre à la requête: déterminer les numéros des clients
qui ont commandé tous les produits?

Client ( NumCL, nomCL, AdresseCL)


Produit (NumProd, nomProd, couleur, poids)
Commande (#NumCL, #NumProd, quantite)

Méthode Possible
Déterminer les clients ayant commandés un nombre distincts de
produits égal au nombre total de produits.

38
Langage d’Interrogation des Données
Solution 1
SELECT NumCL FROM commande
GROUP BY NumCL
HAVING COUNT(distinct NumProd) = (SELECT count(*) FROM Produit);

Solution 2
SELECT NumCL FROM client CL
WHERE (SELECT count(distinct NumProd)
FROM COMMANDE Co
WHERE Co.NumCl= Cl. NumCl) = (SELECT count(*)
FROM Produit);
Solution 3
Select Numcl
From client CL
Where not exists (select *
from Produit
where not exists (select *
from commande Co
where Produit.NumProd= co.NumProd
39
and CL.Numcl = Co.Numcl));
Manipulation des Données Via des requêtes SELECT
1. Insertion des données
INSERT INTO table (col1,..., coln )
SELECT ...
Exemple Enregistrer la participation
INSERT INTO PARTICIPATION (MATR, NDEP) de BJAOUI au groupe
SELECT MATR, 10 FROM EMP département 10 :
WHERE NOME = ‘BJAOUI’;

2. Modification des données


UPDATE table
SET (col1, col2,...) = (SELECT ...)
WHERE prédicat

Exemple Donner à GHARBI un salaire 10 %


UPDATE EMP au dessus de la moyenne des
SET SAL = (SELECT AVG(SAL) * 1.10 salaires des secrétaires
FROM EMP
WHERE POSTE = 'SECRETAIRE') 40
WHERE NOME = ‘GHARBI’;
Manipulation des Données Via des requêtes SELECT
3. Suppression des données
DELETE FROM table
WHERE condition (utilisant une requête SELECT )

Supprimer les employés ayant un


salaire supérieur à la moyenne
Exemple des salaires des secrétaires

DELETE FROM emp


WHERE SAL > (SELECT AVG(SAL) FROM EMP
WHERE POSTE =‘SECRETAIRE’);

41

Vous aimerez peut-être aussi