[{"data":1,"prerenderedAt":726},["ShallowReactive",2],{"page-\u002Fsql\u002Fbase-relationnelle":3,"pieces-sql":684,"autour-\u002Fsql\u002Fbase-relationnelle":709,"prerequis-\u002Fsql\u002Fbase-relationnelle":714,"plan-sql":715},{"id":4,"title":5,"body":6,"description":658,"extension":659,"ligne":207,"meta":660,"motsCles":661,"navigation":663,"niveau":664,"path":665,"prerequis":666,"ressources":667,"seo":676,"sources":677,"stem":682,"__hash__":683},"docs\u002Fsql\u002F01.base-relationnelle.md","La base relationnelle et SELECT",{"type":7,"value":8,"toc":648},"minimark",[9,14,43,47,65,72,79,157,161,180,192,198,202,232,244,247,264,269,275,279,316,321,324,409,426,435,476,480,483,511,520,525,559,562,566,579,607,610,614,644],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,29],"ul",{},[18,19,20],"li",{},"Ce qu'est une base relationnelle : des tables, des lignes, des colonnes et une clé primaire.",[18,22,23,24,28],{},"Lire des données avec ",[25,26,27],"code",{},"SELECT",".",[18,30,31,32,35,36,39,40,28],{},"Filtrer avec ",[25,33,34],{},"WHERE",", trier avec ",[25,37,38],{},"ORDER BY"," et limiter avec ",[25,41,42],{},"LIMIT",[10,44,46],{"id":45},"une-base-ce-sont-des-tableaux","Une base, ce sont des tableaux",[48,49,50,51,55,56,59,60,64],"p",{},"Imagine un tableur. Une ",[52,53,54],"strong",{},"base de données relationnelle"," range les informations dans des tableaux reliés entre eux. Le langage ",[52,57,58],{},"SQL"," (",[61,62,63],"em",{},"Structured Query Language",") sert à lui poser des questions et à modifier son contenu.",[48,66,67,68,71],{},"Dans cette ligne, on utilise ",[52,69,70],{},"PostgreSQL",", le système de base de données que Supabase propose. Les exemples en sont tirés.",[48,73,74,75,78],{},"Notre fil rouge est un site de recettes. Voici la table ",[25,76,77],{},"recettes"," :",[80,81,82,98],"table",{},[83,84,85],"thead",{},[86,87,88,92,95],"tr",{},[89,90,91],"th",{},"id",[89,93,94],{},"titre",[89,96,97],{},"temps_minutes",[99,100,101,113,124,135,146],"tbody",{},[86,102,103,107,110],{},[104,105,106],"td",{},"1",[104,108,109],{},"Velouté de potimarron",[104,111,112],{},"35",[86,114,115,118,121],{},[104,116,117],{},"2",[104,119,120],{},"Gratin dauphinois",[104,122,123],{},"90",[86,125,126,129,132],{},[104,127,128],{},"3",[104,130,131],{},"Poulet rôti",[104,133,134],{},"75",[86,136,137,140,143],{},[104,138,139],{},"4",[104,141,142],{},"Tarte aux pommes",[104,144,145],{},"60",[86,147,148,151,154],{},[104,149,150],{},"5",[104,152,153],{},"Mousse au chocolat",[104,155,156],{},"20",[10,158,160],{"id":159},"le-vocabulaire","Le vocabulaire",[48,162,163,164,166,167,170,171,174,175,177,178,28],{},"Une ",[52,165,80],{}," regroupe un même type d'objets : ici, les recettes. Chaque ",[52,168,169],{},"ligne"," décrit une recette. Chaque ",[52,172,173],{},"colonne"," est une information : ",[25,176,94],{},", ",[25,179,97],{},[48,181,182,183,185,186,189,190,28],{},"La colonne ",[25,184,91],{}," est la ",[52,187,188],{},"clé primaire"," : une valeur unique qui identifie une ligne sans ambiguïté. Deux recettes peuvent avoir le même titre, jamais le même ",[25,191,91],{},[193,194,195],"note",{},[48,196,197],{},"Pour suivre les exemples, tu as besoin d'un PostgreSQL à ta disposition, par exemple l'éditeur SQL d'un projet Supabase. Le cours 03 explique comment créer toi-même les tables. Pour l'instant, prends-les comme déjà remplies.",[10,199,201],{"id":200},"select-lire-des-données","SELECT : lire des données",[203,204,209],"pre",{"className":205,"code":206,"language":207,"meta":208,"style":208},"language-sql shiki shiki-themes github-light-default github-dark-default github-dark-default","SELECT titre, temps_minutes\nFROM recettes;\n","sql","",[25,210,211,223],{"__ignoreMap":208},[212,213,216,219],"span",{"class":214,"line":215},"line",1,[212,217,27],{"class":218},"sOnC1",[212,220,222],{"class":221},"scfrF"," titre, temps_minutes\n",[212,224,226,229],{"class":214,"line":225},2,[212,227,228],{"class":218},"FROM",[212,230,231],{"class":221}," recettes;\n",[48,233,234,235,237,238,240,241,243],{},"Cette requête demande les colonnes ",[25,236,94],{}," et ",[25,239,97],{}," de la table ",[25,242,77],{},". Elle renvoie une ligne par recette.",[48,245,246],{},"Pour obtenir toutes les colonnes, remplace la liste par une étoile :",[203,248,250],{"className":205,"code":249,"language":207,"meta":208,"style":208},"SELECT * FROM recettes;\n",[25,251,252],{"__ignoreMap":208},[212,253,254,256,259,262],{"class":214,"line":215},[212,255,27],{"class":218},[212,257,258],{"class":218}," *",[212,260,261],{"class":218}," FROM",[212,263,231],{"class":221},[48,265,266,268],{},[25,267,27],{}," ne modifie jamais rien, tu peux donc l'essayer sans risque. La requête se termine par un point-virgule.",[270,271,272],"tip",{},[48,273,274],{},"Écris les mots-clés du SQL en majuscules et les noms de tables et de colonnes en minuscules. PostgreSQL accepte les deux, mais la lecture est plus facile.",[10,276,278],{"id":277},"where-filtrer-les-lignes","WHERE : filtrer les lignes",[203,280,282],{"className":205,"code":281,"language":207,"meta":208,"style":208},"SELECT titre\nFROM recettes\nWHERE temps_minutes \u003C= 60;\n",[25,283,284,291,298],{"__ignoreMap":208},[212,285,286,288],{"class":214,"line":215},[212,287,27],{"class":218},[212,289,290],{"class":221}," titre\n",[212,292,293,295],{"class":214,"line":225},[212,294,228],{"class":218},[212,296,297],{"class":221}," recettes\n",[212,299,301,303,306,309,313],{"class":214,"line":300},3,[212,302,34],{"class":218},[212,304,305],{"class":221}," temps_minutes ",[212,307,308],{"class":218},"\u003C=",[212,310,312],{"class":311},"s5iOY"," 60",[212,314,315],{"class":221},";\n",[48,317,318,320],{},[25,319,34],{}," garde seulement les lignes qui respectent la condition. Ici : les recettes de 60 minutes ou moins.",[48,322,323],{},"Voici les comparaisons courantes :",[80,325,326,339],{},[83,327,328],{},[86,329,330,333,336],{},[89,331,332],{},"Opérateur",[89,334,335],{},"Sens",[89,337,338],{},"Exemple",[99,340,341,356,371,394],{},[86,342,343,348,351],{},[104,344,345],{},[25,346,347],{},"=",[104,349,350],{},"égal",[104,352,353],{},[25,354,355],{},"id = 3",[86,357,358,363,366],{},[104,359,360],{},[25,361,362],{},"\u003C>",[104,364,365],{},"différent",[104,367,368],{},[25,369,370],{},"id \u003C> 3",[86,372,373,386,389],{},[104,374,375,177,378,177,380,177,383],{},[25,376,377],{},"\u003C",[25,379,308],{},[25,381,382],{},">",[25,384,385],{},">=",[104,387,388],{},"comparaisons",[104,390,391],{},[25,392,393],{},"temps_minutes > 60",[86,395,396,401,404],{},[104,397,398],{},[25,399,400],{},"LIKE",[104,402,403],{},"texte qui ressemble",[104,405,406],{},[25,407,408],{},"titre LIKE 'Tarte%'",[48,410,411,412,415,416,418,419,422,423,28],{},"Le signe ",[25,413,414],{},"%"," dans un ",[25,417,400],{}," remplace n'importe quelle suite de caractères. Les valeurs de texte s'écrivent entre ",[52,420,421],{},"apostrophes"," simples : ",[25,424,425],{},"'Tarte%'",[48,427,428,429,237,432,78],{},"Combine les conditions avec ",[25,430,431],{},"AND",[25,433,434],{},"OR",[203,436,438],{"className":205,"code":437,"language":207,"meta":208,"style":208},"SELECT titre\nFROM recettes\nWHERE temps_minutes \u003C 60 AND titre LIKE '%chocolat%';\n",[25,439,440,446,452],{"__ignoreMap":208},[212,441,442,444],{"class":214,"line":215},[212,443,27],{"class":218},[212,445,290],{"class":221},[212,447,448,450],{"class":214,"line":225},[212,449,228],{"class":218},[212,451,297],{"class":221},[212,453,454,456,458,460,462,465,468,470,474],{"class":214,"line":300},[212,455,34],{"class":218},[212,457,305],{"class":221},[212,459,377],{"class":218},[212,461,312],{"class":311},[212,463,464],{"class":218}," AND",[212,466,467],{"class":221}," titre ",[212,469,400],{"class":218},[212,471,473],{"class":472},"shWOn"," '%chocolat%'",[212,475,315],{"class":221},[10,477,479],{"id":478},"order-by-et-limit","ORDER BY et LIMIT",[48,481,482],{},"Sans consigne, PostgreSQL ne garantit aucun ordre. Pour trier :",[203,484,486],{"className":205,"code":485,"language":207,"meta":208,"style":208},"SELECT titre, temps_minutes\nFROM recettes\nORDER BY temps_minutes DESC;\n",[25,487,488,494,500],{"__ignoreMap":208},[212,489,490,492],{"class":214,"line":215},[212,491,27],{"class":218},[212,493,222],{"class":221},[212,495,496,498],{"class":214,"line":225},[212,497,228],{"class":218},[212,499,297],{"class":221},[212,501,502,504,506,509],{"class":214,"line":300},[212,503,38],{"class":218},[212,505,305],{"class":221},[212,507,508],{"class":218},"DESC",[212,510,315],{"class":221},[48,512,513,516,517,519],{},[25,514,515],{},"ASC"," trie du plus petit au plus grand (c'est l'ordre par défaut). ",[25,518,508],{}," trie du plus grand au plus petit.",[48,521,522,523,78],{},"Pour garder seulement les premières lignes, ajoute ",[25,524,42],{},[203,526,528],{"className":205,"code":527,"language":207,"meta":208,"style":208},"SELECT titre\nFROM recettes\nORDER BY temps_minutes\nLIMIT 3;\n",[25,529,530,536,542,549],{"__ignoreMap":208},[212,531,532,534],{"class":214,"line":215},[212,533,27],{"class":218},[212,535,290],{"class":221},[212,537,538,540],{"class":214,"line":225},[212,539,228],{"class":218},[212,541,297],{"class":221},[212,543,544,546],{"class":214,"line":300},[212,545,38],{"class":218},[212,547,548],{"class":221}," temps_minutes\n",[212,550,552,554,557],{"class":214,"line":551},4,[212,553,42],{"class":218},[212,555,556],{"class":311}," 3",[212,558,315],{"class":221},[48,560,561],{},"Tu obtiens les trois recettes les plus rapides. Le résultat serait : Mousse au chocolat, Velouté de potimarron, Tarte aux pommes.",[10,563,565],{"id":564},"null-labsence-de-valeur","NULL : l'absence de valeur",[48,567,568,569,572,573,575,576,78],{},"Parfois une information est inconnue. SQL la note ",[52,570,571],{},"NULL",", qui n'est ni zéro ni un texte vide. On ne la teste pas avec ",[25,574,347],{}," mais avec ",[25,577,578],{},"IS NULL",[203,580,582],{"className":205,"code":581,"language":207,"meta":208,"style":208},"SELECT titre FROM recettes WHERE temps_minutes IS NULL;\n",[25,583,584],{"__ignoreMap":208},[212,585,586,588,590,592,595,597,599,602,605],{"class":214,"line":215},[212,587,27],{"class":218},[212,589,467],{"class":221},[212,591,228],{"class":218},[212,593,594],{"class":221}," recettes ",[212,596,34],{"class":218},[212,598,305],{"class":221},[212,600,601],{"class":218},"IS",[212,603,604],{"class":218}," NULL",[212,606,315],{"class":221},[48,608,609],{},"Cette requête liste les recettes dont la durée n'est pas renseignée.",[10,611,613],{"id":612},"à-retenir","À retenir",[15,615,616,619,622,628,639],{},[18,617,618],{},"Une base relationnelle range les données dans des tables, faites de lignes et de colonnes.",[18,620,621],{},"La clé primaire identifie chaque ligne de façon unique.",[18,623,624,627],{},[25,625,626],{},"SELECT colonnes FROM table"," lit les données sans rien modifier.",[18,629,630,632,633,635,636,638],{},[25,631,34],{}," filtre, ",[25,634,38],{}," trie, ",[25,637,42],{}," garde les premières lignes.",[18,640,641,642,28],{},"Le texte s'écrit entre apostrophes simples, et l'absence de valeur se teste avec ",[25,643,578],{},[645,646,647],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}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 .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}",{"title":208,"searchDepth":225,"depth":300,"links":649},[650,651,652,653,654,655,656,657],{"id":12,"depth":225,"text":13},{"id":45,"depth":225,"text":46},{"id":159,"depth":225,"text":160},{"id":200,"depth":225,"text":201},{"id":277,"depth":225,"text":278},{"id":478,"depth":225,"text":479},{"id":564,"depth":225,"text":565},{"id":612,"depth":225,"text":613},"Comprendre les tables, les lignes, les colonnes et la clé primaire, puis lire des données avec SELECT, WHERE, ORDER BY et LIMIT.","md",{},[662,80,169,173,188,27,34,38,42,70],"base relationnelle",true,"debutant","\u002Fsql\u002Fbase-relationnelle",null,[668,672],{"nom":669,"url":670,"type":671},"Documentation PostgreSQL en français, chapitre « Le langage SQL »","https:\u002F\u002Fdocs.postgresql.fr\u002Fcurrent\u002Ftutorial-sql.html","doc",{"nom":673,"url":674,"type":675},"SQL.sh, cours et tutoriels sur le langage SQL","https:\u002F\u002Fsql.sh\u002F","cours",{"title":5,"description":658},[678,679],{"nom":669,"url":670},{"nom":680,"url":681},"Documentation PostgreSQL (en anglais)","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002Ftutorial-sql.html","sql\u002F01.base-relationnelle","STr4HVq8W35UBFiE_N4MMMXczVHQoywlVGG58XQ2r4k",[685,686,690,694,698,702,706],{"path":665,"title":5,"stem":682},{"path":687,"title":688,"stem":689},"\u002Fsql\u002Fmodifier-les-donnees","Ajouter, modifier et supprimer des lignes","sql\u002F02.modifier-les-donnees",{"path":691,"title":692,"stem":693},"\u002Fsql\u002Fcreer-des-tables","Créer des tables","sql\u002F03.creer-des-tables",{"path":695,"title":696,"stem":697},"\u002Fsql\u002Fjointures","Les jointures","sql\u002F04.jointures",{"path":699,"title":700,"stem":701},"\u002Fsql\u002Fagregats-et-index","Agrégats et index","sql\u002F05.agregats-et-index",{"path":703,"title":704,"stem":705},"\u002Fsql\u002Ftransactions-et-injection","Transactions et injection SQL","sql\u002F06.transactions-et-injection",{"path":707,"title":58,"stem":708},"\u002Fsql","sql\u002Findex",[710,712],{"title":58,"path":707,"stem":708,"description":711,"children":-1},"Le mémo de SQL avec PostgreSQL : lire, écrire, créer des tables, joindre, agréger, indexer, transactions et requêtes paramétrées.",{"title":688,"path":687,"stem":689,"description":713,"children":-1},"Écrire dans une base avec INSERT, UPDATE et DELETE, et comprendre pourquoi oublier le WHERE peut tout effacer.",[],[716,717,718,719,721,722,724],{"path":665,"title":5,"niveau":664,"stem":682},{"path":687,"title":688,"niveau":664,"stem":689},{"path":691,"title":692,"niveau":664,"stem":693},{"path":695,"title":696,"niveau":720,"stem":697},"intermediaire",{"path":699,"title":700,"niveau":720,"stem":701},{"path":703,"title":704,"niveau":723,"stem":705},"avance",{"path":707,"title":58,"niveau":725,"stem":708},"memo",1794583462664]