Vous êtes sur la page 1sur 28

But du chapitre

Ce chapitre poursuit l'étude des fonctions. Il explique comment obtenir des informations synthétisées,
telles que des moyennes, sur des groupes de lignes. Il présente les différentes manières de regrouper
les lignes d'une table en sous-ensembles et de préciser des critères de recherche sur ces groupes de
lignes.

Le langage SQL et l'outil iSQL 5-2


Fonctions de groupe
Contrairement aux fonctions monoligne, les fonctions de groupe agissent sur des groupes de lignes et
donnent un résultat par groupe. Un groupe peut être une table entière ou un sous-ensemble d'une table.

Le langage SQL et l'outil iSQL 5-3


Fonctions de groupe (suite)
Chaque fonction accepte un argument. Le tableau suivant présente les différentes options de syntaxe
possibles :
Fonction Description
AVG([DISTINCT|ALL]n) Valeur moyenne de n, ignore les valeurs NULL
COUNT({*|[DISTINCT|ALL]expr}) Nombre de lignes où la valeur de expr n'est pas
NULL (* permet de compter toutes les lignes
sélectionnées, y compris les doublons et les lignes
contenant des valeurs NULL)
MAX([DISTINCT|ALL]expr) Valeur maximale de expr, ignore les
valeurs NULL
MIN([DISTINCT|ALL]expr) Valeur minimale de expr, ignore les
valeurs NULL
STDDEV([DISTINCT|ALL]x) Ecart type de n, ignore les valeurs NULL
SUM([DISTINCT|ALL]n) Somme des valeurs de n, ignore les valeurs NULL
VARIANCE([DISTINCT|ALL]x) Variance de n, ignore les valeurs NULL

Le langage SQL et l'outil iSQL 5-4


Règles d'utilisation des fonctions de groupe
• Avec DISTINCT, la fonction ne prend en compte que les valeurs distinctes ; avec ALL, elle
tient compte de toutes les valeurs y compris des doublons. La valeur par défaut est ALL, par
conséquent il n'est pas nécessaire de la préciser.
• Les données des fonctions utilisant un argument expr peuvent être de type CHAR, VARCHAR2,
NUMBER ou DATE .
• Toutes les fonctions de groupe ignorent les valeurs NULL. Pour affecter une valeur à une valeur
NULL, utilisez la fonction NVL, NVL2 ou COALESCE.
• Le serveur Oracle trie de manière implicite le résultat dans l'ordre croissant en utilisant une
clause GROUP BY. Pour modifier cet ordre de tri par défaut, il est possible d'utiliser le mot-clé
DESC dans une clause ORDER BY.

Le langage SQL et l'outil iSQL 5-5


Fonctions de groupe
Vous pouvez utiliser les fonctions AVG, SUM, MIN et MAX avec des colonnes de données numériques.
L'exemple de la diapositive affiche la moyenne, le maximum, le minimum et la somme des salaires
mensuels de tous les représentants.

Le langage SQL et l'outil iSQL 5-6


Fonctions de groupe (suite)
Vous pouvez utiliser les fonctions MAX et MIN pour tous les types de données. La diapositive ci-
dessus affiche la date d'embauche du dernier employé recruté et celle de l'employé présentant le plus
d'ancienneté.
L'exemple suivant affiche le nom des deux employés apparaissant respectivement en premier et en
dernier dans le classement alphabétique de tous les employés.
SELECT MIN(last_name), MAX(last_name)
FROM employees;

Remarque : Les fonctions AVG, SUM, VARIANCE et STDDEV n'acceptent que des données de type
numérique.

Le langage SQL et l'outil iSQL 5-7


Fonction COUNT
La fonction COUNT se présente sous trois formes :
• COUNT(*)
• COUNT(expr)
• COUNT(DISTINCT expr)
La fonction COUNT(*) renvoie le nombre de lignes d'une table qui répondent aux critères de
l'instruction SELECT, y compris les doublons et les lignes contenant des valeurs NULL dans l'une des
colonnes. Si une clause WHERE est incluse dans l'instruction SELECT, la fonction COUNT(*) renvoie
le nombre de lignes répondant à la condition de la clause WHERE.
En revanche, la fonction COUNT(expr) renvoie le nombre de valeurs non NULL contenues dans la
colonne identifiée par expr.
La fonction COUNT(DISTINCT expr) renvoie le nombre de valeurs non NULL uniques
contenues dans la colonne identifiée par expr.
L'exemple de la diapositive affiche le nombre d'employés du service 50.

