## Particularités de la fonction COUNT

* `COUNT(*)`: compte le nombre de t-uplets obtenus dans la requête (lignes)

* `COUNT attribut`: compte le nombre de valeurs de l'attribut différentes de NULL

* `COUNT(DISTINCT attribut)`: compte le nombre de valeurs différentes de l'attribut

`COUNT(DISTINCT attribut)` n'existe pas dans tous les SGBD
Utilisations de la fonction COUNT

<figure><img src="image_290.png" /></figure>

SELECT count(*)
FROM ingredient

count(*)

9

SELECT count(ingLocation) AS NB Location
FROM ingredient

NB Location

8

SELECT count(Distinct ingLocation) AS
NB Location
FROM ingredient

NB Location

7

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>
Utilisations de la fonction COUNT

<figure><img src="image_291.png" /></figure>

SELECT count(*)
FROM ingredient

count(*)

9

SELECT count(ingLocation) AS NB Located
FROM ingredient

NB Location

8

SELECT count(Distinct ingLocation) AS
NB Location
FROM ingredient

NB Location

7

<table><thead><tr><td>idIngredient</td><td>ingName</td><td>ingLocation</td></tr></thead><tbody><tr><td>1</td><td>water</td><td>anywhere</td></tr><tr><td>2</td><td>mistletoe</td><td>tree</td></tr><tr><td>3</td><td>Apple</td><td>Apple tree</td></tr><tr><td>4</td><td>Beer</td><td>hostel</td></tr><tr><td>5</td><td>Honey</td><td>forest</td></tr><tr><td>6</td><td>Lemon</td><td>Lemon tree</td></tr><tr><td>7</td><td>Raspberry</td><td>Garden</td></tr><tr><td>8</td><td>green salad</td><td>Garden</td></tr><tr><td>9</td><td>Strawberry</td><td>NULL</td></tr></tbody></table>
Pour chaque potion : son nombre d'ingrédients

<figure><img src="image_291.png" /></figure>

<figure><img src="image_292.png" /></figure>

<figure><img src="image_293.png" /></figure>

<figure><img src="image_294.png" /></figure>

Où sont les informations qui nous intéressent ?
Pour chaque potion : son nombre d'ingrédients

<figure><img src="image_292.png" /></figure>

<figure><img src="image_293.png" /></figure>

<figure><img src="image_294.png" /></figure>

<figure><img src="image_295.png" /></figure>

Où sont les informations qui nous intéressent ?
<figure><img src="image_295.png" /></figure>

<figure><img src="image_296.png" /></figure>

<figure><img src="image_297.png" /></figure>

<figure><img src="image_298.png" /></figure>

Où sont les informations qui nous intéressent ?
<figure><img src="image_296.png" /></figure>

<figure><img src="image_297.png" /></figure>

<figure><img src="image_298.png" /></figure>

<figure><img src="image_299.png" /></figure>

Où sont les informations qui nous intéressent ?
Pour chaque potion : son nombre d'ingrédients

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idPotion</td><td>nbre_Ingredients</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>
Pour chaque potion : son nombre d'ingrédients

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idPotion</td><td>nbre_Ingredients</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>
## La clause GROUP BY

Permet de subdiviser la table en groupes

Une seule ligne représente l'ensemble des t-uplets de la table regroupés, tous les t-uplets regroupés ont la même valeur pour les expressions du regroupement

Souvent utilisée avec une fonction de groupe

<figure><img src="image_299.png" /></figure>

GROUP BY expr1, expr2, ...
## La clause GROUP BY

Permet de subdiviser la table en groupes

Une seule ligne représente l'ensemble des t-uplets de la table regroupés, tous les t-uplets regroupés ont la même valeur pour les expressions du regroupement

Souvent utilisée avec une fonction de groupe

<figure><img src="image_300.png" /></figure>

GROUP BY expr1, expr2, ...
<figure><img src="image_300.png" /></figure>

Comment regrouper ?

Par potion : idPotion

Choisir pour le regroupement un attribut significatif (ici la clé de potion)

Compter combien on a d'ingrédients dans chaque groupe
<figure><img src="image_301.png" /></figure>

Comment regrouper ?

Par potion : idPotion

Choisir pour le regroupement un attribut significatif (ici la clé de potion)

Compter combien on a d'ingrédients dans chaque groupe
Pour chaque potion : son nombre d'ingrédients

