Vous êtes sur la page 1sur 10

04/12/2021

ENSIT
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
Chapitre VI d’existantes.

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

Le langage SQL: SELECT [DISTINCT ou ALL] * ou liste de colonnes


FROM nom(s) de table(s)
[WHERE prédicats]
Langage d’Interrogation des Données [GROUP BY ordre des groupes]
[HAVING condition]
[ORDER BY ] liste de colonnes

1 2

Langage d’Interrogation des Données Langage d’Interrogation des Données


1. La clause SELECT • 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
• SELECT permet de spécifier les attributs que l’on désire voir plusieurs colonnes existantes.
apparaître dans le résultat de la requête.
Exemple
• L’opérateur * permet de récupérer automatiquement tous les attributs Pour afficher le salaire annuel des employés, on peut utiliser la
de la table générée par la clause FROM de la requête. requête suivante:
Exemple
SELECT * FROM EMP ; SELECT nome, sal*12 FROM EMP;
Cette commande permet d’afficher la table EMP.
• L’opérateur AS permet de renommer une colonne ou de nommer une
• L’opérateur DISTINCT permet d’éliminer les doublons dans la colonne créée dans la requête.
réponse.
Exemple Exemple
SELECT DISTINCT POSTE FROM EMP;
SELECT nome, sal*12 AS SalaireAnnuel FROM EMP;
3 4

1
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données


2. La clause FROM
• Cette clause spécifie les tables sur lesquelles porte la requête. • Il faut toujours nommer les tables correspondant à des sous-requêtes
Exemples en utilisant l’opérateur AS.
SELECT Nemp, Nome FROM EMP;
SELECT * FROM EMP, DEPT; Produit Cartésien entre les relations Exemple
EMP et DEPT. SELECT * FROM (SELECT * FROM table_1) AS t1, table_2
• L’opérateur AS permet de renommer une table ou de nommer une
table créée dans la requête. 3. La clause WHERE

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


SELECT * from employe as emp; sélectionner dans une table ou dans le produit cartésien de plusieurs
OU tables.
SELECT * from employe emp; • Elle est suivie d'un prédicat (expression logique ayant la valeur vrai
• Les tables mentionnées dans la clause FROM peuvent très bien ou faux) qui sera évalué pour chaque ligne. Les lignes pour lesquelles
correspondre à des tables résultantes d’une requête, spécifiée entre le prédicat est vrai seront sélectionnées.
parenthèses, plutôt qu’à des tables existantes dans la base de
5 6
données.

Langage d’Interrogation des Données Langage d’Interrogation des Données


• Les trois types d'expressions (arithmétiques, caractères, ou dates)
Les prédicats simples peuvent être comparées au moyen des opérateurs d'égalité ou d'ordre (=, !=,
<, >, <=, >=).
• Un prédicat simple est la comparaison de deux expressions ou plus • Pour les types date, la relation d'ordre est l'ordre chronologique; pour les
au moyen d'un opérateur logique : 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
WHERE exp1 = exp2 exp3, bornes incluses
WHERE exp1 != exp2
WHERE exp1 < exp2 SELECT NOME,SAL FROM EMP WHERE SAL BETWEEN 300 AND 500;
WHERE exp1 > exp2 • exp1 IN (exp2 , exp3...) est vrai si exp1 est égale à l'une des expressions de
WHERE exp1 <= exp2 la liste entre parenthèses.
WHERE exp1 >= exp2
WHERE exp1 BETWEEN exp2 AND exp3 SELECT * FROM DEPT WHERE LIEU IN (‘TUNIS’, ‘GABES’, ‘SOUSSE’);
WHERE exp1 LIKE exp2
WHERE exp1 NOT LIKE exp2 • exp1 LIKE exp2 teste l'égalité de deux chaînes en tenant compte des
WHERE exp1 IN (exp2, exp3,...) caractères jokers dans la 2ème chaîne :
WHERE exp1 NOT IN (exp2, exp3,...) _ remplace un seul caractère.
WHERE exp IS NULL % remplace une chaîne de caractères de longueur quelconque.
WHERE exp IS NOT NULL 7
SELECT * FROM EMP WHERE NOME LIKE ‘M%’; 8

2
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données


