MySQL (session 3)
01 Arithmetics, AS et CONCAT
02 AGGREGATE FONCTIONS 2
03
PLAN 04
GROUP BY / HAVING
Travaux Pratiques
[Link]
Arithmetics, AS
et CONCAT
Arithmetics (+,-,/,*,%) pour calculer et AS pour rommer
SELECT 30 + 20; SELECT 30 - 20;
SELECT PrixHT + TVA AS TTC SELECT Prix - 10 AS PrixReduit
FROM Produits; FROM Produits;
SELECT 17 % 5;
SELECT 30 * 20; SELECT 30 / 10;
SELECT Prix * 1.10 AS NouveauPrix SELECT Prix / 2 AS MoitiePrix
FROM Produits; FROM Produits;
CONCAT pour concaténer
SELECT CONCAT("MySQL ", "est ", "fun!") AS ConcatenatedString;
SELECT CONCAT(Address, " ", PostalCode, " ", City, " ", Country) AS FullAddress
FROM Customers;
AGGREGATE FUNCTIONS
MIN(champ) MAX(champ) AVG(champ) SUM(champ) COUNT(champ)
GROUP_CONCAT(champ) -> va mettre bout à bout séparé par une virgule
SELECT MIN(champ) SELECT MAX(champ) SELECT AVG(champ)
FROM table; FROM table; FROM table;
SELECT MIN(Prix) SELECT MAX(Prix) SELECT AVG(Prix)
FROM Produits; FROM Produits; FROM Produits;
SELECT SUM(champ) SELECT COUNT(champ) SELECT GROUP_CONCAT(champ)
FROM table; FROM table; FROM table;
SELECT SUM(Prix) SELECT COUNT(*) SELECT GROUP_CONCAT(Nom)
FROM Produits; FROM Produits FROM Produits;
WHERE Prix < 10;
GROUP BY / HAVING
GROUP BY / HAVING
Structure:
SELECT [DISTINCT] liste_colonnes_séparées_par_virgules
FROM nom_table
[WHERE conditions]
[GROUP BY liste_colonnes_séparées_par_virgules]
[HAVING conditions]
[ORDER BY liste_colonnes_séparées_par_virgules [ASC | DESC]]
[LIMIT [décalage,] nombre_de_lignes]
GROUP BY pour grouper les résultats
Si on veut afficher des champs supplémentaires à ceux qu’on utilise pour grouper, il faut
OBLIGATOIREMENT utiliser des fonctions d'agrégats (count, sum, avg, min, max, group_concat).
SELECT Country, COUNT(CustomerID) AS TotalCustomers
FROM Customers
GROUP BY Country;
SELECT Country, City, COUNT(CustomerID) AS TotalCustomers
FROM Customers
GROUP BY Country, City;
SELECT Eleve_id, GROUP_CONCAT(Note) AS Notes
FROM Notes
GROUP BY Eleve_id;
GROUP BY et les autres parties de la requête.
Le filtre WHERE est SELECT Categorie, COUNT(Prix) AS NbrProduits, AVG(Prix) AS PrixMoyen
appliqué AVANT le FROM Produits
WHERE Pays = 'France'
GROUP BY GROUP BY Categorie;
SELECT Categorie, COUNT(Prix) AS NbrProduits, AVG(Prix) AS PrixMoyen
FROM Produits
WHERE Pays = 'France'
GROUP BY Categorie
Le filtre ORDER BY et ORDER BY NbrProduits DESC
LIMIT 10, 5
le LIMIT sont appliqués
APRES le GROUP BY
HAVING comme un WHERE mais s’appliquant APRÈS le GROUP BY.
3) SELECT Categorie, COUNT(Prix) AS NbrProduits, AVG(Prix) AS PrixMoyen
FROM Produits
1) WHERE Pays = 'France'
2) GROUP BY Categorie
4) HAVING NbrProduits > 5
5) ORDER BY NbrProduits DESC
6) LIMIT 10, 5
En résumé voilà ce qui se passe:
1. Les produits sont filtrés pour ne garder uniquement ceux dont le Pays est 'France'
2. Les résultats sont groupés par Categorie.
3. Pour chaque Categorie cela calcule le NbrProduits et le PrixMoyen
4. PUIS on filtre avec HAVING en gardant uniquement les lignes où NbrProduits est supérieurs à 5.
5. Ensuite ces lignes sont ordonnées par NbrProduits décroissant.
6. Enfin on limite l’affichage à 5 lignes en commençant à l’indice 10.
Travaux
Pratiques