Le langage SQL et l'outil iSQL 5-8


Fonction COUNT (suite)
La diapositive ci-dessus affiche le nombre d'employés du service 80 habilités à toucher une
commission.
Exemple
Affichez le nombre de valeurs contenues dans la colonne DEPARTMENT_ID de la table
EMPLOYEES.
SELECT COUNT(department_id)
FROM employees;

Le langage SQL et l'outil iSQL 5-9


Mot-clé DISTINCT
Le mot-clé DISTINCT vous permet d'exclure tous les doublons contenus dans une colonne.
L'exemple de la diapositive affiche le nombre de services distincts de la table EMPLOYEES.

Le langage SQL et l'outil iSQL 5-10


Fonctions de groupe et valeurs NULL
Toutes les fonctions de groupe ignorent les valeurs NULL des colonnes. Dans l'exemple de la
diapositive, la moyenne est calculée uniquement sur les lignes pour lesquelles la colonne
COMMISSION_PCT est correctement renseignée. Le calcul de la moyenne s'effectue par division du
total des commissions versées à tous les employés par le nombre d'employés touchant une
commission (4).

Le langage SQL et l'outil iSQL 5-11


Fonctions de groupe et valeurs NULL (suite)
La fonction NVL contraint les fonctions de groupe à intégrer des valeurs NULL. Dans la diapositive
ci-dessus, la moyenne est calculée sur toutes les lignes de la table, y compris celles dont la colonne
COMMISSION_PCT contient une valeur NULL. Le calcul de la moyenne s'effectue par division du
total des commissions de tous les employés par le nombre total d'employés de l'entreprise (20).

Le langage SQL et l'outil iSQL 5-12


Groupes de données
Jusqu'ici, la table s'est vue considérée par les fonctions de groupe comme un seul groupe
d'informations. Cependant, il est parfois nécessaire de diviser les informations d'une table en groupes
plus restreints. Pour cela, utilisez la clause GROUP BY.

Le langage SQL et l'outil iSQL 5-13


Clause GROUP BY
La clause GROUP BY vous permet d'organiser les lignes d'une table en groupes restreints. Vous
pouvez ensuite utiliser les fonctions de groupe pour renvoyer des informations synthétisées sur chaque
groupe.
Explication de la syntaxe :
group_by_expression désigne les colonnes dont les valeurs déterminent les
différents groupes
Règles
• Si vous intégrez une fonction de groupe dans une clause SELECT, vous ne pouvez pas
sélectionner dans le même temps des résultats individuels, à moins que la colonne individuelle
ne soit mentionnée dans la clause GROUP BY. Si vous omettez de préciser la liste des colonnes
dans la clause GROUP BY, un message d'erreur s'affiche.
• Avec la clause WHERE, vous pouvez exclure des lignes avant de procéder à la division en
groupes.
• Vous devez inclure les colonnes dans la clause GROUP BY.
• Vous ne pouvez pas utiliser d'alias de colonne dans la clause GROUP BY.
• Par défaut, les lignes sont triées dans l'ordre croissant des colonnes incluses dans la liste GROUP
BY. Vous pouvez changer cet ordre en utilisant la clause ORDER BY.

Le langage SQL et l'outil iSQL 5-14


Clause GROUP BY (suite)
Lorsque vous utilisez la clause GROUP BY, assurez-vous que toutes les colonnes de la liste SELECT
qui ne figurent pas dans des fonctions de groupe sont intégrées à cette clause. L'exemple de la
diapositive affiche le numéro de service et le salaire moyen dans chaque service. L'instruction
SELECT, qui contient une clause GROUP BY, est évaluée de la manière suivante :
• La clause SELECT indique les colonnes à extraire :
– la colonne des numéros de service de la table EMPLOYEES,
– la moyenne de tous les salaires du groupe que vous avez indiqué dans la clause
GROUP BY.
• La clause FROM indique les tables auxquelles doit accéder la base de données : en l'occurrence,
la table EMPLOYEES.
• La clause WHERE indique les lignes à extraire. En l'absence de clause WHERE, toutes les lignes
seront extraites.
• La clause GROUP BY indique la manière dont les lignes doivent être groupées. Dans le cas
présent, elles sont groupées par numéro de service pour permettre à la fonction AVG, appliquée
à la colonne des salaires, de calculer le salaire moyen de chaque service.

