[{"data":1,"prerenderedAt":4367},["ShallowReactive",2],{"navigation":3,"chapter-cours-nsi-tale\u002Ftb-bases-de-donnees":585,"chapter-index-nsi-tale\u002Ftb-bases-de-donnees":2780,"chapter-memo-nsi-tale\u002Ftb-bases-de-donnees":2925},[4,224,440],{"title":5,"path":6,"stem":7,"children":8},"SNT — Seconde","\u002Fsnt-2nde","0.snt-2nde\u002F0.index",[9,10,14,36,66,92,118,144,162,184,206],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"REVIEW pédagogique — SNT 2nde","\u002Fsnt-2nde\u002Freview","0.snt-2nde\u002FREVIEW",{"title":15,"path":16,"stem":17,"children":18},"Internet","\u002Fsnt-2nde\u002Fsa-internet","0.snt-2nde\u002Fsa-internet\u002F0.index",[19,20,24,28,32],{"title":15,"path":16,"stem":17},{"title":21,"path":22,"stem":23},"Adresses symboliques et DNS","\u002Fsnt-2nde\u002Fsa-internet\u002Fadresses-dns","0.snt-2nde\u002Fsa-internet\u002F1.adresses-dns",{"title":25,"path":26,"stem":27},"Internet et les réseaux physiques","\u002Fsnt-2nde\u002Fsa-internet\u002Freseaux-physiques","0.snt-2nde\u002Fsa-internet\u002F2.reseaux-physiques",{"title":29,"path":30,"stem":31},"Protocoles TCP\u002FIP et routage des paquets","\u002Fsnt-2nde\u002Fsa-internet\u002Ftcp-ip-routage","0.snt-2nde\u002Fsa-internet\u002F3.tcp-ip-routage",{"title":33,"path":34,"stem":35},"Réseaux pair-à-pair","\u002Fsnt-2nde\u002Fsa-internet\u002Fpair-a-pair","0.snt-2nde\u002Fsa-internet\u002F4.pair-a-pair",{"title":37,"path":38,"stem":39,"children":40},"Le Web","\u002Fsnt-2nde\u002Fsb-web","0.snt-2nde\u002Fsb-web\u002F0.index",[41,42,46,50,54,58,62],{"title":37,"path":38,"stem":39},{"title":43,"path":44,"stem":45},"Histoire du Web","\u002Fsnt-2nde\u002Fsb-web\u002Fhistoire-web","0.snt-2nde\u002Fsb-web\u002F1.histoire-web",{"title":47,"path":48,"stem":49},"URL et hypertexte","\u002Fsnt-2nde\u002Fsb-web\u002Furl-hypertexte","0.snt-2nde\u002Fsb-web\u002F2.url-hypertexte",{"title":51,"path":52,"stem":53},"HTML et CSS — le contenu et la présentation","\u002Fsnt-2nde\u002Fsb-web\u002Fhtml-css","0.snt-2nde\u002Fsb-web\u002F3.html-css",{"title":55,"path":56,"stem":57},"Client-serveur et requêtes HTTP","\u002Fsnt-2nde\u002Fsb-web\u002Fclient-serveur-http","0.snt-2nde\u002Fsb-web\u002F4.client-serveur-http",{"title":59,"path":60,"stem":61},"Moteurs de recherche","\u002Fsnt-2nde\u002Fsb-web\u002Fmoteurs-recherche","0.snt-2nde\u002Fsb-web\u002F5.moteurs-recherche",{"title":63,"path":64,"stem":65},"Sécurité du navigateur et notions juridiques","\u002Fsnt-2nde\u002Fsb-web\u002Fsecurite-droits","0.snt-2nde\u002Fsb-web\u002F6.securite-droits",{"title":67,"path":68,"stem":69,"children":70},"Les réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F0.index",[71,72,76,80,84,88],{"title":67,"path":68,"stem":69},{"title":73,"path":74,"stem":75},"Panorama des réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fpanorama-rs","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F1.panorama-rs",{"title":77,"path":78,"stem":79},"Identité numérique et authentification","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fidentite-numerique","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F2.identite-numerique",{"title":81,"path":82,"stem":83},"Le modèle économique des réseaux sociaux","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fmodele-economique","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F3.modele-economique",{"title":85,"path":86,"stem":87},"Petit monde et graphes","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fpetit-monde-graphes","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F4.petit-monde-graphes",{"title":89,"path":90,"stem":91},"La cyberviolence","\u002Fsnt-2nde\u002Fsc-reseaux-sociaux\u002Fcyberviolence","0.snt-2nde\u002Fsc-reseaux-sociaux\u002F5.cyberviolence",{"title":93,"path":94,"stem":95,"children":96},"Les données structurées et leur traitement","\u002Fsnt-2nde\u002Fsd-donnees-structurees","0.snt-2nde\u002Fsd-donnees-structurees\u002F0.index",[97,98,102,106,110,114],{"title":93,"path":94,"stem":95},{"title":99,"path":100,"stem":101},"Données et formats","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fdonnees-formats","0.snt-2nde\u002Fsd-donnees-structurees\u002F1.donnees-formats",{"title":103,"path":104,"stem":105},"Données structurées","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fdonnees-structurees","0.snt-2nde\u002Fsd-donnees-structurees\u002F2.donnees-structurees",{"title":107,"path":108,"stem":109},"Métadonnées","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fmetadonnees","0.snt-2nde\u002Fsd-donnees-structurees\u002F3.metadonnees",{"title":111,"path":112,"stem":113},"Traitement de tables","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Ftraitement-tables","0.snt-2nde\u002Fsd-donnees-structurees\u002F4.traitement-tables",{"title":115,"path":116,"stem":117},"Le cloud","\u002Fsnt-2nde\u002Fsd-donnees-structurees\u002Fcloud","0.snt-2nde\u002Fsd-donnees-structurees\u002F5.cloud",{"title":119,"path":120,"stem":121,"children":122},"Localisation, cartographie et mobilité","\u002Fsnt-2nde\u002Fse-localisation-cartographie","0.snt-2nde\u002Fse-localisation-cartographie\u002F0.index",[123,124,128,132,136,140],{"title":119,"path":120,"stem":121},{"title":125,"path":126,"stem":127},"GPS et Galileo — se situer grâce aux satellites","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fgps-galileo","0.snt-2nde\u002Fse-localisation-cartographie\u002F1.gps-galileo",{"title":129,"path":130,"stem":131},"Décoder une trame NMEA","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Ftrame-nmea","0.snt-2nde\u002Fse-localisation-cartographie\u002F2.trame-nmea",{"title":133,"path":134,"stem":135},"Cartes numériques — GeoPortail et OpenStreetMap","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fcartes-numeriques","0.snt-2nde\u002Fse-localisation-cartographie\u002F3.cartes-numeriques",{"title":137,"path":138,"stem":139},"Itinéraires et graphes","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fitineraires-graphes","0.snt-2nde\u002Fse-localisation-cartographie\u002F4.itineraires-graphes",{"title":141,"path":142,"stem":143},"Confidentialité de la position","\u002Fsnt-2nde\u002Fse-localisation-cartographie\u002Fconfidentialite-position","0.snt-2nde\u002Fse-localisation-cartographie\u002F5.confidentialite-position",{"title":145,"path":146,"stem":147,"children":148},"Informatique embarquée et objets connectés","\u002Fsnt-2nde\u002Fsf-info-embarquee","0.snt-2nde\u002Fsf-info-embarquee\u002F0.index",[149,150,154,158],{"title":145,"path":146,"stem":147},{"title":151,"path":152,"stem":153},"Systèmes informatiques embarqués","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fsystemes-embarques","0.snt-2nde\u002Fsf-info-embarquee\u002F1.systemes-embarques",{"title":155,"path":156,"stem":157},"Capteurs et actionneurs","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fcapteurs-actionneurs","0.snt-2nde\u002Fsf-info-embarquee\u002F2.capteurs-actionneurs",{"title":159,"path":160,"stem":161},"IHM et objets connectés","\u002Fsnt-2nde\u002Fsf-info-embarquee\u002Fihm-objet-connecte","0.snt-2nde\u002Fsf-info-embarquee\u002F3.ihm-objet-connecte",{"title":163,"path":164,"stem":165,"children":166},"Photographie numérique","\u002Fsnt-2nde\u002Fsg-photo-numerique","0.snt-2nde\u002Fsg-photo-numerique\u002F0.index",[167,168,172,176,180],{"title":163,"path":164,"stem":165},{"title":169,"path":170,"stem":171},"Photosites, pixels et résolution","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Fpixels-resolution","0.snt-2nde\u002Fsg-photo-numerique\u002F1.pixels-resolution",{"title":173,"path":174,"stem":175},"Les algorithmes de l'appareil photo","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Falgorithmes-photo","0.snt-2nde\u002Fsg-photo-numerique\u002F2.algorithmes-photo",{"title":177,"path":178,"stem":179},"Les métadonnées EXIF","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Fmetadonnees-exif","0.snt-2nde\u002Fsg-photo-numerique\u002F3.metadonnees-exif",{"title":181,"path":182,"stem":183},"Traiter une image en Python","\u002Fsnt-2nde\u002Fsg-photo-numerique\u002Ftraitement-rgb","0.snt-2nde\u002Fsg-photo-numerique\u002F4.traitement-rgb",{"title":185,"path":186,"stem":187,"children":188},"Notions transversales de programmation","\u002Fsnt-2nde\u002Fsh-prog-notions","0.snt-2nde\u002Fsh-prog-notions\u002F0.index",[189,190,194,198,202],{"title":185,"path":186,"stem":187},{"title":191,"path":192,"stem":193},"Séquences d'instructions et variables","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fsequences-affectations","0.snt-2nde\u002Fsh-prog-notions\u002F1.sequences-affectations",{"title":195,"path":196,"stem":197},"Instructions conditionnelles","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fconditionnelles","0.snt-2nde\u002Fsh-prog-notions\u002F2.conditionnelles",{"title":199,"path":200,"stem":201},"Boucles bornées et non bornées","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Fboucles","0.snt-2nde\u002Fsh-prog-notions\u002F3.boucles",{"title":203,"path":204,"stem":205},"Définitions et appels de fonctions","\u002Fsnt-2nde\u002Fsh-prog-notions\u002Ffonctions","0.snt-2nde\u002Fsh-prog-notions\u002F4.fonctions",{"title":207,"path":208,"stem":209,"children":210},"Démo des widgets MDC","\u002Fsnt-2nde\u002Fzz-demo-widgets","0.snt-2nde\u002Fzz-demo-widgets\u002F0.index",[211,212,216,220],{"title":207,"path":208,"stem":209},{"title":213,"path":214,"stem":215},"Démo statique — callouts, code, BO, illustration","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Fstatique","0.snt-2nde\u002Fzz-demo-widgets\u002F1.statique",{"title":217,"path":218,"stem":219},"Démo interactive — self-eval et python-snippet","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Finteractif","0.snt-2nde\u002Fzz-demo-widgets\u002F2.interactif",{"title":221,"path":222,"stem":223},"Démo · 14 widgets de manipulation NSI","\u002Fsnt-2nde\u002Fzz-demo-widgets\u002Fwidgets-manipulation","0.snt-2nde\u002Fzz-demo-widgets\u002F3.widgets-manipulation",{"title":225,"path":226,"stem":227,"children":228},"NSI — Première","\u002Fnsi-1ere","1.nsi-1ere\u002F0.index",[229,230,234,256,282,304,328,354,380,410],{"title":225,"path":226,"stem":227},{"title":231,"path":232,"stem":233},"Relecture pédagogique — 8 chapitres NSI 1ère (PA → PH)","\u002Fnsi-1ere\u002Freview","1.nsi-1ere\u002FREVIEW",{"title":235,"path":236,"stem":237,"children":238},"Histoire de l'informatique","\u002Fnsi-1ere\u002Fpa-histoire-info","1.nsi-1ere\u002Fpa-histoire-info\u002F0.index",[239,240,244,248,252],{"title":235,"path":236,"stem":237},{"title":241,"path":242,"stem":243},"De la préantiquité aux machines à calculer","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fpreantiquite-aux-machines","1.nsi-1ere\u002Fpa-histoire-info\u002F1.preantiquite-aux-machines",{"title":245,"path":246,"stem":247},"La machine universelle (1930-1950)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fmachine-universelle","1.nsi-1ere\u002Fpa-histoire-info\u002F2.machine-universelle",{"title":249,"path":250,"stem":251},"Les ordinateurs modernes (1947-1990)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Fordinateurs-modernes","1.nsi-1ere\u002Fpa-histoire-info\u002F3.ordinateurs-modernes",{"title":253,"path":254,"stem":255},"Réseaux, Web et IA (1969 à aujourd'hui)","\u002Fnsi-1ere\u002Fpa-histoire-info\u002Freseaux-et-web","1.nsi-1ere\u002Fpa-histoire-info\u002F4.reseaux-et-web",{"title":257,"path":258,"stem":259,"children":260},"Représentation des données — types et valeurs","\u002Fnsi-1ere\u002Fpb-types-valeurs","1.nsi-1ere\u002Fpb-types-valeurs\u002F0.index",[261,262,266,270,274,278],{"title":257,"path":258,"stem":259},{"title":263,"path":264,"stem":265},"Bases de numération et entiers positifs","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fbases-entiers-positifs","1.nsi-1ere\u002Fpb-types-valeurs\u002F1.bases-entiers-positifs",{"title":267,"path":268,"stem":269},"Entiers relatifs et complément à deux","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fentiers-relatifs","1.nsi-1ere\u002Fpb-types-valeurs\u002F2.entiers-relatifs",{"title":271,"path":272,"stem":273},"Nombres flottants et virgule flottante","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fflottants","1.nsi-1ere\u002Fpb-types-valeurs\u002F3.flottants",{"title":275,"path":276,"stem":277},"Textes et encodages — ASCII, ISO-8859-1, Unicode","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Ftextes-encodages","1.nsi-1ere\u002Fpb-types-valeurs\u002F4.textes-encodages",{"title":279,"path":280,"stem":281},"Valeurs booléennes et opérateurs logiques","\u002Fnsi-1ere\u002Fpb-types-valeurs\u002Fbooleens","1.nsi-1ere\u002Fpb-types-valeurs\u002F5.booleens",{"title":283,"path":284,"stem":285,"children":286},"Représentation des données : types construits","\u002Fnsi-1ere\u002Fpc-types-construits","1.nsi-1ere\u002Fpc-types-construits\u002F0.index",[287,288,292,296,300],{"title":283,"path":284,"stem":285},{"title":289,"path":290,"stem":291},"Tableaux et listes","\u002Fnsi-1ere\u002Fpc-types-construits\u002Ftableaux-listes","1.nsi-1ere\u002Fpc-types-construits\u002F1.tableaux-listes",{"title":293,"path":294,"stem":295},"Listes en compréhension","\u002Fnsi-1ere\u002Fpc-types-construits\u002Fcomprehension","1.nsi-1ere\u002Fpc-types-construits\u002F2.comprehension",{"title":297,"path":298,"stem":299},"Tuples et p-uplets nommés","\u002Fnsi-1ere\u002Fpc-types-construits\u002Ftuples","1.nsi-1ere\u002Fpc-types-construits\u002F3.tuples",{"title":301,"path":302,"stem":303},"Dictionnaires","\u002Fnsi-1ere\u002Fpc-types-construits\u002Fdictionnaires","1.nsi-1ere\u002Fpc-types-construits\u002F4.dictionnaires",{"title":305,"path":306,"stem":307,"children":308},"Traitement de données en tables","\u002Fnsi-1ere\u002Fpd-tables-donnees","1.nsi-1ere\u002Fpd-tables-donnees\u002F0.index",[309,310,314,318,322],{"title":305,"path":306,"stem":307},{"title":311,"path":312,"stem":313},"Tables et CSV","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ftables-csv","1.nsi-1ere\u002Fpd-tables-donnees\u002F1.tables-csv",{"title":315,"path":316,"stem":317},"Recherche et filtrage","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Frecherche","1.nsi-1ere\u002Fpd-tables-donnees\u002F2.recherche",{"title":319,"path":320,"stem":321},"Trier une table","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ftri","1.nsi-1ere\u002Fpd-tables-donnees\u002F3.tri",{"title":323,"path":324,"stem":325,"children":326},"Fusion et indexation","\u002Fnsi-1ere\u002Fpd-tables-donnees\u002Ffusion-indexation","1.nsi-1ere\u002Fpd-tables-donnees\u002F4.fusion-indexation",[327],{"title":323,"path":324,"stem":325},{"title":329,"path":330,"stem":331,"children":332},"IHM sur le Web","\u002Fnsi-1ere\u002Fpe-ihm-web","1.nsi-1ere\u002Fpe-ihm-web\u002F0.index",[333,334,338,342,346,350],{"title":329,"path":330,"stem":331},{"title":335,"path":336,"stem":337},"HTML et CSS — rappel de structure","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fhtml-css-bases","1.nsi-1ere\u002Fpe-ihm-web\u002F1.html-css-bases",{"title":339,"path":340,"stem":341},"Formulaires HTML","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fformulaires","1.nsi-1ere\u002Fpe-ihm-web\u002F2.formulaires",{"title":343,"path":344,"stem":345},"Événements JavaScript","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fevenements-js","1.nsi-1ere\u002Fpe-ihm-web\u002F3.evenements-js",{"title":347,"path":348,"stem":349},"Manipulation du DOM","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fdom-interaction","1.nsi-1ere\u002Fpe-ihm-web\u002F4.dom-interaction",{"title":351,"path":352,"stem":353},"Client, serveur et HTTP","\u002Fnsi-1ere\u002Fpe-ihm-web\u002Fclient-serveur-http","1.nsi-1ere\u002Fpe-ihm-web\u002F5.client-serveur-http",{"title":355,"path":356,"stem":357,"children":358},"Architectures matérielles et systèmes d'exploitation","\u002Fnsi-1ere\u002Fpf-archi-os","1.nsi-1ere\u002Fpf-archi-os\u002F0.index",[359,360,364,368,372,376],{"title":355,"path":356,"stem":357},{"title":361,"path":362,"stem":363},"Le modèle de von Neumann","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fvon-neumann","1.nsi-1ere\u002Fpf-archi-os\u002F1.von-neumann",{"title":365,"path":366,"stem":367},"Périphériques et interface homme-machine","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fperipheriques-ihm","1.nsi-1ere\u002Fpf-archi-os\u002F2.peripheriques-ihm",{"title":369,"path":370,"stem":371},"Les systèmes d'exploitation","\u002Fnsi-1ere\u002Fpf-archi-os\u002Fsystemes-exploitation","1.nsi-1ere\u002Fpf-archi-os\u002F3.systemes-exploitation",{"title":373,"path":374,"stem":375},"Linux et le shell","\u002Fnsi-1ere\u002Fpf-archi-os\u002Flinux-shell","1.nsi-1ere\u002Fpf-archi-os\u002F4.linux-shell",{"title":377,"path":378,"stem":379},"Réseaux et protocoles","\u002Fnsi-1ere\u002Fpf-archi-os\u002Freseaux","1.nsi-1ere\u002Fpf-archi-os\u002F5.reseaux",{"title":381,"path":382,"stem":383,"children":384},"Langages et programmation","\u002Fnsi-1ere\u002Fpg-langages-prog","1.nsi-1ere\u002Fpg-langages-prog\u002F0.index",[385,386,390,394,398,402,406],{"title":381,"path":382,"stem":383},{"title":387,"path":388,"stem":389},"Diversité et unité des langages de programmation","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fdiversite-langages","1.nsi-1ere\u002Fpg-langages-prog\u002F1.diversite-langages",{"title":391,"path":392,"stem":393},"Constructions élémentaires","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fconstructions-elementaires","1.nsi-1ere\u002Fpg-langages-prog\u002F2.constructions-elementaires",{"title":395,"path":396,"stem":397},"Fonctions","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Ffonctions","1.nsi-1ere\u002Fpg-langages-prog\u002F3.fonctions",{"title":399,"path":400,"stem":401},"Spécification d'une fonction","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fspecification","1.nsi-1ere\u002Fpg-langages-prog\u002F4.specification",{"title":403,"path":404,"stem":405},"Mise au point des programmes","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fmise-au-point","1.nsi-1ere\u002Fpg-langages-prog\u002F5.mise-au-point",{"title":407,"path":408,"stem":409},"Utilisation de bibliothèques","\u002Fnsi-1ere\u002Fpg-langages-prog\u002Fbibliotheques","1.nsi-1ere\u002Fpg-langages-prog\u002F6.bibliotheques",{"title":411,"path":412,"stem":413,"children":414},"Algorithmique","\u002Fnsi-1ere\u002Fph-algorithmique","1.nsi-1ere\u002Fph-algorithmique\u002F0.index",[415,416,420,424,428,432,436],{"title":411,"path":412,"stem":413},{"title":417,"path":418,"stem":419},"Parcours séquentiel d'un tableau","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fparcours-sequentiel","1.nsi-1ere\u002Fph-algorithmique\u002F1.parcours-sequentiel",{"title":421,"path":422,"stem":423},"Bases de la complexité","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fcomplexite-bases","1.nsi-1ere\u002Fph-algorithmique\u002F2.complexite-bases",{"title":425,"path":426,"stem":427},"Tris par sélection et par insertion","\u002Fnsi-1ere\u002Fph-algorithmique\u002Ftris","1.nsi-1ere\u002Fph-algorithmique\u002F3.tris",{"title":429,"path":430,"stem":431},"Recherche dichotomique","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fdichotomie","1.nsi-1ere\u002Fph-algorithmique\u002F4.dichotomie",{"title":433,"path":434,"stem":435},"Algorithmes gloutons","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fgloutons","1.nsi-1ere\u002Fph-algorithmique\u002F5.gloutons",{"title":437,"path":438,"stem":439},"Les k plus proches voisins (k-NN)","\u002Fnsi-1ere\u002Fph-algorithmique\u002Fknn","1.nsi-1ere\u002Fph-algorithmique\u002F6.knn",{"title":441,"path":442,"stem":443,"children":444},"NSI — Terminale","\u002Fnsi-tale","2.nsi-tale\u002F0.index",[445,446,450,476,498,536,560],{"title":441,"path":442,"stem":443},{"title":447,"path":448,"stem":449},"Review pédagogique — chapitres NSI Terminale (TA, TB, TC, TD, TE)","\u002Fnsi-tale\u002Freview","2.nsi-tale\u002FREVIEW",{"title":451,"path":452,"stem":453,"children":454},"Structures de données","\u002Fnsi-tale\u002Fta-structures-donnees","2.nsi-tale\u002Fta-structures-donnees\u002F0.index",[455,456,460,464,468,472],{"title":451,"path":452,"stem":453},{"title":457,"path":458,"stem":459},"Objet, classe, interface","\u002Fnsi-tale\u002Fta-structures-donnees\u002Finterface-implementation","2.nsi-tale\u002Fta-structures-donnees\u002F1.interface-implementation",{"title":461,"path":462,"stem":463},"Implémenter une structure — l'exemple de la file FIFO","\u002Fnsi-tale\u002Fta-structures-donnees\u002Fimplementer-une-structure","2.nsi-tale\u002Fta-structures-donnees\u002F2.implementer-une-structure",{"title":465,"path":466,"stem":467},"Listes, piles, files, dictionnaires","\u002Fnsi-tale\u002Fta-structures-donnees\u002Flistes-piles-files-dict","2.nsi-tale\u002Fta-structures-donnees\u002F3.listes-piles-files-dict",{"title":469,"path":470,"stem":471},"Arbres binaires","\u002Fnsi-tale\u002Fta-structures-donnees\u002Farbres-binaires","2.nsi-tale\u002Fta-structures-donnees\u002F4.arbres-binaires",{"title":473,"path":474,"stem":475},"Graphes","\u002Fnsi-tale\u002Fta-structures-donnees\u002Fgraphes","2.nsi-tale\u002Fta-structures-donnees\u002F5.graphes",{"title":477,"path":478,"stem":479,"children":480},"Bases de données","\u002Fnsi-tale\u002Ftb-bases-de-donnees","2.nsi-tale\u002Ftb-bases-de-donnees\u002F0.index",[481,482,486,490,494],{"title":477,"path":478,"stem":479},{"title":483,"path":484,"stem":485},"Le modèle relationnel","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fmodele-relationnel","2.nsi-tale\u002Ftb-bases-de-donnees\u002F1.modele-relationnel",{"title":487,"path":488,"stem":489},"Bases de données relationnelles et anomalies de schéma","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fbase-relationnelle","2.nsi-tale\u002Ftb-bases-de-donnees\u002F2.base-relationnelle",{"title":491,"path":492,"stem":493},"Le langage SQL","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsql","2.nsi-tale\u002Ftb-bases-de-donnees\u002F3.sql",{"title":495,"path":496,"stem":497},"Les systèmes de gestion de bases de données","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsgbd","2.nsi-tale\u002Ftb-bases-de-donnees\u002F4.sgbd",{"title":499,"path":500,"stem":501,"children":502},"Architectures matérielles, systèmes d'exploitation et réseaux","\u002Fnsi-tale\u002Ftc-archi-os-reseaux","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F0.index",[503,504,508,512,516,520,524,528,532],{"title":499,"path":500,"stem":501},{"title":505,"path":506,"stem":507},"Le système sur puce (SoC)","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fsysteme-sur-puce","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F1.systeme-sur-puce",{"title":509,"path":510,"stem":511},"Processus et ordonnancement par l'OS","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fprocessus-os","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F2.processus-os",{"title":513,"path":514,"stem":515},"L'interblocage (deadlock)","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Finterblocage","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F3.interblocage",{"title":517,"path":518,"stem":519},"Principes du routage","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Froutage-principes","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F4.routage-principes",{"title":521,"path":522,"stem":523},"Protocoles de routage RIP et OSPF","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fprotocoles-rip-ospf","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F5.protocoles-rip-ospf",{"title":525,"path":526,"stem":527},"Chiffrement symétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fchiffrement-symetrique","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F6.chiffrement-symetrique",{"title":529,"path":530,"stem":531},"Chiffrement asymétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fchiffrement-asymetrique","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F7.chiffrement-asymetrique",{"title":533,"path":534,"stem":535},"HTTPS — l'échange de clé symétrique","\u002Fnsi-tale\u002Ftc-archi-os-reseaux\u002Fhttps-tls","2.nsi-tale\u002Ftc-archi-os-reseaux\u002F8.https-tls",{"title":381,"path":537,"stem":538,"children":539},"\u002Fnsi-tale\u002Ftd-langages-prog","2.nsi-tale\u002Ftd-langages-prog\u002F0.index",[540,541,544,548,552,556],{"title":381,"path":537,"stem":538},{"title":403,"path":542,"stem":543},"\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmise-au-point","2.nsi-tale\u002Ftd-langages-prog\u002F1.mise-au-point",{"title":545,"path":546,"stem":547},"Modularité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fmodularite","2.nsi-tale\u002Ftd-langages-prog\u002F2.modularite",{"title":549,"path":550,"stem":551},"Récursivité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Frecursivite","2.nsi-tale\u002Ftd-langages-prog\u002F3.recursivite",{"title":553,"path":554,"stem":555},"Paradigmes de programmation","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fparadigmes","2.nsi-tale\u002Ftd-langages-prog\u002F4.paradigmes",{"title":557,"path":558,"stem":559},"Programme comme donnée — calculabilité et indécidabilité","\u002Fnsi-tale\u002Ftd-langages-prog\u002Fprogramme-comme-donnee","2.nsi-tale\u002Ftd-langages-prog\u002F5.programme-comme-donnee",{"title":411,"path":561,"stem":562,"children":563},"\u002Fnsi-tale\u002Fte-algorithmique","2.nsi-tale\u002Fte-algorithmique\u002F0.index",[564,565,569,573,577,581],{"title":411,"path":561,"stem":562},{"title":566,"path":567,"stem":568},"Algorithmes sur les arbres binaires","\u002Fnsi-tale\u002Fte-algorithmique\u002Farbres-binaires-algos","2.nsi-tale\u002Fte-algorithmique\u002F1.arbres-binaires-algos",{"title":570,"path":571,"stem":572},"Parcours de graphes — DFS, BFS, cycles, chemins","\u002Fnsi-tale\u002Fte-algorithmique\u002Fgraphes-parcours","2.nsi-tale\u002Fte-algorithmique\u002F2.graphes-parcours",{"title":574,"path":575,"stem":576},"Diviser pour régner","\u002Fnsi-tale\u002Fte-algorithmique\u002Fdiviser-pour-regner","2.nsi-tale\u002Fte-algorithmique\u002F3.diviser-pour-regner",{"title":578,"path":579,"stem":580},"Programmation dynamique","\u002Fnsi-tale\u002Fte-algorithmique\u002Fprogrammation-dynamique","2.nsi-tale\u002Fte-algorithmique\u002F4.programmation-dynamique",{"title":582,"path":583,"stem":584},"Recherche textuelle — l'algorithme de Boyer-Moore","\u002Fnsi-tale\u002Fte-algorithmique\u002Frecherche-textuelle","2.nsi-tale\u002Fte-algorithmique\u002F5.recherche-textuelle",[586,966,1348,2199],{"id":587,"title":483,"bo":588,"body":590,"description":951,"eval":952,"extension":953,"labo":952,"meta":954,"navigation":955,"path":484,"quizzes":956,"readingTime":963,"seo":964,"stem":485,"tp":952,"__hash__":965},"cours\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F1.modele-relationnel.md",[589],"TB03",{"type":591,"value":592,"toc":943},"minimark",[593,598,616,631,634,638,668,686,690,700,723,728,763,794,818,822,825,881,888,906,910,931],[594,595,597],"h2",{"id":596},"introduction","Introduction",[599,600,601,602,606,607,610,611,615],"p",{},"Avant d'écrire la moindre requête, il faut ",[603,604,605],"strong",{},"modéliser",". Le modèle\nrelationnel, formalisé par Edgar F. Codd en 1970, propose un cadre\nmathématique simple pour organiser des données : tout se range dans des\n",[603,608,609],{},"tables"," — appelées ",[612,613,614],"em",{},"relations"," — dont la forme est rigoureusement\ncontrainte. C'est ce cadre qui permet ensuite à un SGBD de garantir la\ncohérence des données et au langage SQL d'exprimer des questions complexes\nen quelques lignes.",[599,617,618,619,622,623,626,627,630],{},"Vous connaissez déjà l'intuition. Une feuille de tableur — Excel,\nLibreOffice Calc, Google Sheets — vous montre des colonnes nommées et des\nlignes de données. Le modèle relationnel reprend cette image et la\ndiscipline : une feuille devient une ",[612,620,621],{},"relation",", ses colonnes des\n",[612,624,625],{},"attributs",", ses lignes des ",[612,628,629],{},"n-uplets",", et plusieurs feuilles peuvent se\nrelier rigoureusement par des références mutuelles.",[632,633],"bo-ref",{"code":589},[594,635,637],{"id":636},"le-vocabulaire-du-modèle","Le vocabulaire du modèle",[599,639,640,641,643,644,647,648,651,652,655,656,659,660,663,664,667],{},"Une ",[603,642,621],{}," est ce que vous appelez intuitivement une ",[612,645,646],{},"table",". Chaque\ncolonne porte un ",[603,649,650],{},"attribut"," (un nom) ; chaque attribut tire ses valeurs\nd'un ",[603,653,654],{},"domaine"," (un ensemble de valeurs admissibles, par exemple les\nentiers, les chaînes de moins de 50 caractères, les dates). Chaque ligne\nconstitue un ",[603,657,658],{},"n-uplet"," : un assemblage de valeurs, une pour chaque\nattribut. L'ensemble des n-uplets d'une relation forme son ",[603,661,662],{},"contenu"," ;\nl'ensemble des attributs et de leurs domaines forme son ",[603,665,666],{},"schéma",".",[669,670,671],"note",{},[599,672,673,674,677,678,681,682,685],{},"Contrainte fondamentale : dans une relation, ",[603,675,676],{},"aucune ligne n'est dupliquée","\net ",[603,679,680],{},"l'ordre des lignes n'a pas de sens",". Une relation est un ",[612,683,684],{},"ensemble","\nde n-uplets, au sens mathématique.",[594,687,689],{"id":688},"clés-primaires-et-clés-étrangères","Clés primaires et clés étrangères",[599,691,692,693,696,697,667],{},"Pour identifier sans ambiguïté chaque n-uplet, on choisit un attribut (ou\nune combinaison) qui ne se répète jamais : c'est la ",[603,694,695],{},"clé primaire",". Pour\nrelier une relation à une autre, on utilise un attribut dont les valeurs\nsont des clés primaires d'une autre relation : c'est une ",[603,698,699],{},"clé étrangère",[599,701,702,703,712,713,715,716,719,720,667],{},"On note un schéma relationnel par ",[704,705,706,707,711],"code",{},"R(",[708,709,710],"u",{},"att1",", att2, att3*)","\noù ",[708,714,710],{}," (souligné) est la clé primaire et att3* (étoile, parfois\nnotée ",[704,717,718],{},"att3#"," selon les ouvrages) est une clé étrangère vers la relation ",[704,721,722],{},"R'",[599,724,725],{},[603,726,727],{},"Exemple — un fragment de base scolaire :",[729,730,731,741,750],"ul",{},[732,733,734],"li",{},[704,735,736,737,740],{},"Eleve(",[708,738,739],{},"id_eleve",", nom, prenom, classe)",[732,742,743],{},[704,744,745,746,749],{},"Cours(",[708,747,748],{},"id_cours",", intitule, niveau)",[732,751,752],{},[704,753,754,755,757,762],{},"Inscription(",[708,756,739],{},[612,758,759,760],{},", ",[708,761,748],{},", date_inscription, note)",[599,764,765,766,769,770,773,774,777,778,781,782,785,786,789,790,793],{},"Dans ",[704,767,768],{},"Inscription",", la clé primaire est ",[612,771,772],{},"composée"," : c'est la paire\n",[704,775,776],{},"(id_eleve, id_cours)",", et chacun des deux attributs est aussi une clé\nétrangère, l'un vers ",[704,779,780],{},"Eleve",", l'autre vers ",[704,783,784],{},"Cours",". Cette table de liaison\nmodélise une relation ",[612,787,788],{},"plusieurs-à-plusieurs"," — un élève suit plusieurs\ncours, un cours accueille plusieurs élèves. Vous retrouverez cette base\n",[603,791,792],{},"Eleve \u002F Cours \u002F Inscription"," dans tous les cours du chapitre, pour\ngarder vos repères.",[795,796,799,806],"self-eval-qcm",{"correct":797,"slug":798},"1","modele-relationnel-c1",[800,801,803],"template",{"v-slot:question":802},"",[599,804,805],{},"Dans Eleve(id_eleve, nom, prenom, classe), où id_eleve est souligné, combien la clé primaire comporte-t-elle d'attributs ?",[800,807,808],{"v-slot:choices":802},[729,809,810,812,815],{},[732,811,797],{},[732,813,814],{},"2",[732,816,817],{},"4",[594,819,821],{"id":820},"les-contraintes-dintégrité","Les contraintes d'intégrité",[599,823,824],{},"Le modèle relationnel impose trois contraintes qui garantissent la cohérence\ndes données :",[646,826,827,840],{},[828,829,830],"thead",{},[831,832,833,837],"tr",{},[834,835,836],"th",{},"Contrainte",[834,838,839],{},"Sens",[841,842,843,857,871],"tbody",{},[831,844,845,851],{},[846,847,848],"td",{},[603,849,850],{},"De domaine",[846,852,853,854,667],{},"Chaque valeur d'un attribut doit appartenir au domaine déclaré. On ne range pas du texte dans une colonne ",[704,855,856],{},"entier",[831,858,859,864],{},[846,860,861],{},[603,862,863],{},"D'entité",[846,865,866,867,870],{},"Aucun composant d'une clé primaire ne peut être ",[704,868,869],{},"NULL"," (absent), et deux lignes ne peuvent partager la même clé primaire.",[831,872,873,878],{},[846,874,875],{},[603,876,877],{},"Référentielle",[846,879,880],{},"Toute valeur d'une clé étrangère doit exister comme clé primaire dans la relation référencée. Pas d'inscription pour un élève fantôme.",[599,882,883,884,887],{},"Ces contraintes sont déclarées dans le schéma et ",[603,885,886],{},"vérifiées automatiquement","\npar le SGBD à chaque insertion, mise à jour ou suppression. C'est ce qui\ndistingue une vraie base de données d'un simple tableur.",[795,889,891,896],{"correct":797,"slug":890},"modele-relationnel-c2",[800,892,893],{"v-slot:question":802},[599,894,895],{},"Une clé étrangère peut-elle pointer vers une ligne qui n'existe pas dans la relation référencée ?",[800,897,898],{"v-slot:choices":802},[729,899,900,903],{},[732,901,902],{},"Oui, si on accepte les valeurs NULL",[732,904,905],{},"Non, c’est la contrainte d’intégrité référentielle",[594,907,909],{"id":908},"schéma-vs-contenu","Schéma vs contenu",[599,911,912,913,915,916,919,920,923,924,926,927,930],{},"Le ",[603,914,666],{}," est la ",[612,917,918],{},"forme"," de la base : noms de relations, attributs,\ndomaines, clés. Il change rarement — sa modification s'appelle une ",[612,921,922],{},"migration",".\nLe ",[603,925,662],{}," est l'ensemble des n-uplets actuellement stockés. Il change\nsans cesse, à chaque insertion, modification, suppression. Cette distinction\nsera centrale pour comprendre les ",[603,928,929],{},"anomalies de schéma"," étudiées au cours\nsuivant : un mauvais schéma peut rendre certains contenus impossibles à\nreprésenter proprement.",[932,933,934],"tip",{},[599,935,936,937,939,940,667],{},"Quand vous concevez une base, dessinez d'abord son ",[603,938,666],{}," sur papier —\nrelations, attributs, clés, flèches de clés étrangères. La saisie de\ndonnées vient ",[612,941,942],{},"après",{"title":802,"searchDepth":944,"depth":944,"links":945},2,[946,947,948,949,950],{"id":596,"depth":944,"text":597},{"id":636,"depth":944,"text":637},{"id":688,"depth":944,"text":689},{"id":820,"depth":944,"text":821},{"id":908,"depth":944,"text":909},"Relation, attribut, domaine, clé primaire, clé étrangère, schéma relationnel — le vocabulaire mathématique des bases de données.",null,"md",{},true,[957,961],{"slug":798,"kind":958,"question":805,"choices":959,"correct":797,"multi":960,"explanation":802},"qcm",[797,814,817],false,{"slug":890,"kind":958,"question":895,"choices":962,"correct":797,"multi":960,"explanation":802},[902,905],1,{"title":483,"description":951},"WX8uNS7zra0EuYHmVm_4hXkSZSU0HDd-JMEu-Hh2T4Y",{"id":967,"title":487,"bo":968,"body":970,"description":1339,"eval":952,"extension":953,"labo":952,"meta":1340,"navigation":955,"path":488,"quizzes":1341,"readingTime":963,"seo":1346,"stem":489,"tp":952,"__hash__":1347},"cours\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F2.base-relationnelle.md",[969],"TB01",{"type":591,"value":971,"toc":1331},[972,974,988,990,994,1004,1011,1015,1022,1120,1136,1142,1146,1149,1167,1173,1183,1187,1194,1219,1235,1254,1276,1280,1295,1303,1310],[594,973,597],{"id":596},[599,975,640,976,979,980,983,984,987],{},[603,977,978],{},"base de données relationnelle"," est un ensemble de relations cohérent\nentre elles, conçu pour stocker durablement des données nombreuses. Mais\ntoutes les structures ne se valent pas : un schéma mal pensé condamne la\nbase à des ",[603,981,982],{},"redondances"," et à des ",[603,985,986],{},"anomalies"," qui apparaissent au fur\net à mesure que les données s'accumulent. Ce cours examine ce qu'est une\nbonne structure, en partant de l'exemple d'une mauvaise.",[632,989],{"code":969},[594,991,993],{"id":992},"structure-et-contenu","Structure et contenu",[599,995,996,997,1000,1001,1003],{},"Reprenez la distinction du cours précédent : la ",[603,998,999],{},"structure"," d'une base\nest l'ensemble de ses schémas relationnels (relations, attributs, domaines,\ncontraintes). Le ",[603,1002,662],{}," est la collection actuelle des n-uplets. Le\nmême contenu peut être rangé selon des structures très différentes — et\nc'est ce choix qui détermine la qualité de la base.",[599,1005,1006,1007,1010],{},"Une bonne analogie : un article de Wikipédia. La même information factuelle\n(la date de naissance d'un auteur, par exemple) peut figurer sur sa propre\npage ",[603,1008,1009],{},"et"," sur la page de son éditeur. Si quelqu'un corrige une page sans\ntoucher à l'autre, l'encyclopédie devient localement incohérente. Une base\nmal structurée souffre du même mal, en pire : la contradiction y est\nsilencieuse et systématique.",[594,1012,1014],{"id":1013},"un-schéma-défectueux-la-table-fourre-tout","Un schéma défectueux : la table fourre-tout",[599,1016,1017,1018,1021],{},"Reprenons la base scolaire du cours précédent. Imaginez qu'au lieu de\ntrois relations bien séparées, un développeur pressé range ",[612,1019,1020],{},"tout"," dans une\nseule grosse table :",[646,1023,1024,1050],{},[828,1025,1026],{},[831,1027,1028,1031,1033,1036,1039,1041,1044,1047],{},[834,1029,1030],{},"id_inscription",[834,1032,739],{},[834,1034,1035],{},"nom_eleve",[834,1037,1038],{},"classe",[834,1040,748],{},[834,1042,1043],{},"intitule_cours",[834,1045,1046],{},"niveau",[834,1048,1049],{},"date",[841,1051,1052,1077,1098],{},[831,1053,1054,1056,1059,1062,1065,1068,1071,1074],{},[846,1055,797],{},[846,1057,1058],{},"12",[846,1060,1061],{},"Camus",[846,1063,1064],{},"TG1",[846,1066,1067],{},"7",[846,1069,1070],{},"NSI",[846,1072,1073],{},"Terminale",[846,1075,1076],{},"2026-09-12",[831,1078,1079,1081,1083,1085,1087,1090,1093,1095],{},[846,1080,814],{},[846,1082,1058],{},[846,1084,1061],{},[846,1086,1064],{},[846,1088,1089],{},"9",[846,1091,1092],{},"Maths",[846,1094,1073],{},[846,1096,1097],{},"2026-09-15",[831,1099,1100,1103,1106,1109,1111,1113,1115,1117],{},[846,1101,1102],{},"3",[846,1104,1105],{},"18",[846,1107,1108],{},"Duras",[846,1110,1064],{},[846,1112,1067],{},[846,1114,1070],{},[846,1116,1073],{},[846,1118,1119],{},"2026-09-20",[599,1121,1122,1123,1126,1127,1129,1130,1132,1133,667],{},"Le nom et la classe de Camus apparaissent ",[603,1124,1125],{},"deux fois",". L'intitulé du\ncours ",[612,1128,1070],{}," et son niveau apparaissent ",[603,1131,1125],{}," aussi. C'est une\n",[603,1134,1135],{},"redondance",[1137,1138,1139],"warning",{},[599,1140,1141],{},"Tant que les données sont peu nombreuses, la redondance semble inoffensive.\nÀ grande échelle, elle devient un poison.",[594,1143,1145],{"id":1144},"les-trois-anomalies-classiques","Les trois anomalies classiques",[599,1147,1148],{},"Sur ce schéma fourre-tout, trois familles d'anomalies surgissent :",[599,1150,1151,1154,1155,1157,1158,1160,1161,677,1164,667],{},[603,1152,1153],{},"Anomalie d'insertion"," — vous ne pouvez pas enregistrer un nouvel élève\ntant qu'il n'est pas inscrit à un premier cours, puisque chaque ligne\nexige un ",[704,1156,748],{}," et une ",[704,1159,1049],{},". Le schéma confond ",[612,1162,1163],{},"exister comme élève",[612,1165,1166],{},"être inscrit",[599,1168,1169,1172],{},[603,1170,1171],{},"Anomalie de suppression"," — vous supprimez l'inscription d'identifiant 2.\nSi c'était l'unique inscription de Duras, vous perdez du même coup la\nseule trace de sa classe. Vous vouliez retirer un événement, vous effacez\nune entité entière. Comme dans un vieux carnet d'adresses papier où l'on\ngomme la ligne d'un contact : on supprime le rendez-vous, mais le numéro\nde téléphone et l'adresse partent avec.",[599,1174,1175,1178,1179,1182],{},[603,1176,1177],{},"Anomalie de mise à jour"," — Camus change de classe à la rentrée. Vous\ndevez modifier ",[603,1180,1181],{},"toutes les lignes"," où sa classe apparaît. Si vous en\noubliez une, la base devient incohérente : deux classes pour le même\nélève.",[594,1184,1186],{"id":1185},"le-remède-décomposer","Le remède : décomposer",[599,1188,1189,1190,1193],{},"La règle empirique : ",[603,1191,1192],{},"une relation décrit un seul type d'entité",". On\ndécompose la table fourre-tout en trois relations — celles qui structuraient\ndéjà le cours précédent :",[729,1195,1196,1202,1208],{},[732,1197,1198],{},[704,1199,736,1200,740],{},[708,1201,739],{},[732,1203,1204],{},[704,1205,745,1206,749],{},[708,1207,748],{},[732,1209,1210],{},[704,1211,754,1212,1214,1218],{},[708,1213,739],{},[612,1215,759,1216],{},[708,1217,748],{},", date_inscription)",[599,1220,1221,1222,1224,1225,1227,1228,1230,1231,1234],{},"Désormais Camus n'apparaît qu'une seule fois dans ",[704,1223,780],{},", le cours ",[612,1226,1070],{},"\nune seule fois dans ",[704,1229,784],{},", et les inscriptions ne stockent que les\n",[603,1232,1233],{},"références"," vers les entités concernées. Les trois anomalies\ndisparaissent :",[729,1236,1237,1246,1249],{},[732,1238,1239,1240,1242,1243,1245],{},"vous insérez un nouvel élève dans ",[704,1241,780],{}," sans toucher à ",[704,1244,768],{}," ;",[732,1247,1248],{},"vous supprimez une inscription sans toucher à l'élève ;",[732,1250,1251,1252,667],{},"vous modifiez la classe de Camus dans une seule ligne de ",[704,1253,780],{},[795,1255,1258,1263],{"correct":1256,"slug":1257},"0","base-relationnelle-c1",[800,1259,1260],{"v-slot:question":802},[599,1261,1262],{},"Dans le schéma décomposé, combien de lignes faut-il modifier pour changer la classe de Camus s'il est inscrit à 6 cours ?",[800,1264,1265],{"v-slot:choices":802},[729,1266,1267,1270,1273],{},[732,1268,1269],{},"Une seule",[732,1271,1272],{},"6",[732,1274,1275],{},"Autant que de cours dans la base",[594,1277,1279],{"id":1278},"normalisation-survol","Normalisation — survol",[599,1281,1282,1283,1286,1287,1290,1291,1294],{},"Ce processus de décomposition s'appelle la ",[603,1284,1285],{},"normalisation",". La théorie\ndéfinit des ",[612,1288,1289],{},"formes normales"," (1FN, 2FN, 3FN…) qui formalisent la qualité\nd'un schéma. À votre niveau, retenez la ",[603,1292,1293],{},"règle pratique"," :",[932,1296,1297],{},[599,1298,1299,1302],{},[603,1300,1301],{},"Une relation = une entité conceptuelle."," Si une même information\nfactuelle apparaît à plusieurs endroits, vous avez probablement besoin\nde scinder une relation.",[599,1304,1305,1306,1309],{},"Repérer une anomalie dans un schéma proposé est une compétence du\nprogramme : prenez l'habitude, devant une grosse table, de chercher les\nredondances ",[612,1307,1308],{},"avant"," de l'utiliser.",[795,1311,1313,1318],{"correct":797,"slug":1312},"base-relationnelle-c2",[800,1314,1315],{"v-slot:question":802},[599,1316,1317],{},"Quelle anomalie correspond à : 'on supprime une inscription et on perd la classe de l'élève' ?",[800,1319,1320],{"v-slot:choices":802},[729,1321,1322,1325,1328],{},[732,1323,1324],{},"anomalie d’insertion",[732,1326,1327],{},"anomalie de suppression",[732,1329,1330],{},"anomalie de mise à jour",{"title":802,"searchDepth":944,"depth":944,"links":1332},[1333,1334,1335,1336,1337,1338],{"id":596,"depth":944,"text":597},{"id":992,"depth":944,"text":993},{"id":1013,"depth":944,"text":1014},{"id":1144,"depth":944,"text":1145},{"id":1185,"depth":944,"text":1186},{"id":1278,"depth":944,"text":1279},"Distinguer la structure d'une base de son contenu, repérer les redondances et les anomalies d'insertion, suppression, mise à jour.",{},[1342,1344],{"slug":1257,"kind":958,"question":1262,"choices":1343,"correct":1256,"multi":960,"explanation":802},[1269,1272,1275],{"slug":1312,"kind":958,"question":1317,"choices":1345,"correct":797,"multi":960,"explanation":802},[1324,1327,1330],{"title":487,"description":1339},"OpaxfyJZsbCOA0wV6l5-qtHo3LWUSTs_hggNBjFihbU",{"id":1349,"title":491,"bo":1350,"body":1352,"description":2190,"eval":952,"extension":953,"labo":952,"meta":2191,"navigation":955,"path":492,"quizzes":2192,"readingTime":963,"seo":2197,"stem":493,"tp":952,"__hash__":2198},"cours\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F3.sql.md",[1351],"TB02",{"type":591,"value":1353,"toc":2182},[1354,1356,1377,1384,1386,1389,1398,1401,1405,1408,1435,1442,1479,1485,1504,1515,1556,1577,1581,1588,1694,1706,1710,1717,1781,1784,1806,1809,1879,1896,1900,1906,1947,1959,1997,2003,2041,2055,2076,2080,2083,2162,2178],[594,1355,597],{"id":596},[599,1357,1358,1361,1362,1365,1366,1369,1370,1373,1374,667],{},[603,1359,1360],{},"SQL"," (",[612,1363,1364],{},"Structured Query Language",") est le langage standardisé pour\ninterroger et modifier les bases relationnelles. Apparu en 1974, il est\naujourd'hui l'un des langages informatiques les plus diffusés au monde.\nSon originalité : il est ",[603,1367,1368],{},"déclaratif",". Vous décrivez ",[603,1371,1372],{},"ce que vous\nvoulez",", le SGBD se charge de ",[603,1375,1376],{},"comment l'obtenir",[599,1378,1379,1380,1383],{},"Comparez à la programmation Python que vous pratiquez : pour calculer la\nmoyenne d'une liste de notes, vous écrivez l'algorithme — boucle, somme,\ndivision. C'est ",[603,1381,1382],{},"impératif",". En SQL, vous dites simplement « donne-moi\nla moyenne des notes » et le SGBD invente la stratégie. C'est la\ndifférence entre commander un plat au restaurant (« je veux des frites »)\net le préparer soi-même (peler, couper, faire chauffer l'huile, plonger…).",[632,1385],{"code":1351},[599,1387,1388],{},"Pour tous les exemples, nous travaillons sur la base scolaire déjà\nintroduite aux cours précédents :",[1390,1391,1396],"pre",{"className":1392,"code":1394,"language":1395},[1393],"language-text","Eleve(id_eleve, nom, prenom, classe)\nCours(id_cours, intitule, niveau)\nInscription(id_eleve*, id_cours*, date_inscription, note)\n","text",[704,1397,1394],{"__ignoreMap":802},[599,1399,1400],{},"(clé primaire soulignée par convention dans les schémas ; clé étrangère\nmarquée d'une étoile — voir le cours 1 pour la notation complète)",[594,1402,1404],{"id":1403},"interroger-select-from-where","Interroger : SELECT … FROM … WHERE",[599,1406,1407],{},"La requête la plus simple sélectionne des colonnes d'une relation :",[1390,1409,1413],{"className":1410,"code":1411,"language":1412,"meta":802,"style":802},"language-sql shiki shiki-themes github-light github-light github-dark","SELECT nom, prenom\nFROM Eleve;\n","sql",[704,1414,1415,1427],{"__ignoreMap":802},[1416,1417,1419,1423],"span",{"class":1418,"line":963},"line",[1416,1420,1422],{"class":1421},"s8jYJ","SELECT",[1416,1424,1426],{"class":1425},"sxrX7"," nom, prenom\n",[1416,1428,1429,1432],{"class":1418,"line":944},[1416,1430,1431],{"class":1421},"FROM",[1416,1433,1434],{"class":1425}," Eleve;\n",[599,1436,1437,1438,1441],{},"Pour filtrer, on ajoute ",[704,1439,1440],{},"WHERE"," avec une condition :",[1390,1443,1445],{"className":1410,"code":1444,"language":1412,"meta":802,"style":802},"SELECT nom, prenom, classe\nFROM Eleve\nWHERE classe = 'TG1';\n",[704,1446,1447,1454,1461],{"__ignoreMap":802},[1416,1448,1449,1451],{"class":1418,"line":963},[1416,1450,1422],{"class":1421},[1416,1452,1453],{"class":1425}," nom, prenom, classe\n",[1416,1455,1456,1458],{"class":1418,"line":944},[1416,1457,1431],{"class":1421},[1416,1459,1460],{"class":1425}," Eleve\n",[1416,1462,1464,1466,1469,1472,1476],{"class":1418,"line":1463},3,[1416,1465,1440],{"class":1421},[1416,1467,1468],{"class":1425}," classe ",[1416,1470,1471],{"class":1421},"=",[1416,1473,1475],{"class":1474},"sIIMD"," 'TG1'",[1416,1477,1478],{"class":1425},";\n",[599,1480,1481,1482,1294],{},"Pour éliminer les doublons du résultat, on utilise ",[704,1483,1484],{},"DISTINCT",[1390,1486,1488],{"className":1410,"code":1487,"language":1412,"meta":802,"style":802},"SELECT DISTINCT classe\nFROM Eleve;\n",[704,1489,1490,1498],{"__ignoreMap":802},[1416,1491,1492,1495],{"class":1418,"line":963},[1416,1493,1494],{"class":1421},"SELECT DISTINCT",[1416,1496,1497],{"class":1425}," classe\n",[1416,1499,1500,1502],{"class":1418,"line":944},[1416,1501,1431],{"class":1421},[1416,1503,1434],{"class":1425},[599,1505,1506,1507,1510,1511,1514],{},"Pour trier le résultat, ",[704,1508,1509],{},"ORDER BY"," (ascendant par défaut, ",[704,1512,1513],{},"DESC"," pour\ndescendant) :",[1390,1516,1518],{"className":1410,"code":1517,"language":1412,"meta":802,"style":802},"SELECT nom, prenom\nFROM Eleve\nWHERE classe = 'TG1'\nORDER BY nom ASC;\n",[704,1519,1520,1526,1532,1543],{"__ignoreMap":802},[1416,1521,1522,1524],{"class":1418,"line":963},[1416,1523,1422],{"class":1421},[1416,1525,1426],{"class":1425},[1416,1527,1528,1530],{"class":1418,"line":944},[1416,1529,1431],{"class":1421},[1416,1531,1460],{"class":1425},[1416,1533,1534,1536,1538,1540],{"class":1418,"line":1463},[1416,1535,1440],{"class":1421},[1416,1537,1468],{"class":1425},[1416,1539,1471],{"class":1421},[1416,1541,1542],{"class":1474}," 'TG1'\n",[1416,1544,1546,1548,1551,1554],{"class":1418,"line":1545},4,[1416,1547,1509],{"class":1421},[1416,1549,1550],{"class":1425}," nom ",[1416,1552,1553],{"class":1421},"ASC",[1416,1555,1478],{"class":1425},[795,1557,1559,1564],{"correct":797,"slug":1558},"sql-c1",[800,1560,1561],{"v-slot:question":802},[599,1562,1563],{},"Que retourne SELECT DISTINCT classe FROM Eleve ?",[800,1565,1566],{"v-slot:choices":802},[729,1567,1568,1571,1574],{},[732,1569,1570],{},"toutes les classes avec doublons",[732,1572,1573],{},"chaque classe une seule fois",[732,1575,1576],{},"la première classe",[594,1578,1580],{"id":1579},"joindre-deux-relations-join-on","Joindre deux relations : JOIN … ON",[599,1582,1583,1584,1587],{},"Pour combiner des informations issues de plusieurs relations, on utilise\nune ",[603,1585,1586],{},"jointure",". Elle s'appuie sur l'égalité entre une clé étrangère\nd'une relation et la clé primaire de l'autre. Pour obtenir la liste des\ninscriptions avec le nom de l'élève et l'intitulé du cours :",[1390,1589,1591],{"className":1410,"code":1590,"language":1412,"meta":802,"style":802},"SELECT Eleve.nom, Eleve.prenom, Cours.intitule, Inscription.note\nFROM Inscription\nJOIN Eleve ON Inscription.id_eleve = Eleve.id_eleve\nJOIN Cours ON Inscription.id_cours = Cours.id_cours;\n",[704,1592,1593,1633,1640,1668],{"__ignoreMap":802},[1416,1594,1595,1597,1601,1603,1606,1608,1610,1612,1615,1617,1619,1621,1624,1626,1628,1630],{"class":1418,"line":963},[1416,1596,1422],{"class":1421},[1416,1598,1600],{"class":1599},"sBjJW"," Eleve",[1416,1602,667],{"class":1425},[1416,1604,1605],{"class":1599},"nom",[1416,1607,759],{"class":1425},[1416,1609,780],{"class":1599},[1416,1611,667],{"class":1425},[1416,1613,1614],{"class":1599},"prenom",[1416,1616,759],{"class":1425},[1416,1618,784],{"class":1599},[1416,1620,667],{"class":1425},[1416,1622,1623],{"class":1599},"intitule",[1416,1625,759],{"class":1425},[1416,1627,768],{"class":1599},[1416,1629,667],{"class":1425},[1416,1631,1632],{"class":1599},"note\n",[1416,1634,1635,1637],{"class":1418,"line":944},[1416,1636,1431],{"class":1421},[1416,1638,1639],{"class":1425}," Inscription\n",[1416,1641,1642,1645,1648,1651,1654,1656,1658,1661,1663,1665],{"class":1418,"line":1463},[1416,1643,1644],{"class":1421},"JOIN",[1416,1646,1647],{"class":1425}," Eleve ",[1416,1649,1650],{"class":1421},"ON",[1416,1652,1653],{"class":1599}," Inscription",[1416,1655,667],{"class":1425},[1416,1657,739],{"class":1599},[1416,1659,1660],{"class":1421}," =",[1416,1662,1600],{"class":1599},[1416,1664,667],{"class":1425},[1416,1666,1667],{"class":1599},"id_eleve\n",[1416,1669,1670,1672,1675,1677,1679,1681,1683,1685,1688,1690,1692],{"class":1418,"line":1545},[1416,1671,1644],{"class":1421},[1416,1673,1674],{"class":1425}," Cours ",[1416,1676,1650],{"class":1421},[1416,1678,1653],{"class":1599},[1416,1680,667],{"class":1425},[1416,1682,748],{"class":1599},[1416,1684,1660],{"class":1421},[1416,1686,1687],{"class":1599}," Cours",[1416,1689,667],{"class":1425},[1416,1691,748],{"class":1599},[1416,1693,1478],{"class":1425},[599,1695,1696,1697,1699,1700,1703,1704,667],{},"On lit cette requête comme une recomposition : pour chaque ligne\nd'",[704,1698,768],{},", on récupère l'élève correspondant ",[612,1701,1702],{},"par sa clé"," et le\ncours correspondant ",[612,1705,1702],{},[594,1707,1709],{"id":1708},"les-fonctions-dagrégation","Les fonctions d'agrégation",[599,1711,1712,1713,1716],{},"Les fonctions d'agrégation produisent ",[603,1714,1715],{},"une seule valeur"," à partir d'une\ncolonne :",[646,1718,1719,1729],{},[828,1720,1721],{},[831,1722,1723,1726],{},[834,1724,1725],{},"Fonction",[834,1727,1728],{},"Calcul",[841,1730,1731,1741,1751,1761,1771],{},[831,1732,1733,1738],{},[846,1734,1735],{},[704,1736,1737],{},"COUNT(*)",[846,1739,1740],{},"nombre de lignes",[831,1742,1743,1748],{},[846,1744,1745],{},[704,1746,1747],{},"AVG(col)",[846,1749,1750],{},"moyenne",[831,1752,1753,1758],{},[846,1754,1755],{},[704,1756,1757],{},"MIN(col)",[846,1759,1760],{},"minimum",[831,1762,1763,1768],{},[846,1764,1765],{},[704,1766,1767],{},"MAX(col)",[846,1769,1770],{},"maximum",[831,1772,1773,1778],{},[846,1774,1775],{},[704,1776,1777],{},"SUM(col)",[846,1779,1780],{},"somme",[599,1782,1783],{},"Exemple — la moyenne générale des notes :",[1390,1785,1787],{"className":1410,"code":1786,"language":1412,"meta":802,"style":802},"SELECT AVG(note)\nFROM Inscription;\n",[704,1788,1789,1799],{"__ignoreMap":802},[1416,1790,1791,1793,1796],{"class":1418,"line":963},[1416,1792,1422],{"class":1421},[1416,1794,1795],{"class":1599}," AVG",[1416,1797,1798],{"class":1425},"(note)\n",[1416,1800,1801,1803],{"class":1418,"line":944},[1416,1802,1431],{"class":1421},[1416,1804,1805],{"class":1425}," Inscription;\n",[599,1807,1808],{},"La meilleure note attribuée en NSI :",[1390,1810,1812],{"className":1410,"code":1811,"language":1412,"meta":802,"style":802},"SELECT MAX(Inscription.note)\nFROM Inscription\nJOIN Cours ON Inscription.id_cours = Cours.id_cours\nWHERE Cours.intitule = 'NSI';\n",[704,1813,1814,1833,1839,1862],{"__ignoreMap":802},[1416,1815,1816,1818,1821,1824,1826,1828,1830],{"class":1418,"line":963},[1416,1817,1422],{"class":1421},[1416,1819,1820],{"class":1599}," MAX",[1416,1822,1823],{"class":1425},"(",[1416,1825,768],{"class":1599},[1416,1827,667],{"class":1425},[1416,1829,669],{"class":1599},[1416,1831,1832],{"class":1425},")\n",[1416,1834,1835,1837],{"class":1418,"line":944},[1416,1836,1431],{"class":1421},[1416,1838,1639],{"class":1425},[1416,1840,1841,1843,1845,1847,1849,1851,1853,1855,1857,1859],{"class":1418,"line":1463},[1416,1842,1644],{"class":1421},[1416,1844,1674],{"class":1425},[1416,1846,1650],{"class":1421},[1416,1848,1653],{"class":1599},[1416,1850,667],{"class":1425},[1416,1852,748],{"class":1599},[1416,1854,1660],{"class":1421},[1416,1856,1687],{"class":1599},[1416,1858,667],{"class":1425},[1416,1860,1861],{"class":1599},"id_cours\n",[1416,1863,1864,1866,1868,1870,1872,1874,1877],{"class":1418,"line":1545},[1416,1865,1440],{"class":1421},[1416,1867,1687],{"class":1599},[1416,1869,667],{"class":1425},[1416,1871,1623],{"class":1599},[1416,1873,1660],{"class":1421},[1416,1875,1876],{"class":1474}," 'NSI'",[1416,1878,1478],{"class":1425},[1137,1880,1881],{},[599,1882,1883,1884,1887,1888,1891,1892,1895],{},"Le programme exclut explicitement ",[704,1885,1886],{},"GROUP BY"," et ",[704,1889,1890],{},"HAVING",". Vous utilisez\nles fonctions d'agrégation sans regroupement — elles produisent toujours\n",[603,1893,1894],{},"une seule ligne"," en sortie.",[594,1897,1899],{"id":1898},"mettre-à-jour-insert-update-delete","Mettre à jour : INSERT, UPDATE, DELETE",[599,1901,1902,1905],{},[603,1903,1904],{},"Ajouter"," une ligne :",[1390,1907,1909],{"className":1410,"code":1908,"language":1412,"meta":802,"style":802},"INSERT INTO Eleve (id_eleve, nom, prenom, classe)\nVALUES (42, 'Curie', 'Marie', 'TG2');\n",[704,1910,1911,1919],{"__ignoreMap":802},[1416,1912,1913,1916],{"class":1418,"line":963},[1416,1914,1915],{"class":1421},"INSERT INTO",[1416,1917,1918],{"class":1425}," Eleve (id_eleve, nom, prenom, classe)\n",[1416,1920,1921,1924,1926,1929,1931,1934,1936,1939,1941,1944],{"class":1418,"line":944},[1416,1922,1923],{"class":1421},"VALUES",[1416,1925,1361],{"class":1425},[1416,1927,1928],{"class":1599},"42",[1416,1930,759],{"class":1425},[1416,1932,1933],{"class":1474},"'Curie'",[1416,1935,759],{"class":1425},[1416,1937,1938],{"class":1474},"'Marie'",[1416,1940,759],{"class":1425},[1416,1942,1943],{"class":1474},"'TG2'",[1416,1945,1946],{"class":1425},");\n",[599,1948,1949,1952,1953,1958],{},[603,1950,1951],{},"Modifier"," des lignes existantes — ",[612,1954,1955,1956],{},"toujours avec un ",[704,1957,1440],{},", sinon\ntoutes les lignes sont touchées :",[1390,1960,1962],{"className":1410,"code":1961,"language":1412,"meta":802,"style":802},"UPDATE Eleve\nSET classe = 'TG3'\nWHERE id_eleve = 42;\n",[704,1963,1964,1971,1983],{"__ignoreMap":802},[1416,1965,1966,1969],{"class":1418,"line":963},[1416,1967,1968],{"class":1421},"UPDATE",[1416,1970,1460],{"class":1425},[1416,1972,1973,1976,1978,1980],{"class":1418,"line":944},[1416,1974,1975],{"class":1421},"SET",[1416,1977,1468],{"class":1425},[1416,1979,1471],{"class":1421},[1416,1981,1982],{"class":1474}," 'TG3'\n",[1416,1984,1985,1987,1990,1992,1995],{"class":1418,"line":1463},[1416,1986,1440],{"class":1421},[1416,1988,1989],{"class":1425}," id_eleve ",[1416,1991,1471],{"class":1421},[1416,1993,1994],{"class":1599}," 42",[1416,1996,1478],{"class":1425},[599,1998,1999,2002],{},[603,2000,2001],{},"Supprimer"," des lignes :",[1390,2004,2006],{"className":1410,"code":2005,"language":1412,"meta":802,"style":802},"DELETE FROM Inscription\nWHERE id_eleve = 42 AND id_cours = 7;\n",[704,2007,2008,2018],{"__ignoreMap":802},[1416,2009,2010,2013,2016],{"class":1418,"line":963},[1416,2011,2012],{"class":1421},"DELETE",[1416,2014,2015],{"class":1421}," FROM",[1416,2017,1639],{"class":1425},[1416,2019,2020,2022,2024,2026,2028,2031,2034,2036,2039],{"class":1418,"line":944},[1416,2021,1440],{"class":1421},[1416,2023,1989],{"class":1425},[1416,2025,1471],{"class":1421},[1416,2027,1994],{"class":1599},[1416,2029,2030],{"class":1421}," AND",[1416,2032,2033],{"class":1425}," id_cours ",[1416,2035,1471],{"class":1421},[1416,2037,2038],{"class":1599}," 7",[1416,2040,1478],{"class":1425},[1137,2042,2043],{},[599,2044,2045,2048,2049,2051,2052,2054],{},[704,2046,2047],{},"DELETE FROM Inscription;"," sans ",[704,2050,1440],{}," vide entièrement la table.\nVérifiez systématiquement votre ",[704,2053,1440],{}," avant d'exécuter une commande de\nmise à jour ou de suppression.",[795,2056,2058,2063],{"correct":797,"slug":2057},"sql-c2",[800,2059,2060],{"v-slot:question":802},[599,2061,2062],{},"Que fait UPDATE Eleve SET classe = 'TG3'; (sans WHERE) ?",[800,2064,2065],{"v-slot:choices":802},[729,2066,2067,2070,2073],{},[732,2068,2069],{},"rien, la requête est invalide",[732,2071,2072],{},"modifie la classe de tous les élèves",[732,2074,2075],{},"crée un nouvel élève en TG3",[594,2077,2079],{"id":2078},"anatomie-dune-requête-select","Anatomie d'une requête SELECT",[599,2081,2082],{},"Toute requête d'interrogation suit la même charpente, dans cet ordre :",[1390,2084,2086],{"className":1410,"code":2085,"language":1412,"meta":802,"style":802},"SELECT  \u003Ccolonnes à afficher>\nFROM    \u003Crelation principale>\nJOIN    \u003Cautre relation> ON \u003Ccondition de jointure>\nWHERE   \u003Ccondition de filtrage>\nORDER BY \u003Ccolonne(s) de tri>;\n",[704,2087,2088,2101,2113,2136,2148],{"__ignoreMap":802},[1416,2089,2090,2092,2095,2098],{"class":1418,"line":963},[1416,2091,1422],{"class":1421},[1416,2093,2094],{"class":1421},"  \u003C",[1416,2096,2097],{"class":1425},"colonnes à afficher",[1416,2099,2100],{"class":1421},">\n",[1416,2102,2103,2105,2108,2111],{"class":1418,"line":944},[1416,2104,1431],{"class":1421},[1416,2106,2107],{"class":1421},"    \u003C",[1416,2109,2110],{"class":1425},"relation principale",[1416,2112,2100],{"class":1421},[1416,2114,2115,2117,2119,2122,2125,2128,2131,2134],{"class":1418,"line":1463},[1416,2116,1644],{"class":1421},[1416,2118,2107],{"class":1421},[1416,2120,2121],{"class":1425},"autre relation",[1416,2123,2124],{"class":1421},">",[1416,2126,2127],{"class":1421}," ON",[1416,2129,2130],{"class":1421}," \u003C",[1416,2132,2133],{"class":1425},"condition de jointure",[1416,2135,2100],{"class":1421},[1416,2137,2138,2140,2143,2146],{"class":1418,"line":1545},[1416,2139,1440],{"class":1421},[1416,2141,2142],{"class":1421},"   \u003C",[1416,2144,2145],{"class":1425},"condition de filtrage",[1416,2147,2100],{"class":1421},[1416,2149,2151,2153,2155,2158,2160],{"class":1418,"line":2150},5,[1416,2152,1509],{"class":1421},[1416,2154,2130],{"class":1421},[1416,2156,2157],{"class":1425},"colonne(s) de tri",[1416,2159,2124],{"class":1421},[1416,2161,1478],{"class":1425},[599,2163,2164,2165,759,2167,759,2169,2171,2172,2174,2175,2177],{},"Les clauses ",[704,2166,1644],{},[704,2168,1440],{},[704,2170,1509],{}," sont facultatives. ",[704,2173,1422],{}," et\n",[704,2176,1431],{}," sont obligatoires. Mémoriser cet ordre vous fait gagner du temps :\nen cas d'erreur de syntaxe, c'est presque toujours un ordre cassé.",[2179,2180,2181],"style",{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":802,"searchDepth":944,"depth":944,"links":2183},[2184,2185,2186,2187,2188,2189],{"id":596,"depth":944,"text":597},{"id":1403,"depth":944,"text":1404},{"id":1579,"depth":944,"text":1580},{"id":1708,"depth":944,"text":1709},{"id":1898,"depth":944,"text":1899},{"id":2078,"depth":944,"text":2079},"Interroger et mettre à jour une base relationnelle — SELECT, WHERE, JOIN, INSERT, UPDATE, DELETE, et les fonctions d'agrégation.",{},[2193,2195],{"slug":1558,"kind":958,"question":1563,"choices":2194,"correct":797,"multi":960,"explanation":802},[1570,1573,1576],{"slug":2057,"kind":958,"question":2062,"choices":2196,"correct":797,"multi":960,"explanation":802},[2069,2072,2075],{"title":491,"description":2190},"GGnWhzaxAvz15Fj9tDpD5fiC8CO4ejMP3cQDQ18XG7o",{"id":2200,"title":495,"bo":2201,"body":2203,"description":2771,"eval":952,"extension":953,"labo":952,"meta":2772,"navigation":955,"path":496,"quizzes":2773,"readingTime":963,"seo":2778,"stem":497,"tp":952,"__hash__":2779},"cours\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F4.sgbd.md",[2202],"TB04",{"type":591,"value":2204,"toc":2763},[2205,2207,2218,2241,2243,2264,2268,2283,2286,2290,2309,2314,2390,2393,2414,2418,2557,2568,2576,2580,2594,2652,2663,2682,2686,2746,2760],[594,2206,597],{"id":596},[599,2208,2209,2210,2213,2214,2217],{},"Un ",[603,2211,2212],{},"système de gestion de bases de données"," (SGBD) est le logiciel qui\nréalise concrètement le modèle relationnel : il stocke les fichiers,\napplique les contraintes du schéma, exécute les requêtes SQL et arbitre\nles accès simultanés de multiples utilisateurs. Sans SGBD, on aurait\ndes fichiers ; avec un SGBD, on a une base. Le programme retient\n",[603,2215,2216],{},"quatre services"," que vous devez savoir nommer et expliquer.",[599,2219,2220,2221,2224,2225,2228,2229,2232,2233,2236,2237,2240],{},"Une image utile : le SGBD est au stockage des données ce qu'un\n",[603,2222,2223],{},"bibliothécaire"," est à un fonds de livres. Il sait où chaque ouvrage est\nrangé (les ",[612,2226,2227],{},"index","), peut prêter à plusieurs lecteurs sans confusion\n(",[612,2230,2231],{},"concurrence","), tient des registres de tous les mouvements\n(",[612,2234,2235],{},"journalisation",") et n'ouvre ses réserves qu'à des lecteurs munis d'une\ncarte (",[612,2238,2239],{},"sécurité","). Vous n'avez pas besoin de fouiller les rayons : vous\nposez votre demande, le bibliothécaire s'en occupe.",[632,2242],{"code":2202},[599,2244,2245,2246,2249,2250,1887,2253,2256,2257,1887,2260,2263],{},"Quelques noms à connaître : ",[603,2247,2248],{},"SQLite"," (le plus simple, embarqué, un seul\nfichier), ",[603,2251,2252],{},"PostgreSQL",[603,2254,2255],{},"MySQL\u002FMariaDB"," (serveurs open-source\nincontournables), ",[603,2258,2259],{},"Oracle",[603,2261,2262],{},"SQL Server"," (propriétaires, marché\nentreprise).",[594,2265,2267],{"id":2266},"service-n1-persistance-des-données","Service n°1 — Persistance des données",[599,2269,2270,2271,2274,2275,2278,2279,2282],{},"Le SGBD ",[603,2272,2273],{},"garantit la durée de vie"," des données au-delà de l'exécution\nd'un programme. Une donnée écrite reste écrite, même si l'application\nplante, même si la machine s'éteint, même après un mois sans usage. Cette\npersistance est obtenue par stockage ",[603,2276,2277],{},"sur disque"," (et pas seulement en\nmémoire vive) et par un ",[603,2280,2281],{},"journal de transactions"," qui permet de rejouer\nou d'annuler une opération en cas d'incident.",[599,2284,2285],{},"C'est ce service qui distingue une base de données d'une simple structure\nPython en mémoire : la liste disparaît à la fin du script, la table de la\nbase demeure.",[594,2287,2289],{"id":2288},"service-n2-gestion-des-accès-concurrents","Service n°2 — Gestion des accès concurrents",[599,2291,2292,2293,2296,2297,2300,2301,2304,2305,2308],{},"Plusieurs utilisateurs peuvent interroger ou modifier la base ",[603,2294,2295],{},"en même\ntemps",". Sans précaution, deux écritures simultanées peuvent se corrompre\nmutuellement. Le SGBD organise alors les ",[603,2298,2299],{},"transactions"," — des séquences\nd'opérations qui s'exécutent comme un tout indivisible : ou tout réussit,\nou tout est annulé. Cette propriété de « tout ou rien » s'appelle\nl'",[603,2302,2303],{},"atomicité",". Pour la garantir lorsque deux transactions touchent les\nmêmes données, le SGBD met en place des ",[603,2306,2307],{},"verrous"," qui sérialisent les\naccès, comme un feu rouge à un croisement.",[599,2310,2311,1294],{},[603,2312,2313],{},"Exemple — virement bancaire",[1390,2315,2317],{"className":1410,"code":2316,"language":1412,"meta":802,"style":802},"-- Transaction (logique) :\nUPDATE Compte SET solde = solde - 100 WHERE id = 'A';\nUPDATE Compte SET solde = solde + 100 WHERE id = 'B';\n",[704,2318,2319,2325,2360],{"__ignoreMap":802},[1416,2320,2321],{"class":1418,"line":963},[1416,2322,2324],{"class":2323},"sCsY4","-- Transaction (logique) :\n",[1416,2326,2327,2329,2332,2334,2337,2339,2341,2344,2347,2350,2353,2355,2358],{"class":1418,"line":944},[1416,2328,1968],{"class":1421},[1416,2330,2331],{"class":1425}," Compte ",[1416,2333,1975],{"class":1421},[1416,2335,2336],{"class":1425}," solde ",[1416,2338,1471],{"class":1421},[1416,2340,2336],{"class":1425},[1416,2342,2343],{"class":1421},"-",[1416,2345,2346],{"class":1599}," 100",[1416,2348,2349],{"class":1421}," WHERE",[1416,2351,2352],{"class":1425}," id ",[1416,2354,1471],{"class":1421},[1416,2356,2357],{"class":1474}," 'A'",[1416,2359,1478],{"class":1425},[1416,2361,2362,2364,2366,2368,2370,2372,2374,2377,2379,2381,2383,2385,2388],{"class":1418,"line":1463},[1416,2363,1968],{"class":1421},[1416,2365,2331],{"class":1425},[1416,2367,1975],{"class":1421},[1416,2369,2336],{"class":1425},[1416,2371,1471],{"class":1421},[1416,2373,2336],{"class":1425},[1416,2375,2376],{"class":1421},"+",[1416,2378,2346],{"class":1599},[1416,2380,2349],{"class":1421},[1416,2382,2352],{"class":1425},[1416,2384,1471],{"class":1421},[1416,2386,2387],{"class":1474}," 'B'",[1416,2389,1478],{"class":1425},[599,2391,2392],{},"Sans gestion de concurrence, une panne entre les deux instructions\nlaisserait la somme de 100 € envolée. Le SGBD applique l'atomicité : ou\nles deux instructions réussissent, ou aucune ne prend effet.",[795,2394,2396,2401],{"correct":797,"slug":2395},"sgbd-c1",[800,2397,2398],{"v-slot:question":802},[599,2399,2400],{},"Que se passe-t-il si deux transactions modifient simultanément le solde du même compte ?",[800,2402,2403],{"v-slot:choices":802},[729,2404,2405,2408,2411],{},[732,2406,2407],{},"le SGBD les exécute en parallèle sans contrôle",[732,2409,2410],{},"le SGBD les sérialise via des verrous",[732,2412,2413],{},"la base se corrompt",[594,2415,2417],{"id":2416},"service-n3-efficacité-de-traitement-des-requêtes","Service n°3 — Efficacité de traitement des requêtes",[599,2419,2420,2421,2423,2424,2492,2493,667],{},"Une table de 10 millions de lignes ne se parcourt pas naïvement. Le SGBD\nconstruit des ",[603,2422,2227],{}," — structures auxiliaires (souvent des arbres\néquilibrés) qui pointent vers les lignes correspondant à une valeur\ndonnée. Une recherche par clé primaire passe ainsi de ",[1416,2425,2428,2461],{"className":2426},[2427],"katex",[1416,2429,2432],{"className":2430},[2431],"katex-mathml",[2433,2434,2436],"math",{"xmlns":2435},"http:\u002F\u002Fwww.w3.org\u002F1998\u002FMath\u002FMathML",[2437,2438,2439,2456],"semantics",{},[2440,2441,2442,2446,2450,2453],"mrow",{},[2443,2444,2445],"mi",{},"O",[2447,2448,1823],"mo",{"stretchy":2449},"false",[2443,2451,2452],{},"n",[2447,2454,2455],{"stretchy":2449},")",[2457,2458,2460],"annotation",{"encoding":2459},"application\u002Fx-tex","O(n)",[1416,2462,2466],{"className":2463,"ariaHidden":2465},[2464],"katex-html","true",[1416,2467,2470,2475,2481,2485,2488],{"className":2468},[2469],"base",[1416,2471],{"className":2472,"style":2474},[2473],"strut","height:1em;vertical-align:-0.25em;",[1416,2476,2445],{"className":2477,"style":2480},[2478,2479],"mord","mathnormal","margin-right:0.0278em;",[1416,2482,1823],{"className":2483},[2484],"mopen",[1416,2486,2452],{"className":2487},[2478,2479],[1416,2489,2455],{"className":2490},[2491],"mclose"," à\n",[1416,2494,2496,2522],{"className":2495},[2427],[1416,2497,2499],{"className":2498},[2431],[2433,2500,2501],{"xmlns":2435},[2437,2502,2503,2519],{},[2440,2504,2505,2507,2509,2512,2515,2517],{},[2443,2506,2445],{},[2447,2508,1823],{"stretchy":2449},[2443,2510,2511],{},"log",[2447,2513,2514],{},"⁡",[2443,2516,2452],{},[2447,2518,2455],{"stretchy":2449},[2457,2520,2521],{"encoding":2459},"O(\\log n)",[1416,2523,2525],{"className":2524,"ariaHidden":2465},[2464],[1416,2526,2528,2531,2534,2537,2546,2551,2554],{"className":2527},[2469],[1416,2529],{"className":2530,"style":2474},[2473],[1416,2532,2445],{"className":2533,"style":2480},[2478,2479],[1416,2535,1823],{"className":2536},[2484],[1416,2538,2541,2542],{"className":2539},[2540],"mop","lo",[1416,2543,2545],{"style":2544},"margin-right:0.0139em;","g",[1416,2547],{"className":2548,"style":2550},[2549],"mspace","margin-right:0.1667em;",[1416,2552,2452],{"className":2553},[2478,2479],[1416,2555,2455],{"className":2556},[2491],[599,2558,2559,2560,2563,2564,2567],{},"Avant chaque exécution, le SGBD calcule un ",[603,2561,2562],{},"plan d'exécution"," : l'ordre\ndes opérations (quel index utiliser, dans quel ordre joindre les\nrelations, où appliquer les filtres). C'est l'",[603,2565,2566],{},"optimiseur de requêtes","\nqui traduit la requête déclarative en une stratégie efficace.",[932,2569,2570],{},[599,2571,2572,2573,2575],{},"C'est pour cela que le SQL est ",[603,2574,1368],{}," : vous décrivez le\nrésultat voulu, le SGBD choisit la stratégie. Vous ne pouvez pas\ntoujours en faire autant avec un programme Python que vous écrivez\nvous-même.",[594,2577,2579],{"id":2578},"service-n4-sécurisation-des-accès","Service n°4 — Sécurisation des accès",[599,2581,2582,2583,2586,2587,2590,2591,1294],{},"Toutes les données ne sont pas accessibles à tous. Le SGBD gère un\nsystème de ",[603,2584,2585],{},"droits"," : qui peut lire quelle relation, qui peut y\nécrire, qui peut modifier le schéma. Les droits sont attribués\nexplicitement avec ",[704,2588,2589],{},"GRANT"," et révoqués avec ",[704,2592,2593],{},"REVOKE",[1390,2595,2597],{"className":1410,"code":2596,"language":1412,"meta":802,"style":802},"GRANT SELECT ON Eleve TO professeur;\nGRANT INSERT, UPDATE ON Inscription TO secretariat;\nREVOKE INSERT ON Eleve FROM stagiaire;\n",[704,2598,2599,2616,2637],{"__ignoreMap":802},[1416,2600,2601,2603,2606,2608,2610,2613],{"class":1418,"line":963},[1416,2602,2589],{"class":1421},[1416,2604,2605],{"class":1421}," SELECT",[1416,2607,2127],{"class":1421},[1416,2609,1647],{"class":1425},[1416,2611,2612],{"class":1421},"TO",[1416,2614,2615],{"class":1425}," professeur;\n",[1416,2617,2618,2620,2623,2625,2627,2629,2632,2634],{"class":1418,"line":944},[1416,2619,2589],{"class":1421},[1416,2621,2622],{"class":1421}," INSERT",[1416,2624,759],{"class":1425},[1416,2626,1968],{"class":1421},[1416,2628,2127],{"class":1421},[1416,2630,2631],{"class":1425}," Inscription ",[1416,2633,2612],{"class":1421},[1416,2635,2636],{"class":1425}," secretariat;\n",[1416,2638,2639,2641,2643,2645,2647,2649],{"class":1418,"line":1463},[1416,2640,2593],{"class":1421},[1416,2642,2622],{"class":1421},[1416,2644,2127],{"class":1421},[1416,2646,1647],{"class":1425},[1416,2648,1431],{"class":1421},[1416,2650,2651],{"class":1425}," stagiaire;\n",[599,2653,2654,2655,2658,2659,2662],{},"Au-delà des droits, le SGBD gère aussi le ",[603,2656,2657],{},"chiffrement"," des\ncommunications, l'authentification des utilisateurs, et la ",[603,2660,2661],{},"journalisation\ndes accès"," (qui a lu quoi, qui a modifié quoi, à quelle heure). Ces\nmécanismes sont indispensables dès qu'une base contient des données\npersonnelles soumises au RGPD.",[795,2664,2666,2671],{"correct":814,"slug":2665},"sgbd-c2",[800,2667,2668],{"v-slot:question":802},[599,2669,2670],{},"Quel mot-clé SQL retire un droit à un utilisateur ?",[800,2672,2673],{"v-slot:choices":802},[729,2674,2675,2678,2680],{},[732,2676,2677],{},"DROP",[732,2679,2012],{},[732,2681,2593],{},[594,2683,2685],{"id":2684},"synthèse-les-quatre-services","Synthèse — les quatre services",[646,2687,2688,2698],{},[828,2689,2690],{},[831,2691,2692,2695],{},[834,2693,2694],{},"Service",[834,2696,2697],{},"Ce que le SGBD garantit",[841,2699,2700,2710,2720,2730],{},[831,2701,2702,2707],{},[846,2703,2704],{},[603,2705,2706],{},"Persistance",[846,2708,2709],{},"Les données survivent à l'arrêt de l'application et de la machine.",[831,2711,2712,2717],{},[846,2713,2714],{},[603,2715,2716],{},"Accès concurrents",[846,2718,2719],{},"Plusieurs utilisateurs simultanés sans corruption mutuelle, via transactions et verrous.",[831,2721,2722,2727],{},[846,2723,2724],{},[603,2725,2726],{},"Efficacité",[846,2728,2729],{},"Index, plans d'exécution, optimiseur — requêtes rapides même sur grandes tables.",[831,2731,2732,2737],{},[846,2733,2734],{},[603,2735,2736],{},"Sécurité",[846,2738,2739,2740,2742,2743,2745],{},"Droits (",[704,2741,2589],{},"\u002F",[704,2744,2593],{},"), authentification, chiffrement, journalisation.",[599,2747,2748,2749,2752,2753,1887,2756,2759],{},"Le programme ne demande ",[603,2750,2751],{},"pas"," d'en détailler le fonctionnement interne —\nil demande de savoir ",[603,2754,2755],{},"nommer",[603,2757,2758],{},"expliquer le rôle"," de chaque\nservice. Apprenez ce tableau.",[2179,2761,2762],{},"html pre.shiki code .sCsY4, html code.shiki .sCsY4{--shiki-light:#6A737D;--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sBjJW, html code.shiki .sBjJW{--shiki-light:#005CC5;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sIIMD, html code.shiki .sIIMD{--shiki-light:#032F62;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":802,"searchDepth":944,"depth":944,"links":2764},[2765,2766,2767,2768,2769,2770],{"id":596,"depth":944,"text":597},{"id":2266,"depth":944,"text":2267},{"id":2288,"depth":944,"text":2289},{"id":2416,"depth":944,"text":2417},{"id":2578,"depth":944,"text":2579},{"id":2684,"depth":944,"text":2685},"Persistance, accès concurrents, efficacité et sécurité — les quatre services rendus par un SGBD relationnel.",{},[2774,2776],{"slug":2395,"kind":958,"question":2400,"choices":2775,"correct":797,"multi":960,"explanation":802},[2407,2410,2413],{"slug":2665,"kind":958,"question":2670,"choices":2777,"correct":814,"multi":960,"explanation":802},[2677,2012,2593],{"title":495,"description":2771},"imaFcPeQb1EC77r7JRVU0cMaKUzrzEhpQrC1etlcJC0",{"id":2781,"title":477,"bo":2782,"body":2783,"description":2919,"eval":952,"extension":953,"labo":952,"meta":2920,"navigation":955,"path":478,"quizzes":2922,"readingTime":963,"seo":2923,"stem":479,"tp":952,"__hash__":2924},"cours\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F0.index.md",[969,1351,589,2202],{"type":591,"value":2784,"toc":2915},[2785,2789,2806,2809,2855,2863,2867,2908],[594,2786,2788],{"id":2787},"au-programme","Au programme",[599,2790,2791,2792,2795,2796,2799,2800,2802,2803,667],{},"Le chapitre TB répond à une question simple en apparence : ",[603,2793,2794],{},"comment ranger\ndes données nombreuses, sans redondance ni incohérence, pour pouvoir les\ninterroger efficacement ?"," Vous découvrez le ",[603,2797,2798],{},"modèle relationnel"," — la\nthéorie mathématique sur laquelle reposent presque toutes les bases de\ndonnées utilisées en production aujourd'hui — puis sa concrétisation par le\nlangage ",[603,2801,1360],{}," et l'outil logiciel qui orchestre le tout : le ",[603,2804,2805],{},"SGBD",[599,2807,2808],{},"Vous y apprenez à :",[729,2810,2811,2817,2831,2849],{},[732,2812,2813,2816],{},[603,2814,2815],{},"modéliser une situation"," sous forme de relations avec leurs attributs,\ndomaines, clés primaires et clés étrangères (TB03) ;",[732,2818,2819,2822,2823,2826,2827,2830],{},[603,2820,2821],{},"distinguer la structure d'une base"," (son schéma) ",[603,2824,2825],{},"de son contenu","\n(les données qu'elle stocke), et ",[603,2828,2829],{},"repérer les anomalies"," induites par un\nschéma mal normalisé (TB01) ;",[732,2832,2833,2836,2837,2840,2841,759,2844,759,2846,2848],{},[603,2834,2835],{},"écrire des requêtes SQL"," d'interrogation (",[704,2838,2839],{},"SELECT … FROM … WHERE … JOIN",")\net de mise à jour (",[704,2842,2843],{},"INSERT",[704,2845,1968],{},[704,2847,2012],{},") sur une base réaliste (TB02) ;",[732,2850,2851,2854],{},[603,2852,2853],{},"identifier les services rendus par un SGBD"," : persistance, accès\nconcurrents, efficacité, sécurisation (TB04).",[2856,2857,2860],"card",{"icon":2858,"title":2859},"i-lucide-check","Pré-requis",[599,2861,2862],{},"Le chapitre PD de Première (traitement de données en tables) introduit la\nnotion de table et de jointure dans un cadre Python. Vous le retrouvez ici\nformalisé. Aucune connaissance préalable de SQL n'est supposée.",[594,2864,2866],{"id":2865},"plan","Plan",[2868,2869,2870,2876,2882,2902],"ol",{},[732,2871,2872,2875],{},[603,2873,2874],{},"Modèle relationnel"," — TB03 — relation, attribut, domaine, clé primaire,\nclé étrangère, schéma relationnel.",[732,2877,2878,2881],{},[603,2879,2880],{},"Base de données relationnelle"," — TB01 — structure vs contenu, normalisation,\nanomalies d'un schéma défectueux.",[732,2883,2884,2887,2888,759,2890,759,2892,2894,2895,759,2897,759,2899,2901],{},[603,2885,2886],{},"Langage SQL"," — TB02 — interroger (",[704,2889,1422],{},[704,2891,1440],{},[704,2893,1644],{},") et mettre à\njour (",[704,2896,2843],{},[704,2898,1968],{},[704,2900,2012],{},").",[732,2903,2904,2907],{},[603,2905,2906],{},"Système de gestion de bases de données"," — TB04 — persistance, concurrence,\nefficacité, sécurité.",[599,2909,2910,2911,2914],{},"Une fiche mémo de chapitre et une auto-évaluation consolident les notions en fin\nde parcours. La source MDC ",[704,2912,2913],{},"chapitre.eval.md"," prépare le DS de fin de séquence.",{"title":802,"searchDepth":944,"depth":944,"links":2916},[2917,2918],{"id":2787,"depth":944,"text":2788},{"id":2865,"depth":944,"text":2866},"Modéliser et interroger des données nombreuses et persistantes — du schéma relationnel au SQL, en passant par les services du SGBD.",{"icon":2921},"i-lucide-database",[],{"title":477,"description":2919},"nsLcDZwSzcxoy_n6MsuqZKGQdOr5Kww3qL8H5G2fA_Q",[2926,3074,3237,3726,3910],{"id":2927,"title":2928,"bo":2929,"body":2930,"description":3067,"eval":952,"extension":953,"labo":952,"meta":3068,"navigation":960,"path":3069,"quizzes":3070,"readingTime":963,"seo":3071,"stem":3072,"tp":952,"__hash__":3073},"coursMemo\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F1.modele-relationnel.memo.md","Le modèle relationnel — l'essentiel",[589],{"type":591,"value":2931,"toc":3061},[2932,2936,2953,2957,3013,3017,3022,3033,3037],[594,2933,2935],{"id":2934},"en-une-phrase","En une phrase",[599,2937,640,2938,2940,2941,2943,2944,2946,2947,2949,2950,667],{},[603,2939,621],{}," (table) range des ",[603,2942,629],{}," (lignes) selon un ",[603,2945,666],{},"\n(attributs + domaines), identifie chaque n-uplet par une ",[603,2948,695],{}," et\nse relie à d'autres relations par des ",[603,2951,2952],{},"clés étrangères",[594,2954,2956],{"id":2955},"à-mémoriser","À mémoriser",[729,2958,2959,2965,2974,2985,2998,3004],{},[732,2960,2961,2964],{},[603,2962,2963],{},"Relation"," = table = ensemble de n-uplets (pas de doublon, pas d'ordre).",[732,2966,2967,2970,2971,2973],{},[603,2968,2969],{},"Attribut"," = colonne ; ",[603,2972,654],{}," = ensemble des valeurs admissibles.",[732,2975,2976,2979,2980,667],{},[603,2977,2978],{},"Clé primaire"," : attribut(s) qui identifient sans ambiguïté chaque ligne ;\nnotation soulignée ",[704,2981,2982],{},[708,2983,2984],{},"att",[732,2986,2987,2990,2991,2994,2995,667],{},[603,2988,2989],{},"Clé étrangère"," : attribut dont les valeurs référencent une clé primaire\nailleurs ; notation ",[704,2992,2993],{},"att*"," ou ",[704,2996,2997],{},"att#",[732,2999,3000,3003],{},[603,3001,3002],{},"Trois contraintes d'intégrité"," : domaine, entité (clé primaire non NULL\net unique), référentielle (clé étrangère existante).",[732,3005,3006,3009,3010,3012],{},[603,3007,3008],{},"Schéma"," = structure (rarement modifiée) ; ",[603,3011,662],{}," = données (modifié\nconstamment).",[594,3014,3016],{"id":3015},"notation-dun-schéma-relationnel","Notation d'un schéma relationnel",[1390,3018,3020],{"className":3019,"code":1394,"language":1395},[1393],[704,3021,1394],{"__ignoreMap":802},[599,3023,3024,3025,3028,3029,3032],{},"Clé primaire soulignée, clé étrangère marquée ",[704,3026,3027],{},"*"," (ou ",[704,3030,3031],{},"#",") avec flèche\nimplicite vers la relation référencée.",[594,3034,3036],{"id":3035},"pièges-courants","Pièges courants",[729,3038,3039,3045,3051],{},[732,3040,3041,3042,3044],{},"Une clé primaire peut être ",[603,3043,772],{}," (plusieurs attributs ensemble).",[732,3046,3047,3048,3050],{},"Une clé primaire ne peut jamais valoir ",[704,3049,869],{}," — c'est une contrainte\nd'entité.",[732,3052,3053,3054,3057,3058,3060],{},"Une relation n'a ",[603,3055,3056],{},"pas d'ordre"," : ",[704,3059,1509],{}," réordonne le résultat d'une\nrequête, pas la relation elle-même.",{"title":802,"searchDepth":944,"depth":944,"links":3062},[3063,3064,3065,3066],{"id":2934,"depth":944,"text":2935},{"id":2955,"depth":944,"text":2956},{"id":3015,"depth":944,"text":3016},{"id":3035,"depth":944,"text":3036},"Mémo de révision sur le vocabulaire et les contraintes du modèle relationnel.",{},"\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fmodele-relationnel.memo",[],{"title":2928,"description":3067},"2.nsi-tale\u002Ftb-bases-de-donnees\u002F1.modele-relationnel.memo","dTLJGJEFKhoMXbTQwr6XJRTSiIC-EBelsaDL3CTh3BA",{"id":3075,"title":3076,"bo":3077,"body":3078,"description":3230,"eval":952,"extension":953,"labo":952,"meta":3231,"navigation":960,"path":3232,"quizzes":3233,"readingTime":963,"seo":3234,"stem":3235,"tp":952,"__hash__":3236},"coursMemo\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F2.base-relationnelle.memo.md","Base relationnelle et anomalies — l'essentiel",[969],{"type":591,"value":3079,"toc":3223},[3080,3082,3093,3095,3141,3145,3183,3187,3195,3198,3204,3207,3213,3215],[594,3081,2935],{"id":2934},[599,3083,3084,3085,3088,3089,3092],{},"Un bon schéma relationnel ",[603,3086,3087],{},"isole chaque entité dans sa propre relation"," ;\nun schéma défectueux ",[603,3090,3091],{},"redonde l'information"," et engendre des anomalies\nd'insertion, de suppression et de mise à jour.",[594,3094,2956],{"id":2955},[729,3096,3097,3103,3109,3115],{},[732,3098,3099,3102],{},[603,3100,3101],{},"Structure"," = ensemble des schémas relationnels (forme, rarement modifiée).",[732,3104,3105,3108],{},[603,3106,3107],{},"Contenu"," = ensemble des n-uplets stockés (modifié constamment).",[732,3110,3111,3114],{},[603,3112,3113],{},"Redondance"," : une même information factuelle apparaît plusieurs fois.",[732,3116,3117,3120,3121],{},[603,3118,3119],{},"Trois anomalies"," issues d'une redondance non maîtrisée :\n",[729,3122,3123,3129,3135],{},[732,3124,3125,3128],{},[603,3126,3127],{},"insertion"," : impossible de stocker une entité sans une autre ;",[732,3130,3131,3134],{},[603,3132,3133],{},"suppression"," : retirer un fait efface aussi une entité ;",[732,3136,3137,3140],{},[603,3138,3139],{},"mise à jour"," : il faut modifier plusieurs lignes pour un seul fait.",[594,3142,3144],{"id":3143},"à-savoir-reconnaître","À savoir reconnaître",[646,3146,3147,3157],{},[828,3148,3149],{},[831,3150,3151,3154],{},[834,3152,3153],{},"Situation",[834,3155,3156],{},"Anomalie",[841,3158,3159,3167,3175],{},[831,3160,3161,3164],{},[846,3162,3163],{},"« Je ne peux pas créer un élève tant qu'il n'est pas inscrit à un cours »",[846,3165,3166],{},"Insertion",[831,3168,3169,3172],{},[846,3170,3171],{},"« J'ai supprimé sa dernière inscription, j'ai perdu sa classe »",[846,3173,3174],{},"Suppression",[831,3176,3177,3180],{},[846,3178,3179],{},"« Il a changé de classe, je dois corriger 30 lignes »",[846,3181,3182],{},"Mise à jour",[594,3184,3186],{"id":3185},"remède","Remède",[599,3188,3189,3192,3193,667],{},[603,3190,3191],{},"Décomposer"," : une relation par entité conceptuelle, reliée aux autres\npar des ",[603,3194,2952],{},[599,3196,3197],{},"Avant :",[1390,3199,3202],{"className":3200,"code":3201,"language":1395},[1393],"Inscription(id_inscription, nom_eleve, classe, intitule_cours, niveau, date)\n",[704,3203,3201],{"__ignoreMap":802},[599,3205,3206],{},"Après :",[1390,3208,3211],{"className":3209,"code":3210,"language":1395},[1393],"Eleve(id_eleve, nom, prenom, classe)\nCours(id_cours, intitule, niveau)\nInscription(id_eleve*, id_cours*, date_inscription)\n",[704,3212,3210],{"__ignoreMap":802},[594,3214,3036],{"id":3035},[729,3216,3217,3220],{},[732,3218,3219],{},"Une redondance discrète peut se cacher derrière un attribut « pratique »\n(nom de la classe d'un élève dupliqué dans chaque ligne d'évaluation).",[732,3221,3222],{},"La normalisation n'est pas un dogme : on accepte parfois une légère\nredondance pour la performance — mais en connaissance de cause.",{"title":802,"searchDepth":944,"depth":944,"links":3224},[3225,3226,3227,3228,3229],{"id":2934,"depth":944,"text":2935},{"id":2955,"depth":944,"text":2956},{"id":3143,"depth":944,"text":3144},{"id":3185,"depth":944,"text":3186},{"id":3035,"depth":944,"text":3036},"Mémo de révision sur la distinction structure\u002Fcontenu et les anomalies de schéma.",{},"\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fbase-relationnelle.memo",[],{"title":3076,"description":3230},"2.nsi-tale\u002Ftb-bases-de-donnees\u002F2.base-relationnelle.memo","9BC0_f2vMnmvadqYHmYz1v0xex1K2ZAsbGb-KXLsL6g",{"id":3238,"title":3239,"bo":3240,"body":3241,"description":3719,"eval":952,"extension":953,"labo":952,"meta":3720,"navigation":960,"path":3721,"quizzes":3722,"readingTime":963,"seo":3723,"stem":3724,"tp":952,"__hash__":3725},"coursMemo\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F3.sql.memo.md","SQL — l'essentiel",[1351],{"type":591,"value":3242,"toc":3705},[3243,3245,3267,3271,3342,3346,3351,3377,3381,3401,3404,3487,3491,3555,3557,3589,3592,3622,3624,3647,3649,3703],[594,3244,2935],{"id":2934},[599,3246,3247,3248,3250,3251,1361,3254,3256,3257,1361,3260,759,3262,759,3264,3266],{},"SQL est un langage ",[603,3249,1368],{}," pour ",[603,3252,3253],{},"interroger",[704,3255,1422],{},") et\n",[603,3258,3259],{},"modifier",[704,3261,2843],{},[704,3263,1968],{},[704,3265,2012],{},") une base relationnelle.",[594,3268,3270],{"id":3269},"charpente-dun-select","Charpente d'un SELECT",[1390,3272,3274],{"className":1410,"code":3273,"language":1412,"meta":802,"style":802},"SELECT   \u003Ccolonnes>\nFROM     \u003Crelation>\nJOIN     \u003Crelation2> ON \u003Ccondition>\nWHERE    \u003Ccondition>\nORDER BY \u003Ccolonne(s)> [ASC|DESC];\n",[704,3275,3276,3287,3298,3318,3328],{"__ignoreMap":802},[1416,3277,3278,3280,3282,3285],{"class":1418,"line":963},[1416,3279,1422],{"class":1421},[1416,3281,2142],{"class":1421},[1416,3283,3284],{"class":1425},"colonnes",[1416,3286,2100],{"class":1421},[1416,3288,3289,3291,3294,3296],{"class":1418,"line":944},[1416,3290,1431],{"class":1421},[1416,3292,3293],{"class":1421},"     \u003C",[1416,3295,621],{"class":1425},[1416,3297,2100],{"class":1421},[1416,3299,3300,3302,3304,3307,3309,3311,3313,3316],{"class":1418,"line":1463},[1416,3301,1644],{"class":1421},[1416,3303,3293],{"class":1421},[1416,3305,3306],{"class":1425},"relation2",[1416,3308,2124],{"class":1421},[1416,3310,2127],{"class":1421},[1416,3312,2130],{"class":1421},[1416,3314,3315],{"class":1425},"condition",[1416,3317,2100],{"class":1421},[1416,3319,3320,3322,3324,3326],{"class":1418,"line":1545},[1416,3321,1440],{"class":1421},[1416,3323,2107],{"class":1421},[1416,3325,3315],{"class":1425},[1416,3327,2100],{"class":1421},[1416,3329,3330,3332,3334,3337,3339],{"class":1418,"line":2150},[1416,3331,1509],{"class":1421},[1416,3333,2130],{"class":1421},[1416,3335,3336],{"class":1425},"colonne(s)",[1416,3338,2124],{"class":1421},[1416,3340,3341],{"class":1425}," [ASC|DESC];\n",[594,3343,3345],{"id":3344},"snippets-de-référence","Snippets de référence",[3347,3348,3350],"h3",{"id":3349},"filtrer","Filtrer",[1390,3352,3354],{"className":1410,"code":3353,"language":1412,"meta":802,"style":802},"SELECT nom, prenom FROM Eleve WHERE classe = 'TG1';\n",[704,3355,3356],{"__ignoreMap":802},[1416,3357,3358,3360,3363,3365,3367,3369,3371,3373,3375],{"class":1418,"line":963},[1416,3359,1422],{"class":1421},[1416,3361,3362],{"class":1425}," nom, prenom ",[1416,3364,1431],{"class":1421},[1416,3366,1647],{"class":1425},[1416,3368,1440],{"class":1421},[1416,3370,1468],{"class":1425},[1416,3372,1471],{"class":1421},[1416,3374,1475],{"class":1474},[1416,3376,1478],{"class":1425},[3347,3378,3380],{"id":3379},"dédupliquer-trier","Dédupliquer + trier",[1390,3382,3384],{"className":1410,"code":3383,"language":1412,"meta":802,"style":802},"SELECT DISTINCT classe FROM Eleve ORDER BY classe;\n",[704,3385,3386],{"__ignoreMap":802},[1416,3387,3388,3390,3392,3394,3396,3398],{"class":1418,"line":963},[1416,3389,1494],{"class":1421},[1416,3391,1468],{"class":1425},[1416,3393,1431],{"class":1421},[1416,3395,1647],{"class":1425},[1416,3397,1509],{"class":1421},[1416,3399,3400],{"class":1425}," classe;\n",[3347,3402,3403],{"id":1586},"Jointure",[1390,3405,3407],{"className":1410,"code":3406,"language":1412,"meta":802,"style":802},"SELECT Eleve.nom, Cours.intitule, Inscription.note\nFROM Inscription\nJOIN Eleve ON Inscription.id_eleve = Eleve.id_eleve\nJOIN Cours ON Inscription.id_cours = Cours.id_cours;\n",[704,3408,3409,3435,3441,3463],{"__ignoreMap":802},[1416,3410,3411,3413,3415,3417,3419,3421,3423,3425,3427,3429,3431,3433],{"class":1418,"line":963},[1416,3412,1422],{"class":1421},[1416,3414,1600],{"class":1599},[1416,3416,667],{"class":1425},[1416,3418,1605],{"class":1599},[1416,3420,759],{"class":1425},[1416,3422,784],{"class":1599},[1416,3424,667],{"class":1425},[1416,3426,1623],{"class":1599},[1416,3428,759],{"class":1425},[1416,3430,768],{"class":1599},[1416,3432,667],{"class":1425},[1416,3434,1632],{"class":1599},[1416,3436,3437,3439],{"class":1418,"line":944},[1416,3438,1431],{"class":1421},[1416,3440,1639],{"class":1425},[1416,3442,3443,3445,3447,3449,3451,3453,3455,3457,3459,3461],{"class":1418,"line":1463},[1416,3444,1644],{"class":1421},[1416,3446,1647],{"class":1425},[1416,3448,1650],{"class":1421},[1416,3450,1653],{"class":1599},[1416,3452,667],{"class":1425},[1416,3454,739],{"class":1599},[1416,3456,1660],{"class":1421},[1416,3458,1600],{"class":1599},[1416,3460,667],{"class":1425},[1416,3462,1667],{"class":1599},[1416,3464,3465,3467,3469,3471,3473,3475,3477,3479,3481,3483,3485],{"class":1418,"line":1545},[1416,3466,1644],{"class":1421},[1416,3468,1674],{"class":1425},[1416,3470,1650],{"class":1421},[1416,3472,1653],{"class":1599},[1416,3474,667],{"class":1425},[1416,3476,748],{"class":1599},[1416,3478,1660],{"class":1421},[1416,3480,1687],{"class":1599},[1416,3482,667],{"class":1425},[1416,3484,748],{"class":1599},[1416,3486,1478],{"class":1425},[3347,3488,3490],{"id":3489},"agrégation-sans-group-by","Agrégation (sans GROUP BY)",[1390,3492,3494],{"className":1410,"code":3493,"language":1412,"meta":802,"style":802},"SELECT AVG(note) FROM Inscription;\nSELECT COUNT(*) FROM Eleve WHERE classe = 'TG1';\nSELECT MAX(note), MIN(note) FROM Inscription;\n",[704,3495,3496,3509,3537],{"__ignoreMap":802},[1416,3497,3498,3500,3502,3505,3507],{"class":1418,"line":963},[1416,3499,1422],{"class":1421},[1416,3501,1795],{"class":1599},[1416,3503,3504],{"class":1425},"(note) ",[1416,3506,1431],{"class":1421},[1416,3508,1805],{"class":1425},[1416,3510,3511,3513,3516,3518,3520,3523,3525,3527,3529,3531,3533,3535],{"class":1418,"line":944},[1416,3512,1422],{"class":1421},[1416,3514,3515],{"class":1599}," COUNT",[1416,3517,1823],{"class":1425},[1416,3519,3027],{"class":1421},[1416,3521,3522],{"class":1425},") ",[1416,3524,1431],{"class":1421},[1416,3526,1647],{"class":1425},[1416,3528,1440],{"class":1421},[1416,3530,1468],{"class":1425},[1416,3532,1471],{"class":1421},[1416,3534,1475],{"class":1474},[1416,3536,1478],{"class":1425},[1416,3538,3539,3541,3543,3546,3549,3551,3553],{"class":1418,"line":1463},[1416,3540,1422],{"class":1421},[1416,3542,1820],{"class":1599},[1416,3544,3545],{"class":1425},"(note), ",[1416,3547,3548],{"class":1599},"MIN",[1416,3550,3504],{"class":1425},[1416,3552,1431],{"class":1421},[1416,3554,1805],{"class":1425},[3347,3556,3166],{"id":3127},[1390,3558,3559],{"className":1410,"code":1908,"language":1412,"meta":802,"style":802},[704,3560,3561,3567],{"__ignoreMap":802},[1416,3562,3563,3565],{"class":1418,"line":963},[1416,3564,1915],{"class":1421},[1416,3566,1918],{"class":1425},[1416,3568,3569,3571,3573,3575,3577,3579,3581,3583,3585,3587],{"class":1418,"line":944},[1416,3570,1923],{"class":1421},[1416,3572,1361],{"class":1425},[1416,3574,1928],{"class":1599},[1416,3576,759],{"class":1425},[1416,3578,1933],{"class":1474},[1416,3580,759],{"class":1425},[1416,3582,1938],{"class":1474},[1416,3584,759],{"class":1425},[1416,3586,1943],{"class":1474},[1416,3588,1946],{"class":1425},[3347,3590,3182],{"id":3591},"mise-à-jour",[1390,3593,3595],{"className":1410,"code":3594,"language":1412,"meta":802,"style":802},"UPDATE Eleve SET classe = 'TG3' WHERE id_eleve = 42;\n",[704,3596,3597],{"__ignoreMap":802},[1416,3598,3599,3601,3603,3605,3607,3609,3612,3614,3616,3618,3620],{"class":1418,"line":963},[1416,3600,1968],{"class":1421},[1416,3602,1647],{"class":1425},[1416,3604,1975],{"class":1421},[1416,3606,1468],{"class":1425},[1416,3608,1471],{"class":1421},[1416,3610,3611],{"class":1474}," 'TG3'",[1416,3613,2349],{"class":1421},[1416,3615,1989],{"class":1425},[1416,3617,1471],{"class":1421},[1416,3619,1994],{"class":1599},[1416,3621,1478],{"class":1425},[3347,3623,3174],{"id":3133},[1390,3625,3627],{"className":1410,"code":3626,"language":1412,"meta":802,"style":802},"DELETE FROM Inscription WHERE id_eleve = 42;\n",[704,3628,3629],{"__ignoreMap":802},[1416,3630,3631,3633,3635,3637,3639,3641,3643,3645],{"class":1418,"line":963},[1416,3632,2012],{"class":1421},[1416,3634,2015],{"class":1421},[1416,3636,2631],{"class":1425},[1416,3638,1440],{"class":1421},[1416,3640,1989],{"class":1425},[1416,3642,1471],{"class":1421},[1416,3644,1994],{"class":1599},[1416,3646,1478],{"class":1425},[594,3648,3036],{"id":3035},[729,3650,3651,3668,3681,3692],{},[732,3652,3653,2994,3655,3657,3658,3663,3664,3667],{},[704,3654,1968],{},[704,3656,2012],{}," ",[603,3659,3660,3661],{},"sans ",[704,3662,1440],{}," touche ",[603,3665,3666],{},"toutes"," les lignes.",[732,3669,3670,3671,3057,3674,3677,3678,667],{},"Les chaînes vont entre ",[603,3672,3673],{},"apostrophes simples",[704,3675,3676],{},"'TG1'",", pas ",[704,3679,3680],{},"\"TG1\"",[732,3682,3683,3684,3686,3687,3689,3690,667],{},"Pas de ",[704,3685,1886],{}," ni de ",[704,3688,1890],{}," au programme : les agrégats produisent\nalors ",[603,3691,1894],{},[732,3693,3694,3695,3698,3699,3702],{},"Une jointure repose sur ",[603,3696,3697],{},"clé étrangère = clé primaire"," ; écrire\n",[704,3700,3701],{},"FROM A, B"," ou oublier la condition de jointure produit un produit\ncartésien (très grosse table).",[2179,3704,2181],{},{"title":802,"searchDepth":944,"depth":944,"links":3706},[3707,3708,3709,3718],{"id":2934,"depth":944,"text":2935},{"id":3269,"depth":944,"text":3270},{"id":3344,"depth":944,"text":3345,"children":3710},[3711,3712,3713,3714,3715,3716,3717],{"id":3349,"depth":1463,"text":3350},{"id":3379,"depth":1463,"text":3380},{"id":1586,"depth":1463,"text":3403},{"id":3489,"depth":1463,"text":3490},{"id":3127,"depth":1463,"text":3166},{"id":3591,"depth":1463,"text":3182},{"id":3133,"depth":1463,"text":3174},{"id":3035,"depth":944,"text":3036},"Mémo de référence pour écrire vos requêtes SQL d'interrogation et de mise à jour.",{},"\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsql.memo",[],{"title":3239,"description":3719},"2.nsi-tale\u002Ftb-bases-de-donnees\u002F3.sql.memo","rVRgi_viOBnT5hy-S9Hv9wbxb_QrSlqIeEVzz8TasVk",{"id":3727,"title":3728,"bo":3729,"body":3730,"description":3903,"eval":952,"extension":953,"labo":952,"meta":3904,"navigation":960,"path":3905,"quizzes":3906,"readingTime":963,"seo":3907,"stem":3908,"tp":952,"__hash__":3909},"coursMemo\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002F4.sgbd.memo.md","SGBD — l'essentiel",[2202],{"type":591,"value":3731,"toc":3896},[3732,3734,3742,3746,3801,3805,3826,3830,3864,3866,3893],[594,3733,2935],{"id":2934},[599,3735,2209,3736,3738,3739,3741],{},[603,3737,2805],{}," est le logiciel qui exécute concrètement le modèle relationnel\net qui rend ",[603,3740,2216],{}," : persistance, accès concurrents,\nefficacité, sécurité.",[594,3743,3745],{"id":3744},"à-mémoriser-les-4-services","À mémoriser — les 4 services",[646,3747,3748,3757],{},[828,3749,3750],{},[831,3751,3752,3754],{},[834,3753,2694],{},[834,3755,3756],{},"Mécanisme clé",[841,3758,3759,3768,3777,3786],{},[831,3760,3761,3765],{},[846,3762,3763],{},[603,3764,2706],{},[846,3766,3767],{},"Stockage disque + journal de transactions. Les données survivent à un crash.",[831,3769,3770,3774],{},[846,3771,3772],{},[603,3773,2716],{},[846,3775,3776],{},"Transactions atomiques + verrous. Plusieurs utilisateurs en même temps sans corruption.",[831,3778,3779,3783],{},[846,3780,3781],{},[603,3782,2726],{},[846,3784,3785],{},"Index (arbres équilibrés), plans d'exécution, optimiseur de requêtes.",[831,3787,3788,3792],{},[846,3789,3790],{},[603,3791,2736],{},[846,3793,3794,3795,3797,3798,3800],{},"Droits ",[704,3796,2589],{}," \u002F ",[704,3799,2593],{},", authentification, chiffrement, journalisation.",[594,3802,3804],{"id":3803},"sgbd-à-connaître-de-nom","SGBD à connaître de nom",[729,3806,3807,3812,3819],{},[732,3808,3809,3811],{},[603,3810,2248],{}," — embarqué, un fichier, idéal pour un cours.",[732,3813,3814,759,3816,3818],{},[603,3815,2252],{},[603,3817,2255],{}," — serveurs open-source, marché web.",[732,3820,3821,759,3823,3825],{},[603,3822,2259],{},[603,3824,2262],{}," — propriétaires, marché entreprise.",[594,3827,3829],{"id":3828},"mots-clés-droits","Mots-clés droits",[1390,3831,3833],{"className":1410,"code":3832,"language":1412,"meta":802,"style":802},"GRANT  SELECT ON Eleve TO professeur;\nREVOKE INSERT ON Eleve FROM stagiaire;\n",[704,3834,3835,3850],{"__ignoreMap":802},[1416,3836,3837,3839,3842,3844,3846,3848],{"class":1418,"line":963},[1416,3838,2589],{"class":1421},[1416,3840,3841],{"class":1421},"  SELECT",[1416,3843,2127],{"class":1421},[1416,3845,1647],{"class":1425},[1416,3847,2612],{"class":1421},[1416,3849,2615],{"class":1425},[1416,3851,3852,3854,3856,3858,3860,3862],{"class":1418,"line":944},[1416,3853,2593],{"class":1421},[1416,3855,2622],{"class":1421},[1416,3857,2127],{"class":1421},[1416,3859,1647],{"class":1425},[1416,3861,1431],{"class":1421},[1416,3863,2651],{"class":1425},[594,3865,3036],{"id":3035},[729,3867,3868,3878,3884],{},[732,3869,3870,3873,3874,3877],{},[603,3871,3872],{},"Persistance ≠ sauvegarde"," : la persistance assure la survie aux\narrêts ordinaires ; la sauvegarde (",[612,3875,3876],{},"backup",") protège des pertes\ncatastrophiques (disque grillé).",[732,3879,3880,3883],{},[603,3881,3882],{},"Optimiseur ≠ magie"," : un mauvais schéma ou une absence d'index\nrendent même le meilleur optimiseur impuissant.",[732,3885,3886,3887,1887,3889,3892],{},"Le programme demande de ",[603,3888,2755],{},[603,3890,3891],{},"expliquer"," chaque service —\npas d'en détailler l'algorithmique interne.",[2179,3894,3895],{},"html pre.shiki code .s8jYJ, html code.shiki .s8jYJ{--shiki-light:#D73A49;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sxrX7, html code.shiki .sxrX7{--shiki-light:#24292E;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":802,"searchDepth":944,"depth":944,"links":3897},[3898,3899,3900,3901,3902],{"id":2934,"depth":944,"text":2935},{"id":3744,"depth":944,"text":3745},{"id":3803,"depth":944,"text":3804},{"id":3828,"depth":944,"text":3829},{"id":3035,"depth":944,"text":3036},"Mémo de révision sur les quatre services d'un SGBD relationnel.",{},"\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fsgbd.memo",[],{"title":3728,"description":3903},"2.nsi-tale\u002Ftb-bases-de-donnees\u002F4.sgbd.memo","uVdkmU630HQvjgvXh1gi0euJ11Ah-cYlLhluoYqik5o",{"id":3911,"title":3912,"bo":3913,"body":3914,"description":4335,"eval":952,"extension":953,"labo":952,"meta":4336,"navigation":960,"path":4338,"quizzes":4339,"readingTime":963,"seo":4364,"stem":4365,"tp":952,"__hash__":4366},"coursMemo\u002F2.nsi-tale\u002Ftb-bases-de-donnees\u002Fchapitre.memo.md","Bases de données — synthèse",[969,1351,589,2202],{"type":591,"value":3915,"toc":4330},[3916,3920,3923,3939,3955,3972,3981,4031,4059,4063,4139,4143,4173,4197,4221,4233,4241,4268,4297,4322],[594,3917,3919],{"id":3918},"vue-densemble","Vue d'ensemble",[599,3921,3922],{},"Le chapitre TB construit, en quatre temps, une compréhension complète de\nce qu'est une base de données relationnelle.",[599,3924,912,3925,3927,3928,3931,3932,3938],{},[603,3926,2798],{}," (TB03) pose le vocabulaire mathématique :\nrelation, attribut, domaine, n-uplet, clé primaire, clé étrangère. Il\ndéfinit trois contraintes d'intégrité (domaine, entité, référentielle)\nqui garantissent que les données restent cohérentes au fil des\nmodifications. Vous savez désormais lire et écrire un ",[603,3929,3930],{},"schéma\nrelationnel"," en notation compacte\n",[704,3933,706,3934,3937],{},[708,3935,3936],{},"cp",", att, cle_etrangere*)"," — clé primaire soulignée,\nclé étrangère pointée par étoile.",[599,3940,3941,3942,3945,3946,3949,3950,3952,3953,1294],{},"Le passage ",[603,3943,3944],{},"structure \u002F contenu"," (TB01) ouvre la question de la\n",[603,3947,3948],{},"qualité"," d'un schéma. Une base mal conçue souffre de ",[603,3951,982],{},"\nqui engendrent trois familles d'",[603,3954,986],{},[729,3956,3957,3962,3967],{},[732,3958,3959,3961],{},[603,3960,3127],{}," : impossible de créer une entité sans une autre ;",[732,3963,3964,3966],{},[603,3965,3133],{}," : retirer un fait efface une entité ;",[732,3968,3969,3971],{},[603,3970,3139],{}," : un seul changement réel exige de modifier plusieurs\nlignes (et tout oubli crée une incohérence).",[599,3973,3974,3975,3978,3979,667],{},"Le remède est la ",[603,3976,3977],{},"décomposition"," : une relation par entité, reliée aux\nautres par des clés étrangères. C'est la ",[603,3980,1285],{},[599,3982,3983,3984,3986,3987,1361,3989,3256,3992,1361,3994,759,3996,759,3998,4000,4001,759,4003,4005,4006,759,4009,4012,4013,759,4015,759,4018,4021,4022,4024,4025,4027,4028,4030],{},"Le langage ",[603,3985,1360],{}," (TB02) concrétise toutes ces idées : il offre des\nverbes pour ",[603,3988,3253],{},[704,3990,3991],{},"SELECT … FROM … WHERE … JOIN … ON",[603,3993,3259],{},[704,3995,2843],{},[704,3997,1968],{},[704,3999,2012],{},") la base. Vous maîtrisez\n",[704,4002,1484],{},[704,4004,1509],{}," et les fonctions d'agrégation (",[704,4007,4008],{},"COUNT",[704,4010,4011],{},"AVG",",\n",[704,4014,3548],{},[704,4016,4017],{},"MAX",[704,4019,4020],{},"SUM",") — sans ",[704,4023,1886],{}," ni ",[704,4026,1890],{},", hors-programme.\nSQL est ",[603,4029,1368],{}," : vous décrivez ce que vous voulez, le SGBD\ndécide comment l'obtenir.",[599,4032,912,4033,4035,4036,4038,4039,4042,4043,4046,4047,4050,4051,4053,4054,2742,4056,4058],{},[603,4034,2805],{}," (TB04) est précisément l'outil qui rend tout cela possible.\nIl fournit ",[603,4037,2216],{}," qu'il faut savoir nommer et expliquer :\n",[603,4040,4041],{},"persistance"," (les données survivent aux arrêts), ",[603,4044,4045],{},"accès\nconcurrents"," (transactions et verrous), ",[603,4048,4049],{},"efficacité"," (index et\noptimiseur de requêtes), ",[603,4052,2239],{}," (droits ",[704,4055,2589],{},[704,4057,2593],{},",\nauthentification, journalisation).",[594,4060,4062],{"id":4061},"carte-des-notions","Carte des notions",[646,4064,4065,4077],{},[828,4066,4067],{},[831,4068,4069,4071,4074],{},[834,4070,784],{},[834,4072,4073],{},"Items BO",[834,4075,4076],{},"Notions-clés",[841,4078,4079,4089,4099,4129],{},[831,4080,4081,4084,4086],{},[846,4082,4083],{},"1. Modèle relationnel",[846,4085,589],{},[846,4087,4088],{},"Relation, attribut, domaine, clé primaire, clé étrangère, contraintes d'intégrité",[831,4090,4091,4094,4096],{},[846,4092,4093],{},"2. Base relationnelle",[846,4095,969],{},[846,4097,4098],{},"Structure vs contenu, redondance, anomalies (insertion, suppression, mise à jour), normalisation",[831,4100,4101,4104,4106],{},[846,4102,4103],{},"3. SQL",[846,4105,1351],{},[846,4107,4108,2742,4110,2742,4112,2742,4114,2742,4116,759,4118,759,4120,4122,4123,2742,4125,2742,4127],{},[704,4109,1422],{},[704,4111,1431],{},[704,4113,1440],{},[704,4115,1644],{},[704,4117,1650],{},[704,4119,1484],{},[704,4121,1509],{},", agrégation, ",[704,4124,2843],{},[704,4126,1968],{},[704,4128,2012],{},[831,4130,4131,4134,4136],{},[846,4132,4133],{},"4. SGBD",[846,4135,2202],{},[846,4137,4138],{},"Persistance, accès concurrents, efficacité, sécurité",[594,4140,4142],{"id":4141},"auto-évaluation","Auto-évaluation",[795,4144,4146,4157],{"correct":797,"slug":4145},"tb-bases-de-donnees-1-q1",[800,4147,4148],{"v-slot:question":802},[599,4149,765,4150,4153,4154,4156],{},[704,4151,4152],{},"Inscription(id_eleve*, id_cours*, date_inscription, note)",", l'étoile ",[704,4155,3027],{}," indique :",[800,4158,4159],{"v-slot:choices":802},[729,4160,4161,4164,4167,4170],{},[732,4162,4163],{},"une clé primaire composée",[732,4165,4166],{},"une clé étrangère",[732,4168,4169],{},"un attribut obligatoire",[732,4171,4172],{},"un attribut optionnel",[795,4174,4176,4181],{"correct":814,"slug":4175},"tb-bases-de-donnees-1-q2",[800,4177,4178],{"v-slot:question":802},[599,4179,4180],{},"Quelle contrainte interdit qu'une clé étrangère pointe vers une ligne inexistante ?",[800,4182,4183],{"v-slot:choices":802},[729,4184,4185,4188,4191,4194],{},[732,4186,4187],{},"la contrainte de domaine",[732,4189,4190],{},"la contrainte d'entité",[732,4192,4193],{},"la contrainte référentielle",[732,4195,4196],{},"la contrainte de normalisation",[795,4198,4200,4205],{"correct":797,"slug":4199},"tb-bases-de-donnees-1-q3",[800,4201,4202],{"v-slot:question":802},[599,4203,4204],{},"« Je supprime la dernière inscription d'un élève et je perds son adresse. »\nCette gêne est :",[800,4206,4207],{"v-slot:choices":802},[729,4208,4209,4212,4215,4218],{},[732,4210,4211],{},"une anomalie d'insertion",[732,4213,4214],{},"une anomalie de suppression",[732,4216,4217],{},"une anomalie de mise à jour",[732,4219,4220],{},"une violation de domaine",[4222,4223,4225],"self-eval-free-text",{"answer":1484,"case-sensitive":2449,"slug":4224},"tb-bases-de-donnees-1-q4",[800,4226,4227],{"v-slot:question":802},[599,4228,4229,4230,4232],{},"Quel mot-clé SQL placez-vous après ",[704,4231,1422],{}," pour éliminer les doublons du résultat ?",[4222,4234,4236],{"answer":2593,"case-sensitive":2449,"slug":4235},"tb-bases-de-donnees-1-q5",[800,4237,4238],{"v-slot:question":802},[599,4239,4240],{},"Quel verbe SQL retire un droit d'accès à un utilisateur ?",[795,4242,4244,4252],{"correct":814,"slug":4243},"tb-bases-de-donnees-1-q6",[800,4245,4246],{"v-slot:question":802},[599,4247,4248,4249,4251],{},"Lequel de ces services n'est ",[603,4250,2751],{}," au programme parmi les services du SGBD ?",[800,4253,4254],{"v-slot:choices":802},[729,4255,4256,4259,4262,4265],{},[732,4257,4258],{},"persistance des données",[732,4260,4261],{},"gestion des accès concurrents",[732,4263,4264],{},"compilation des requêtes SQL en code machine",[732,4266,4267],{},"sécurisation des accès",[795,4269,4271,4279],{"correct":797,"slug":4270},"tb-bases-de-donnees-1-q7",[800,4272,4273],{"v-slot:question":802},[599,4274,4275,4276,4278],{},"La clause ",[704,4277,1886],{}," est-elle au programme de Terminale NSI ?",[800,4280,4281],{"v-slot:choices":802},[729,4282,4283,4286,4289,4294],{},[732,4284,4285],{},"oui, en complément des fonctions d'agrégation",[732,4287,4288],{},"non, hors-programme — on utilise les agrégats sans regroupement",[732,4290,4291,4292],{},"seulement avec ",[704,4293,1890],{},[732,4295,4296],{},"seulement sur des clés primaires",[4298,4299,4301,4306],"self-eval-ordering",{"slug":4300},"tb-bases-de-donnees-1-q8",[800,4302,4303],{"v-slot:question":802},[599,4304,4305],{},"Ordonnez les étapes pour identifier si un attribut est une clé étrangère dans un schéma donné :",[800,4307,4308],{"v-slot:items":802},[729,4309,4310,4313,4316,4319],{},[732,4311,4312],{},"Repérer un attribut dont les valeurs semblent référencer une autre relation",[732,4314,4315],{},"Vérifier que les valeurs prises correspondent à des clés primaires de la relation cible",[732,4317,4318],{},"Confirmer la déclaration explicite de la clé étrangère dans le schéma",[732,4320,4321],{},"Tracer mentalement la flèche entre l'attribut et la clé primaire référencée",[4222,4323,4325],{"answer":1509,"case-sensitive":2449,"slug":4324},"tb-bases-de-donnees-1-q9",[800,4326,4327],{"v-slot:question":802},[599,4328,4329],{},"Quels deux mots-clés SQL placez-vous en fin de requête pour trier le résultat ?",{"title":802,"searchDepth":944,"depth":944,"links":4331},[4332,4333,4334],{"id":3918,"depth":944,"text":3919},{"id":4061,"depth":944,"text":4062},{"id":4141,"depth":944,"text":4142},"Vue d'ensemble du chapitre, points-clés à mémoriser, auto-évaluation finale.",{"self_eval_slug":4337},"nsi-tale-tb-bases-de-donnees","\u002Fnsi-tale\u002Ftb-bases-de-donnees\u002Fchapitre.memo",[4340,4343,4345,4347,4352,4353,4356,4360,4363],{"slug":4145,"kind":958,"question":4341,"choices":4342,"correct":797,"multi":960,"explanation":802},"Dans Inscription(id_eleve*, id_cours*, date_inscription, note), l'étoile * indique :",[4163,4166,4169,4172],{"slug":4175,"kind":958,"question":4180,"choices":4344,"correct":814,"multi":960,"explanation":802},[4187,4190,4193,4196],{"slug":4199,"kind":958,"question":4204,"choices":4346,"correct":797,"multi":960,"explanation":802},[4211,4214,4217,4220],{"slug":4224,"kind":4348,"question":4349,"answer":1484,"caseSensitive":960,"tolerance":4350,"inputType":4351,"explanation":802},"free_text","Quel mot-clé SQL placez-vous après SELECT pour éliminer les doublons du résultat ?",0,"string",{"slug":4235,"kind":4348,"question":4240,"answer":2593,"caseSensitive":960,"tolerance":4350,"inputType":4351,"explanation":802},{"slug":4243,"kind":958,"question":4354,"choices":4355,"correct":814,"multi":960,"explanation":802},"Lequel de ces services n'est pas au programme parmi les services du SGBD ?",[4258,4261,4264,4267],{"slug":4270,"kind":958,"question":4357,"choices":4358,"correct":797,"multi":960,"explanation":802},"La clause GROUP BY est-elle au programme de Terminale NSI ?",[4285,4288,4359,4296],"seulement avec HAVING",{"slug":4300,"kind":4361,"question":4305,"items":4362,"explanation":802},"ordering",[4312,4315,4318,4321],{"slug":4324,"kind":4348,"question":4329,"answer":1509,"caseSensitive":960,"tolerance":4350,"inputType":4351,"explanation":802},{"title":3912,"description":4335},"2.nsi-tale\u002Ftb-bases-de-donnees\u002Fchapitre.memo","Xl1VkIXoOVI1QAhzavcjGUYqOU8yBmiuDS3LfhPXPrk",1788035589201]