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

@@ -101,6 +101,14 @@ WHERE gauche IS NULL;
``` ```
![](jointures/rightantijoin.svg) ![](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 ## 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. 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`. Les jointures d'exclusion peuvent aussi s'écrire avec une sous requête et une condition `EXISTS`.
```sql ```sql
SELECT gauxhe.* SELECT gauche.*
FROM gauche g FROM gauche g
WHERE NOT EXISTS ( WHERE NOT EXISTS (
SELECT 1 SELECT 1
@@ -187,6 +195,12 @@ Avantages :
- Robuste face aux valeurs NULL (pas dambiguïté). - 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. - 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 ```sql
SELECT g.* SELECT g.*
FROM gauche g FROM gauche g

@@ -1,13 +1,13 @@
-- Réponses questions de 1 à 10 -- 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, select a.nom,
count(t.id) as nb_ticket count(t.id) as nb_ticket
from adherent a from adherent a
join ticket t on a.id = t.adherent_id join ticket t on a.id = t.adherent_id
group by a.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, select a.nom, a.prenom,
count(t.id) as nb_ticket count(t.id) as nb_ticket
from adherent a from adherent a
@@ -15,24 +15,9 @@ join ticket t on a.id = t.adherent_id
where a.nom = 'Lavergne' where a.nom = 'Lavergne'
group by a.id; 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 -- 18.84
select round(avg(total_ticket),2) as panier_moyen select round(avg(total_ticket),2) as panier_moyen
from ( from (
@@ -42,7 +27,7 @@ from (
group by t.id group by t.id
) sous_requete; ) 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 -- 6.69
SELECT round(avg(nb_articles_distincts),2) AS moyenne_articles_distincts SELECT round(avg(nb_articles_distincts),2) AS moyenne_articles_distincts
FROM ( FROM (
@@ -52,7 +37,7 @@ FROM (
GROUP BY t.id GROUP BY t.id
) sub; ) 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 -- 7.21
SELECT round(AVG(nb_articles),2) AS moyenne_articles_par_ticket SELECT round(AVG(nb_articles),2) AS moyenne_articles_par_ticket
FROM ( 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 select f.code, count(a.code) as nb_produits
from famille f from famille f
left join article a on f.code = a.famille_code left join article a on f.code = a.famille_code
group by f.code; group by f.code;
-- 6b -- 3b
select f.famille, count(a.code) as nb_produits select f.famille, count(a.code) as nb_produits
from famille f from famille f
left join article a on f.code = a.famille_code left join article a on f.code = a.famille_code
where f.code = '02CHOU' where f.code = '02CHOU'
group by f.famille; group by f.famille;
-- 6c -- 3c
select f.code, count(a.code) as nb_produits select f.code, count(a.code) as nb_produits
from famille f from famille f
left join article a on f.code = a.famille_code left join article a on f.code = a.famille_code
group by f.code group by f.code
having count(a.code) <= 2; 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, select date_trunc('month', t.date_ticket) as mois,
sum(l.quantite * l.prix_unitaire) as montant_mensuel sum(l.quantite * l.prix_unitaire) as montant_mensuel
from ticket t from ticket t
@@ -99,14 +84,14 @@ join ligne l on t.id = l.ticket_id
group by date_trunc('month', t.date_ticket) group by date_trunc('month', t.date_ticket)
order by mois; order by mois;
-- 7b -- 4b
select select
round(sum(l.quantite * l.prix_unitaire),2) as montant_mensuel round(sum(l.quantite * l.prix_unitaire),2) as montant_mensuel
from ticket t from ticket t
join ligne l on t.id = l.ticket_id join ligne l on t.id = l.ticket_id
where date_trunc('month', t.date_ticket) = '2016-04-01'; 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 select a.nom, sum(l.quantite * l.prix_unitaire) as total_depense
from adherent a from adherent a
join ticket t on a.id = t.adherent_id join ticket t on a.id = t.adherent_id
@@ -115,7 +100,7 @@ group by a.nom
order by total_depense desc order by total_depense desc
limit 3; 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 select a.article, sum(l.quantite) as total_vendu
from article a from article a
join ligne l on a.code = l.article_code join ligne l on a.code = l.article_code
@@ -124,7 +109,7 @@ group by a.article
order by total_vendu desc order by total_vendu desc
limit 1 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 select a.article, sum(l.quantite) as total_vendu
from article a from article a
join ligne l on a.code = l.article_code join ligne l on a.code = l.article_code
@@ -133,7 +118,7 @@ group by a.article
order by total_vendu desc order by total_vendu desc
limit 1 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, select f.code,
sum(l.quantite * l.prix_unitaire) as total_famille sum(l.quantite * l.prix_unitaire) as total_famille
from famille f from famille f
@@ -142,7 +127,7 @@ join ligne l on a.code = l.article_code
group by f.code group by f.code
order by total_famille desc; order by total_famille desc;
-- 10b -- 7b
select f.code, select f.code,
round(sum(l.quantite * l.prix_unitaire),2) as total_famille round(sum(l.quantite * l.prix_unitaire),2) as total_famille
from famille f from famille f

@@ -31,21 +31,17 @@ WHERE NOT EXISTS (
WHERE l.article_code = a.code WHERE l.article_code = a.code
); );
-- 12b -- 12b
SELECT a.code, a.article, a.famille_code SELECT a.code, a.article, a.famille_code
FROM article a FROM article a
JOIN ligne l ON l.article_code = a.code JOIN ligne l ON l.article_code = a.code
GROUP BY a.code GROUP BY a.code
HAVING COUNT(*) = 1; 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 -- 14
SELECT SELECT
famille_code, famille_code,
famille, famille,
article_le_moins_cher, article_le_moins_cher,
@@ -53,7 +49,7 @@ SELECT
article_le_plus_cher, article_le_plus_cher,
prix_max prix_max
FROM ( FROM (
SELECT SELECT
f.code AS famille_code, f.code AS famille_code,
f.famille, f.famille,
ar.article AS article_le_moins_cher, ar.article AS article_le_moins_cher,

@@ -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 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 ```sql
select article, prix from article select article, prix from article
order by prix desc limit 1; 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 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 ```sql
select article, prix from article select article, prix from article
order by prix asc limit 1; order by prix asc limit 1;
@@ -92,3 +96,14 @@ order by prix asc limit 1;
### Filtre après agrégation ### 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`. `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;
```