CPGE OKBA BNOU NAFEA
Le Langage
SQL
Filière PSI
Mohamed Ouamer
Le Langage SQL
1. Introduction
1.1. Notion de requête
Une requête est une commande répondant à une syntaxe précise permettant la manipulation d'informations à
l'intérieur d'une base de données.
Dans le monde des bases de données, les requêtes permettent de sélectionner (SELECT), supprimer
(DELETE), ajouter (INSERT) ou mettre à jour (UPDATE) des enregistrements dans une base de données.
Elle permettent également d'autres manipulations sur la structure même de la base de données sur laquelle
elles sont appliquées, comme l'ajout d'un champ dans une table (ALTER TABLE), la suppression d'une table
(DROP TABLE) ou la modification des droits d'accès à certaines informations (GRANT).
1.2. Présentation de SQL
SQL signifie "Structured Query Language" c'est-à-dire Langage d'interrogation structuré. En fait SQL est un
langage complet de gestion de bases de données relationnelles. Il a été conçu par IBM dans les années 70. Il
est devenu le langage standard des systèmes de gestion de bases de données (SGBD) relationnelles
(SGBDR).
C'est à la fois :
• un langage d'interrogation de base de données (ordre SELECT)
• un langage de manipulation des données (LMD ; ordres UPDATE, INSERT, DELETE)
• un langage de définition des données (LDD ; ordres CREATE, ALTER, DROP),
• un langage de contrôle de l'accès aux données (LCD ; ordres GRANT, REVOKE).
Le langage SQL est utilisé par les principaux SGBDR : DB2, Oracle, Informix, Ingres, RDB,... Chacun de ces
SGBDR a cependant sa propre variante du langage.
1.3. Objets manipulés par SQL
1.4. Identificateurs
SQL utilise des identificateurs pour désigner les objets qu'il manipule : utilisateurs, tables, colonnes, index,
fonctions, etc. Un identificateur est un mot formé d'au plus 30 caractères, commençant obligatoirement par une
lettre de l'alphabet. Les caractères suivants peuvent être une lettre, un chiffre, ou l'un des symboles # $ et _.
SQL ne fait pas la différence entre les lettres minuscules et majuscules. Les voyelles accentuées ne sont pas
acceptées. Un identificateur ne doit pas figurer dans la liste des mot clés réservés. Voici quelques mots clés que
l'on risque d'utiliser comme identificateurs : ASSERT, ASSIGN, AUDIT, COMMENT, DATE, DECIMAL,
DEFINITION, FILE, FORMAT, INDEX, LIST, MODE, OPTION, PARTITION, PRIVILEGES, PUBLIC, REF,
REFERENCES, SELECT, SEQUENCE, SESSION, SET, TABLE, TYPE.
1.5. Tables
Les relations sont stockées sous forme de tables composées de lignes et de colonnes.
1.6. Colonnes
Les données contenues dans une colonne doivent être toutes d'un même type de données. Ce type est indiqué
au moment de la création de la table qui contient la colonne. Chaque colonne est repérée par un identificateur
unique à l'intérieur de chaque table. Deux colonnes de deux tables différentes peuvent porter le même nom. Il
est ainsi fréquent de donner le même nom à deux colonnes de deux tables différentes lorsqu'elles
correspondent à une clé étrangère à la clé primaire référencée. Par exemple, la colonne "Dept" des tables DEPT
et EMP. Une colonne peut porter le même nom que sa table. Le nom complet d'une colonne est en fait celui de
sa table, suivi d'un point et du nom de la colonne. Par exemple, la colonne [Link]. Le nom de la table peut
être omis quand il n'y a pas d'ambiguïté sur la table à laquelle elle appartient, ce qui est généralement le cas.
1.7. Etat NULL
Mohamed Ouamer 1
Le Langage SQL
Une colonne qui n'est pas renseignée, et donc vide, est dite d'état "NULL". Sa valeur n'est pas zéro, c'est une
absence de valeur.
2. Langage de manipulation des données
Le langage de manipulation de données (LMD) est le langage permettant de modifier les informations
contenues dans la base.
Il existe trois commandes SQL permettant d'effectuer les trois types de modification des données :
• INSERT: ajout de lignes
• UPDATE: mise à jour de lignes
• DELETE: suppression de lignes
2.1. Insertion
INSERT INTO table (col1,..., coln )
VALUES (val1,...,valn )
ou
INSERT INTO table (col1,..., coln )
SELECT ...
table est le nom de la table sur laquelle porte l'insertion. col1,..., coln est la liste des noms des colonnes pour
lesquelles on donne une valeur. Cette liste est optionnelle. Si elle est omise, le SGBDR prendra par défaut
l'ensemble des colonnes de la table dans l'ordre où elles ont été données lors de la création de la table. Si une
liste de colonnes est spécifiée, les colonnes ne figurant pas dans la liste auront la valeur NULL.
➢ Exemples
(a) INSERT INTO dept
VALUES (10, 'FINANCES', 'PARIS')
(b) INSERT INTO dept (lieu, nomd, dept)
VALUES ('GRENOBLE', 'RECHERCHE', 20)
La deuxième forme avec la clause SELECT permet d'insérer dans une table
des lignes provenant d'une table de la base. Le SELECT a la même syntaxe
qu'un SELECT normal.
Enregistrer la participation de MARTIN au groupe de projet numéro 10 :
INSERT INTO PARTICIPATION (MATR, CODEP)
SELECT MATR, 10 FROM EMP
WHERE NOME = 'MARTIN'
2.2. Modification
La commande UPDATE permet de modifier les valeurs d'un ou plusieurs champs, dans une ou plusieurs lignes
existantes d'une table.
UPDATE table
SET col1 = exp1, col2 = exp2, ...
WHERE prédicat
ou
UPDATE table
SET (col1, col2,...) = (SELECT ...)
WHERE prédicat
Mohamed Ouamer 2
Le Langage SQL
table est le nom de la table mise à jour ; col1, col2, ... sont les noms des colonnes qui seront modifiées ; exp1,
exp2,... sont des expressions.
Les valeurs de col1, col2... sont mises à jour dans toutes les lignes satisfaisant le prédicat. La clause WHERE
est facultative. Si elle est absente, toutes les lignes sont mises à jour.
➢ Exemples
(a) Faire passer MARTIN dans le département 10 :
UPDATE EMP
SET DEPT = 10
WHERE NOME = 'MARTIN'
(b) Augmenter de 10 % les commerciaux :
UPDATE EMP
SET SAL = SAL * 1.1
WHERE POSTE = 'COMMERCIAL'
(c) Donner à CLEMENT un salaire 10 % au dessus de la moyenne des
salaires des secrétaires :
UPDATE EMP
SET SAL = (SELECT AVG(SAL) * 1.10
FROM EMP
WHERE POSTE = 'SECRETAIRE')
WHERE NOME = 'CLEMENT'
(d) Enlever (plus exactement, mettre à la valeur NULL) la commission de MARTIN :
UPDATE EMP
SET COMM = NULL
WHERE NOME = 'MARTIN'
2.3. Suppression
L'ordre DELETE permet de supprimer des lignes d'une table.
DELETE FROM table
WHERE prédicat
La clause WHERE indique quelles lignes doivent être supprimées. ATTENTION : cette clause est facultative ; si
elle n'est pas précisée, TOUTES LES LIGNES DE LA TABLE SONT SUPPRIMEES.
➢ Exemple
DELETE FROM dept
WHERE dept = 10
3. Interrogations
3.1. Syntaxe générale
L'ordre SELECT possède six clauses différentes, dont seules les deux premières sont obligatoires. Elles sont
données ci-dessous, dans l'ordre dans lequel elles doivent apparaître, quand elles sont utilisées :
SELECT ...
FROM ...
WHERE ...
Mohamed Ouamer 3
Le Langage SQL
GROUP BY ...
HAVING ...
ORDER BY ...
LIMIT
OFFSET
3.2. Clause SELECT
Cette clause permet d'indiquer quelles colonnes, ou quelles expressions doivent être retournées par
l'interrogation.
SELECT [DISTINCT] *
ou
SELECT [DISTINCT] exp1 [[AS] nom1 ], exp2 [[AS] nom2 ], .....
exp1, exp2, ... sont des expressions, nom1, nom2, ... sont des noms facultatifs de 30 caractères maximum,
donnés aux expressions. Chacun de ces noms est inséré aprés l'expression, séparé de cette dernière par un
blanc ou par le mot clé AS (optionnel) ; il constituera le titre de la colonne dans l'affichage du résultat de la
sélection. Ces noms ne peuvent être utilisés dans les autres clauses (where par exemple).
"*" signifie que toutes les colonnes de la table sont sélectionnées. Le mot clé facultatif DISTINCT ajouté aprés
l'ordre SELECT permet d'éliminer les duplications : si, dans le résultat, plusieurs lignes sont identiques, une
seule sera conservée.
➢ Exemples
(a) SELECT * FROM DEPT
(b) SELECT DISTINCT POSTE FROM EMP
(c) SELECT NOME, SAL Salaire FROM EMP
(d) La requête suivante va provoquer une erreur car on utilise le nom Salaire dans la clause where :
SELECT NOME, SAL Salaire FROM EMP
WHERE Salaire > 1000
Si le nom contient des séparateurs (espace, caractère spécial), ou s'il est identique à un mot réservé SQL
(exemple : DATE), il doit être mis entre guillemets.
➢ Exemple
SELECT NOME, SAL "Salaire Total" FROM EMP
Le nom complet d'une colonne d'une table est le nom de la table suivi d'un point et du nom de la colonne. Par
exemple : [Link], [Link], [Link]
Le nom de la table peut être omis quand il n'y a pas d'ambiguïté. Il doit être précisé s'il y a une ambiguïté, ce
qui peut arriver quand on fait une sélection sur plusieurs tables à la fois et que celles-ci contiennent des
colonnes qui ont le même nom.
3.3. Clause FROM
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 pour le temps de la
sélection. On utilise cette possibilité pour lever certaines ambiguïtés, quand la même table est utilisée de
plusieurs façons différentes dans un même ordre SELECT. Quand on a donné un synonyme à une table dans
une requête, elle n'est plus reconnue sous son nom d'origine dans cette requête.
Mohamed Ouamer 4
Le Langage SQL
Quand on précise plusieurs tables dans la clause FROM, on obtient le produit cartésien des tables.
➢ Exemple
Produit cartésien des noms des départements par les numéros des départements :
SELECT [Link], [Link]
FROM dept A,dept B
La norme SQL2 permet d'avoir un SELECT à la place d'un nom de table..
(a) Pour obtenir la liste des employés avec le pourcentage de leur salaire par rapport au total des salaires, une
seule instruction SELECT suffit:
select nome, sal, sal/total*100
from emp, (select sum(sal) as total from emp)
3.4. 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. La clause
where est étudiée ici pour la commande SELECT. Elle peut se rencontrer aussi dans les commandes UPDATE et
DELETE avec la même syntaxe.
Clause WHERE simple
WHERE prédicat
Un prédicat simple est la comparaison de deux expressions ou plus au moyen d'un opérateur logique :
Mohamed Ouamer 5
Le Langage SQL
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.
Il faut ajouter à ces opérateurs classiques les opérateurs suivants BETWEEN, IN, LIKE, IS NULL :
exp1 BETWEEN exp2 AND exp3 est vrai si exp1 est compris entre exp2 et exp3, bornes incluses.
exp1 IN (exp2 , exp3...) est vrai si exp1 est égale à l'une des expressions de la liste entre parenthèses.
exp1 LIKE exp2 teste l'égalité de deux chaînes en tenant compte des caractères jokers dans la 2ème chaîne :
• "_" remplace 1 caractère exactement
• "%" remplace une chaîne de caractères de longueur quelconque, y compris de longueur nulle
Le fonctionnement est le même que celui des caractères joker ? et * sous Windows. Ainsi l'expression 'MARTIN'
LIKE '_AR%' sera vraie.
Voici quelques exemples :
o WHERE CustomerName LIKE 'a%'
o WHERE CustomerName LIKE '%a'
o WHERE CustomerName LIKE '%or%'
o WHERE CustomerName LIKE '_r%'
o WHERE CustomerName LIKE 'a__%'
o WHERE ContactName LIKE 'a%o'
➢ Remarques
(a) L'utilisation des jokers ne fonctionne qu'avec LIKE ; elle ne fonctionne pas avec "=".
(b) Si on veut faire considérer "_" ou "%" comme des caractères normaux, il faut les faire précéder d'un
caractère d'échappement que l'on indique par la clause ESCAPE. Par exemple, les requêtes suivantes affichent
les noms qui contiennent les caractère "%" et "_", respectivement:
select nome from emp
where nome like '%\%%' escape '\'
select nome from emp
where nome like '%\_%' escape '\'
L'opérateur IS NULL permet de tester l'état NULL :
exp IS [NOT] NULL est vrai si l'expression a l'état NULL (ou l'inverse avec NOT).
Le prédicat "expr = NULL" n'est jamais vrai, et ne permet donc pas de tester si l'expression est NULL.
Opérateurs logiques
Les opérateurs logiques AND et OR peuvent être utilisés pour combiner plusieurs prédicats (l'opérateur AND est
prioritaire par rapport à l'opérateur OR). Des parenthèses peuvent être utilisées pour imposer une priorité dans
l'évaluation du prédicat, ou simplement pour rendre plus claire l'expression logique. L'opérateur NOT placé
devant un prédicat en inverse le sens.
➢ Exemples
(a) Sélectionner les employés du département 30 ayant un salaire supérieur à 1500 frs.
Mohamed Ouamer 6
Le Langage SQL
SELECT NOME FROM EMP
WHERE DEPT = 30 AND SAL > 1500
(b) Afficher une liste comprenant les employés du département 30 dont le salaire est supérieur à 11000 Dhs et
(attention, à la traduction par OR) les employés qui ne touchent pas de commission.
SELECT nome FROM emp
WHERE dept = 30 AND sal > 11000 OR comm IS NULL
(c) SELECT * FROM EMP
WHERE (POSTE = 'DIRECTEUR' OR POSTE = 'SECRETAIRE')
AND DEPT = 10
La clause WHERE peut aussi être utilisée pour faire des jointures (vues dans le cours sur le modèle relationnel)
et des sous-interrogations (une des valeurs utilisées dans un WHERE provient d'une requête SELECT emboîtée)
comme nous allons le voir dans les sections suivantes.
3.5. Jointure
Quand on précise plusieurs tables dans la clause FROM, on obtient le produit cartésien des tables. Ce produit
cartésien ore en général peu d'intérêt.
Ce qui est normalement souhaité, c'est de joindre les informations de diverses tables, en "recollant" les lignes
des tables suivant les valeurs qu'elles ont dans certaines colonnes. Une variante de la clause FROM permet de
préciser les colonnes qui servent au recollement.
➢ Exemple
Liste des employés avec le nom du département où ils travaillent :
SELECT NOME, NOMD
FROM EMP JOIN DEPT ON [Link] = [Link]
La clause FROM indique de ne conserver dans le produit cartésien des tables EMP et DEPT que les éléments
pour lesquels le numéro de département provenant de la table DEPT est le même que le numéro de
département provenant de la table EMP. Ainsi, on obtiendra bien une jointure entre les tables EMP et DEPT
d'après le numéro de département.
Par opposition aux jointures externes que l'on va bientôt étudier, on peut ajouter le mot clé INNER :
SELECT NOME, NOMD
FROM EMP INNER JOIN DEPT ON [Link] = [Link]
➢ Remarque
Cette syntaxe SQL2 n'est pas supportée par tous les SGBD. La jointure peut aussi être traduite par la clause
WHERE :
SELECT NOME, NOMD
FROM EMP, DEPT
WHERE [Link] = [Link]
Cette façon de faire est encore très souvent utilisée, même avec les SGBD qui supportent la syntaxe SQL2.
3.6. Sous-interrogation
Une caractéristique puissante de SQL est la possibilité qu'un prédicat employé dans une clause WHERE
(expression à droite d'un opérateur de comparaison) comporte un SELECT emboîté.
Mohamed Ouamer 7
Le Langage SQL
Par exemple, la sélection des employés ayant même poste que MARTIN peut s'écrire en joignant la table EMP
avec elle-même :
SELECT [Link]
FROM EMP JOIN EMP MARTIN ON [Link] = [Link]
WHERE [Link] = 'MARTIN'
mais on peut aussi la formuler au moyen d'une sous-interrogation :
SELECT NOME FROM EMP
WHERE POSTE = (SELECT POSTE
FROM EMP
WHERE NOME = 'MARTIN')
Les sections suivantes exposent les divers aspects de ces sous-interrogations.
Sous-interrogation à une ligne et une colonne
Dans ce cas, le SELECT imbriqué équivaut à une valeur.
WHERE exp op (SELECT ...) où op est un des opérateurs = != < > <= >= exp est toute expression légale.
➢ Exemple
Liste des employés travaillant dans le même département que MERCIER :
SELECT NOME FROM EMP
WHERE DEPT = (SELECT DEPT FROM EMP
WHERE NOME = 'MERCIER')
Un SELECT peut comporter plusieurs sous-interrogations, soit imbriquées, soit au même niveau dans différents
prédicats combinés par des AND ou des OR.
(a) Liste des employés du département 10 ayant même poste que quelqu'un du département VENTES :
SELECT NOME, POSTE FROM EMP
WHERE DEPT = 10
AND POSTE IN
(SELECT POSTE
FROM EMP
WHERE DEPT = (SELECT DEPT
FROM DEPT
WHERE NOMD = 'VENTES'))
(b) Liste des employés ayant même poste que MERCIER ou un salaire supérieur à CHATEL :
SELECT NOME, POSTE, SAL FROM EMP
WHERE POSTE = (SELECT POSTE FROM EMP
WHERE NOME = 'MERCIER')
OR SAL > (SELECT SAL FROM EMP WHERE NOME = 'CHATEL')
Jointures et sous-interrogations peuvent se combiner.
➢ Exemple
Liste des employés travaillant à LYON et ayant même poste que FREMONT.
SELECT NOME, POSTE
FROM EMP JOIN DEPT ON [Link] = [Link]
WHERE LIEU = 'LYON'
Mohamed Ouamer 8
Le Langage SQL
AND POSTE = (SELECT POSTE FROM EMP
WHERE NOME = 'FREMONT')
On peut aussi plus simplement utiliser la jointure naturelle puisque les noms des colonnes de jointures sont les
mêmes :
SELECT NOME, POSTE
FROM EMP NATURAL JOIN DEPT
WHERE LIEU = 'LYON'
AND POSTE = (SELECT POSTE FROM EMP
WHERE NOME = 'FREMONT')
Attention : une sous-interrogation à une seule ligne doit ramener une seule ligne ; dans le cas où plusieurs
lignes, ou pas de ligne du tout seraient ramenées, un message d'erreur sera affiché et l'interrogation sera
abandonnée.
Sous-interrogation ramenant plusieurs lignes
Une sous-interrogation peut ramener plusieurs lignes à condition que l'opérateur de comparaison admette à sa
droite un ensemble de valeurs. Les opérateurs permettant de 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 sera 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 sera vraie si elle est vraie pour tous les éléments de l'ensemble (elle est vraie si
l'ensemble est vide).
où op est un des opérateurs =, !=, <, >, <=, >=.
➢ 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
WHERE DEPT=30)
➢ Remarque
L'opérateur IN est équivalent à = ANY, et l'opérateur NOT IN est équivalent à != ALL.
Sous-interrogation ramenant plusieurs colonnes
Il est possible de comparer le résultat d'un SELECT ramenant plusieurs colonnes à une liste de colonnes. La
liste de colonnes figurera entre parenthèses à gauche de l'opérateur de comparaison.
Avec une seule ligne sélectionnée :
WHERE (exp, exp,...) op (SELECT ...)
Mohamed Ouamer 9
Le Langage SQL
Avec plusieurs lignes sélectionnées :
WHERE (exp, exp,...) op ANY (SELECT ...)
WHERE (exp, exp,...) op ALL (SELECT ...)
WHERE (exp, exp,...) IN (SELECT ...)
WHERE (exp, exp,...) NOT IN (SELECT ...)
WHERE (exp, exp,...)
où op est un des opérateurs "=" ou "!="
Les expressions figurant dans la liste entre parenthèses seront comparées à celles qui sont ramenées par le
SELECT.
➢ Exemple
Employés ayant même poste et même salaire que MERCIER :
SELECT NOME, POSTE, SAL FROM EMP
WHERE (POSTE, SAL) =
(SELECT POSTE, SAL FROM EMP
WHERE NOME = 'MERCIER')
Clause EXISTS
La clause EXISTS est suivie d'une sous-interrogation entre parenthèses, et prend la valeur vrai s'il existe au
moins une ligne satisfaisant les conditions de la sous-interrogation.
➢ Exemple
SELECT NOMD FROM DEPT
WHERE EXISTS (SELECT * FROM EMP
WHERE DEPT = [Link] AND SAL > 10000)
Cette interrogation liste le nom des départements qui ont au moins un employé ayant plus de 10.000 Dhs
comme salaire ; pour chaque ligne de DEPT la sous-interrogation synchronisée est exécutée et si au moins une
ligne est trouvée dans la table EMP, EXISTS prend la valeur vrai et la ligne de DEPT satisfait les critères de
l'interrogation.
Souvent on peut utiliser IN à la place de la clause EXISTS. Essayez sur l'exemple précédent.
➢ Remarque
Il faut se méfier lorsque l'on utilise EXISTS en présence de valeurs NULL. Si on veut par exemple les employés
qui ont la plus grande commission par la requête suivante,
select nome
from emp e1
where not exists
(select matr from emp
where comm > [Link])
on aura en plus dans la liste tous les employés qui ont une commission NULL.
3.7. Opérateurs ensemblistes
Pour cette section on supposera que deux tables EMP1 et EMP2 contiennent les informations sur deux filiales de
l'entreprise.
Opérateur UNION
Mohamed Ouamer 10
Le Langage SQL
L'opérateur UNION permet de fusionner deux sélections de tables pour obtenir un ensemble de lignes égal à la
réunion des lignes des deux sélections.
Les lignes communes n'apparaîtront qu'une fois. Si on veut conserver les doublons, on peut utiliser la variante
UNION ALL.
➢ Exemple
Liste des ingénieurs des deux filiales :
SELECT * FROM EMP1
WHERE POSTE='INGENIEUR'
UNION
SELECT * FROM EMP
WHERE POSTE='INGENIEUR'
Opérateur INTERSECT
L'opérateur INTERSECT permet d'obtenir l'ensemble des lignes communes à deux interrogations.
➢ Exemple
Liste des départements qui ont des employés dans les deux filiales :
SELECT DEPT FROM EMP1
INTERSECT
SELECT DEPT FROM EMP2
Opérateur EXCEPT
L'opérateur EXCEPT de SQL2 permet d'ôter d'une sélection les lignes obtenues dans une deuxième sélection.
➢ Exemple
Liste des départements qui ont des employés dans la première filiale mais pas dans la deuxième.
SELECT DEPT FROM EMP1
EXCEPT
SELECT DEPT FROM EMP2
Clause ORDER BY
On ne peut ajouter une clause ORDER BY que sur le dernier select.
3.8. Fonctions de groupes
Les fonctions de groupes peuvent apparaître dans le Select ou le Having ; ce sont les fonctions suivantes :
Mohamed Ouamer 11
Le Langage SQL
➢ Exemples
(a) SELECT COUNT(*) FROM EMP
(b) SELECT SUM(COMM) FROM EMP WHERE DEPT = 10
Les valeurs NULL sont ignorées par les fonctions de groupe. Ainsi, SUM(col) est la somme des valeurs qui ne
sont pas égales à NULL de la colonne 'col'. De même, AVG est la somme des valeurs non "NULL" divisée par le
nombre de valeurs non "NULL".
la requête suivante affiche le nom et le salaire des employés qui gagnent le plus dans l'entreprise:
SELECT NOME, SAL FROM EMP
WHERE SAL = (SELECT MAX(SAL) FROM EMP)
3.9. Clause GROUP BY
Il est possible de subdiviser la table en groupes, chaque groupe étant l'ensemble des lignes ayant une valeur
commune.
GROUP BY exp1, exp2,... groupe en une seule ligne toutes les lignes pour lesquelles exp1, exp2,... ont la même
valeur. Cette clause se place juste après la clause WHERE, ou après la clause FROM si la clause WHERE n'existe
pas.
Des lignes peuvent être éliminées avant que le groupe ne soit formé grâce à la clause WHERE.
➢ Exemples
(a) SELECT DEPT, COUNT(*) FROM EMP
GROUP BY DEPT
(b) SELECT DEPT, COUNT(*) FROM EMP
WHERE POSTE = 'SECRETAIRE'
GROUP BY DEPT
(c) SELECT DEPT, POSTE, COUNT(*) FROM EMP
GROUP BY DEPT, POSTE
(d) SELECT NOME, DEPT FROM EMP
WHERE (DEPT, SAL) IN
(SELECT DEPT, MAX(SAL) FROM EMP
GROUP BY DEPT)
➢ RESTRICTION :
Mohamed Ouamer 12
Le Langage SQL
Une expression d'un SELECT avec clause GROUP BY ne peut évidemment que correspondre à une
caractéristique de groupe. SQL n'est pas très intelligent pour comprendre ce qu'est une caractéristique de
groupe ; une expression du SELECT ne peut être que :
• soit une fonction de groupe,
• soit une expression figurant dans le GROUP BY.
L'ordre suivant est invalide car NOMD n'est pas une expression du GROUP BY :
SELECT NOMD, SUM(SAL)
FROM EMP NATURAL JOIN DEPT
GROUP BY DEPT
Il faut, soit se contenter du numéro de département au lieu du nom :
SELECT DEPT, SUM(SAL)
FROM EMP NATURAL JOIN DEPT
GROUP BY DEPT
Soit modifier le GROUP BY pour avoir le nom du département :
SELECT NOMD, SUM(SAL)
FROM EMP NATURAL JOIN DEPT
GROUP BY NOMD
3.10. 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 DEPT, COUNT(*)
FROM EMP
WHERE POSTE = 'SECRETAIRE'
GROUP BY DEPT
HAVING COUNT(*) > 1
On peut évidemment combiner toutes les clauses, des jointures et des sous-interrogations. La requête suivante
donne le nom du département (et son nombre de secrétaires) qui a le plus de secrétaires :
SELECT NOMD Departement, COUNT(*) "Nombre de secretaires"
FROM EMP NATURAL JOIN DEPT
WHERE POSTE = 'SECRETAIRE'
GROUP BY NOMD HAVING COUNT(*) =
(SELECT MAX(COUNT(*)) FROM EMP
WHERE POSTE = 'SECRETAIRE'
GROUP BY DEPT)
3.11. Clause ORDER BY
Les lignes constituant le résultat d'un SELECT sont obtenues dans un ordre indéterminé. La clause ORDER BY
précise l'ordre dans lequel la liste des lignes sélectionnées sera donnée. ORDER BY exp1 [DESC], exp2 [DESC],
...
L'option facultative DESC donne un tri par ordre décroissant. Par défaut, l'ordre est croissant. 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, etc. Les valeurs nulles sont toujours en tête quel que soit l'ordre du tri (ascendant ou
descendant).
Mohamed Ouamer 13
Le Langage SQL
Pour préciser lors d'un tri sur quelle expression va porter le tri, il est possible de donner le rang relatif de la
colonne dans la liste des colonnes, plutôt que son nom. Il est aussi possible de donner un nom d'en-tête de
colonne du SELECT.
➢ Exemple
À la place de : SELECT DEPT, NOMD FROM DEPT ORDER BY NOMD on peut taper : SELECT DEPT, NOMD FROM
DEPT ORDER BY 2 Cette nouvelle syntaxe doit être utilisée pour les interrogations exprimées à l'aide d'un
opérateur booléen UNION, INTERSECT ou EXCEPT.
Elle permet aussi de simplifier l'écriture d'un tri sur une colonne qui contient une expression complexe.
(a) Liste des employés et de leur poste, triée par département et dans chaque département par ordre de salaire
décroissant :
SELECT NOME, POSTE FROM EMP
ORDER BY DEPT, SAL DESC
(b) SELECT DEPT, SUM(SAL) "Total salaires" FROM EMP
GROUP BY DEPT
ORDER BY 2
(c) SELECT DEPT, SUM(SAL) "Total salaires" FROM EMP
GROUP BY DEPT
ORDER BY SUM(SAL)
(d) SELECT DEPT, SUM(SAL) "Total salaires" FROM EMP
GROUP BY DEPT
ORDER BY "Total salaires"
3.12. Clause LIMIT
La clause LIMIT est utilisée dans les requêtes SQL pour limiter le nombre de lignes retournées par la requête.
Syntaxe:
SELECT colonnes
FROM table
WHERE condition
ORDER BY colonne(s)
LIMIT nombre_de_lignes;
Supposons que vous avez une table Clients avec 10 000 clients. Vous souhaitez afficher les 10 premiers clients
triés par nom. Voici la requête que vous pouvez utiliser:
SQL
SELECT *
FROM Clients
ORDER BY nom
LIMIT 10;
Voici une explication de la requête :
• SELECT * sélectionne toutes les colonnes de la table Clients.
• FROM Clients indique la table sur laquelle la requête est exécutée.
Mohamed Ouamer 14
Le Langage SQL
• ORDER BY nom trie les résultats par la colonne nom.
• LIMIT 10 limite le nombre de lignes à 10.
3.13. Clause OFFSET
La clause OFFSET est utilisée dans les requêtes SQL pour ignorer un certain nombre de lignes au début du
résultat de la requête.
Syntaxe:
SQL
SELECT colonnes
FROM table
WHERE condition
ORDER BY colonne(s)
LIMIT nombre_de_lignes
OFFSET nombre_de_lignes_à_ignorer;
Exemple:
Supposons que vous avez une table Clients avec 10 000 clients. Vous souhaitez afficher les clients 11 à 20 triés
par nom. Voici la requête que vous pouvez utiliser:
SQL
SELECT *
FROM Clients
ORDER BY nom
LIMIT 10
OFFSET 10;
Explication:
• SELECT * sélectionne toutes les colonnes de la table Clients.
• FROM Clients indique la table sur laquelle la requête est exécutée.
• ORDER BY nom trie les résultats par la colonne nom.
• LIMIT 10 limite le nombre de lignes à 10.
• OFFSET 10 ignore les 10 premières lignes du résultat.
Mohamed Ouamer 15