CPGE Oujda Spé
SQL/interrogation d’une base de données
Group by/having/order by/union/intersect
GROUP BY
La commande GROUP BY est utilisée en SQL pour grouper plusieurs résultats et utiliser une fonction de totaux sur un groupe de résultat. Sur une table qui contient toutes les ventes d’un magasin, il est par exemple possible de liste regrouper les ventes par clients identiques et d’obtenir le coût total des achats pour chaque client.
Syntaxe
SELECT colonne1, fonction(colonne2)
FROM table
GROUP BY colonne1
Prenons en considération une table « achat » qui résume les ventes d’une boutique :
|
id |
client |
tarif |
date |
|
1 |
Pierre |
102 |
2012-10-23 |
|
2 |
Simon |
47 |
2012-10-27 |
|
3 |
Marie |
18 |
2012-11-05 |
|
4 |
Marie |
20 |
2012-11-14 |
|
5 |
Pierre |
160 |
2012-12-03 |
Pour obtenir le coût total de chaque client en regroupant les commandes des mêmes clients, il faut utiliser la requête suivante :
SELECT client, SUM(tarif) FROM achat GROUP BY client
Utilisation d’autres fonctions de statistiques
Il existe plusieurs fonctions qui peuvent être utilisées pour manipuler plusieurs enregistrements, il s’agit des fonctions d’agrégations statistiques, les principales sont les suivantes :
HAVING
La condition HAVING en SQL est presque similaire à WHERE à la seule différence que HAVING permet de filtrer en utilisant des fonctions telles que SUM(), COUNT(), AVG(), MIN() ou MAX().
Syntaxe
SELECT colonne1, SUM(colonne2)
FROM nom_table
GROUP BY colonne1
HAVING fonction(colonne2) operateur valeur
Si dans la table précédente on souhaite récupérer la liste des clients qui ont commandé plus de 40€, toute commandes confondu alors il est possible d’utiliser la requête suivante :
SELECT client, SUM(tarif)
FROM achat
GROUP BY client
HAVING SUM(tarif) > 40
Résultat :
|
client |
SUM(tarif) |
|
Pierre |
262 |
|
Simon |
47 |
La cliente « Marie » a cumulée 38€ d’achat (un achat de 18€ et un autre de 20€) ce qui est inférieur à la limite de 40€ imposée par HAVING. En conséquent cette ligne n’est pas affichée dans le résultat.
SQL ORDER BY
La commande ORDER BY permet de trier les lignes dans un résultat d’une requête SQL.
Syntaxe
SELECT colonne1, colonne2
FROM table
ORDER BY colonne1
Par défaut les résultats sont classés par ordre ascendant, toutefois il est possible d’inverser l’ordre en utilisant le suffixe DESC après le nom de la colonne. Par ailleurs
Exemple
Pour l’ensemble de nos exemple, nous allons prendre un base « utilisateur » de test, qui contient les données suivantes :
|
id |
nom |
prenom |
date_inscription |
tarif_total |
|
1 |
Durand |
Maurice |
2012-02-05 |
145 |
|
2 |
Dupond |
Fabrice |
2012-02-07 |
65 |
|
3 |
Durand |
Fabienne |
2012-02-13 |
90 |
|
4 |
Dubois |
Chloé |
2012-02-16 |
98 |
|
5 |
Dubois |
Simon |
2012-02-23 |
27 |
Pour récupérer la liste de ces utilisateurs par ordre alphabétique du nom de famille, il est possible d’utiliser la requête suivante :
SELECT *
FROM utilisateur
ORDER BY nom
Résultat :
|
id |
nom |
prenom |
date_inscription |
tarif_total |
|
4 |
Dubois |
Chloé |
2012-02-16 |
98 |
|
5 |
Dubois |
Simon |
2012-02-23 |
27 |
|
2 |
Dupond |
Fabrice |
2012-02-07 |
65 |
|
1 |
Durand |
Maurice |
2012-02-05 |
145 |
|
3 |
Durand |
Fabienne |
2012-02-13 |
90 |
UNION
C’est donc une commande qui permet de concaténer les résultats de 2 requêtes ou plus.
Syntaxe
SELECT * FROM table1
UNION
SELECT * FROM table2
Exemple
SELECT * FROM magasin1_client
UNION
SELECT * FROM magasin2_client
SQL INTERSECT
Cette commande permet donc de récupérer les enregistrements communs à 2 requêtes.
Syntaxe
SELECT * FROM table1
INTERSECT
SELECT * FROM table2
Dans cet exemple, il faut que les 2 tables soient similaires (mêmes colonnes, mêmes types et même ordre). Le résultat correspondra aux enregistrements qui existent dans table1 et dans table2.
Exemple
SELECT * FROM magasin1_client
INTERSECT
SELECT * FROM magasin2_client