Skip to content

Commit 577ecdd

Browse files
committed
Add Makefile and new exercises for Boulangerie and CAC 40
1 parent 41e721a commit 577ecdd

6 files changed

Lines changed: 233 additions & 11 deletions

File tree

Makefile

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
.PHONY: install start build deploy clean help
2+
3+
# Development server with legacy OpenSSL support (required for Node.js 17+)
4+
start:
5+
NODE_OPTIONS=--openssl-legacy-provider npm start
6+
7+
# Install dependencies
8+
install:
9+
npm install
10+
11+
# Build for production
12+
build:
13+
NODE_OPTIONS=--openssl-legacy-provider npm run build
14+
15+
# Deploy to GitHub Pages
16+
deploy: build
17+
npx gh-pages -d build
18+
19+
# Clean build artifacts and dependencies
20+
clean:
21+
rm -rf build node_modules
22+
23+
# Reinstall dependencies
24+
reinstall: clean install
25+
26+
# Show help
27+
help:
28+
@echo "Available commands:"
29+
@echo " make install - Install npm dependencies"
30+
@echo " make start - Start development server"
31+
@echo " make build - Build for production"
32+
@echo " make deploy - Build and deploy to GitHub Pages"
33+
@echo " make clean - Remove build artifacts and node_modules"
34+
@echo " make reinstall - Clean and reinstall dependencies"

package-lock.json

Lines changed: 32 additions & 6 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/App.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ export default function App(props) {
8888
</div>)
8989
if (selectedExo) {
9090
if ('url' in selectedExo)
91-
main = (<iframe src={`https://mozilla.github.io/pdf.js/web/viewer.html?file=https://raw.githubusercontent.com/fortierq/cours/main/sql/cours/${selectedExo.url}#zoom=page-fit&pagemode=none`} width="100%" height="700" />)
91+
main = (<iframe src={`https://mozilla.github.io/pdf.js/web/viewer.html?file=https://raw.githubusercontent.com/fortierq/cours/main/sql/${selectedExo.url}#zoom=page-fit&pagemode=none`} width="100%" height="700" />)
9292
else
9393
main = (<Exo key={selectedExo.questions[0]} {...selectedExo} />)
9494
}