• exp IS [NOT] NULL est vrai si l'expression a la valeur NULL (ou La jointure naturelle
l'inverse avec NOT).
SELECT * FROM DEPT WHERE LIEU IS NOT NULL; • 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
Les opérateurs logiques ayant mêmes valeurs pour les attributs en commun.
• Les opérateurs logiques AND et OR peuvent être utilisés pour
combiner plusieurs prédicats. Exemple
Exemples
Nemp Nome Prene Sal Poste Ndept
SELECT NOME FROM EMP 100 Bjaoui Ali 450 Secrétaire 1
WHERE NDEPT = 30 AND SAL > 500; 101 Bjaoui Mohamed 560 Ingénieur 2
102 Gharbi Salwa 700 Secrétaire 2
SELECT * FROM EMP
WHERE (POSTE = 'DIRECTEUR' OR POSTE = 'SECRETAIRE')
AND DEPT = 10; La relation Emp
9 10

Langage d’Interrogation des Données Langage d’Interrogation des Données

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


SELECT NOME, NOMD
1 Finance
FROM EMP, DEPT
2 Marketing WHERE EMP.NDEPT = DEPT.NDEPT;
3 Comptabilité
• La version SQL2 peut exprimer la jointure par JOIN ON
La relation Dept SELECT NOME, NOMD
FROM EMP JOIN DEPT ON EMP.NDEPT = DEPT.NDEPT;
La jointure naturelle entre la relation Dept et la relation Emp
On peut aussi utiliser le mot-clé NATURAL JOIN pour exprimer une jointure
Nemp Nome Prene Sal Poste Ndept Nomd naturelle.
100 Bjaoui Ali 450 Secrétaire 1 Finance
Exemple
101 Bjaoui Mohamed 560 Ingénieur 2 Marketing
SELECT NOME, NOMD
102 Gharbi Salwa 700 Secrétaire 2 Marketing FROM EMP NATURAL JOIN DEPT;

12
11

3
04/12/2021

Jointure de la table sur elle Langage d’Interrogation des Données


même La théta-jointure
• La thêta-jointure de R1 et R2 permet de rapprocher les tuples de
• Lister les noms des employés qui ont un supérieur, en indiquant deux relations afin de former une troisième relation qui contient
pour chacun le nom de son supérieur : 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 :
EMP(MATR, NOME, PRENOME, #SUP)
- Θ ∈ {=, <, >, ≤, ≥ ≠ }.
- Ai est un attribut de R1 et Bi est un attribut de R2

SELECT EMP.NOME EMPLOYE, SUPE.NOME SUPERIEUR Exemple 1


FROM EMP, EMP SUPE A B C D E
WHERE EMP.SUP = SUPE.MATR;
1 a 1 b a
1 b 2 b c
3 a 4 a a

13
La relation R1 La relation R2 14

Langage d’Interrogation des Données Langage d’Interrogation des Données

La théta-jointure de R1 et R2 vérifiant la condition A ≤ C EN SQL, la théta-jointure de R1 et R2 est exprimée comme suit:


SELECT * FROM R1, R2
A B C D E WHERE R1.A <= R2.C;
1 a 1 b a
• La version SQL2 peut exprimer la théta-jointure par JOIN ON
1 a 2 b c
SELECT *
1 a 4 a a FROM R1 JOIN R2 ON R1.A <=R2.C;
1 b 1 b a
1 b 2 b c Exemple 2
1 b 4 a a
3 a 4 a a
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;
15 16

4
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données


Autres types de jointures 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.
Remarques:
- l’attribut key représente la clé primaire de la table A et une clé étrangère
dans la table B.
- Pour Left Join et Right Join, l’ordre est important. 17 18

Langage d’Interrogation des Données Langage d’Interrogation des Données


INNER JOIN
INNER JOIN
La table Client Pour afficher toutes les commandes associées aux utilisateurs, il est
Id_client Nom Prenom possible d’utiliser la requête suivante :
1 Bjaoui Ali
SELECT client.id_client, nom, prenom, numFacture, date_achat, prix_total
2 Bjaoui Mohamed FROM client INNER JOIN commande ON client.id_client = commande.id_client;
3 Gharbi Salwa
4 Amari Meriem Le résultat de cette requête est:
Id_client Nom prenom Id_client NumFacture Date_achat Prix_total
La table Commande
1 Bjaoui Ali 1 100 10/11/2016 500
Id_client NumFacture Date_achat Prix_total 1 Bjaoui Ali 1 101 20/12/2016 200.5
1 100 10/11/2016 500 2 Bjaoui Mohamed 2 103 11/02/2017 300
1 101 20/12/2016 200.5 2 Bjaoui Mohamed 2 104 25/03/2017 150

2 103 11/02/2017 300


2 104 25/03/2017 150 19 20

5
04/12/2021

Langage d’Interrogation des Données


LEFT JOIN
LEFT JOIN aussi appelée LEFT OUTER JOIN
Pour lister tous les clients avec leurs commandes et afficher également les
Cette commande permet de lister tous les résultats de la table de gauche clients qui n’ont pas effectués d’achats, il est possible d’utiliser la requête
même si il n’ya pas de correspondance dans la deuxième table. 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
Dans le cas de non correspondance de la table A avec la table B, les
1 Bjaoui Ali 101 20/12/2016 200.5
colonnes de la table B vaudront NULL.
2 Bjaoui Mohamed 103 11/02/2017 300
2 Bjaoui Mohamed 104 25/03/2017 150
3 Gharbi Salwa

21 4 Amari Meriem 22

Langage d’Interrogation des Données Langage d’Interrogation des Données


RIGHT JOIN aussi appelée RIGHT OUTER JOIN RIGHT JOIN
Pour lister toutes les commandes des clients et également ceux qui n’ont
Cette commande permet de lister tous les résultats de la table de droite
pas effectués d’achats, il est possible d’utiliser la requête suivante :
même si il n’ya pas de correspondance dans la première table.
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
Dans le cas de non correspondance de la table B avec la table A, les
1 101 20/12/2016 200.5 Bjaoui Ali
colonnes de la table A vaudront NULL.
2 103 11/02/2017 300 Bjaoui Mohamed
2 104 25/03/2017 150 Bjaoui Mohamed
3 Gharbi Salwa

4 Amari Meriem
23 24

6
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données


Les sous-Interrogations
FULL JOIN aussi appelée FULL OUTER JOIN
• SQL permet l’imbrication de sous-requêtes au niveau de la clause
Cette commande permet de combiner les résultats des deux tables, les WHERE.
associer entre eux grâce à une condition et remplir avec des valeurs nulles • Le résultat d’une requête peut être une valeur simple.
si la condition n’est pas respectée. 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'
25 AND POSTE = (SELECT POSTE FROM EMP 26
WHERE NOME = ‘GHARBI');

Langage d’Interrogation des Données Langage d’Interrogation des Données


• Une sous-requête peut ramener à plusieurs lignes si l’opérateur de • La clause EXISTS prend la valeur vraie s'il existe au moins une ligne
comparaison admet à sa droite un ensemble de valeurs satisfaisant les conditions de la sous-requête.
Exemple
• Les opérateurs utilisés pour comparer une valeur à un ensemble de
valeurs sont: SELECT NOMD FROM DEPT D SELECT NOMD FROM DEPT D
- L’opérateur IN WHERE EXISTS (SELECT * FROM EMP WHERE D.NDEPT IN (SELECT NDEPT
- Les opérateurs obtenus en ajoutant ANY ou ALL à la suite des WHERE NDEPT = D.NDEPT FROM EMP
AND SAL > 1000); WHERE SAL>1000);
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). Les Fonctions de groupes
• ALL : la comparaison retourne vraie si elle est vraie pour tous les AVG : moyenne
éléments de l'ensemble (elle est vraie si l'ensemble est vide). SUM : somme
MIN : plus petite des valeurs
L'opérateur IN est équivalent à = ANY, et l'opérateur NOT IN est équivalent à != ALL.
MAX : plus grande des valeurs
VARIANCE : variance
Exemple Liste des employés gagnant plus que tous les employés du
STDDEV : écart type (déviation standard)
département 30 COUNT(*) : nombre de lignes
SELECT NOME, SAL FROM EMP COUNT(col ) : nombre de valeurs non nulles de la colonne
WHERE SAL > ALL (SELECT SAL FROM EMP 27
COUNT(DISTINCT col ) : nombre de valeurs non nulles différentes 28
WHERE NDEPT=30);

7
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données

Exemple1
SELECT COUNT(*) FROM EMP; Exemple2
SELECT NDEPT, COUNT(*) FROM EMP
Exemple2 WHERE POSTE = 'SECRETAIRE'
SELECT NOME, SAL FROM EMP GROUP BY NDEPT;
WHERE SAL = (SELECT MAX(SAL) FROM EMP);
• Une restriction peut être appliquée après le calcul des groupes en
Les clauses GROUP BY et HAVING utilisant la clause HAVING.
• Il est possible de partitionner une table en des groupes où chaque
groupe représente un ensemble de tuples ayant une valeur commune. Exemple
• Cette clause est spécifiée juste après la clause WHERE ou après la SELECT NDEPT, COUNT(*)
clause FROM si la clause WHERE n’existe pas. FROM EMP
WHERE POSTE = 'SECRETAIRE'
Exemple1 GROUP BY NDEPT HAVING COUNT(*) > 1;
SELECT NDEPT, COUNT(*)
FROM EMP
GROUP BY NDEPT; 29 30

