Skip to content
Snippets Groups Projects
Commit 97276a5f authored by Vincent Namy (EDU_GE)'s avatar Vincent Namy (EDU_GE)
Browse files

Format NB3

parent 632ddc30
Branches
No related tags found
No related merge requests found
{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Leçon n°3: Gestion simplifiée d'un cinéma"},{"metadata":{},"cell_type":"markdown","source":"## I) Modélisation d'une base de données\n\nNous allons modéliser une base de données qui gère les projections de films dans des salles de cinéma. \n\n### 1. Description du modèle\nLa base de données doit gérer :\n- **Les films** avec un numéro unique, un titre et une durée.\n- **Les projections** qui ont un numéro unique et un tarif.\n- **Les créneaux horaires** définis par une date et une heure de début.\n- **Les salles** identifiées par un numéro et une capacité.\n\nCes entités sont liées entre elles par différentes **associations** :\n- **Un film peut être projeté plusieurs fois** (relation `CONCERNE`).\n- **Une projection a lieu à un seul créneau horaire**, mais un créneau peut ne pas contenir de projection (relation `AVOIR_LIEU_PENDANT`).\n- **Une projection a lieu dans une seule salle**, mais une salle peut accueillir plusieurs projections (relation `AVOIR_LIEU_DANS`).\n"},{"metadata":{},"cell_type":"markdown","source":"![copie d'écran](https://githepia.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Notebooks/img/BD_cours_n3_cinema_association_entite.png)"},{"metadata":{},"cell_type":"markdown","source":"### 2. Explication des associations\n##### CONCERNE (1,1 PROJECTION <--> 0,N FILM)\n- Chaque **projection** est associée à **un seul film**.\n- Un **film** peut être projeté plusieurs fois ou ne pas l'être du tout.\n\n##### AVOIR_LIEU_PENDANT (0,N CRÉNEAU_HORAIRE <--> 1,1 PROJECTION)\n- Chaque **projection** a lieu à **un unique créneau horaire**.\n- Un **créneau horaire** peut ne contenir aucune projection ou en contenir plusieurs.\n\n##### AVOIR_LIEU_DANS (1,1 PROJECTION <--> 0,N SALLE)\n- Chaque **projection** a lieu dans **une seule salle**.\n- Une **salle** peut accueillir plusieurs projections ou être vide."},{"metadata":{},"cell_type":"markdown","source":"En partant du modèle entité-association, on peut créer le modèle relationnel qui va nous permettre de créer la base de donnée."},{"metadata":{},"cell_type":"markdown","source":"![copie d'écran](https://githepia.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Notebooks/img/BD_cours_n3_cinema_schema_relationnel.png)"},{"metadata":{},"cell_type":"markdown","source":"### 3. Rappel sur les clés primaires et clés étrangères 🔑\n\nDans une base de données relationnelle, les **clés primaires** et **clés étrangères** permettent d'établir des liens entre les tables.\n\n#### 📌 **Clé primaire**\nUne **clé primaire** est un attribut (ou un ensemble d’attributs) qui identifie **de manière unique** chaque ligne d’une table.\n- Elle ne peut pas contenir de valeurs NULL.\n- Elle doit être unique pour chaque ligne.\n\n**Exemple :** Dans la table `FILM`, `Num_film` est une clé primaire car chaque film possède un identifiant unique. Elle est représentée par souligné dans le schéma.\n```sql\nCREATE TABLE FILM (\n Num_film INTEGER NOT NULL PRIMARY KEY,\n Titre VARCHAR(255),\n Duree INTEGER\n);\n```\n\n#### 📌 **Clé étrangère**\nUne **clé étrangère** est un attribut qui établit une relation entre deux tables en faisant référence à la clé primaire d’une autre table. Elle est représenté par un # dans le schéma.\n- Elle garantit l'intégrité des données : une clé étrangère ne peut contenir que des valeurs existantes dans la table référencée.\n\n**Exemple :** Dans la table `PROJECTION`, `Num_film` est une clé étrangère qui fait référence à `Num_film` dans `FILM`.\n```sql\nCREATE TABLE PROJECTION (\n Num_projection INTEGER NOT NULL PRIMARY KEY,\n Tarif DECIMAL(10,2),\n Num_creneau INTEGER NOT NULL,\n Num_film INTEGER NOT NULL,\n Num_salle INTEGER NOT NULL,\n FOREIGN KEY (Num_salle) REFERENCES SALLE (Num_salle),\n FOREIGN KEY (Num_film) REFERENCES FILM (Num_film),\n FOREIGN KEY (Num_creneau) REFERENCES CRENEAU_HORAIRE (Num_creneau)\n);\n```\n\n---"},{"metadata":{},"cell_type":"markdown","source":"Le code suivant, permet de créer et insérer des données dans les différentes tables modélisées.\n\n**Exécutez la cellule suivante (Ctrl+Enter) pour générer la base de données**"},{"metadata":{"trusted":false},"cell_type":"code","source":"-- Création des tables\nCREATE TABLE CRENEAU_HORAIRE (\n Num_creneau INTEGER NOT NULL PRIMARY KEY,\n Date DATE,\n Heure_de_debut TIME\n);\n\nCREATE TABLE FILM (\n Num_film INTEGER NOT NULL PRIMARY KEY,\n Titre VARCHAR(255),\n Duree INTEGER\n);\n\nCREATE TABLE SALLE (\n Num_salle INTEGER NOT NULL PRIMARY KEY,\n Capacite INTEGER\n);\n\nCREATE TABLE PROJECTION (\n Num_projection INTEGER NOT NULL PRIMARY KEY,\n Tarif DECIMAL(10,2),\n Num_creneau INTEGER NOT NULL,\n Num_film INTEGER NOT NULL,\n Num_salle INTEGER NOT NULL,\n FOREIGN KEY (Num_salle) REFERENCES SALLE (Num_salle),\n FOREIGN KEY (Num_film) REFERENCES FILM (Num_film),\n FOREIGN KEY (Num_creneau) REFERENCES CRENEAU_HORAIRE (Num_creneau)\n);\n\n-- Insérer des valeurs dans CRENEAU_HORAIRE\nINSERT INTO CRENEAU_HORAIRE (Num_creneau, Date, Heure_de_debut) VALUES\n(1, '2025-02-10', '14:00'),\n(2, '2025-02-10', '16:30'),\n(3, '2025-02-10', '19:00'),\n(4, '2025-02-11', '14:00'),\n(5, '2025-02-11', '16:30'),\n(6, '2025-02-12', '14:00'),\n(7, '2025-02-12', '16:30'),\n(8, '2025-02-12', '19:00');\n\n-- Insérer des valeurs dans FILM\nINSERT INTO FILM (Num_film, Titre, Duree) VALUES\n(1, 'Inception', 148),\n(2, 'Interstellar', 169),\n(3, 'Avatar', 162),\n(4, 'Titanic', 195),\n(5, 'Joker', 122),\n(6, 'The Dark Knight', 152),\n(7, 'Pulp Fiction', 154),\n(8, 'Forrest Gump', 142),\n(9, 'The Matrix', 136),\n(10, 'Gladiator', 155);\n\n-- Insérer des valeurs dans SALLE\nINSERT INTO SALLE (Num_salle, Capacite) VALUES\n(1, 150),\n(2, 200),\n(3, 100),\n(4, 180),\n(5, 250),\n(6, 300),\n(7, 220),\n(8, 130);\n\n-- Insérer des valeurs dans PROJECTION\nINSERT INTO PROJECTION (Num_projection, Tarif, Num_creneau, Num_film, Num_salle) VALUES\n(1, 12.50, 1, 1, 1),\n(2, 10.00, 2, 2, 2),\n(3, 9.50, 3, 3, 3),\n(4, 13.00, 4, 4, 4),\n(5, 11.00, 5, 5, 5),\n(6, 14.00, 6, 6, 6),\n(7, 9.00, 7, 7, 7),\n(8, 12.00, 8, 8, 8),\n(9, 13.50, 1, 9, 3),\n(10, 11.50, 2, 10, 4),\n(11, 10.00, 3, 1, 5),\n(12, 15.00, 4, 2, 6),\n(13, 12.50, 5, 3, 7),\n(14, 13.00, 6, 4, 8),\n(15, 11.00, 7, 5, 1),\n(16, 9.50, 8, 6, 2);\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"**Exécuter les requêtes suivantes (Ctrl+Enter)** pour afficher le contenu des différentes tables."},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"SELECT * FROM FILM","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"SELECT * FROM PROJECTION","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"SELECT * FROM SALLE","execution_count":null,"outputs":[]},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"SELECT * FROM CRENEAU_HORAIRE","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3>\n\nPetite révision SQL (voir leçon précédente).\n\nÉcrire les requêtes SQL permettant d'extraire de cette base de données les informations qui suivent. Aidez-vous du Cheat sheet SQL remis en classe."},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\nA) Affiche uniquement les titres et la durée des films."},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nB) Affiche les films dont la durée est supérieure à 120 minutes."},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nC) Affiche les films dont le titre contient la lettre \"a\"."},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nD) Affiche toutes les projections avec leur numéro et leur tarif."},{"metadata":{"trusted":false,"scrolled":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nE) Affiche toutes les projections qui ont lieu après 18h00."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nF) Affiche les projections qui auront lieu le 10 février 2025."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nG) Affiche les projections qui auront lieu le 10 février 2025."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nH) Affiche les salles qui ont une capacité de plus de 150 places."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nI) Affiche les films triés par ordre décroissant de durée."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nJ) Affiche le nombre total de films dans la base de données."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nK) Affiche la durée moyenne des films."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nL) Affiche le film le plus long avec son titre et sa durée."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nM) Affiche le tarif le plus élevé et le plus bas parmi toutes les projections."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nN) Affiche la capacité totale de toutes les salles. (i.e. Somme de toutes les places)."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"tags":["breakpoint"]},"cell_type":"markdown","source":"**Ctrl + Enter pour continuer**"},{"metadata":{},"cell_type":"markdown","source":"## II) Expression conditionnelle avec un CASE\n\nComment afficher les salles avec une catégorie de capacité ?\n\n- \"Petite salle\" si la capacité est inférieure à 100,\n- \"Moyenne salle\" si elle est entre 100 et 200,\n- \"Grande salle\" si elle est supérieure à 200.\n\n==> En utilisant une expression conditionnelle CASE. Exécuter la requête suivante:"},{"metadata":{"trusted":false},"cell_type":"code","source":"SELECT Num_salle, Capacite,\n CASE \n WHEN Capacite < 100 THEN 'Petite salle'\n WHEN Capacite BETWEEN 100 AND 200 THEN 'Moyenne salle'\n ELSE 'Grande salle'\n END AS Categorie\nFROM SALLE;","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2 : Expression conditionnelle avec un CASE </h3>\n\n📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nEn t'inspirant de l'exemple ci-dessus, affiche les projections avec une classification du tarif:\n- \"Tarif réduit\" si le prix est inférieur à 10 CHF.\n- \"Tarif standard\" si le prix est entre 10€ et 12 CHF.\n- \"Tarif premium\" si le prix est supérieur à 12 CHF."},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"tags":["breakpoint"]},"cell_type":"markdown","source":"**Ctrl + Enter pour continuer**"},{"metadata":{},"cell_type":"markdown","source":"## III) Les jonctions\n\n### ❓ Comment trouver des informations qui se trouvent dans plusieurs tables ?\n\nLorsqu'on construit une base de données relationnelle, les informations sont souvent réparties dans plusieurs tables pour éviter les redondances et améliorer l'organisation des données.\n\nMais comment peut-on récupérer des données qui sont liées entre plusieurs tables ? C'est là qu'intervient le `INNER JOIN` !\n\n---\n\n\n\n### 📖 Introduction au INNER JOIN\n\nLe `INNER JOIN` permet de combiner des lignes de deux tables lorsque les valeurs d'une colonne correspondent dans les deux tables.\nSeules les lignes ayant une correspondance dans **les deux tables** sont retournées.\n\n#### 📌 Syntaxe Générale :\n```sql\nSELECT colonne1, colonne2, ...\nFROM Table1\nINNER JOIN Table2\nON Table1.colonne_commune = Table2.colonne_commune;\n```\n\n---"},{"metadata":{},"cell_type":"markdown","source":"### 🔎 Exemple 1 : Lister les projections avec leurs films associés\n\nNous avons deux tables :\n- **`FILM`** (`Num_film`, `Titre`, `Durée`)\n- **`PROJECTION`** (`Num_projection`, `Tarif`, `Num_film` → clé étrangère)\n\n📌 **Énoncé :**\nAffiche toutes les projections avec les titres et le tarif des films correspondants."},{"metadata":{"trusted":false},"cell_type":"code","source":"SELECT PROJECTION.Num_projection, FILM.Titre, PROJECTION.Tarif\nFROM PROJECTION\nINNER JOIN FILM ON PROJECTION.Num_film = FILM.Num_film;","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 🔎 Exemple 2 : Lister les projections avec leurs créneaux horaires\n\nNous avons deux tables :\n- **`PROJECTION`** (`Num_projection`, ``)\n- **`CRENEAU_HORAIRE`** (`Num_creneau`, `Date_projection`, `Heure_de_debut`)\n\n📌 **Énoncé :**\nAffiche la liste des projections avec leur date et leur heure de début."},{"metadata":{"trusted":false},"cell_type":"code","source":"SELECT PROJECTION.Num_projection, CRENEAU_HORAIRE.Date, CRENEAU_HORAIRE.Heure_de_debut\nFROM PROJECTION\nINNER JOIN CRENEAU_HORAIRE ON PROJECTION.Num_creneau = CRENEAU_HORAIRE.Num_creneau;","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### ✍️ Exercices d’application"},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3 : Lister les projections avec les salles associées </h3>\n\nAffiche toutes les projections avec **leurs salles associées** et **leurs capacités**.\n\n💡 **Tables :** \n- `PROJECTION` (`Num_projection`, `Tarif`, `Num_salle`) \n- `SALLE` (`Num_salle`, `Capacite`)\n\n📝 **Écris la requête SQL :**"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 4 : Trouver les films projetés après 18h00 </h3>\n\nAffiche tous les films qui ont une projection **après 18h00**, avec leur titre et leur heure de début.\n\n💡 **Tables :** \n- `FILM` (`Num_film`, `Titre`) \n- `PROJECTION` (`Num_projection`, `Num_film`, `Num_creneau`) \n- `CRENEAU_HORAIRE` (`Num_creneau`, `Heure_de_debut`)\n\n📝 **Écris la requête SQL :**"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 5 : Afficher le nombre de projections par film </h3> \n\nAffiche le **titre des films** et **le nombre total de projections** pour chaque film.\n\n💡 **Tables :** \n- `FILM` (`Num_film`, `Titre`) \n- `PROJECTION` (`Num_projection`, `Num_film`)\n\n📝 **Écris la requête SQL :**"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"SQL","language":"sql","name":"sql"}},"nbformat":4,"nbformat_minor":2}
\ No newline at end of file
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": "# Leçon n°3: Gestion simplifiée d'un cinéma"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## I) Modélisation d'une base de données\n\nNous allons modéliser une base de données qui gère les projections de films dans des salles de cinéma. \n\n### 1. Description du modèle\nLa base de données doit gérer :\n- **Les films** avec un numéro unique, un titre et une durée.\n- **Les projections** qui ont un numéro unique et un tarif.\n- **Les créneaux horaires** définis par une date et une heure de début.\n- **Les salles** identifiées par un numéro et une capacité.\n\nCes entités sont liées entre elles par différentes **associations** :\n- **Un film peut être projeté plusieurs fois** (relation `CONCERNE`).\n- **Une projection a lieu à un seul créneau horaire**, mais un créneau peut ne pas contenir de projection (relation `AVOIR_LIEU_PENDANT`).\n- **Une projection a lieu dans une seule salle**, mais une salle peut accueillir plusieurs projections (relation `AVOIR_LIEU_DANS`).\n"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "![copie d'écran](https://githepia.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Notebooks/img/BD_cours_n3_cinema_association_entite.png)"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### 2. Explication des associations\n##### CONCERNE (1,1 PROJECTION <--> 0,N FILM)\n- Chaque **projection** est associée à **un seul film**.\n- Un **film** peut être projeté plusieurs fois ou ne pas l'être du tout.\n\n##### AVOIR_LIEU_PENDANT (0,N CRÉNEAU_HORAIRE <--> 1,1 PROJECTION)\n- Chaque **projection** a lieu à **un unique créneau horaire**.\n- Un **créneau horaire** peut ne contenir aucune projection ou en contenir plusieurs.\n\n##### AVOIR_LIEU_DANS (1,1 PROJECTION <--> 0,N SALLE)\n- Chaque **projection** a lieu dans **une seule salle**.\n- Une **salle** peut accueillir plusieurs projections ou être vide."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "En partant du modèle entité-association, on peut créer le modèle relationnel qui va nous permettre de créer la base de donnée."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "![copie d'écran](https://githepia.hesge.ch/info_sismondi/activites-2in-do/-/raw/main/Notebooks/img/BD_cours_n3_cinema_schema_relationnel.png)"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### 3. Rappel sur les clés primaires et clés étrangères 🔑\n\nDans une base de données relationnelle, les **clés primaires** et **clés étrangères** permettent d'établir des liens entre les tables.\n\n#### 📌 **Clé primaire**\nUne **clé primaire** est un attribut (ou un ensemble d’attributs) qui identifie **de manière unique** chaque ligne d’une table.\n- Elle ne peut pas contenir de valeurs NULL.\n- Elle doit être unique pour chaque ligne.\n\n**Exemple :** Dans la table `FILM`, `Num_film` est une clé primaire car chaque film possède un identifiant unique. Elle est représentée par souligné dans le schéma.\n```sql\nCREATE TABLE FILM (\n Num_film INTEGER NOT NULL PRIMARY KEY,\n Titre VARCHAR(255),\n Duree INTEGER\n);\n```\n\n#### 📌 **Clé étrangère**\nUne **clé étrangère** est un attribut qui établit une relation entre deux tables en faisant référence à la clé primaire d’une autre table. Elle est représenté par un # dans le schéma.\n- Elle garantit l'intégrité des données : une clé étrangère ne peut contenir que des valeurs existantes dans la table référencée.\n\n**Exemple :** Dans la table `PROJECTION`, `Num_film` est une clé étrangère qui fait référence à `Num_film` dans `FILM`.\n```sql\nCREATE TABLE PROJECTION (\n Num_projection INTEGER NOT NULL PRIMARY KEY,\n Tarif DECIMAL(10,2),\n Num_creneau INTEGER NOT NULL,\n Num_film INTEGER NOT NULL,\n Num_salle INTEGER NOT NULL,\n FOREIGN KEY (Num_salle) REFERENCES SALLE (Num_salle),\n FOREIGN KEY (Num_film) REFERENCES FILM (Num_film),\n FOREIGN KEY (Num_creneau) REFERENCES CRENEAU_HORAIRE (Num_creneau)\n);\n```\n\n---"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "Le code suivant, permet de créer et insérer des données dans les différentes tables modélisées.\n\n**Exécutez la cellule suivante (Ctrl+Enter) pour générer la base de données**"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": "-- Création des tables\nCREATE TABLE CRENEAU_HORAIRE (\n Num_creneau INTEGER NOT NULL PRIMARY KEY,\n Date DATE,\n Heure_de_debut TIME\n);\n\nCREATE TABLE FILM (\n Num_film INTEGER NOT NULL PRIMARY KEY,\n Titre VARCHAR(255),\n Duree INTEGER\n);\n\nCREATE TABLE SALLE (\n Num_salle INTEGER NOT NULL PRIMARY KEY,\n Capacite INTEGER\n);\n\nCREATE TABLE PROJECTION (\n Num_projection INTEGER NOT NULL PRIMARY KEY,\n Tarif DECIMAL(10,2),\n Num_creneau INTEGER NOT NULL,\n Num_film INTEGER NOT NULL,\n Num_salle INTEGER NOT NULL,\n FOREIGN KEY (Num_salle) REFERENCES SALLE (Num_salle),\n FOREIGN KEY (Num_film) REFERENCES FILM (Num_film),\n FOREIGN KEY (Num_creneau) REFERENCES CRENEAU_HORAIRE (Num_creneau)\n);\n\n-- Insérer des valeurs dans CRENEAU_HORAIRE\nINSERT INTO CRENEAU_HORAIRE (Num_creneau, Date, Heure_de_debut) VALUES\n(1, '2025-02-10', '14:00'),\n(2, '2025-02-10', '16:30'),\n(3, '2025-02-10', '19:00'),\n(4, '2025-02-11', '14:00'),\n(5, '2025-02-11', '16:30'),\n(6, '2025-02-12', '14:00'),\n(7, '2025-02-12', '16:30'),\n(8, '2025-02-12', '19:00');\n\n-- Insérer des valeurs dans FILM\nINSERT INTO FILM (Num_film, Titre, Duree) VALUES\n(1, 'Inception', 148),\n(2, 'Interstellar', 169),\n(3, 'Avatar', 162),\n(4, 'Titanic', 195),\n(5, 'Joker', 122),\n(6, 'The Dark Knight', 152),\n(7, 'Pulp Fiction', 154),\n(8, 'Forrest Gump', 142),\n(9, 'The Matrix', 136),\n(10, 'Gladiator', 155);\n\n-- Insérer des valeurs dans SALLE\nINSERT INTO SALLE (Num_salle, Capacite) VALUES\n(1, 150),\n(2, 200),\n(3, 100),\n(4, 180),\n(5, 250),\n(6, 300),\n(7, 220),\n(8, 130);\n\n-- Insérer des valeurs dans PROJECTION\nINSERT INTO PROJECTION (Num_projection, Tarif, Num_creneau, Num_film, Num_salle) VALUES\n(1, 12.50, 1, 1, 1),\n(2, 10.00, 2, 2, 2),\n(3, 9.50, 3, 3, 3),\n(4, 13.00, 4, 4, 4),\n(5, 11.00, 5, 5, 5),\n(6, 14.00, 6, 6, 6),\n(7, 9.00, 7, 7, 7),\n(8, 12.00, 8, 8, 8),\n(9, 13.50, 1, 9, 3),\n(10, 11.50, 2, 10, 4),\n(11, 10.00, 3, 1, 5),\n(12, 15.00, 4, 2, 6),\n(13, 12.50, 5, 3, 7),\n(14, 13.00, 6, 4, 8),\n(15, 11.00, 7, 5, 1),\n(16, 9.50, 8, 6, 2);\n"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "**Exécuter les requêtes suivantes (Ctrl+Enter)** pour afficher le contenu des différentes tables."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": "SELECT * FROM FILM"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": "SELECT * FROM PROJECTION"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": "SELECT * FROM SALLE"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": "SELECT * FROM CRENEAU_HORAIRE"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 1 </h3>\n\nPetite révision SQL (voir leçon précédente).\n\nÉcrire les requêtes SQL permettant d'extraire de cette base de données les informations qui suivent. Aidez-vous du Cheat sheet SQL remis en classe."
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\nA) Affiche uniquement les titres et la durée des films."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nB) Affiche les films dont la durée est supérieure à 120 minutes."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nC) Affiche les films dont le titre contient la lettre \"a\"."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nD) Affiche toutes les projections avec leur numéro et leur tarif."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"scrolled": true,
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nE) Affiche toutes les projections qui ont lieu après 18h00."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nF) Affiche les projections qui auront lieu le 10 février 2025."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nG) Affiche les projections qui auront lieu le 10 février 2025."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nH) Affiche les salles qui ont une capacité de plus de 150 places."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nI) Affiche les films triés par ordre décroissant de durée."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nJ) Affiche le nombre total de films dans la base de données."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nK) Affiche la durée moyenne des films."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nL) Affiche le film le plus long avec son titre et sa durée."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nM) Affiche le tarif le plus élevé et le plus bas parmi toutes les projections."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nN) Affiche la capacité totale de toutes les salles. (i.e. Somme de toutes les places)."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {
"tags": [
"breakpoint"
]
},
"source": "**Ctrl + Enter pour continuer**"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## II) Expression conditionnelle avec un CASE\n\nComment afficher les salles avec une catégorie de capacité ?\n\n- \"Petite salle\" si la capacité est inférieure à 100,\n- \"Moyenne salle\" si elle est entre 100 et 200,\n- \"Grande salle\" si elle est supérieure à 200.\n\n==> En utilisant une expression conditionnelle CASE. Exécuter la requête suivante:"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": "SELECT Num_salle, Capacite,\n CASE \n WHEN Capacite < 100 THEN 'Petite salle'\n WHEN Capacite BETWEEN 100 AND 200 THEN 'Moyenne salle'\n ELSE 'Grande salle'\n END AS Categorie\nFROM SALLE;"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 2 : Expression conditionnelle avec un CASE </h3>\n\n📝 **Écris la requête SQL selon l'énoncé suivant:**\n\n\nEn t'inspirant de l'exemple ci-dessus, affiche les projections avec une classification du tarif:\n- \"Tarif réduit\" si le prix est inférieur à 10 CHF.\n- \"Tarif standard\" si le prix est entre 10€ et 12 CHF.\n- \"Tarif premium\" si le prix est supérieur à 12 CHF."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {
"tags": [
"breakpoint"
]
},
"source": "**Ctrl + Enter pour continuer**"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "## III) Les jonctions\n\n### ❓ Comment trouver des informations qui se trouvent dans plusieurs tables ?\n\nLorsqu'on construit une base de données relationnelle, les informations sont souvent réparties dans plusieurs tables pour éviter les redondances et améliorer l'organisation des données.\n\nMais comment peut-on récupérer des données qui sont liées entre plusieurs tables ? C'est là qu'intervient le `INNER JOIN` !\n\n---\n\n\n\n### 📖 Introduction au INNER JOIN\n\nLe `INNER JOIN` permet de combiner des lignes de deux tables lorsque les valeurs d'une colonne correspondent dans les deux tables.\nSeules les lignes ayant une correspondance dans **les deux tables** sont retournées.\n\n#### 📌 Syntaxe Générale :\n```sql\nSELECT colonne1, colonne2, ...\nFROM Table1\nINNER JOIN Table2\nON Table1.colonne_commune = Table2.colonne_commune;\n```\n\n---"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### 🔎 Exemple 1 : Lister les projections avec leurs films associés\n\nNous avons deux tables :\n- **`FILM`** (`Num_film`, `Titre`, `Durée`)\n- **`PROJECTION`** (`Num_projection`, `Tarif`, `Num_film` → clé étrangère)\n\n📌 **Énoncé :**\nAffiche toutes les projections avec les titres et le tarif des films correspondants."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": "SELECT PROJECTION.Num_projection, FILM.Titre, PROJECTION.Tarif\nFROM PROJECTION\nINNER JOIN FILM ON PROJECTION.Num_film = FILM.Num_film;"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### 🔎 Exemple 2 : Lister les projections avec leurs créneaux horaires\n\nNous avons deux tables :\n- **`PROJECTION`** (`Num_projection`, ``)\n- **`CRENEAU_HORAIRE`** (`Num_creneau`, `Date_projection`, `Heure_de_debut`)\n\n📌 **Énoncé :**\nAffiche la liste des projections avec leur date et leur heure de début."
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": "SELECT PROJECTION.Num_projection, CRENEAU_HORAIRE.Date, CRENEAU_HORAIRE.Heure_de_debut\nFROM PROJECTION\nINNER JOIN CRENEAU_HORAIRE ON PROJECTION.Num_creneau = CRENEAU_HORAIRE.Num_creneau;"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "### ✍️ Exercices d’application"
},
{
"cell_type": "markdown",
"metadata": {},
"source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 3 : Lister les projections avec les salles associées </h3>\n\nAffiche toutes les projections avec **leurs salles associées** et **leurs capacités**.\n\n💡 **Tables :** \n- `PROJECTION` (`Num_projection`, `Tarif`, `Num_salle`) \n- `SALLE` (`Num_salle`, `Capacite`)\n\n📝 **Écris la requête SQL :**"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 4 : Trouver les films projetés après 18h00 </h3>\n\nAffiche tous les films qui ont une projection **après 18h00**, avec leur titre et leur heure de début.\n\n💡 **Tables :** \n- `FILM` (`Num_film`, `Titre`) \n- `PROJECTION` (`Num_projection`, `Num_film`, `Num_creneau`) \n- `CRENEAU_HORAIRE` (`Num_creneau`, `Heure_de_debut`)\n\n📝 **Écris la requête SQL :**"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
},
{
"cell_type": "markdown",
"metadata": {},
"source": "<h3 style=\"color:teal;background-color:azure;\" > <i class=\"fa fa-pencil\" aria-hidden=\"true\"> </i> &nbsp; Exercice 5 : Afficher le nombre de projections par film </h3> \n\nAffiche le **titre des films** et **le nombre total de projections** pour chaque film.\n\n💡 **Tables :** \n- `FILM` (`Num_film`, `Titre`) \n- `PROJECTION` (`Num_projection`, `Num_film`)\n\n📝 **Écris la requête SQL :**"
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"trusted": false
},
"outputs": [],
"source": ""
}
],
"metadata": {
"kernelspec": {
"display_name": "SQL",
"language": "sql",
"name": "sql"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment