diff --git a/Exercices.md b/Exercices.md index d2f29c6..eb25400 100644 --- a/Exercices.md +++ b/Exercices.md @@ -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. diff --git a/Home.md b/Home.md index 7299af5..fa8a588 100644 --- a/Home.md +++ b/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) diff --git a/Jointure.md b/Jointure.md index 54ef4b2..b689477 100644 --- a/Jointure.md +++ b/Jointure.md @@ -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 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 diff --git a/Réponses/1-10.sql b/Réponses/1-10.sql index 7ef30fe..9dd8bb5 100644 --- a/Réponses/1-10.sql +++ b/Réponses/1-10.sql @@ -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 diff --git a/Réponses/11-20.sql b/Réponses/11-20.sql index cb906dc..423a2cc 100644 --- a/Réponses/11-20.sql +++ b/Réponses/11-20.sql @@ -31,21 +31,17 @@ WHERE NOT EXISTS ( WHERE l.article_code = a.code ); --- 12b +-- 12b SELECT a.code, a.article, a.famille_code FROM article a 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 -SELECT +SELECT famille_code, famille, article_le_moins_cher, @@ -53,7 +49,7 @@ SELECT article_le_plus_cher, prix_max FROM ( - SELECT + SELECT f.code AS famille_code, f.famille, ar.article AS article_le_moins_cher, diff --git a/aggregation.md b/aggregation.md index 83fe359..3f31b5c 100644 --- a/aggregation.md +++ b/aggregation.md @@ -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; +```