Langage d’Interrogation des Données Langage d’Interrogation des Données


Les opérateurs ensemblistes
La clause ORDER BY
Opérateur UNION
• La clause ORDER BY spécifie l'ordre dans lequel la liste des tuples • Cet opérateur permet de fusionner deux sélections de tables afin
sélectionnés sera donnée. d’obtenir un ensemble de lignes représentant la réunion des lignes des
ORDER BY exp1 [DESC], exp2 [DESC],etc; deux sélections.
• Le mot-clé DESC indique que le tri est décroissant. Par défaut, le tri SELECT * FROM EMP1 WHERE POSTE='INGENIEUR'
est croissant. UNION
SELECT * FROM EMP;
Exemples
Opérateur INTERSECT
SELECT NDEPT, NOMD FROM DEPT ORDER BY NOMD; • Cet opérateur permet de générer les tuples communs à deux
interrogations.
SELECT NOME, POSTE FROM EMP ORDER BY NDEPT, SAL DESC;
SELECT NDEPT FROM EMP1
INTERSECT
31 32
SELECT NDEPT FROM EMP2;

8
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données


La gestion des valeurs nulles
Opérateur MINUS
• L’opérateur MINUS dans Oracle permet de supprimer d’une • Un SGBD Relationnel indique l’absence d’une valeur
sélection les lignes obtenues dans une deuxième sélection. d’un attribut par le marqueur NULL, qui signifie une
valeur inconnue.
Exemple
• Le résultat d’une expression comportant une valeur NULL
Liste des départements qui ont des employés dans la première filiale mais
pas dans la deuxième. est évalué à NULL.

SELECT NDEPT FROM EMP1 • Les fonctions de groupes ne traitent pas les valeurs
MINUS nulles
SELECT NDEPT FROM EMP2;

• La fonction NVL permet de convertir une valeur NULL en


une valeur spécifiée.
33 34

Langage d’Interrogation des Données Langage d’Interrogation des Données


Exemple

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

Le résultat est: Le résultat est:


ne sal Comm salaireTotal ne sal Comm salaireTotal
100 1250 1400 2650 100 1250 1400 2650
101 950 101 950 950
102 1600 300 1900 102 1600 300 1900
103 2000 103 2000 2000

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

35 36

9
04/12/2021

Langage d’Interrogation des Données Langage d’Interrogation des Données


Solution 1
La division
SELECT NumCL FROM commande
• Il n’existe pas d’opérateur de division dans SQL GROUP BY NumCL
• Comment répondre à la requête: déterminer les numéros des clients HAVING COUNT(distinct NumProd) = (SELECT count(*) FROM Produit);
qui ont commandé tous les produits?
Solution 2
Client ( NumCL, nomCL, AdresseCL)
SELECT NumCL FROM client CL
Produit (NumProd, nomProd, couleur, poids)
WHERE (SELECT count(distinct NumProd)
Commande (#NumCL, #NumProd, quantite)
FROM COMMANDE Co
WHERE Co.NumCl= Cl. NumCl) = (SELECT count(*)
Méthode Possible FROM Produit);
Déterminer les clients ayant commandés un nombre distincts de Solution 3
produits égal au nombre total de produits.
Select Numcl
From client CL
Where not exists (select *
from Produit
where not exists (select *
from commande Co
where Produit.NumProd= co.NumProd
37 38
and CL.Numcl = Co.Numcl));

Manipulation des Données Via des requêtes SELECT Manipulation des Données Via des requêtes SELECT
1. Insertion des données
3. Suppression des données
INSERT INTO table (col1,..., coln )
DELETE FROM table
SELECT ...
WHERE condition (utilisant une requête 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’;
Supprimer les employés ayant un
2. Modification des données salaire supérieur à la moyenne
UPDATE table des salaires des secrétaires
Exemple
SET (col1, col2,...) = (SELECT ...)
WHERE prédicat
DELETE FROM emp
Donner à GHARBI un salaire 10 % WHERE SAL > (SELECT AVG(SAL) FROM EMP
Exemple
au dessus de la moyenne des WHERE POSTE =‘SECRETAIRE’);
UPDATE EMP
SET SAL = (SELECT AVG(SAL) * 1.10 salaires des secrétaires
FROM EMP
WHERE POSTE = 'SECRETAIRE') 39 40
WHERE NOME = ‘GHARBI’;

10

Vous aimerez peut-être aussi