<figure><img src="image_301.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1, 2, 5</td><td>1</td><td>2, 1, 1</td></tr><tr><td>4</td><td>4</td><td>1</td></tr></tbody></table>

Regroupement potion : idPotion
Pour chaque potion : son nombre d'ingrédients

<figure><img src="image_302.png" /></figure>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1, 2, 5</td><td>1</td><td>2, 1, 1</td></tr><tr><td>4</td><td>4</td><td>1</td></tr></tbody></table>

Regroupement potion : idPotion
Pour chaque potion : son nombre d'ingrédients

<figure><img src="image_302.png" /></figure>

SELECT idPotion, count(*)
FROM composition
GROUP BY idPotion

<table><thead><tr><td>idPotion</td><td>count(*)</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>
Pour chaque potion : son nombre d'ingrédients

<figure><img src="image_303.png" /></figure>

SELECT idPotion, count(*)
FROM composition
GROUP BY idPotion

<table><thead><tr><td>idPotion</td><td>count(*)</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>
Les restrictions de la clause GROUP BY

Les seules opérations réalisables sur une "table regroupée" sont :

* opérations qui prennent en compte un ensemble de lignes (fonctions de groupe)

* opérations de projection portant sur des attributs impliqués dans le regroupement
Les restrictions de la clause GROUP BY

Les seules opérations réalisables sur une "table regroupée" sont :

* opérations qui prennent en compte un ensemble de lignes (fonctions de groupe)

* opérations de projection portant sur des attributs impliqués dans le regroupement
Les restrictions de la clause GROUP BY

<figure><img src="image_303.png" /></figure>

<figure><img src="image_304.png" /></figure>

Fonctions de groupe
Les restrictions de la clause GROUP BY

<figure><img src="image_304.png" /></figure>

<figure><img src="image_305.png" /></figure>

Fonctions de groupe
La clause HAVING

* Permet de sélectionner des groupes définis par la clause GROUP BY

* Même syntaxe que le prédicat de la clause WHERE

* Ne porte que sur les caractéristiques du groupe

<figure><img src="image_305.png" /></figure>

HAVING critère de sélection de
groupes
La clause HAVING

* Permet de sélectionner des groupes définis par la clause GROUP BY

* Même syntaxe que le prédicat de la clause WHERE

* Ne porte que sur les caractéristiques du groupe

<figure><img src="image_306.png" /></figure>

HAVING critère de sélection de
groupes
Potions dont le nombre d'ingrédients est supérieur à 2

<figure><img src="image_306.png" /></figure>

```sql
SELECT idPotion, count(*)
FROM composition
GROUP BY idPotion
```

<table><thead><tr><td>idPotion</td><td>count(*)</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>

Repartons de la requête vue précédemment qui compte les ingrédients par potion
Potions dont le nombre d'ingrédients est supérieur à 2

<figure><img src="image_307.png" /></figure>

SELECT idPotion, count(*)
FROM composition
GROUP BY idPotion

<table><thead><tr><td>idPotion</td><td>count(*)</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>

Repartons de la requête vue précédemment qui compte les ingrédients par potion
Potions dont le nombre d'ingrédients est supérieur à 2

<figure><img src="image_307.png" /></figure>

SELECT idPotion

FROM composition

GROUP BY idPotion

HAVING count(*) > 2

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idPotion</td><td>count(*)</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>

<table><tr><td>idPotion</td></tr><tr><td>1</td></tr></table>
Potions dont le nombre d'ingrédients est supérieur à 2

<figure><img src="image_308.png" /></figure>

SELECT idPotion

FROM composition

GROUP BY idPotion

HAVING count(*) > 2

<table><thead><tr><td>idIngredient</td><td>idPotion</td><td>comQuantity</td></tr></thead><tbody><tr><td>1</td><td>1</td><td>2</td></tr><tr><td>2</td><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td><td>10</td></tr><tr><td>5</td><td>1</td><td>1</td></tr></tbody></table>

<table><thead><tr><td>idPotion</td><td>count(*)</td></tr></thead><tbody><tr><td>1</td><td>3</td></tr><tr><td>4</td><td>1</td></tr></tbody></table>

<table><tr><td>idPotion</td></tr><tr><td>1</td></tr></table>
Les restrictions de la clause HAVING

Liées aux restrictions de la clause GROUP BY

