Administrateur Systèmes d'Information mais aussi Développeur Web.
Passionné par plein de choses :)

Arnaud Bosquet

Administrateur Systèmes d'Information / Dev Web / Tennis

SQL : les bases, les fonctions agrégats & les Group By

Ah les requêtes SQL parfois c’est génial, parfois on se prend la tête pour une petite requête. Ici, pas d’interaction avec un langage de programmation, uniquement des requêtes SQL.

logo-mysqlJ’ai rédigé entièrement cet article avec mes p’tits doigts, il donc possible que subsiste quelques erreurs et quelques oublis (notamment dans les tableaux).

1) Formulation d’une requête

Une requête SQL se forme toujours de la même façon :

SELECT [DISTINCT] * FROM matable [WHERE] [ORDER] [GROUP BY [HAVING]] [LIMIT]

On peut ajouter diverses options. Des options de sélection avec le mot WHERE, de limitation avec LIMIT, d’ordre avec ORDER ou bien encore de groupage avec GROUP BY.

Une requête commencera toujours par un SELECT. Après cette fonction vous pouvez trouver des fonctions agrégats (voir ci-dessous), des noms de champs, un DISTINCT qui supprimera les doublons si on précise un nom de champs derrière ou bien une * qui renverra tous les champs de la table.

Prenons un exemple avec une table reg_user qui contient 5 champs : un identifiant unique, un nom et 3 champs qui contiennent différents montant.

Schématiquement c’est ça :

Reg_user (id, nom, montant1, montant2, montant3)

Pour être plus explicite, voici des exemples de requêtes avec les résultats retournés.

SELECT * FROM reg_user ;

id nom montant1 montant2 montant3
1 Toto 45 43 34
2 Tata 78 98 78
3 Tutu 34 56 98
4 Toutou 87 65 88
5 Titi 65 45 32
6 Tonton 98 76 56

SELECT * FROM reg_user WHERE montant1 > 50;
(retourne les enregistrements dont le montant1 est supérieur à 50)

id nom montant1 montant2 montant3
2 Tata 78 98 78
4 Toutou 87 65 88
5 Titi 65 45 32
6 Tonton 98 76 56

SELECT * FROM reg_user WHERE montant1 >50 LIMIT 2;
(idem, en ne sortant que les deux premiers résultats)

id nom montant1 montant2 montant3
2 Tata 78 98 78
4 Toutou 87 65 88

SELECT * FROM reg_user WHERE montant1 >50 ORDER BY montant2 ASC LIMIT 2;
(idem en triant le champ montant2 par ordre croissant)

id nom montant1 montant2 montant3
4 Toutou 87 65 88
2 Tata 78 98 78

SELECT * FROM reg_user WHERE montant1 >50 ORDER BY montant2 DESC LIMIT 2;
(idem en triant le champ montant2 par ordre décroissant)

id nom montant1 montant2 montant3
2 Tata 78 98 78
4 Toutou 87 65 88

2) Les opérateurs de comparaison

On appelle opérateurs de comparaison des opérateurs que l’on peut placer après le WHERE, afin de faire une sélection sur les lignes. On peut utiliser de nombreux tests qui sont toujours formé de la même façon :

Nom_du_champs (< ; > ; = ; != ; LIKE) test

J’utilise le plus souvent ces opérateurs :

= Egal Nombre ou chaine de caractère
< Inférieur Nombre
> Supérieur Nombre
<= Inférieur ou égal Nombre
>= Supérieur ou égal Nombre
!= ou <> différent Nombre ou chaine de caractère
Like ressemblant chaine de caractère
Not like Non ressemblant chaine de caractère
Is NULL Champs nul Nombre ou chaine de caractère
Is not NULL Champs non nul Nombre ou chaine de caractère
[NOT] IN Dans (pratique pour des sous requêtes) Nombre, requête ou chaine de caractère
BETWEEN Entre Nombre ou chaine de caractère

Je reviens juste un peu sur l’opérateur LIKE qui permet de comparer deux chaines de caractères. Diverses options sont disponibles avec cet opérateur. Il faut rappeler que cet opérateur n’est pas sensible à la casse.

Démonstration par l’exemple :

SELECT * FROM reg_user WHERE nom LIKE 'toto';
(Retourne les lignes où le champ nom est égal à « toto »)

id nom montant1 montant2 montant3
1 Toto 45 43 34

