diff --git a/Aggregation/linar_regression.md b/Aggregation/linar_regression.md new file mode 100644 index 0000000..0fbb9a8 --- /dev/null +++ b/Aggregation/linar_regression.md @@ -0,0 +1,25 @@ +# Agrégation - Régression linéaire + +> La régression linéaire est un modèle qui cherche à établir une relation linéaire entre une variable, dite expliquée, et une ou plusieurs variables, dites explicatives. + +La régression linéaire simple cherche une droite : y = a⋅x + b + +- a est la pente de la droite (slope), +- b est l’ordonnée à l’origine (intercept). + +![Régression linéaire](regression.svg) + +`REGR_SLOPE(y, x)` Calcule la pente de la droite (a), + +`REGR_INTERCEPT(y, x)` Calcule l’ordonnée à l’origine (b). + +`REGR_R2(y, x)` Coefficient de détermination (entre 0 et 1). + +Mesure la qualité de l’ajustement : + +- 1 : la droite explique parfaitement les données, +- 0 : aucun lien linéaire, + +plus c’est proche de 1, plus la droite est pertinente. + +`REGR_COUNT(y, x)` Nombre de paires (x, y) effectivement utilisées (hors NULL) pour effectuer le calcul. Équivalent à COUNT(*) mais appliqué seulement sur les deux colonnes non nulles. diff --git a/regression.svg b/Aggregation/regression.svg similarity index 97% rename from regression.svg rename to Aggregation/regression.svg index a44e0b5..0096689 100644 --- a/regression.svg +++ b/Aggregation/regression.svg @@ -14,6 +14,7 @@ +b diff --git a/Home.md b/Home.md index 1009c6e..709fcc7 100644 --- a/Home.md +++ b/Home.md @@ -1,6 +1,7 @@ # fonctions avancées du langage SQL - [Fonctions d'agrégation](aggregation.md) + - [Régression linéaire](Aggregation/linear_regression.md) - [Jointure](Jointure.md) - [Sous requêtes](sousrequete.md) - [Vues et fonctions](View.md) @@ -11,6 +12,10 @@ ## Exercices +### Jointures + +- Lister les articles dont la famille n'existe pas. + Arrondir les montant à deux chiffres après la virgule. - 1a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket. diff --git a/aggregation.md b/aggregation.md index 1caa656..f95cbd4 100644 --- a/aggregation.md +++ b/aggregation.md @@ -287,36 +287,6 @@ Retourne la valeur la plus fréquente. Ces fonctions sont en réalité des [fenêtres analytiques](window.md) mais peuvent être utilisées pour explorer la distribution. -## Régressions linéaires simples - -Ces fonctions permettent de réaliser des régressions linéaires simples directement en SQL, c’est-à-dire d’ajuster une droite de tendance entre deux ensembles de données numériques (variables x et y). - -On suppose qu’on a deux variables : -- x : la variable explicative (indépendante), -- y : la variable à expliquer (dépendante). - -La régression linéaire simple cherche une droite : y = a⋅x + b - -- a est la pente (slope). -- b est l’ordonnée à l’origine (intercept), - -![Régression linéaire](regression.svg) - - -`REGR_SLOPE(y, x)` Calcule la pente de la droite (a), - -`REGR_INTERCEPT(y, x)` Calcule l’ordonnée à l’origine (b). - -`REGR_R2(y, x)` Coefficient de détermination (entre 0 et 1). - -Mesure la qualité de l’ajustement : - -- 1 : la droite explique parfaitement les données, -- 0 : aucun lien linéaire, - -plus c’est proche de 1, plus la droite est pertinente. - -`REGR_COUNT(y, x)` Nombre de paires (x, y) effectivement utilisées (hors NULL) pour effectuer le calcul. Équivalent à COUNT(*) mais appliqué seulement sur les deux colonnes non nulles. ## Agrégats d'intervalles diff --git a/sousrequete.md b/sousrequete.md index 8a3aa3e..60a7b2f 100644 --- a/sousrequete.md +++ b/sousrequete.md @@ -18,7 +18,29 @@ Parce qu’elle doit produire une table (un jeu de résultats) indépendante **a - Dans le SELECT, une sous-requête peut être corrélée (elle utilise des colonnes de la requête principale) ou non. - Dans le WHERE, idem : elle peut être corrélée (EXISTS, IN dépendant de la ligne en cours) ou non (test fixe). -**Exercice : ** Sélectionner les articles dont le prix est supérieur à la moyenne générale des prix des articles. +## Sous-requête scalaire + +> une sous-requête scalaire est une sous-requête qui retourne **une seule valeur** (un scalaire, c’est-à-dire une seule ligne et une seule colonne). + +Elle peut être utilisée partout où une valeur simple est attendue, par exemple : + +- dans la liste de sélection (SELECT), +- dans une clause WHERE, +- dans une clause HAVING, +- parfois même dans la clause ORDER BY. + +```sql +SELECT * +FROM table +WHERE nom_colonne = ( + SELECT valeur + FROM table2 + LIMIT 1 +) +``` + + +**Exercice :** Sélectionner les articles dont le prix est supérieur à la moyenne générale des prix des articles. Dans un langage procédural on utiliserait deux étapes pour obtenir le résultat. Première étape calculer la moyenne des prix @@ -44,6 +66,14 @@ select * from article Cette fois ci il faut calculer les moyennes des prix pour chacune des familles et comparer les articles avec la moyenne correspondante. Ce n'est plus possible en programmation procédurale. +```sql +select avg(prix) from article where famille_code = '02CHOU'; +select * from article where prix > 3.68 and famille_code = '02CHOU'; + +select avg(prix) from article where famille_code = '02NARU'; +select * from article where prix > 2.47 and famille_code = '02NARU'; +``` + La sous requête permet de calculer pour chaque ligne d'article la moyenne correspondante à la famille du dit article. ```sql @@ -56,33 +86,6 @@ select code, article, prix from article a1 Remarquez l'utilisation de l'alias `a1` sur la table de la requête principale pour pouvoir être injecter sans confusion dans la sous requête car celle-ci utilise la même table. -## Sous-requête scalaire - -> une sous-requête scalaire est une sous-requête qui retourne **une seule valeur** (un scalaire, c’est-à-dire une seule ligne et une seule colonne). - -Elle peut être utilisée partout où une valeur simple est attendue, par exemple : - -- dans la liste de sélection (SELECT), -- dans une clause WHERE, -- dans une clause HAVING, -- parfois même dans la clause ORDER BY. - -```sql -SELECT * -FROM table -WHERE nom_colonne = ( - SELECT valeur - FROM table2 - LIMIT 1 -) -``` - -Sélection des articles dont le prix est supérieur à la moyenne des prix de tous les articles - -```sql -select * from article - where prix > (select avg(prix) from article); -``` ## Conditions diff --git a/window.md b/window.md index 02e71c5..39c6b66 100644 --- a/window.md +++ b/window.md @@ -226,13 +226,14 @@ from ca_mensuel order by mois ``` -### Moyenne glissante sur 3 mois +**Exercice :** Calculer la moyenne glissante sur 3 mois ```sql -select *, round(AVG(total) over ( - order by mois - rows between 2 preceding and current row -), 2) as moyenne_glissante_3 +select *, + round(AVG(total) over ( + order by mois + rows between 2 preceding and current row + ), 2) as moyenne_glissante_3 from ca_mensuel order by mois ```