Les seules expressions réalisables dans une clause HAVING sont :

* des expressions qui utilisent des fonctions de groupe sur les attributs qui ne font pas partie du regroupement,

* des expressions utilisant sous une forme quelconque les attributs du regroupement
Les restrictions de la clause HAVING

Liées aux restrictions de la clause GROUP BY

Les seules expressions réalisables dans une clause HAVING sont :

* des expressions qui utilisent des fonctions de groupe sur les attributs qui ne font pas partie du regroupement,

* des expressions utilisant sous une forme quelconque les attributs du regroupement
Les restrictions de la clause
HAVING

<figure><img src="image_308.png" /></figure>

<figure><img src="image_309.png" /></figure>

Fonctions de groupe

GROUP BY idPotion
HAVING count(distinct idIngredient) > 3

<figure><img src="image_310.png" /></figure>

GROUP BY idPotion
HAVING count(comQuantity) > 2

<figure><img src="image_311.png" /></figure>

GROUP BY idPotion
HAVING comQuantity = 2

<figure><img src="image_312.png" /></figure>
# Les restrictions de la clause HAVING

<figure><img src="image_309.png" /></figure>

<figure><img src="image_310.png" /></figure>

Regroupement

Fonctions de groupe

GROUP BY idPotion
HAVING
count(distinct idIngredient) > 3

<figure><img src="image_311.png" /></figure>

GROUP BY idPotion
HAVING
count(comQuantity) > 2

<figure><img src="image_312.png" /></figure>

GROUP BY idPotion
HAVING comQuantity =
2

<figure><img src="image_313.png" /></figure>
## La clause `ORDER BY`

Permet de préciser dans quel ordre les t-uplets sélectionnés seront donnés.

Le tri peut s'effectuer selon plusieurs critères, en allant du premier critère au dernier.

<figure><img src="image_313.png" /></figure>

ORDER BY expr1 [DESC, ASC] [, expr2 [DESC, ASC], ...]
## La clause `ORDER BY`

Permet de préciser dans quel ordre les t-uplets sélectionnés seront donnés.

Le tri peut s'effectuer selon plusieurs critères, en allant du premier critère au dernier.

<figure><img src="image_314.png" /></figure>

Syntaxe
```
ORDER BY expr1 [DESC, ASC] [, expr2 [DESC, ASC], ...]
```
Potion par ordre croissant de nom de
potion

<figure><img src="image_314.png" /></figure>

SELECT *

FROM potion

ORDER BY poName

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr></tbody></table>

Par défaut : ordre croissant
Potion par ordre croissant de nom de
potion

<figure><img src="image_315.png" /></figure>

SELECT *

FROM potion

ORDER BY poName

<table><thead><tr><td>idPotion</td><td>poName</td><td>poEffect</td><td>poDuration</td></tr></thead><tbody><tr><td>4</td><td>Anger potion</td><td>Makes you angry</td><td>5</td></tr><tr><td>2</td><td>Happiness Potion</td><td>Makes people happy</td><td>120</td></tr><tr><td>3</td><td>Invisibility Potion</td><td>Makes you invisible</td><td>10</td></tr><tr><td>1</td><td>Magic potion</td><td>Makes you strong</td><td>30</td></tr></tbody></table>

Par défaut : ordre croissant
Les compositions par quantité et id d'ingrédient

<figure><img src="image_315.png" /></figure>

SELECT *

FROM composition

ORDER BY comQuantity, idIngredient

<table><thead><tr><th>idIngredient</th><th>comQuantity</th></tr></thead><tbody><tr><td>2</td><td>1</td></tr><tr><td>5</td><td>1</td></tr><tr><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td></tr></tbody></table>
Les compositions par quantité et id d'ingrédient

<figure><img src="image_316.png" /></figure>

SELECT *

FROM composition

ORDER BY comQuantity, idIngredient

<table><thead><tr><th>idIngredient</th><th>comQuantity</th></tr></thead><tbody><tr><td>2</td><td>1</td></tr><tr><td>5</td><td>1</td></tr><tr><td>1</td><td>1</td></tr><tr><td>4</td><td>4</td></tr></tbody></table>
Et maintenant à vous de
jouer !!!

<figure><img src="image_316.png" /></figure>
Et maintenant à vous de
jouer !!!

<figure><img src="image_317.png" /></figure>