Questions
@@ -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 n’ont 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 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.
|
- 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.
|
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 d’un 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 d’un 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 d’affaires 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 d’affaires 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 n’ont jamais acheté d'article ? (273)
|
- 11a : Combien d'adhérents n’ont jamais acheté d'article ? (273)
|
||||||
- 11b : Combien d'adhérents n’ont aucun ticket ? (261)
|
- 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
|
## 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 d’ambiguïté).
|
- 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.
|
- 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
|
```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 d’un ticket.
|
-- 2a : Calculer le montant moyen d’un 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 d’affaires réalisé.
|
-- 4a : Afficher, pour chaque mois, le chiffre d’affaires 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
|
||||||
|
|||||||
@@ -38,10 +38,6 @@ 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
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
```
|
||||||
|
|||||||
Reference in New Issue
Block a user