diff --git a/Espace Formateur b/Espace Formateur index 56f8da6..2e72736 160000 --- a/Espace Formateur +++ b/Espace Formateur @@ -1 +1 @@ -Subproject commit 56f8da6f6647b3ab0bc81f4df18855e384d10e1e +Subproject commit 2e727368a24f00bd2a4ae65a8434a00d1bdf5dc8 diff --git a/cours/04_vues-et-fonctions.slides.md b/cours/04_vues-et-fonctions.slides.md new file mode 100644 index 0000000..6e68313 --- /dev/null +++ b/cours/04_vues-et-fonctions.slides.md @@ -0,0 +1,359 @@ +--- +title: Template +theme: solarized +author: Alexandre Devos +company: Octocorn +contributors: + - Alexandre Devos +--- + +# SQL : Vues + +![SQL](./assets/sql.png) + +![MySQL](./assets/mysql.png) + + +---- + +## Vues + +### Définition + +- Une vue est une requête SQL stockée dans la base de données. +- Table virtuelle, dont les lignes sont issues d'une ou plusieurs tables de la base de données. + +---- + +## Vues + +### Autrement dit + +- Créer une vue revient à créer une nouvelle table contenant le résultat d'une requête. +- On pourra la manipuler comme une table classique. +- Elle ne peut contenir que des `SELECT`. + +---- + +## Vues + +### Objectifs + +- Eviter de dupliquer du code. (et de recréer des tables). +- Simplifier les requêtes complexes. +- On peut se baser sur une vue pour faire des opérations + +---- + +## Vues + +### Création + +```sql +CREATE VIEW nom_vue AS +SELECT colonne1, colonne2, ... +FROM table +WHERE condition; +``` + +---- + +## Vues + +### Exemple + +```sql +CREATE VIEW `Promotions_en_cours` AS +SELECT + eleves.nom AS 'Nom', + eleves.prenom as 'Prénom', + TIMEDIFF(NOW(), date_naissance) AS 'Age', + classes.annee AS Promotion +FROM eleves + LEFT JOIN classes ON eleves.classe_id = classes.id +WHERE classes.annee = 2024 +``` + +> Que contiendra cette vue ? + +---- + +## Vues + +### Exemple + +- On pourra ensuite utiliser cette vue comme une table classique. + +```sql +SELECT * FROM `Promotions_en_cours` +``` + +---- + +## Vues + +### Quelques précisions + +- Utilisez des alias pour les colonnes, surtout en cas de doublons. +- La requête ne doit pas faire référence à des variables locales. +- Les tables doivent exister avant de créer la vue. +- La vue ne peut pas contenir de sous requête `SELECT` dans la clause `FROM`. + +--- + +## Fonctions + + +![SQL](./assets/sql.png) + +![MySQL](./assets/mysql.png) + +---- + +## Fonctions + +### Définition + +- Une fonction est un bloc de code qui effectue une tâche spécifique. +- SQL propose de nombreuses fonctions, ayant chacune un rôle bien précis. +- Il en existe deux types : les fonctions d'**agrégation** et les fonctions **scalaires**. + +---- + +## Fonctions Scalaires + +### Définition + +- Une fonction scalaire est une fonction qui concerne une seule valeur. +- Elle permet de manipuler des données. +- Elle ne retourne qu'une seule valeur. +- Elle peut être utilisée dans une requête SQL comme une colonne. + +---- + +## Fonctions Scalaires + +### Arrondis + +```mysql +SELECT ROUND(12.345, 2); -- Arrondi à x (2) décimales +SELECT CEIL(12.345); -- Arrondit supérieur +SELECT FLOOR(12.345); -- Arrondit inférieur +SELECT TRUNCATE(12.345, 2); -- Tronque à x (2) décimales +``` + +---- + +## Fonctions Scalaires + +### Exposants et racies + +```mysql +SELECT POW(2, 3); -- 2 puissance 3 +SELECT SQRT(9); -- Racine carrée +``` + +---- + +## Fonctions Scalaires + +### Autres + +```mysql +SELECT SIGN(-12); -- Renvoie -1 si négatif, 0 si nul, 1 si positif +SELECT ABS(-12); -- Renvoie la valeur absolue +SELECT MOD(12, 5); -- Renvoie le reste de la division euclidienne +``` + +---- + +## Fonctions Scalaires + +### Longueur des chaines + +```mysql +SELECT LENGTH('Hello'); -- Renvoie le nombre d'octets +SELECT CHAR_LENGTH('Hello'); -- Renvoie le nombre de caractères +SELECT BIT_LENGTH('Hello'); -- Renvoie le nombre de bits +``` + +> 1 octet = 8 bits = 1 caractère + +---- + +## Fonctions Scalaires + +### TRIM + +- Supprime des caractères en début et fin de chaine. + +```mysql +-- Espaces avant et après +SELECT TRIM(' Octocorn ') AS both_espace, +-- Espaces avant +TRIM(LEADING FROM ' Octocorn ') AS lead_espace, +-- Espaces après +TRIM(TRAILING FROM ' Octocorn ') AS trail_espace, + +-- e avant et après +TRIM('e' FROM 'eeeeOctocorneeee') AS both_e, +-- e avant +TRIM(LEADING 'e' FROM 'eeeOctocorneee') AS lead_e, +-- e après +TRIM(BOTH 'e' FROM 'eeeOctocorneee') AS both_e, +``` + +---- + +## Fonctions Scalaires + +### SUBSTRING + +- Renvoie une sous chaine de caractères. + +```mysql +SELECT SUBSTRING('Octocorn', 2) AS from2, +-- Affiche après avoir sauté 1 caractères +SUBSTRING('Octocorn' FROM 3) AS from3, +-- Affiche à partir du troisième caractère +SUBSTRING('Octocorn', 2, 3) AS from2long3, +-- Affiche 3 caractères à partir du second +SUBSTRING('Octocorn' FROM 3 FOR 1) AS from3long1; +-- Affiche 1 caractère à partir du troisième +``` + +---- + +## Fonctions Scalaires + +### Changer la casse + +```mysql +SELECT UPPER('Octocorn') AS upper, -- En majuscules +LOWER('Octocorn') AS lower, -- En minuscules +``` + +> On peut aussi utiliser `UCASE` et `LCASE` + +---- + +## Fonctions Scalaires + +### LEFT et RIGHT + +- Renvoie une sous chaine de caractères. + +```mysql +SELECT LEFT('Octocorn', 2) AS left, -- 2 premiers caractères +RIGHT('Octocorn', 2) AS right; -- 2 derniers caractères +``` + +---- + +## Fonctions Scalaires + +### Et d'autres ! + +- `REVERSE` : Inverse une chaine de caractères. +- `REPEAT` : Répète une chaine de caractères. +- `REPLACE` : Remplace une chaine de caractères. +- `INSERT` : Insère une chaine de caractères. + +---- + +## Fonctions d'agrégation + +### Définition + +- Une fonction d'agrégation est une fonction qui concerne un ensemble de valeurs. +- Elles permettent entre autres de faire des statistiques, générer des totaux, groupements, etc. + +> Ecoutez bien, car vous allez avoir besoin de ces fonctions pour vos exercices ! + +---- + +## Fonctions + +### Compter + +```mysql +SELECT COUNT(*) AS nb_eleves FROM eleves; -- Nombre d'élèves +SELECT COUNT(DISTINCT classe_id) AS nb_classes FROM eleves; -- Nombre de classes +``` + +---- + +## Fonctions + +### MIN et MAX + +```mysql +SELECT MIN(date_naissance) AS min_date FROM eleves; -- Date de naissance la plus ancienne +SELECT MAX(date_naissance) AS max_date FROM eleves; -- Date de naissance la plus récente +SELECT SUM(age) AS sum_age FROM eleves; -- Somme des âges +SELECT AVG(age) AS avg_age FROM eleves; -- Moyenne des âges +``` + +---- + +## Fonctions + +### GROUP BY + +- Permet de grouper les résultats selon une colonne. +- Elimine les doublons. + +```mysql +SELECT classe_id, + COUNT(*) AS nb_eleves +FROM eleves +GROUP BY classe_id; +``` + +> Que comprenez vous ici ? + +---- + +## Fonctions + +### GROUP BY + +```mysql +SELECT classe_id, + COUNT(*) AS nb_eleves +FROM eleves +GROUP BY classe_id; +``` + +Ici, nous avons le nombre d'élèves par classe, tout simplement. + +---- + +## Fonctions + +### HAVING + +- Permet de filtrer les résultats d'un `GROUP BY`. +- Remplace le `WHERE` dans ce cas. + +```mysql +SELECT classe_id, + COUNT(*) AS nb_eleves +FROM eleves +GROUP BY classe_id +HAVING nb_eleves > 2; +``` + +> N'affichera que les classes de plus de 2 élèves. + +---- + +## A vous de jouer ! + +Réalisez la partie 2 du TP Beer ! + +---- + +## La suite ! + +[index](index.html) \ No newline at end of file diff --git a/exercices/TP Beer/partie-1.coq.md b/exercices/TP Beer/Partie 1/partie-1.coq.md similarity index 100% rename from exercices/TP Beer/partie-1.coq.md rename to exercices/TP Beer/Partie 1/partie-1.coq.md diff --git a/exercices/TP Beer/partie-1.poulet.md b/exercices/TP Beer/Partie 1/partie-1.poulet.md similarity index 100% rename from exercices/TP Beer/partie-1.poulet.md rename to exercices/TP Beer/Partie 1/partie-1.poulet.md diff --git a/exercices/TP Beer/partie-1.poussin.md b/exercices/TP Beer/Partie 1/partie-1.poussin.md similarity index 100% rename from exercices/TP Beer/partie-1.poussin.md rename to exercices/TP Beer/Partie 1/partie-1.poussin.md diff --git a/exercices/TP Beer/Partie 2/tp-beer-partie2.coq.md b/exercices/TP Beer/Partie 2/tp-beer-partie2.coq.md new file mode 100644 index 0000000..aacc9a4 --- /dev/null +++ b/exercices/TP Beer/Partie 2/tp-beer-partie2.coq.md @@ -0,0 +1,55 @@ +## 10 Listez pour chaque ticket la quantité totale d’articles vendus. (Classer par quantité décroissante) + +```mysql + +``` + +## 11 Listez chaque ticket pour lequel la quantité totale d’articles vendus est supérieure à 500. (Classer par quantité décroissante) + +```mysql +``` + +## 12 Listez chaque ticket pour lequel la quantité totale d’articles vendus est supérieure à 500. On exclura du total, les ventes ayant une quantité supérieure à 50 (classer par quantité décroissante) + +```mysql +``` + +## 13 Listez les bières de type ‘Trappiste’. (id, nom de la bière, volume et titrage) + +```mysql +``` + +## 14 Listez les marques de bières du continent ‘Afrique’ + +```mysql + +``` + +## 15 Lister les bières du continent ‘Afrique’ + +```mysql +``` + +## 16. Lister les tickets (année, numéro de ticket, montant total payé). En sachant que le prix de vente est égal au prix d’achat augmenté de 15%. + +```mysql + +``` + +## 17 Donner le C.A. par année. + +```mysql +``` + +## 18. Lister les quantités vendues de chaque article pour l’année 2016. + +```mysql + +``` + +## 19. Lister les quantités vendues de chaque article pour les années 2014, 2015, 2016. + +```mysql + +``` + diff --git a/exercices/TP Beer/Partie 2/tp-beer-partie2.poulet.md b/exercices/TP Beer/Partie 2/tp-beer-partie2.poulet.md new file mode 100644 index 0000000..6160075 --- /dev/null +++ b/exercices/TP Beer/Partie 2/tp-beer-partie2.poulet.md @@ -0,0 +1,80 @@ +## 10 Listez pour chaque ticket la quantité totale d’articles vendus. (Classer par quantité décroissante) + +```mysql + +``` + +- Vous aurez besoin de la fonction `SUM` + + + +## 11 Listez chaque ticket pour lequel la quantité totale d’articles vendus est supérieure à 500. (Classer par quantité décroissante) + +```mysql +``` + +- Vous devrez utiliser la fonction `GROUP BY` +- Vous devrez utiliser `ORDER BY` + +## 12 Listez chaque ticket pour lequel la quantité totale d’articles vendus est supérieure à 500. On exclura du total, les ventes ayant une quantité supérieure à 50 (classer par quantité décroissante) + +```mysql +``` + +- Vous réaliserez la somme des quantités vendues avec la fonction `SUM` dans le `SELECT` + +## 13 Listez les bières de type ‘Trappiste’. (id, nom de la bière, volume et titrage) + +```mysql +``` + +- Vous devrez faire une jointure avec la table `type` + +## 14 Listez les marques de bières du continent ‘Afrique’ + +```mysql + +``` + +- Vous devrez faire deux jointures + +## 15 Lister les bières du continent ‘Afrique’ + +```mysql +``` + +- Vous devrez faire trois jointures + +## 16. Lister les tickets (année, numéro de ticket, montant total payé). En sachant que le prix de vente est égal au prix d’achat augmenté de 15%. + +```mysql + +``` + +- Vous devrez faire un `SUM` sur la quantité multipliée par le prix d'achat, et ajouter 15% +- Vous devrez faire deux jointures + +> Vous aurez certainement besoin du mot `USING` dans votre requête. + +## 17 Donner le C.A. par année. + +```mysql +``` + +- Vous devrez faire la somme des quantités multipliées par le prix d'achat, et ajouter 15% au résultat (*1.15) + +## 18. Lister les quantités vendues de chaque article pour l’année 2016. + +```mysql + +``` + +- Vous devrez faire une jointure + +## 19. Lister les quantités vendues de chaque article pour les années 2014, 2015, 2016. + +```mysql + +``` + +- Vous devrez faire la somme des quantités vendues avec la fonction `SUM` dans le `SELECT` diff --git a/exercices/TP Beer/Partie 2/tp-beer-partie2.poussin.md b/exercices/TP Beer/Partie 2/tp-beer-partie2.poussin.md new file mode 100644 index 0000000..5f4b6b7 --- /dev/null +++ b/exercices/TP Beer/Partie 2/tp-beer-partie2.poussin.md @@ -0,0 +1,121 @@ +## 10 Listez pour chaque ticket la quantité totale d’articles vendus. (Classer par quantité décroissante) + +```mysql + +``` + +- Vous aurez besoin de la fonction `SUM` +- Vous devrez partir de la table `Ventes` +- Vous devrez utiliser la fonction `GROUP BY` + + + +## 11 Listez chaque ticket pour lequel la quantité totale d’articles vendus est supérieure à 500. (Classer par quantité décroissante) + +```mysql +``` + +- Vous devrez partir de la table `Ventes` +- Vous devrez utiliser la fonction `GROUP BY` +- Vous devrez utiliser `ORDER BY` + +> Attention, avec une fonction `GROUP BY`, vous ne pouvez pas utiliser `WHERE` pour filtrer les données. Vous devrez utiliser `HAVING` à la place. + +## 12 Listez chaque ticket pour lequel la quantité totale d’articles vendus est supérieure à 500. On exclura du total, les ventes ayant une quantité supérieure à 50 (classer par quantité décroissante) + +```mysql +``` + +- Vous devrez partir de la table `Ventes` +- Vous réaliserez la somme des quantités vendues avec la fonction `SUM` dans le `SELECT` +- Vous devrez utiliser `WHERE` avant `GROUP BY` +- Vous devrez utiliser la fonction `GROUP BY` et `HAVING` +- Vous terminerez par `ORDER BY` + +## 13 Listez les bières de type ‘Trappiste’. (id, nom de la bière, volume et titrage) + +```mysql +``` + +- Vous devrez partir de la table `article` +- Vous devrez faire une jointure avec la table `type` + +> Le nom de la table `type` est mal choisi, car mot réservé. Il faudra donc l'entourer de backticks. + +## 14 Listez les marques de bières du continent ‘Afrique’ + +```mysql + +``` + +- Vous devrez partir de la table `marque` +- Vous devrez faire une jointure avec la table `pays` +- Vous devrez faire une jointure avec la table `continent` +- Vous devrez utiliser la clause `WHERE` pour filtrer les données + +## 15 Lister les bières du continent ‘Afrique’ + +```mysql +``` + +- Vous devrez partir de la table `article` +- Vous devrez faire une jointure avec la table `marque` +- Vous devrez faire une jointure avec la table `pays` +- Vous devrez faire une jointure avec la table `continent` +- Vous devrez utiliser la clause `WHERE` pour filtrer les données + +## 16. Lister les tickets (année, numéro de ticket, montant total payé). En sachant que le prix de vente est égal au prix d’achat augmenté de 15%. + +```mysql + +``` + +- Vous devrez partir de la table `ticket` +- Vous devrez faire un `SUM` sur la quantité multipliée par le prix d'achat, et ajouter 15% au résultat (*1.15) +- Vous devrez faire une jointure avec la table `ventes` +- Vous devrez faire une jointure avec la table `article` +- Vous devrez utiliser la fonction `GROUP BY` pour regrouper les données par ticket et par année + +> `USING` est une alternative à `ON` pour les jointures. Il permet de faire une jointure sur une ou plusieurs colonnes portant le même nom dans les deux tables. + +```mysql +SELECT colonne1, colonne2, colonne3 +FROM table1 +INNER JOIN table2 USING (colonne1, colonne2) +``` + +## 17 Donner le C.A. par année. + +```mysql +``` + +- Vous devrez partir de la table `ventes` +- Vous devrez faire la somme des quantités multipliées par le prix d'achat, et ajouter 15% au résultat (*1.15) +- Vous devrez faire une jointure avec la table `article` +- Vous devrez utiliser la fonction `GROUP BY` pour regrouper les données par année + +## 18. Lister les quantités vendues de chaque article pour l’année 2016. + +```mysql + +``` + +- Vous devrez partir de la table `ventes` +- Vous devrez faire la somme des quantités vendues avec la fonction `SUM` dans le `SELECT` +- Vous devrez faire une jointure avec la table `article` +- Vous devrez utiliser la clause `WHERE` pour filtrer les données +- Vous devrez utiliser la fonction `GROUP BY` pour regrouper les données par article +- Vous terminerez par `ORDER BY` + +## 19. Lister les quantités vendues de chaque article pour les années 2014, 2015, 2016. + +```mysql + +``` + +- Vous devrez partir de la table `ventes` +- Vous devrez faire la somme des quantités vendues avec la fonction `SUM` dans le `SELECT` +- Vous devrez faire une jointure avec la table `article` +- Vous devrez utiliser la clause `WHERE` pour filtrer les données sur les années, avec `BETWEEN` +- Vous devrez utiliser la fonction `GROUP BY` pour regrouper les données par article et par année +- Vous terminerez par `ORDER BY`