diff --git a/aggregation.md b/aggregation.md index 3521a1d..8492f97 100644 --- a/aggregation.md +++ b/aggregation.md @@ -1,11 +1,11 @@ # Fonctions d'agrégation > [!NOTE] -> Une agrégation est une opération qui permet de combiner plusieurs valeurs de données en une seule valeur résumée. Les opérations d'agrégation sont souvent utilisées en combinaison avec la clause `group by` pour regrouper les données selon des critères spécifiques avant de les résumer. +> Une agrégation est une opération qui permet de combiner **plusieurs valeurs de données en une seule valeur** résumée. Les opérations d'agrégation sont souvent utilisées en combinaison avec la clause `group by` pour regrouper les données selon des critères spécifiques avant de les résumer. -### Compter +## Compter -Compte le nombre d'enregistrements dans un ensemble de données. +L'opérateur `count` Compte le nombre d'enregistrements dans un ensemble de données. **Exercice :** Compter le nombre d'adhérents. @@ -16,6 +16,16 @@ select count(*) from adherent On peut compter sur n'importe quelle colonne, dans ce cas, pour ne pas avoir à choisir on utilise le caractère joker *. +> [!WARNING] +> Attention ! Si on compte sur une colonne seules les lignes avec une valeur **non nulle** seront comptées. + +**Exercice :** Compter le nombre d'adhérent dont le codepostal est non null. + +```sql +select count(codepostal) from adherent; +>> 2438 +``` + **Exercice :** Compter le nombre d'articles de la famille 02CHOU. ```sql @@ -24,7 +34,7 @@ select count(*) from article >> 29 ``` -### distinct +## distinct En ajoutant le mot clé `distinct` l'opération s'effectue sur les **valeurs uniques** d'une ou de plusieurs colonnes.select codepostal, count(case when genre = 1 then 1 end) as nb_hommes, @@ -39,19 +49,17 @@ select count(distinct codepostal) from adherent >> 11 ``` -Attention ! Sans distinct `count(codepostal)` compte **toutes** les lignes de la colonne codepostal, soit le nombre total d'ahérent. - -```sql -select count(codepostal) from adherent ->> 2439 -``` +> [!WARNING] +> Attention ! Sans distinct, `count(codepostal)` compte **toutes** les lignes de la colonne codepostal dont la valeur est non nulle. Dans notre cas pratiquement tous les adhérents (2438/2439). ### Regroupement la clause `group by` permet de choisir un ou plusieurs niveau de regroupement. ```sql -select codepostal, count(*) from adherent group by codepostal; +select codepostal, count(*) + from adherent + group by codepostal; ``` codepostal | count @@ -74,7 +82,8 @@ Il est possible de donner un nom spécifique à n'importe qu'elle colonne y comp ```sql select codepostal, count(*) as nb_adherents - from adherent group by codepostal; + from adherent + group by codepostal; ``` ### Filtre @@ -134,7 +143,7 @@ from adherent group by codepostal; ``` -### Somme +## Somme Calcule la somme des valeurs d'une colonne numérique. @@ -154,7 +163,7 @@ select sum(round(quantite * prix_unitaire, 2)) as chiffre_affaire from ligne; L'arrondi de la somme n'est pas égal à la somme des arrondis. -### Moyenne +## Moyenne Calcule la moyenne des valeurs d'une colonne numérique. @@ -162,7 +171,7 @@ Calcule la moyenne des valeurs d'une colonne numérique. select avg(prix) from article; ``` -### Maximum +## Maximum Retourne la valeur maximale dans une colonne. @@ -180,7 +189,7 @@ order by prix desc limit 1; >> Pistache 63 € ``` -### Minimum +## Minimum Retourne la valeur minimale dans une colonne. @@ -199,16 +208,68 @@ order by prix asc limit 1; ### Une valeur -Avec la fonction `any_value` la colonne prend une valeur sans aucune distinction. +Avec la fonction `any_value` la colonne prend une valeur de la colonne sans distinction particulière. + +```sql +select codepostal, any_value(nom) + from adherent + group by codepostal; +``` + +codepostal | nom +---|--- +88480|Fievet +88490|Maury +88100|Cuvelier +88470|Maurin + |Jouve +88210|Aubertin +88650|Wagner +88580|Beaulieu +88430|Baudouin +88520|Bérard +88110|Frémont +88420|Besnard ### Toutes La fonction `bool_and` ou son alias `every` renvoie vrai si toutes les lignes satisfont la condition. +**Exercice :** Afficher vrai si tous les articles d'une même famille ont tous leur prix supérieur à 10 € + +```sql +select famille_code, bool_and(prix > 10) as sup_10 + from article + group by famille_code +``` + +famille_code | sup_10 +---|--- +03BANA | false +03PECHE|false +03RHUBARBE|false +03FIGUE|true +03ORANGE|false + ### Au moins un La fonction `bool_or` renvoie vrai si au moins une lignes satisfait la condition. +**Exercice :** Afficher vrai si au moins un article d'une famille a un prix supérieur à 5 € + +```sql +select famille_code, bool_or(prix > 5) as sup_5 + from article + group by famille_code +``` + +famille_code | sup_5 +---|--- +03BANA | false +03PECHE|true +03RHUBARBE|true +03FIGUE|true +03ORANGE|false ### Concaténation en chaine @@ -217,12 +278,19 @@ La fonction `bool_or` renvoie vrai si au moins une lignes satisfait la condition ```sql select string_agg(distinct famille_code, ', ') from article; +>> '02, 02AROM, 02ARTICHAU, 02ASP, 02AUBE, 02BETT, ...' ``` ### Concaténation en tableau `ARRAY_AGG` construit une tableau à partir des éléments. Très utilisé lors d'une sérialisation en JSON par exemple. +```sql +select array_agg(distinct famille_code) +from article; +>> ['02', '02AROM', '02ARTICHAU', '02ASP', '02AUBE', '02BETT', ...] +``` + ### Filtre après agrégation `HAVING` est emblable à `WHERE`, mais utilisé pour filtrer les résultats des fonctions d'agrégation **après** un `GROUP BY`. diff --git a/tp1.md b/tp1.md index db4312e..da38c8a 100644 --- a/tp1.md +++ b/tp1.md @@ -1,14 +1,15 @@ # Travaux pratiques de Cartographie -1. Avec le logiciel QGIS +## 1. Logiciel de catographie +Installer QGIS Ajouter les couches - AJouter une couche xyz avec OpenStreetMap - Zommer sur l'ile de Batz (En Bretagne, au nord de Morlaix) -### POI (Point of Interest) +## 2 POI (Point of Interest) - Ajouter une nouvelle table pour les points - Ajouter un point depuis QGIS : menhir de Kreach ar Bolloch (A) un autre sur le menhir de Porz ar Roc'h - Calculer la distance entre les 2 menhirs @@ -23,7 +24,7 @@ create table point ( ); ``` -2. Créer une table zone +3. Créer une table zone ```sql create table zone ( @@ -56,8 +57,8 @@ create table zone ( ### La Pinède - Dessiner la pinède ouest en faisant 3 parties (utiliser le magnétisme) - Vérifier que les 3 parties sont adjacentes -- Fusionner les 3 parties -- Retirer le marais de la pinède +- Fusionner les 3 parties (ST_UNION) +- ### Carte - Importer les données du fichier zone.csv