Ministère de l’Enseignement Supérieur et de recherche scientifique
Université de Sousse
Institut Supérieur de Gestion (ISG)
Séance de Cours
BI2
Chapitre7
SQL : Langage d'interrogation des
données
Enseignant : MR Kamel Garrouch
2024-2025
Plan du cours
I. L’Ordre Select
II. La Clause FROM
III. La Clause where
IV. La Clause ORDER BY
V. Opérateurs logiques
VI. Clause GROUP BY
2
I. L’Ordre Select
Utilisé pour retrouver des informations stockées dans une BD
Possède six clauses différentes, dont seules les deux premières sont obligatoires.
SELECT [DISTINCT ou ALL] * ou liste de colonnes
FROM nom de table ou de la vue
[WHERE prédicats]
[GROUP BY ordre des groupes]
[HAVING condition]
[ORDER BY ] liste de colonnes
3
I. L’Ordre Select
a) L'opérateur * (étoile)
Récupère le contenu de toutes les colonnes de la table précisée dans la clause
FROM de la requête.
Exemple
Soit la table journal :
code_j titre prix type periode adr_j
110 LE MONDE 4.5 INFO QUOTIDIEN PARIS
111 LIBERATION 4.5 INFO QUOTIDIEN PARIS
112 LA RECHERCHE 32 SCIENCE MENSUEL PARIS
113 TELERAMA 15 TELE HEBDO MONTROUGE
Pour afficher le contenu de toutes les colonnes on doit taper la requête suivante :
Select * from journal;
4
I. L’Ordre Select
b) La Projection :
Limiter l’affichage à une ou à quelques colonnes de la table précisée dans la clause
FROM de la requête.
Exemple :
Pour afficher seulement les types : Pour afficher le titre et le prix de chaque journal :
Select type from journal; Select titre, prix from journal;
TYPE
---------- titre prix
INFO ------- ------
INFO LE MONDE 4.5
SCIENCE LIBERATION 4.5
TELE LA RECHERCHE 32
TELERAMA 15
5
I. L’Ordre Select
c) L'opérateur DISTINCT:
Permet d'éliminer les duplications :
Si dans le résultat, plusieurs lignes sont identiques une seule sera conservée.
Exemple :
Select type from journal;
select distinct type from journal;
TYPE TYPE
---------- Pour éliminer une telle ----------
INFO redondance on utilise INFO
INFO l’opérateur DISTNCT SCIENCE
SCIENCE TELE
TELE
6
I. L’Ordre Select
d) L'opérateur AS:
Permet de donner un nom à de nouvelles colonnes créées par la requête.
Exemple :
Select distinct type Select distinct type as "LES TYPES"
From journal; from journal;
type LES TYPES
---------- ----------
INFO INFO
SCIENCE SCIENCE
TELE TELE
7
I. L’Ordre Select
e) Les expressions
portent sur des colonnes, des constantes et des fonctions et peuvent figurer :
•en tant que colonne résultat d'un SELECT
•dans une clause WHERE
•dans une clause ORDER BY
•dans les ordres de manipulations de données (INSERT, UPDATE, DELETE)
Exemple :
Select code_j, titre, prix*2 as "prix CODE_J TITRE prix double
--------- -------------------- -----------
double" From journal;
110 LE MONDE 9
112 LIBERATION 9
113 LA RECHERCHE 64
114 TELERAMA 30
8
II. La Clause FROM
Donne la liste des tables participant à l'interrogation.
Il est possible de lancer des interrogations utilisant plusieurs tables à la fois
FROM table1 [synonyme1 ] , table2 [synonyme2 ] , ...
synonyme1, synonyme2,... sont des synonymes attribués facultativement
aux tables.
Utilisé pour lever certaines ambiguïtés, quand la même table est utilisée
de plusieurs façons différentes dans une même interrogation.
Exemple : Select distinct type
From journal Jour;
Si un synonyme est attribué à une table dans une requête, elle n'est plus
reconnue sous son nom d'origine dans cette requête.
9
II. La Clause FROM
FROM table1 [synonyme1 ] , table2 [synonyme2 ] , ...
La norme SQL2 permet d'avoir un SELECT à la place d'un nom de table.
Exemples
Select code_j
From (select code_j, titre from journal);
10
III. 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 qui sera évalué pour chaque ligne.
Les lignes pour lesquelles le prédicat est vrai seront sélectionnées.
WHERE exp1 = exp2 WHERE exp1 IN (exp2, exp3,...)
WHERE exp1 != exp2 WHERE exp1 NOT IN (exp2, exp3,...)
WHERE exp1 < exp2 WHERE exp IS NULL
WHERE exp1 > exp2 WHERE exp IS NOT NULL
WHERE exp1 <= exp2
WHERE exp1 >= exp2
WHERE exp1 BETWEEN exp2 AND exp3
WHERE exp1 LIKE (NOT LIKE) exp2 11
III. La Clause WHERE
Exemples :
R1 : Liste des journaux (toutes les colonnes) dont le code est supérieur à 111
Select *
From journal
Where code_j > 111;
R2 : Titres et prix des journaux dont le prix est dans l’intervalle [15, 20]
Select titre, prix
From journal
Where prix between 15 and 20;
12
III. La Clause WHERE
Exemples :
LIKE : teste l'égalité de deux chaînes en tenant compte des caractères jokers
dans la 2ème chaîne :
'-' remplace exactement 1 caractère
'%' remplace une chaîne de caractères de longueur quelconque
R3 : Titres des journaux dont le titre commence par ‘T ’ et contient ‘M’
Select titre
From journal
Where upper(titre) like 'T%M%';
R4 : Titres des journaux dont la deuxième lettre est ‘E ’ et se termine par ‘A’
Select titre
From journal
Where upper(titre) like '-E%A'; 13
III. La Clause WHERE
IS NULL permet de tester la valeur NULL
exp IS [NOT] NULL : est vrai si l'expression a la valeur NULL (ou l'inverse
avec NOT).
Exemple :
R5 : Liste des journaux ayant un type (type n’est pas NULL).
Select *
From journal
Where type IS NOT NULL
R6 : Liste des journaux n’ayant pas un type (type est NULL).
Select *
From journal
Where type IS NULL 14
IV. La Clause ORDER BY
Permet de définir un tri des colonnes de la réponse
ORDER BY colonne1 [ASC ou DESC ] [, colonne2 [ASC ou DESC ] ..].
Le tri se fait d'abord selon la première expression, puis les lignes ayant la même
valeur pour la première expression sont triées selon la deuxième expression, etc.
Exemple :
R7 : Afficher la liste des journaux dont l’adresse n’est pas ‘PARIS’ trié par ordre
décroissant des types : Select * From journal
Where upper (adr_j) Not like 'PARIS'
ORDER BY type DESC;
R8 : Liste des journaux trié par ordre croissant des prix
Select *
From journal
ORDER BY prix ASC; 15
V. Opérateurs logiques
AND et OR peuvent être utilisés pour combiner plusieurs prédicats.
L'opérateur NOT placé devant un prédicat en inverse le sens.
Exemple :
R9 : Sélectionner les journaux de PARIS ayant un prix supérieur à 5
Select *
From journal
Where prix>5 and upper (ADR_j) = 'PARIS';
16
VI. Clause GROUP BY
SELECT [DISTINCT ou ALL] * ou liste de colonnes
FROM nom de table ou de la vue
[WHERE prédicats]
[GROUP BY exp1, exp2,…]
[HAVING condition]
[ORDER BY ] liste de colonnes
Permet de subdiviser la table en groupes, chaque groupe étant l'ensemble des
lignes ayant une valeur commune.
Groupe en une seule ligne toutes les lignes qui ont la même valeur de exp1
17
VI. Clause GROUP BY
Fonctions de groupes
S'utilisent avec la clause GROUP BY
Peuvent apparaître dans le Select ou le Having
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 retournées par le select
COUNT(col ) : nombre de valeurs non nulles de la colonne retournées par le
select
18
VI. Clause GROUP BY
Exemple
R10 : Donner le nombre de journaux par type de journal,
Select type, count(*)
From journal
Group by type;
R11: Donner pour chaque ville le nombre de journaux et leur prix moyen,
Select adr_j, count(*) as "Nombre" , AVG(prix) as "Prix Moyen"
From journal
Group by adr_j;
19
VI. Clause GROUP BY
Tous les attribut qui se trouvent dans un ordre select (sauf Fonctions
de groupes) doivent figurer dans la clause group by.
Exemple
Select code_j, adr_j
From journal
Where lower(titre) like ('%r%')
Group by adr_j
l'erreur suivante est affichée par SQL
ERREUR à la ligne 1:
ORA-00979: N'est pas une expression GROUP BY
20
VI. Clause GROUP BY
Clause HAVING
HAVING prédicat : sert à préciser quels groupes doivent être sélectionnés
Elle se place après la clause GROUP BY.
Le prédicat suit la même syntaxe que celui de la clause WHERE.
Cependant, il ne peut porter que sur des caractéristiques de groupe :
fonction de groupe ou expression figurant dans la clause GROUP BY.
Exemple
Select count(*), adr_j
From journal
Where lower(titre) like ('%r%')
Group by adr_j
Having count (*)>1
Les valeurs NULL sont ignorées par les fonctions de groupe. 21
VI. Clause GROUP BY
Exemple
SELECT dept, AVG(salaire)
FROM employes
GROUP BY dept
HAVING COUNT(*) >= 3
22
23