Questions

2025-08-30 13:50:45 +02:00
parent 30dab11fc7
commit 6e54f5d61d
6 changed files with 63 additions and 56 deletions

@@ -1,6 +1,5 @@
# Exercices
- 1 : Lister tous les tickets avec le nom du client. Afficher uniquement les tickets qui ont un client existant.
- 2 : Lister tous les clients et le nombre de tickets associés, même les clients qui nont pas encore de ticket doivent apparaître (avec 0).
- 3 : Lister tous les tickets, avec le nom du client sil existe. Si un ticket a perdu sa référence client (valeur orpheline), il doit tout de même apparaître.

32
Home.md

@@ -10,23 +10,21 @@
Arrondir les montant à deux chiffres après la virgule.
- 3a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket.
- 3b : Quel est le détail du nombre de ticket pour ceux dont le nom de famille est Lavergne ? (11 et 2)
- 3c : Quels sont les personnes qui ont exactement 72 tickets ? (Cote et Lebreton)
- 4 : Afficher l'article le plus cher et l'article le moins cher (avec leur prix). (Pistache 63 et Courgette Mini Fleur 0.3)
- 5a : Calculer le montant moyen dun ticket. (18.84)
- 5b : Calculer le nombre moyen d'article distinct d'un ticket. (6.69)
- 5c : Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1. (7.22)
- 6a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés.
- 6b : Quel est le nombre d'article de la famille 02CHOU. (29)
- 6c : Quelles sont les familles qui ont 2 ou moins d'articles ? ()
- 7a : Afficher, pour chaque mois, le chiffre daffaires réalisé.
- 7b : Quel est le chiffre d'affaire du mois d'avril 2016. (20042.39)
- 8 : Trouver les 3 adhérents qui ont dépensé le plus en montant total. (Collot, Gérard, Blandin)
- 9a : Afficher l'article facturé au poids ayant généré le plus de ventes en quantité totale vendue. (Pomme)
- 9b : Afficher l'article facturé à l'unité ayant généré le plus de ventes en quantité totale vendue. (Oeufs Boite 6)
- 10a : Pour chaque famille, afficher le montant total des ventes.
- 10b : Quel est le montant total des ventes de la famille 03FRAISE. (10368.69)
- 1a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket.
- 1b : Quel est le détail du nombre de ticket pour ceux dont le nom de famille est Lavergne ? (11 et 2)
- 2a : Calculer le montant moyen dun ticket. (18.84)
- 2b : Calculer le nombre moyen d'article distinct d'un ticket. (6.69)
- 2c : Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1. (7.22)
- 3a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés.
- 3b : Quel est le nombre d'article de la famille 02CHOU. (29)
- 3c : Quelles sont les familles qui ont 2 ou moins d'articles ? ()
- 4a : Afficher, pour chaque mois, le chiffre daffaires réalisé.
- 4b : Quel est le chiffre d'affaire du mois d'avril 2016. (20042.39)
- 5 : Trouver les 3 adhérents qui ont dépensé le plus en montant total. (Collot, Gérard, Blandin)
- 6a : Afficher l'article facturé au poids ayant généré le plus de ventes en quantité totale vendue. (Pomme)
- 6b : Afficher l'article facturé à l'unité ayant généré le plus de ventes en quantité totale vendue. (Oeufs Boite 6)
- 7a : Pour chaque famille, afficher le montant total des ventes.
- 7b : Quel est le montant total des ventes de la famille 03FRAISE. (10368.69)
- 11a : Combien d'adhérents nont jamais acheté d'article ? (273)
- 11b : Combien d'adhérents nont aucun ticket ? (261)

