{"cells":[{"metadata":{},"cell_type":"markdown","source":"# <center>TP 1 : Bases de données en SQL</center>"},{"metadata":{},"cell_type":"markdown","source":"## A - Bases de données"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Définition</u> : Base de données</b>  <br>\nUne base de données regroupe, au sein d’un stockage informatique un ensemble de données organisé de manière cohérente.<br>\nCes données sont organisées de manière à être facilement consultées, enrichies, supprimées, comparées.\n\n|idclient |nom |prenom | ville |\n|:------:|:----------:|:----------:|:----------:|\n|1|Ewing|Grant|San Gregorio nelle Alpi |\n|2|Buck|Violet|Landenne|\n|3|Hood|Isabelle|Sahiwal |\n|4|Small|Germane|Fontanafredda |\n|5|Hancock|Vincent|Potsdam |\n    \n</div>\n\n"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Définition</u> : SQL</b>  <br>\nLe SQL (Structured Query Language) est un langage informatique servant à exploiter des bases de données. C'est à dire qu'il permet notamment de rechercher, d'ajouter, de modifier, de supprimer, d'analyser des données, ou encore, de créer et de modifier l'organisation des données dans les bases de données.\n</div>\n\n"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Définition</u> : SGBD</b>  <br>\nUn système de gestion de base de données (SGBD) est un logiciel permettant d’interagir avec une base de donnée.<br>\n    Dans notre cas, Capytale est notre SGBD et la base de donnée que l'on va utiliser dans ce TP est un fichier <code>.sql</code> déjà attaché à cette activité Capytale. <br>\n    Il est chargé automatiquement lors de l'ouverture de la page et, on peut ainsi directement effectuer des requêtes sur la base de données. \n</div>"},{"metadata":{},"cell_type":"markdown","source":"## B - Modèle relationnel"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Définition</u> : Relation (ou table)</b>  <br>\nUne relation (ou table) est une structure de données comprenant différentes entités, caractérisées chacune par différents attributs.\n    <ul>\n        <li>Chaque colonne d’une relation s’appelle un <b>attribut</b>.<br>\n            Le nom donné à la colonne est appelé un <b>descripteur</b>.<br>\nL’ensemble des valeurs que peut prendre un même attribut s’appelle le <b>domaine</b> de l’attribut.<br>\n            On va s'intéréser à deux <b>type de données</b> pour les attributs malgré qu'il en existe d'autres : les entiers, notés \"INT\", et les chaînes de caractères, notées \"TEXT\", .<br> </li>\n        <li>Chaque ligne de la relation correspond aux données d’une entité.<br> </li>\n        Pour une entité, la donnée des valeurs de chaque attribut s’appelle un <b>enregistrement</b>.\n        <li>Un <b>champ</b> est l'information élémentaire d'une base de données. C'est l'intersection d'une ligne et d'une colonne.</li>\n    </ul>\n</div><br>\n<b>Exemple :</b> En reprenant la base de donnée précédente.\n<ul>\n    <li>Cette base de données est une table/relation. </li>\n    <li>Cette table contient cinq enregistrements. </li>\n    <li>Cette table possède quatre attributs/colonnes dont les descripteurs sont : <b>idclient</b>, <b>nom</b>, <b>prenom</b>, <b>ville</b>.  </li>\n    <li>Le domaine de l'attribut <b>nom</b> est l'ensemble des noms possibles et son type de données est \"TEXT. Celui de l'attribut <b>idclient</b> est l'ensemble des entiers et son type de données est \"INT\". </li>\n    <li>Un enregistrement de la table est : $\\hspace{5mm}$2  $\\hspace{5mm}$   Buck  $\\hspace{5mm}$   Violet  $\\hspace{5mm}$   Landenne.</li>\n    </ul>"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n    <b><u>Question 1</u> : </b>Lister toutes les tables de la base de données chargée dans le notebook en exécutant ci-dessous la commande <code>.tables</code>.\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 2</u> : </b>Afficher la table de votre choix en complétant les instructions ci-dessous\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"SELECT * \nFROM .................. /*nom de la table à afficher */","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"On comprend qu'on a à disposition une base de données bancaires (évidemment factice) qui recense les clients, leurs comptes et les opérations effectuées sur les comptes."},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Définition</u> : PRIMARY KEY et FOREIGN KEY</b>  <br>\n<ul>\n    <li> La <b>clé primaire</b> d’une relation/table est un attribut qui permet d’identifier de manière unique et sans ambiguité chaque entité de cette relation.</li>\n    <li> On appelle <b>clé étrangère</b> d’une relation/table tout attribut qui fait référence à une clé primaire d’une autre relation/table.</li>\n</div>"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 3</u> : </b>Dans la table de votre choix, Y-a-t-il des clés primaires ? Y-a-t-il des clés étrangères ?\n</div>"},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{"trusted":false},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Définition</u> : Schéma relationnel</b>  <br>\nOn appelle <b>schéma relationnel</b> la liste des noms des relations suivis de la liste de leurs attributs, de leur domaine et des clés primaires et étrangères. \n</div>"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n    <b><u>Question 4</u> : </b>Afficher le schéma relationnel de la base de données en saisisant l'instruction <code>.schema</code>.\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n    <b><u>Question 5</u> : </b>Exécuter la requête ci-dessous. <br>\n    A quoi sert elle ?\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"SELECT * \nFROM client \nWHERE idclient=42 ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n    <b><u>Question 6</u> : </b>En vous inspirant des instructions précédentes, lister tous les livrets A ouvert à la banque dont on a les données.\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<b>On traduit cette requête en français par : «sélectionner tous les attributs des lignes de la table `compte` dont le `type` est égal à Livret A»</b>"},{"metadata":{},"cell_type":"markdown","source":"## C - Recherche de données dans une table"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Format d'une requête pour rechercher des informations dans une table</u></b>  <br>\n    \n```SQL\nSELECT les attributs à afficher ou * pour tous les afficher\nFROM la relation/table considérée\nWHERE les critères de recherche, séparés par OR ou AND si nécessaire et NOT pour une négation\n```\n</div>"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n    <b><u>Question 7</u> : </b>A quoi sert la requête suivante ?\n    \n```SQL\nSELECT nom, prenom \nFROM client \nWHERE idclient <15\n```\n</div>"},{"metadata":{"trusted":false},"cell_type":"raw","source":""},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 8</u> : </b>Ecrire ci-dessous une requête afin d'afficher les <code>nom</code>, <code>prenom</code> et <code>ville</code> des clients dont le prénom est \"Jordan\".\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 9</u> : </b>Écrire une requête permettant d'afficher « les <code>montant</code> et <code>informations</code> des opérations réalisées sur les comptes d'idenficateur $1$ ou $13$ ». Vous devriez obtenir les résultats suivants :\n\n\n|montant |informations|\n|:------:|:----------:|\n|526.86 |Virement|\n|7.95 | Cheque|\n|131.47 |Cheque|\n|20.17 |Virement|\n|26.19 |Guichet|\n|307.93 |Cheque|\n|-360.29 |Guichet|\n</div>"},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 10</u> : </b>Écrire une requête fournissant les identifiants de tous les comptes de type <code>Livret A</code>.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 11</u> : </b>Écrire une requête fournissant les identifiants d'opération et montants de toutes les opérations effectuées au guichet pour un montant compris entre $0$ et $100$.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## D - Jointure de différentes tables d'une même base de données"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    <b><u>Jointure de tables</u></b>  <br>\nSQL permet d'afficher des tables recoupant des données contenues dans différentes tables. Pour ce faire, on fait des <b>jointures</b> sur des attributs qu'elles ont en commun.<br>\nUne requête avec jointure de tables s'écrit sous la forme suivante :\n    \n```SQL\nSELECT table_1.attribut_1, table_2.attribut_2, ...\nFROM table_1 \nINNER JOIN table_2 ON table_1.nom_attribut_commun=table_2.nom_attribut_commun\nWHERE condition s il y en a\n```\n    \n<ul>\n    <li>la ligne <code>SELECT</code> permet de choisir quels attributs afficher pour chacune des tables ; </li>\n    <li>la ligne <code>FROM ...</code> définit la première table à laquelle on va s'intéresser ; </li>\n    <li>la ligne <code>INNER JOIN ... ON ...</code> permet de faire la jointure entre notre première table et une seconde selon un attribut commun aux deux ;</li>\n    <li>la ligne <code>WHERE</code> permet de limiter l'affichage de la table jointée aux enregistrements vérifiant une condition donnée.</li>\n</ul>\n</div>"},{"metadata":{"slideshow":{"slide_type":"slide"}},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 12</u> : </b>Que va afficher la requête ci-dessous ? Vérifier votre raisonnement en l'exécutant.\n    \n```SQL\nSELECT client.nom,client.prenom,compte.idcompte \nFROM client \nINNER JOIN compte ON client.idclient=compte.idclient \nWHERE compte.type='Livret A'     \n````\n</div> "},{"metadata":{},"cell_type":"raw","source":""},{"metadata":{"trusted":false},"cell_type":"code","source":"    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\nFaire des jointures peut être délicat. Pour bien les faire, on peut suivre le protocole suivant :\n<ul>\n    <li>Faire le bilan des attributs à afficher. </li>\n    <li>Faire le bilan des tables à utiliser pour obtenir ces arguments. </li>\n    <li>Faire le bilan des jointures (Quel est l'attribut qui va permettre de relier une base à une autre ?). </li>\n    <li>Faire le bilan des contraintes </li>\n    <li>Ecrire la requête en tenant compte des éléments précédents. </li>\n</ul> \nSi nécessaire, on peut faire plusieurs jointures entre plusieurs tables les unes à la suite des autres.\n</div> "},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 13</u> : </b>Ecrire une requète permettant d'afficher le numéro client, le type de livret et le montant de toutes les opérations du client ayant l'identifiant 33.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 14</u> : </b>Compléter le code suivant pour afficher tous les montants des opérations de plus de 700 euros ainsi que les noms et prénoms des titulaires des comptes concernés par ces opérations.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"SELECT client.nom, ...........\nFROM client \nINNER JOIN compte ON client.idclient=compte.idclient \nINNER JOIN .......... ON ..........\nWHERE ..........                     ","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 15</u> : </b>Afficher la table des opérations effectuées sur chaque compte pour un montant compris entre 0 et 100 euros. On demande à avoir l'identificateur du propriétaire, l'identificateur du compte, le type de compte, le montant et les informations de l'opération.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"                   ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## E - Modification d'une table"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\n    \n<ul>\n<li>Pour rajouter un enregistrement à une table, on utilise la requête :<br>\n        \n```SQL\nINSERT INTO nom_de_la_table\nVALUES (élément 1, élément 2, ...)\n``` \n        \n</li>\n<li>Pour supprimer un enregistrement d'une table, on utilise la requête :<br>\n        \n```SQL\nDELETE FROM nom_de_la_table\nWHERE condition\n``` \n        \n</li>\n<li>Pour mettre à jour un enregistrement dans une table, on utilise la requête :<br>\n        \n```SQL\nUPDATE nom_de_la_table\nSET nom_colonne_1 = \"nouvelle valeur 1\", nom_colonne_2 = \"nouvelle valeur 2\", ...\nWHERE condition\n``` \n        \n</li>\n<li>Pour créer une table, on utilise la requête :<br>\n        \n```SQL\nCREATE TABLE nom_de_la_table\n(\n    colonne1 type_donnees,\n    colonne2 type_donnees,\n    colonne3 type_donnees,\n    colonne4 type_donnees\n)\n``` \n</li>\n</ul>\n\n</div>"},{"metadata":{"trusted":false},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 16</u> : </b>Ecrire une requête permettant de rajouter une nouvelle opération numérotée 1001, à la table <code>operation</code>, représentant un dépot par virement de 150 euros sur le compte d'identifiant 269.<br>\n    <i>Vous pouvez vérifier votre requête en allant chercher l'opération dans la table<code>operation</code>.</i>\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 17</u> : </b>Le client Ewing Grant vient de fermer ses comptes et on veut le suprimer de la table client. Ecrire une requête permettant de faire cela.<br>\n    <i>Vous pouvez vérifier votre requête en allant chercher le client dans la table<code>client</code>.</i>\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 18</u> : </b>Le banquier à l'accueil de la banque a fait une erreur lors de l'ouverture du compte de la cliente dont l'indentifiant est le numéro 9. Son prénom est Jessie et non pas Jesse.<br>\nEcrire une requête permettant de corriger cette erreur.<br>\n    <i>Vous pouvez vérifier votre requête en allant chercher le client dans la table<code>client</code>.</i>\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 19</u> : </b>Créer une nouvelle table, appelé bilan, contenant les noms des clients, les prénoms des clients, les identifiants de ses comptes et pour chaque compte son type.<br>\n    <i>Vous pouvez vérifier votre résultat en utilisant la requète <code>.schema</code>.</i>\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 20</u> : </b>Insérer dans cette nouvelle table toutes les données correspondantes. On triera la table par ordre croissant de noms puis prénoms.<br>\n    <i>Vous pouvez vérifier en affichant la table <code>bilan</code>.</i>\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## E - Commandes non exigibles mais intéressantes pour le traitement de données"},{"metadata":{},"cell_type":"markdown","source":"### <center>Fonctions d'agrégation, traitement statistique</center>"},{"metadata":{"trusted":true},"cell_type":"markdown","source":"<div class=\"alert alert-block alert-info\" style=\"border-left:15px solid #003366;\">\nSQL permet de faire un traitement statistique basique grace à des fonctions dites d'agrégation.\n<ul>  \n    \n<li>Pour déterminer le nombre d'enregistrements dans une table, on utilise la requête :\n        \n```SQL\nSELECT COUNT(*)\nFROM table_choisie\nWHERE conditions\n```\n</li>\n    \n<li>Pour déterminer la valeur minimale d'un attribut, on utilise la requête :\n        \n```SQL\nSELECT MIN(attribut)\nFROM table_choisie\nWHERE conditions\n```\n</li>\n    \n<li>Pour déterminer la valeur maximale d'un attribut, on utilise la requête :\n        \n```SQL\nSELECT MAX(attribut)\nFROM table_choisie\nWHERE conditions\n```\n</li>\n    \n<li>Pour déterminer la valeur moyenne d'un attribut, on utilise la requête :\n        \n```SQL\nSELECT AVG(attribut)\nFROM table_choisie\nWHERE conditions\n```\n</li>\n    \n<li>Pour déterminer la somme des valeurs d'un attribut on utilise la requête :\n        \n```SQL\nSELECT SUM(attribut)\nFROM table_choisie\nWHERE conditions\n```\n</li>\n\n</ul>    \n\n</ul>\n</div>"},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 21</u> : </b>Ecrire une requête permettant de compter le nombre de Livrets A.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 22</u> : </b>Ecrire une requête permettant d'obtenir la somme des montants des opérations positives (dépôts).\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 23</u> : </b>Ecrire une requête permettant d'obtenir le montant du plus grand virement de notre base de données.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 24</u> : </b>Ecrire une requête permettant d'obtenir le montant du plus petit dépot de notre base de données.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 25</u> : </b>Ecrire une requête permettant d'obtenir la moyenne des retraits.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 26</u> : </b>A quoi sert la requête suivante ?\n    \n```SQL\nSELECT COUNT(montant)\nFROM operation\nWHERE montant>0\n```\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"<div class=\"alert alert-danger\" style=\"border-left: 15px solid #a94442;\">\n<b><u>Question 27</u> : </b>Ecrire une requête permettant d'obtenir la moyenne des dépots sur les assurances vies.\n</div> "},{"metadata":{"trusted":false},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"name":"sql","display_name":"SQL","language":"sql"},"celltoolbar":"Éditer les Méta-Données"},"nbformat":4,"nbformat_minor":2}