SELECT * FROM reg_user WHERE nom LIKE 'to%';
(Retourne les lignes dont le champ nom commencent par « to »)

id nom montant1 montant2 montant3
1 Toto 45 43 34
4 Toutou 87 65 88
6 Tonton 98 76 56

SELECT * FROM reg_user WHERE nom LIKE '%ta%' ;
(Retourne les lignes dont le champ nom contient « ta »)

id nom montant1 montant2 montant3
2 Tata 78 98 78

Ces tests peuvent être couplés par des opérateurs logiques (voir ci-dessous)

3) Les opérateurs logiques

Les opérateurs logiques permettent donc de coupler différent opérateurs de comparaison. On trouve ainsi : AND ou &&, OR ou || et d’autres moins courants.

Exemple :

SELECT * FROM reg_user WHERE nom LIKE 'to%' AND montant3 >= 56;
(Retourne les lignes dont le champ nom commence par to et dont le montant3 est supérieur ou égal à 56)

id nom montant1 montant2 montant3
4 Toutou 87 65 88
6 Tonton 98 76 56

4) Les fonctions agrégats

Les fonctions agrégats sont des fonctions de calcul, calculé par le gestionnaire de base de donné, avant l’affichage des résultats.

On trouve :

Count() Compte le nombre de ligne lu par le select
AVG() Retourne la moyenne de la colonne désignée
MIN() Retourne la valeur minimale de la colonne
MAX() Retourne la valeur maximale de la colonne
SUM() Retourne la somme de la colonne

Le souci c’est que ces fonctions ne sont pas utilisables dans un WHERE. On ne peut donc pas faire une requête qui dirait :

SELECT * FROM reg_user WHERE sum(montant1+montant2+montant3)>100;

Ceci retourne forcément une erreur

5) Utiliser la fonction GROUP BY HAVING pour faire des tests avec les fonctions agrégats

Du coup, on utilise une fonction de groupage dans notre requête. Cette fonction s’appelle avec le mot clef GROUP BY.

Avant de montrer un exemple, il faut préciser que tous les champs qui se trouve après le GROUP BY doit obligatoire se trouver dans le SELECT.

Cela étant dit, exemple :

SELECT *, SUM(montant1+montant2+montant3) FROM reg_user GROUP BY id;
(Retourne la somme des trois montants pour chaque utilisateur)

id nom sum(montant1+montant2+montant3)
1 Toto 122
2 Tata 254
3 Tutu 188
4 Toutou 240
5 Titi 142
6 Tonton 230

Et maintenant, si on veut sélectionner avec une seule requête les utilisateurs qui ont la somme des trois montants supérieurs à 200, comment on fait ?

Soit on fait une sous requête (mais on fait du coup 2 appels à la base), soit on fait intervenir le HAVING.

A la requête précédente, on va ajouter ce qui suit : « grouper les utilisateurs, ayant une somme des 3 montants supérieur à 200, par leur identifiant ».

Exemple :

SELECT *, SUM(montant1+montant2+montant3) FROM reg_user GROUP BY id HAVING SUM(montant1+montant2+montant3)>200

id nom montant1 montant2 montant3 sum(montant1+montant2+montant3)
2 Tata 78 98 78 254
4 Toutou 87 65 88 240
6 Tonton 98 76 56 230

J’ai surement oublié de nombreuses choses, mais les requêtes sql sont tellement complexes qu’il est difficile de tout caser dans un seul article.

La dernière partie avec les GROUP BY et HAVING est surement la plus intéressante de cet article.

Bon courage et si vous des remarques, n’hésitez pas.

4 commentaires


[…] Les requêtes SQL, les fonctions agrégats et les Group By -> ici […]

Didier KOUAKOU
29 Mar 2012 à 14:55

Bon tuto, mais j’aurais souhaité un peu plus d’exemple sur l’utilisation de GROUP BY.
Merci Arnaud !

Arnaud
30 Mar 2012 à 19:25

Salut,

J’ai pas le temps de faire un tuto plus détaillé là dessus.
Mais il y a un super tuto que j’ai déjà utilisé, tu peux le trouver ici : http://cedric-duprez.developpez.com/tutoriels/mysql/demythifier-group-by/

Armel
20 Fév 2014 à 18:11

Bonjour,
j’ai tapé exactement votre commande
SELECT *
FROM montant
where montant1>50 and limit 2;
mais voici le message que j’ai sur acces: erreur de syntaxe

Répondre