src/exos/boulangerie.tsx

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import { Exo_interface } from "./exos";
2+
3+
export const exo_boulangerie: Exo_interface = {
4+
name: "Boulangerie",
5+
description: (
6+
<div>
7+
Base de données d'une chaîne de boulangeries.<br /><br />
8+
<b>Boulangeries</b> : les différentes boulangeries (nom, ville, nombre d'employés).<br />
9+
<b>Pâtisseries</b> : les produits vendus (nom, prix en euros, calories).<br />
10+
<b>Clients</b> : les clients enregistrés (nom, prénom, ville).<br />
11+
<b>Commandes</b> : les achats effectués (client, boulangerie, pâtisserie, quantité, date).
12+
</div>
13+
),
14+
db_url: "boulangerie.sql",
15+
diagram: "6962cb2cd6e030a024a929d6",
16+
questions: [
17+
"Afficher le nom et la ville de chaque boulangerie.",
18+
"Afficher les pâtisseries coûtant moins de 3 euros.",
19+
"Afficher les pâtisseries triées par calories décroissantes.",
20+
"Afficher les clients habitant à Paris.",
21+
"Afficher les boulangeries ayant plus de 5 employés.",
22+
],
23+
answers: [
24+
"SELECT nom, ville FROM boulangeries",
25+
"SELECT nom, prix FROM patisseries WHERE prix < 3",
26+
"SELECT nom, calories FROM patisseries ORDER BY calories DESC",
27+
"SELECT nom, prenom FROM clients WHERE ville = 'Paris'",
28+
"SELECT nom, employes FROM boulangeries WHERE employes > 5",
29+
],
30+
};
31+
32+
export const exo_boulangerie_join: Exo_interface = {
33+
...exo_boulangerie,
34+
name: "Boulangerie",
35+
questions: [
36+
"Afficher le prénom du client et le nom de la pâtisserie pour chaque commande.",
37+
"Afficher les commandes passées dans des boulangeries de Paris (nom du client, nom de la boulangerie).",
38+
"Afficher le nom des clients ayant commandé des croissants.",
39+
"Afficher le nom des pâtisseries commandées à la boulangerie 'Au Pain Doré'.",
40+
"Afficher les clients ayant commandé dans une boulangerie de leur propre ville.",
41+
"Afficher le nom du client, la pâtisserie et le prix total (prix × quantité) pour chaque commande.",
42+
"Afficher les pâtisseries jamais commandées.",
43+
"Afficher le nom des clients ayant commandé des pâtisseries à plus de 400 calories.",
44+
],
45+
answers: [
46+
"SELECT cl.prenom, p.nom FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN patisseries p ON co.patisserie_id = p.id",
47+
"SELECT cl.nom, b.nom FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN boulangeries b ON co.boulangerie_id = b.id WHERE b.ville = 'Paris'",
48+
"SELECT DISTINCT cl.nom FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN patisseries p ON co.patisserie_id = p.id WHERE p.nom = 'Croissant'",
49+
"SELECT DISTINCT p.nom FROM commandes co JOIN boulangeries b ON co.boulangerie_id = b.id JOIN patisseries p ON co.patisserie_id = p.id WHERE b.nom = 'Au Pain Doré'",
50+
"SELECT DISTINCT cl.nom, cl.prenom FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN boulangeries b ON co.boulangerie_id = b.id WHERE cl.ville = b.ville",
51+
"SELECT cl.nom, p.nom, p.prix * co.quantite AS total FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN patisseries p ON co.patisserie_id = p.id",
52+
"SELECT p.nom FROM patisseries p LEFT JOIN commandes co ON p.id = co.patisserie_id WHERE co.id IS NULL",
53+
"SELECT DISTINCT cl.nom FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN patisseries p ON co.patisserie_id = p.id WHERE p.calories > 400",
54+
],
55+
};
56+
57+
export const exo_boulangerie_group: Exo_interface = {
58+
...exo_boulangerie,
59+
name: "Boulangerie",
60+
questions: [
61+
"Afficher le nombre de boulangeries par ville.",
62+
"Afficher le nombre total de commandes par client (nom du client et nombre de commandes).",
63+
"Afficher le chiffre d'affaires total par boulangerie (nom et total).",
64+
"Afficher la pâtisserie la plus commandée (nom et quantité totale).",
65+
"Afficher le nombre de calories moyen des pâtisseries commandées par chaque client.",
66+
"Afficher les villes ayant au moins 2 boulangeries.",
67+
],
68+
answers: [
69+
"SELECT ville, COUNT(*) AS nb FROM boulangeries GROUP BY ville",
70+
"SELECT cl.nom, COUNT(*) AS nb_commandes FROM commandes co JOIN clients cl ON co.client_id = cl.id GROUP BY cl.id, cl.nom",
71+
"SELECT b.nom, SUM(p.prix * co.quantite) AS total FROM commandes co JOIN boulangeries b ON co.boulangerie_id = b.id JOIN patisseries p ON co.patisserie_id = p.id GROUP BY b.id, b.nom",
72+
"SELECT p.nom, SUM(co.quantite) AS total FROM commandes co JOIN patisseries p ON co.patisserie_id = p.id GROUP BY p.id, p.nom ORDER BY total DESC LIMIT 1",
73+
"SELECT cl.nom, AVG(p.calories) AS calories_moy FROM commandes co JOIN clients cl ON co.client_id = cl.id JOIN patisseries p ON co.patisserie_id = p.id GROUP BY cl.id, cl.nom",
74+
"SELECT ville, COUNT(*) AS nb FROM boulangeries GROUP BY ville HAVING COUNT(*) >= 2",
75+
],
76+
};

src/exos/cac40.tsx

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import { Exo_interface } from "./exos";
2+
3+
export const exo_cac40: Exo_interface = {
4+
name: "CAC 40",
5+
description: (
6+
<div>
7+
Base de données contenant les entreprises du CAC 40 et leurs données financières historiques (2020-2024).<br /><br />
8+
<b>Entreprises</b> : informations générales sur chaque entreprise (secteur, date de création, siège social).<br />
9+
<b>Finances</b> : données financières annuelles (chiffre d'affaires, bénéfice net, dette, capitaux propres).<br /><br />
10+
Les montants sont en millions d'euros.<br />
11+
La <b>marge nette</b> = bénéfice net / chiffre d'affaires × 100 (en %).<br />
12+
Le <b>ratio dette/capitaux propres</b> mesure l'endettement de l'entreprise.<br /><br />
13+
<a href="https://www.boursorama.com">Source : données publiques des entreprises</a>.
14+
</div>
15+
),
16+
db_url: "cac40.sql",
17+
diagram: "6962c115d6e030a024a8eb65",
18+
questions: [
19+
"Afficher le nom et le secteur de chaque entreprise du CAC 40.",
20+
"Afficher les entreprises du secteur 'Luxe'.",
21+
"Afficher les entreprises créées avant 1900, triées par date de création.",
22+
"Afficher le chiffre d'affaires total de toutes les entreprises du CAC 40 en 2023, en milliards d'euros.",
23+
"Afficher les 5 entreprises ayant réalisé le plus gros bénéfice net en 2023.",
24+
"Afficher le nom et la marge nette (bénéfice/chiffre d'affaires × 100) des entreprises en 2023, triées par marge décroissante. Limiter aux 10 premières.",
25+
"Afficher les entreprises dont le bénéfice a augmenté entre 2022 et 2023.",
26+
"Afficher le chiffre d'affaires moyen par secteur en 2023, trié par chiffre d'affaires décroissant.",
27+
"Afficher les entreprises dont la dette dépasse les capitaux propres en 2023.",
28+
"Afficher l'évolution du bénéfice total du CAC 40 par année.",
29+
],
30+
answers: [
31+
"SELECT nom, secteur FROM entreprises",
32+
"SELECT nom FROM entreprises WHERE secteur = 'Luxe'",
33+
"SELECT nom, date_creation FROM entreprises WHERE date_creation < 1900 ORDER BY date_creation",
34+
"SELECT SUM(chiffre_affaires) / 1000 AS ca_milliards FROM finances WHERE annee = 2023",
35+
"SELECT e.nom, f.benefice_net FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2023 ORDER BY f.benefice_net DESC LIMIT 5",
36+
"SELECT e.nom, (f.benefice_net * 100.0 / f.chiffre_affaires) AS marge_nette FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2023 ORDER BY marge_nette DESC LIMIT 10",
37+
"SELECT e.nom FROM entreprises e JOIN finances f22 ON e.id = f22.entreprise_id JOIN finances f23 ON e.id = f23.entreprise_id WHERE f22.annee = 2022 AND f23.annee = 2023 AND f23.benefice_net > f22.benefice_net",
38+
"SELECT e.secteur, AVG(f.chiffre_affaires) AS ca_moyen FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2023 GROUP BY e.secteur ORDER BY ca_moyen DESC",
39+
"SELECT e.nom, f.dette, f.capitaux_propres FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2023 AND f.dette > f.capitaux_propres",
40+
"SELECT annee, SUM(benefice_net) AS benefice_total FROM finances GROUP BY annee ORDER BY annee",
41+
],
42+
};
43+
44+
export const exo_cac40_join: Exo_interface = {
45+
...exo_cac40,
46+
name: "CAC 40 (jointures)",
47+
questions: [
48+
"Afficher le nom et le chiffre d'affaires de chaque entreprise en 2024.",
49+
"Afficher le nom des entreprises du secteur 'Luxe' avec leur bénéfice en 2024.",
50+
"Afficher le nom et la capitalisation des entreprises ayant plus de 100000 employés en 2024.",
51+
"Afficher les entreprises dont le bénéfice a été négatif en 2024.",
52+
"Afficher le nom, secteur et dividende des 5 entreprises avec le meilleur dividende en 2024.",
53+
"Afficher les entreprises du secteur 'Banque' avec leur chiffre d'affaires en 2023 et 2024.",
54+
"Afficher le nom des entreprises dont la dette a diminué entre 2023 et 2024.",
55+
"Afficher le nom et le ratio dette/capitaux_propres des entreprises en 2024, trié par ratio décroissant.",
56+
],
57+
answers: [
58+
"SELECT e.nom, f.chiffre_affaires FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2024",
59+
"SELECT e.nom, f.benefice FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE e.secteur = 'Luxe' AND f.annee = 2024",
60+
"SELECT e.nom, f.capitalisation FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE e.employes > 100000 AND f.annee = 2024",
61+
"SELECT e.nom, f.benefice FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2024 AND f.benefice < 0",
62+
"SELECT e.nom, e.secteur, f.dividende FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2024 ORDER BY f.dividende DESC LIMIT 5",
63+
"SELECT e.nom, f23.chiffre_affaires AS ca_2023, f24.chiffre_affaires AS ca_2024 FROM entreprises e JOIN finances f23 ON e.id = f23.entreprise_id JOIN finances f24 ON e.id = f24.entreprise_id WHERE e.secteur = 'Banque' AND f23.annee = 2023 AND f24.annee = 2024",
64+
"SELECT e.nom FROM entreprises e JOIN finances f23 ON e.id = f23.entreprise_id JOIN finances f24 ON e.id = f24.entreprise_id WHERE f23.annee = 2023 AND f24.annee = 2024 AND f24.dette < f23.dette",
65+
"SELECT e.nom, (f.dette * 1.0 / f.capitaux_propres) AS ratio FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2024 AND f.capitaux_propres > 0 ORDER BY ratio DESC",
66+
],
67+
};
68+
69+
export const exo_cac40_group: Exo_interface = {
70+
...exo_cac40,
71+
questions: [
72+
"Afficher le nombre d'entreprises par secteur.",
73+
"Afficher le secteur ayant généré le plus de bénéfices cumulés sur 2020-2024.",
74+
"Afficher les entreprises ayant eu un bénéfice positif chaque année de 2020 à 2024.",
75+
"Afficher le ratio moyen dette/capitaux propres par secteur en 2023, trié par ratio décroissant.",
76+
],
77+
answers: [
78+
"SELECT secteur, COUNT(*) AS nb_entreprises FROM entreprises GROUP BY secteur",
79+
"SELECT e.secteur, SUM(f.benefice_net) AS benefice_total FROM entreprises e JOIN finances f ON e.id = f.entreprise_id GROUP BY e.secteur ORDER BY benefice_total DESC LIMIT 1",
80+
"SELECT e.nom FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.benefice_net > 0 GROUP BY e.nom HAVING COUNT(*) = 5",
81+
"SELECT e.secteur, AVG(f.dette * 1.0 / f.capitaux_propres) AS ratio_dette FROM entreprises e JOIN finances f ON e.id = f.entreprise_id WHERE f.annee = 2023 AND f.capitaux_propres > 0 GROUP BY e.secteur ORDER BY ratio_dette DESC",
82+
],
83+
};

src/exos/exos.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { exo_concours, exo_concours_group, exo_concours_nested } from "./concour
33
import { exo_fonciere } from "./fonciere";
44
import { exo_pays } from "./pays"
55
import { exo_metro } from "./metro";
6+
import { exo_cac40, exo_cac40_group, exo_cac40_join } from "./cac40";
7+
import { exo_boulangerie, exo_boulangerie_join, exo_boulangerie_group } from "./boulangerie";
68

79
export interface Exo_interface {
810
name: string;
@@ -14,10 +16,11 @@ export interface Exo_interface {
1416
}
1517

1618
export const cours = [
17-
{ name: "Requêtes sur une table", url: "1_select/select.pdf", exos: [exo_metro, exo_pays] },
18-
{ name: "Plusieurs tables", url: "2_join/join.pdf", exos: [exo_concours, exo_pokemon] },
19-
{ name: "Fonctions d'agrégation", url: "3_groupby/groupby.pdf", exos: [exo_concours_group, exo_pokemon_group] },
20-
{ name: "Requêtes imbriquées", url: "4_imbrique/imbrique.pdf", exos: [exo_concours_nested] },
19+
{ name: "Requêtes sur une table", url: "cours/1_select/select.pdf", exos: [exo_metro, exo_pays, exo_cac40, exo_boulangerie] },
20+
{ name: "Plusieurs tables", url: "cours/2_join/join.pdf", exos: [exo_concours, exo_pokemon, exo_cac40_join, exo_boulangerie_join] },
21+
{ name: "Fonctions d'agrégation", url: "cours/3_groupby/groupby.pdf", exos: [exo_concours_group, exo_pokemon_group, exo_cac40_group, exo_boulangerie_group] },
22+
{ name: "Requêtes imbriquées", url: "cours/4_imbrique/imbrique.pdf", exos: [exo_concours_nested] },
23+
{ name: "Résumé", url: "resume/sql_resume.pdf", exos: [] },
2124
];
2225

2326
export const exercices_other = [exo_fonciere];

0 commit comments

Comments
 (0)