Le langage SQL et l'outil iSQL 5-15


Clause GROUP BY (suite)
La colonne GROUP BY ne doit pas nécessairement figurer dans la clause SELECT. Par exemple,
l'instruction SELECT de la diapositive affiche le salaire moyen dans chaque service, mais pas les
numéros de service correspondants. Toutefois, sans les numéros de service, les résultats ne sont pas
très parlants.
Vous pouvez utiliser la fonction de groupe dans la clause ORDER BY.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
ORDER BY AVG(salary);

Le langage SQL et l'outil iSQL 5-16


Sous-groupes
Vous devez parfois visualiser les résultats de sous-groupes. Sur la diapositive ci-dessus, l'état affiche le
total des salaires pour chacun des postes à l'intérieur de chaque service.
La table EMPLOYEES est classée par numéro de service et, au sein de ce groupe, par poste. Par
exemple, les quatre magasiniers (ST_CLERK) du service 50 ont été regroupés ; vous obtenez un seul
résultat (salaire total) pour ce sous-groupe.

Le langage SQL et l'outil iSQL 5-17


Sous-groupes (suite)
Vous pouvez obtenir des informations synthétisées sur des groupes et des sous-groupes en précisant
plusieurs colonnes GROUP BY. Vous pouvez en outre déterminer l'ordre de tri par défaut des résultats
en fonction de l'ordre des colonnes figurant dans la clause GROUP BY. L'instruction SELECT de la
diapositive, qui contient une clause GROUP BY, est évaluée de la manière suivante :
• La clause SELECT indique les colonnes à extraire :
– la colonne des numéros de service de la table EMPLOYEES,
– l'ID de poste de la table EMPLOYEES,
– la somme de tous les salaires du groupe que vous avez spécifié dans la clause
GROUP BY.
• La clause FROM indique les tables auxquelles doit accéder la base de données : en l'occurrence,
la table EMPLOYEES.
• La clause GROUP BY indique la manière de grouper les lignes :
– Les lignes sont tout d'abord groupées par numéro de service.
– Ensuite, à l'intérieur de ces groupes, les lignes sont groupées par ID de poste.
La fonction SUM est alors appliquée à la colonne des salaires pour chacun des postes à l'intérieur de
chaque service.

Le langage SQL et l'outil iSQL 5-18


Erreurs d'utilisation des fonctions de groupe dans une interrogation
Chaque fois que vous utilisez des éléments individuels (DEPARTMENT_ID) avec des fonctions de
groupe (COUNT) dans la même instruction SELECT, vous devez obligatoirement inclure une clause
GROUP BY qui précise ces éléments individuels (dans le cas présent, DEPARTMENT_ID). Si la
clause GROUP BY est absente, vous voyez apparaître le message d'erreur "not a single-group group
function", et un astérisque (*) désigne la colonne incorrecte. Pour corriger l'erreur ci-dessus, ajoutez la
clause GROUP BY.
SELECT department_id, count(last_name)
FROM employees
GROUP BY department_id;

Toute colonne ou expression de la liste SELECT autre qu'une fonction d'agrégation doit être incluse
dans la clause GROUP BY.

Le langage SQL et l'outil iSQL 5-19


Erreurs d'utilisation des fonctions de groupe dans une interrogation (suite)
La clause WHERE ne permet pas de limiter les groupes. L'instruction SELECT ci-dessus provoque une
erreur, car elle utilise la clause WHERE pour limiter l'affichage aux services dans lesquels le salaire
moyen est supérieur à 8 000 $.
Vous pouvez corriger l'erreur ci-dessus en limitant les groupes avec la clause HAVING.
SELECT department_id, AVG(salary)
FROM employees
HAVING AVG(salary) > 8000
GROUP BY department_id;

Le langage SQL et l'outil iSQL 5-20