@@ -101,6 +101,14 @@ WHERE gauche IS NULL;
```
![](jointures/rightantijoin.svg)
Lister les articles dont la famille n'existe pas.
```sql
select a.* from article a
left join famille f on f.code = a.famille_code
where f.code is null
```
## Jointure croisée ou produit cartésien
La jointure croisée renvoie le produit cartésien des deux tables. Chaque ligne de la première table est combinée avec chaque ligne de la deuxième table. Cela produit un très grand nombre de lignes de résultat.
@@ -172,7 +180,7 @@ WHERE A.id = B.a_id;
Les jointures d'exclusion peuvent aussi s'écrire avec une sous requête et une condition `EXISTS`.
```sql
SELECT gauxhe.*
SELECT gauche.*
FROM gauche g
WHERE NOT EXISTS (
SELECT 1
@@ -187,6 +195,12 @@ Avantages :
- Robuste face aux valeurs NULL (pas dambiguïté).
- Souvent optimisé par le moteur en anti-semi-join (cest-à-dire que le moteur ne lit pas plus de lignes que nécessaire dans la table de droite). Les jointures qui passent par des produits cartésiens sont consommatrices en ressources.
```sql
select a.* from article a
where not exists (select 1 from famille where a.famille_code = famille.code)
```
```sql
SELECT g.*
FROM gauche g

@@ -1,13 +1,13 @@
-- Réponses questions de 1 à 10
-- 3a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket.
-- 1a : Pour chaque adhérent unique, afficher son nom et son nombre de ticket.
select a.nom,
count(t.id) as nb_ticket
from adherent a
join ticket t on a.id = t.adherent_id
group by a.id;
-- 3b : Quel est le détail du nombre de ticket pour ceux dont le nom de famille est Lavergne ?
-- 1b : Quel est le détail du nombre de ticket pour ceux dont le nom de famille est Lavergne ?
select a.nom, a.prenom,
count(t.id) as nb_ticket
from adherent a
@@ -15,24 +15,9 @@ join ticket t on a.id = t.adherent_id
where a.nom = 'Lavergne'
group by a.id;
-- 3c : Quels sont les personnes quiont exactement 72 tickets ?
select a.nom, a.prenom,
count(t.id) as nb_ticket
from adherent a
join ticket t on a.id = t.adherent_id
group by a.id
having count(t.id) = 72;
-- 4 : Afficher le produit le plus cher et le produit le moins cher (avec leur prix).
-- Pistache 63
-- Courgette Mini Fleur 0.3
-- ------------------------------------------------------------
-- 5a : Calculer le montant moyen dun ticket.
-- 2a : Calculer le montant moyen dun ticket.
-- 18.84
select round(avg(total_ticket),2) as panier_moyen
from (
@@ -42,7 +27,7 @@ from (
group by t.id
) sous_requete;
-- 5b : Calculer le nombre moyen d'article distinct d'un ticket.
-- 2b : Calculer le nombre moyen d'article distinct d'un ticket.
-- 6.69
SELECT round(avg(nb_articles_distincts),2) AS moyenne_articles_distincts
FROM (
@@ -52,7 +37,7 @@ FROM (
GROUP BY t.id
) sub;
-- 5c Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1.
-- 2c Calculer le nombre moyen d'article d'un ticket. Les articles facturés au poids comptent pour 1.
-- 7.21
SELECT round(AVG(nb_articles),2) AS moyenne_articles_par_ticket
FROM (
@@ -71,27 +56,27 @@ FROM (
-- ------------------------------------------------------------
-- 6a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés.
-- 3a : Pour chaque famille, afficher le nom de la famille et le nombre d'articles associés.
select f.code, count(a.code) as nb_produits
from famille f
left join article a on f.code = a.famille_code
group by f.code;
-- 6b
-- 3b
select f.famille, count(a.code) as nb_produits
from famille f
left join article a on f.code = a.famille_code
where f.code = '02CHOU'
group by f.famille;
-- 6c
-- 3c
select f.code, count(a.code) as nb_produits
from famille f
left join article a on f.code = a.famille_code
group by f.code
having count(a.code) <= 2;
-- 7 : Afficher, pour chaque mois, le chiffre daffaires réalisé.
-- 4a : Afficher, pour chaque mois, le chiffre daffaires réalisé.
select date_trunc('month', t.date_ticket) as mois,
sum(l.quantite * l.prix_unitaire) as montant_mensuel
from ticket t
@@ -99,14 +84,14 @@ join ligne l on t.id = l.ticket_id
group by date_trunc('month', t.date_ticket)
order by mois;
-- 7b
-- 4b
select
round(sum(l.quantite * l.prix_unitaire),2) as montant_mensuel
from ticket t
join ligne l on t.id = l.ticket_id
where date_trunc('month', t.date_ticket) = '2016-04-01';
-- 8 : Trouver les 3 adhérents qui ont dépensé le plus en montant total.
-- 5 : Trouver les 3 adhérents qui ont dépensé le plus en montant total.
select a.nom, sum(l.quantite * l.prix_unitaire) as total_depense
from adherent a
join ticket t on a.id = t.adherent_id
@@ -115,7 +100,7 @@ group by a.nom
order by total_depense desc
limit 3;
-- 9a : Afficher l'article ayant généré le plus de ventes en quantité totale vendue.
-- 6a : Afficher l'article ayant généré le plus de ventes en quantité totale vendue.
select a.article, sum(l.quantite) as total_vendu
from article a
join ligne l on a.code = l.article_code
@@ -124,7 +109,7 @@ group by a.article
order by total_vendu desc
limit 1
-- 9b : Afficher l'article ayant généré le plus de ventes en quantité totale vendue.
-- 6b : Afficher l'article ayant généré le plus de ventes en quantité totale vendue.
select a.article, sum(l.quantite) as total_vendu
from article a
join ligne l on a.code = l.article_code
@@ -133,7 +118,7 @@ group by a.article
order by total_vendu desc
limit 1
-- 10 : Pour chaque famille, afficher le montant total des ventes.
-- 7a : Pour chaque famille, afficher le montant total des ventes.
select f.code,
sum(l.quantite * l.prix_unitaire) as total_famille
from famille f
@@ -142,7 +127,7 @@ join ligne l on a.code = l.article_code
group by f.code
order by total_famille desc;
-- 10b
-- 7b
select f.code,
round(sum(l.quantite * l.prix_unitaire),2) as total_famille
from famille f

@@ -38,10 +38,6 @@ JOIN ligne l ON l.article_code = a.code
GROUP BY a.code
HAVING COUNT(*) = 1;
-- 13 Lister les articles dont la famille est absente
select a.* from article a
left join famille f on f.code = a.famille_code
where f.code is null
-- 14

@@ -69,6 +69,8 @@ SELECT MAX(age) FROM utilisateurs;
Une autre solution consiste à trier la colonne est de limiter le résultat à une seule ligne
Afficher l'article le plus cher (avec son prix). (Pistache 63 €)
```sql
select article, prix from article
order by prix desc limit 1;
@@ -84,6 +86,8 @@ SELECT MIN(age) FROM utilisateurs;
Une autre solution consiste à trier la colonne est de limiter le résultat à une seule ligne
Afficher l'article le moins cher (avec son prix). (Courgette Mini Fleur 0.3)
```sql
select article, prix from article
order by prix asc limit 1;
@@ -92,3 +96,14 @@ order by prix asc limit 1;
### 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`.
Quels sont les personnes qui ont exactement 72 tickets ? (Cote et Lebreton)
```sql
select a.nom, a.prenom,
count(t.id) as nb_ticket
from adherent a
join ticket t on a.id = t.adherent_id
group by a.id
having count(t.id) = 72;
```