Questions
@@ -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 n’ont pas encore de ticket doivent apparaître (avec 0).
|
||||
- 3 : Lister tous les tickets, avec le nom du client s’il existe. Si un ticket a perdu sa référence client (valeur orpheline), il doit tout de même apparaître.
|
||||
|
||||
32
Home.md
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 d’un 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 d’affaires 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 d’un 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 d’affaires 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 n’ont jamais acheté d'article ? (273)
|
||||
- 11b : Combien d'adhérents n’ont aucun ticket ? (261)
|
||||
|
||||
16
Jointure.md
16
Jointure.md
@@ -101,6 +101,14 @@ WHERE gauche IS NULL;
|
||||
```
|
||||

|
||||
|
||||
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 d’ambiguïté).
|
||||
- Souvent optimisé par le moteur en anti-semi-join (c’est-à-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 d’un ticket.
|
||||
-- 2a : Calculer le montant moyen d’un 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 d’affaires réalisé.
|
||||
-- 4a : Afficher, pour chaque mois, le chiffre d’affaires 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;
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user