Exclure des groupes de résultats
De la même manière que vous utilisez la clause WHERE pour limiter les lignes que vous sélectionnez,
vous pouvez utiliser la clause HAVING pour restreindre des groupes. Par exemple, pour afficher le
salaire maximum de chaque service en ne prenant en compte que les services présentant un salaire
maximum supérieur à 10 000 $, vous devez procéder comme suit :
1. Recherchez le salaire maximum de chaque service en créant des groupes par numéro de service.
2. Limitez les groupes aux services présentant un salaire maximum supérieur à 10 000 $.

Le langage SQL et l'outil iSQL 5-21


Clause HAVING
La clause HAVING vous permet de préciser les groupes que vous souhaitez afficher. Vous pouvez
ainsi restreindre les groupes en fonction des informations agrégées.
Explication de la syntaxe :
group_condition limite les groupes de lignes renvoyés aux groupes pour lesquels la
condition indiquée est vraie
Lorsque vous utilisez la clause HAVING, le serveur Oracle effectue la procédure suivante :
1. Les lignes sont regroupées.
2. La fonction de groupe s'applique au groupe.
3. Les groupes qui correspondent aux critères de la clause HAVING s'affichent.
Il est possible de placer la clause HAVING avant la clause GROUP BY ; néanmoins, pour des raisons
de logique, il est recommandé de placer la clause GROUP BY en tête. Les groupes sont formés, puis
les fonctions de groupe sont calculées avant que la clause HAVING ne soit appliquée aux groupes de
la liste SELECT.

Le langage SQL et l'outil iSQL 5-22


Clause HAVING (suite)
La diapositive ci-dessus affiche les numéros de service et les salaires maximum des services dont le
salaire maximum est supérieur à 10 000 $.
Vous pouvez recourir à la clause GROUP BY sans utiliser de fonction de groupe dans la liste SELECT.
Si vous limitez les lignes renvoyées en fonction du résultat d'une fonction de groupe, vous devez
utiliser une clause GROUP BY et une clause HAVING.
L'exemple suivant affiche les numéros de service et les salaires moyens pour les services dont le
salaire maximum est supérieur à 10 000 $.
SELECT department_id, AVG(salary)
FROM employees
GROUP BY department_id
HAVING max(salary)>10000;

Le langage SQL et l'outil iSQL 5-23


Clause HAVING (suite)
La diapositive ci-dessus présente l'ID de poste et le total des salaires mensuels pour chaque poste dont
le salaire total est supérieur à 13 000 $. L'exemple proposé exclut les représentants. Le résultat est trié
dans l'ordre croissant du salaire total mensuel.

Le langage SQL et l'outil iSQL 5-24


Imbriquer des fonctions de groupe
Les fonctions de groupe peuvent être imbriquées sur deux niveaux. L'exemple ci-dessus affiche le
salaire moyen maximum.

Le langage SQL et l'outil iSQL 5-25


Synthèse
SQL comprend sept fonctions de groupe :
• AVG
• COUNT
• MAX
• MIN
• SUM
• STDDEV
• VARIANCE
Vous pouvez créer des sous-groupes en utilisant la clause GROUP BY. La clause HAVING permet
d'exclure des groupes.
Dans une instruction, les clauses HAVING et GROUP BY doivent suivre la clause WHERE. La clause
ORDER BY doit être placée à la fin.
Le serveur Oracle évalue les clauses dans l'ordre suivant :
1. Si l'instruction contient une clause WHERE, le serveur détermine les lignes candidates.
2. Le serveur identifie les groupes indiqués dans la clause GROUP BY.
3. La clause HAVING permet de restreindre encore davantage les résultats en excluant les groupes

Le langage SQL et l'outil iSQL 5-26


qui ne répondent pas aux critères qu'elle définit.

Le langage SQL et l'outil iSQL 5-‹N°›


Présentation de l'exercice 5
A la fin de cet exercice, vous saurez utiliser les fonctions de groupe et sélectionner des groupes de
données.
Questions écrites
Pour les questions 1 à 3, entourez Vrai ou Faux.
Remarque : Des alias de colonne sont utilisés pour les interrogations.

Le langage SQL et l'outil iSQL 5-27

Vous aimerez peut-être aussi