[{"data":1,"prerenderedAt":951},["ShallowReactive",2],{"page-\u002Fsql":3,"pieces-sql":922,"autour-\u002Fsql":936,"prerequis-\u002Fsql":939,"plan-sql":940},{"id":4,"title":5,"body":6,"description":899,"extension":900,"ligne":23,"meta":901,"motsCles":902,"navigation":718,"niveau":909,"path":910,"prerequis":911,"ressources":911,"seo":912,"sources":913,"stem":920,"__hash__":921},"docs\u002Fsql\u002Findex.md","SQL",{"type":7,"value":8,"toc":891},"minimark",[9,13,18,102,161,170,174,258,279,283,384,458,463,467,542,590,596,600,737,779,794,798,847,873,887],[10,11,12],"p",{},"Ce mémo résume le SQL de PostgreSQL, avec le fil rouge des recettes. Chaque section renvoie au chapitre qui l'explique en détail.",[14,15,17],"h2",{"id":16},"lire-des-données","Lire des données",[19,20,25],"pre",{"className":21,"code":22,"language":23,"meta":24,"style":24},"language-sql shiki shiki-themes github-light-default github-dark-default github-dark-default","SELECT titre, temps_minutes\nFROM recettes\nWHERE temps_minutes \u003C= 60 AND titre LIKE 'T%'\nORDER BY temps_minutes DESC\nLIMIT 10;\n","sql","",[26,27,28,41,50,79,90],"code",{"__ignoreMap":24},[29,30,33,37],"span",{"class":31,"line":32},"line",1,[29,34,36],{"class":35},"sOnC1","SELECT",[29,38,40],{"class":39},"scfrF"," titre, temps_minutes\n",[29,42,44,47],{"class":31,"line":43},2,[29,45,46],{"class":35},"FROM",[29,48,49],{"class":39}," recettes\n",[29,51,53,56,59,62,66,69,72,75],{"class":31,"line":52},3,[29,54,55],{"class":35},"WHERE",[29,57,58],{"class":39}," temps_minutes ",[29,60,61],{"class":35},"\u003C=",[29,63,65],{"class":64},"s5iOY"," 60",[29,67,68],{"class":35}," AND",[29,70,71],{"class":39}," titre ",[29,73,74],{"class":35},"LIKE",[29,76,78],{"class":77},"shWOn"," 'T%'\n",[29,80,82,85,87],{"class":31,"line":81},4,[29,83,84],{"class":35},"ORDER BY",[29,86,58],{"class":39},[29,88,89],{"class":35},"DESC\n",[29,91,93,96,99],{"class":31,"line":92},5,[29,94,95],{"class":35},"LIMIT",[29,97,98],{"class":64}," 10",[29,100,101],{"class":39},";\n",[103,104,105,118],"table",{},[106,107,108],"thead",{},[109,110,111,115],"tr",{},[112,113,114],"th",{},"Clause",[112,116,117],{},"Rôle",[119,120,121,131,141,151],"tbody",{},[109,122,123,128],{},[124,125,126],"td",{},[26,127,55],{},[124,129,130],{},"filtre les lignes",[109,132,133,138],{},[124,134,135],{},[26,136,137],{},"ORDER BY ... ASC\u002FDESC",[124,139,140],{},"trie",[109,142,143,148],{},[124,144,145],{},[26,146,147],{},"LIMIT n",[124,149,150],{},"garde les n premières lignes",[109,152,153,158],{},[124,154,155],{},[26,156,157],{},"IS NULL",[124,159,160],{},"teste l'absence de valeur",[10,162,163,164,169],{},"Détails : ",[165,166,168],"a",{"href":167},"\u002Fsql\u002Fbase-relationnelle","La base relationnelle et SELECT",".",[14,171,173],{"id":172},"écrire-des-données","Écrire des données",[19,175,177],{"className":21,"code":176,"language":23,"meta":24,"style":24},"INSERT INTO recettes (titre, temps_minutes) VALUES ('Crêpes', 30) RETURNING id;\nUPDATE recettes SET temps_minutes = 50 WHERE id = 4;\nDELETE FROM recettes WHERE id = 5;\n",[26,178,179,205,237],{"__ignoreMap":24},[29,180,181,184,187,190,193,196,199,202],{"class":31,"line":32},[29,182,183],{"class":35},"INSERT INTO",[29,185,186],{"class":39}," recettes (titre, temps_minutes) ",[29,188,189],{"class":35},"VALUES",[29,191,192],{"class":39}," (",[29,194,195],{"class":77},"'Crêpes'",[29,197,198],{"class":39},", ",[29,200,201],{"class":64},"30",[29,203,204],{"class":39},") RETURNING id;\n",[29,206,207,210,213,216,218,221,224,227,230,232,235],{"class":31,"line":43},[29,208,209],{"class":35},"UPDATE",[29,211,212],{"class":39}," recettes ",[29,214,215],{"class":35},"SET",[29,217,58],{"class":39},[29,219,220],{"class":35},"=",[29,222,223],{"class":64}," 50",[29,225,226],{"class":35}," WHERE",[29,228,229],{"class":39}," id ",[29,231,220],{"class":35},[29,233,234],{"class":64}," 4",[29,236,101],{"class":39},[29,238,239,242,245,247,249,251,253,256],{"class":31,"line":52},[29,240,241],{"class":35},"DELETE",[29,243,244],{"class":35}," FROM",[29,246,212],{"class":39},[29,248,55],{"class":35},[29,250,229],{"class":39},[29,252,220],{"class":35},[29,254,255],{"class":64}," 5",[29,257,101],{"class":39},[10,259,260,262,263,265,266,268,269,271,272,274,275,169],{},[26,261,209],{}," et ",[26,264,241],{}," sans ",[26,267,55],{}," touchent toute la table. Teste le ",[26,270,55],{}," avec un ",[26,273,36],{}," d'abord. Détails : ",[165,276,278],{"href":277},"\u002Fsql\u002Fmodifier-les-donnees","Ajouter, modifier et supprimer des lignes",[14,280,282],{"id":281},"créer-des-tables","Créer des tables",[19,284,286],{"className":21,"code":285,"language":23,"meta":24,"style":24},"CREATE TABLE recettes (\n  id            bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,\n  titre         text NOT NULL,\n  temps_minutes integer CHECK (temps_minutes > 0),\n  categorie_id  bigint REFERENCES categories (id)\n);\n",[26,287,288,303,329,342,365,378],{"__ignoreMap":24},[29,289,290,293,296,300],{"class":31,"line":32},[29,291,292],{"class":35},"CREATE",[29,294,295],{"class":35}," TABLE",[29,297,299],{"class":298},"syCW7"," recettes",[29,301,302],{"class":39}," (\n",[29,304,305,308,311,314,317,320,323,326],{"class":31,"line":43},[29,306,307],{"class":39},"  id            ",[29,309,310],{"class":35},"bigint",[29,312,313],{"class":35}," GENERATED",[29,315,316],{"class":35}," ALWAYS",[29,318,319],{"class":35}," AS",[29,321,322],{"class":35}," IDENTITY",[29,324,325],{"class":35}," PRIMARY KEY",[29,327,328],{"class":39},",\n",[29,330,331,334,337,340],{"class":31,"line":52},[29,332,333],{"class":39},"  titre         ",[29,335,336],{"class":35},"text",[29,338,339],{"class":35}," NOT NULL",[29,341,328],{"class":39},[29,343,344,347,350,353,356,359,362],{"class":31,"line":81},[29,345,346],{"class":39},"  temps_minutes ",[29,348,349],{"class":35},"integer",[29,351,352],{"class":35}," CHECK",[29,354,355],{"class":39}," (temps_minutes ",[29,357,358],{"class":35},">",[29,360,361],{"class":64}," 0",[29,363,364],{"class":39},"),\n",[29,366,367,370,372,375],{"class":31,"line":92},[29,368,369],{"class":39},"  categorie_id  ",[29,371,310],{"class":35},[29,373,374],{"class":35}," REFERENCES",[29,376,377],{"class":39}," categories (id)\n",[29,379,381],{"class":31,"line":380},6,[29,382,383],{"class":39},");\n",[103,385,386,396],{},[106,387,388],{},[109,389,390,393],{},[112,391,392],{},"Contrainte",[112,394,395],{},"Règle",[119,397,398,408,418,428,438,448],{},[109,399,400,405],{},[124,401,402],{},[26,403,404],{},"PRIMARY KEY",[124,406,407],{},"identifie la ligne",[109,409,410,415],{},[124,411,412],{},[26,413,414],{},"NOT NULL",[124,416,417],{},"valeur obligatoire",[109,419,420,425],{},[124,421,422],{},[26,423,424],{},"UNIQUE",[124,426,427],{},"pas de doublon",[109,429,430,435],{},[124,431,432],{},[26,433,434],{},"CHECK (...)",[124,436,437],{},"condition sur la valeur",[109,439,440,445],{},[124,441,442],{},[26,443,444],{},"REFERENCES t (col)",[124,446,447],{},"clé étrangère",[109,449,450,455],{},[124,451,452],{},[26,453,454],{},"DEFAULT v",[124,456,457],{},"valeur par défaut",[10,459,163,460,169],{},[165,461,282],{"href":462},"\u002Fsql\u002Fcreer-des-tables",[14,464,466],{"id":465},"jointures","Jointures",[19,468,470],{"className":21,"code":469,"language":23,"meta":24,"style":24},"SELECT r.titre, c.nom\nFROM recettes AS r\nJOIN categories AS c ON c.id = r.categorie_id;\n",[26,471,472,494,506],{"__ignoreMap":24},[29,473,474,476,479,481,484,486,489,491],{"class":31,"line":32},[29,475,36],{"class":35},[29,477,478],{"class":64}," r",[29,480,169],{"class":39},[29,482,483],{"class":64},"titre",[29,485,198],{"class":39},[29,487,488],{"class":64},"c",[29,490,169],{"class":39},[29,492,493],{"class":64},"nom\n",[29,495,496,498,500,503],{"class":31,"line":43},[29,497,46],{"class":35},[29,499,212],{"class":39},[29,501,502],{"class":35},"AS",[29,504,505],{"class":39}," r\n",[29,507,508,511,514,516,519,522,525,527,530,533,535,537,540],{"class":31,"line":52},[29,509,510],{"class":35},"JOIN",[29,512,513],{"class":39}," categories ",[29,515,502],{"class":35},[29,517,518],{"class":39}," c ",[29,520,521],{"class":35},"ON",[29,523,524],{"class":64}," c",[29,526,169],{"class":39},[29,528,529],{"class":64},"id",[29,531,532],{"class":35}," =",[29,534,478],{"class":64},[29,536,169],{"class":39},[29,538,539],{"class":64},"categorie_id",[29,541,101],{"class":39},[103,543,544,554],{},[106,545,546],{},[109,547,548,551],{},[112,549,550],{},"Jointure",[112,552,553],{},"Lignes gardées",[119,555,556,570,580],{},[109,557,558,567],{},[124,559,560,563,564,566],{},[26,561,562],{},"INNER JOIN"," (ou ",[26,565,510],{},")",[124,568,569],{},"correspondance des deux côtés",[109,571,572,577],{},[124,573,574],{},[26,575,576],{},"LEFT JOIN",[124,578,579],{},"toute la table de gauche",[109,581,582,587],{},[124,583,584],{},[26,585,586],{},"RIGHT JOIN",[124,588,589],{},"toute la table de droite",[10,591,163,592,169],{},[165,593,595],{"href":594},"\u002Fsql\u002Fjointures","Les jointures",[14,597,599],{"id":598},"agrégats-et-index","Agrégats et index",[19,601,603],{"className":21,"code":602,"language":23,"meta":24,"style":24},"SELECT c.nom, COUNT(r.id) AS nb\nFROM categories AS c\nLEFT JOIN recettes AS r ON r.categorie_id = c.id\nGROUP BY c.nom\nHAVING COUNT(r.id) > 1;\n\nCREATE INDEX idx_recettes_titre ON recettes (titre);\n",[26,604,605,639,650,678,689,714,720],{"__ignoreMap":24},[29,606,607,609,611,613,616,618,621,624,627,629,631,634,636],{"class":31,"line":32},[29,608,36],{"class":35},[29,610,524],{"class":64},[29,612,169],{"class":39},[29,614,615],{"class":64},"nom",[29,617,198],{"class":39},[29,619,620],{"class":64},"COUNT",[29,622,623],{"class":39},"(",[29,625,626],{"class":64},"r",[29,628,169],{"class":39},[29,630,529],{"class":64},[29,632,633],{"class":39},") ",[29,635,502],{"class":35},[29,637,638],{"class":39}," nb\n",[29,640,641,643,645,647],{"class":31,"line":43},[29,642,46],{"class":35},[29,644,513],{"class":39},[29,646,502],{"class":35},[29,648,649],{"class":39}," c\n",[29,651,652,654,656,658,661,663,665,667,669,671,673,675],{"class":31,"line":52},[29,653,576],{"class":35},[29,655,212],{"class":39},[29,657,502],{"class":35},[29,659,660],{"class":39}," r ",[29,662,521],{"class":35},[29,664,478],{"class":64},[29,666,169],{"class":39},[29,668,539],{"class":64},[29,670,532],{"class":35},[29,672,524],{"class":64},[29,674,169],{"class":39},[29,676,677],{"class":64},"id\n",[29,679,680,683,685,687],{"class":31,"line":81},[29,681,682],{"class":35},"GROUP BY",[29,684,524],{"class":64},[29,686,169],{"class":39},[29,688,493],{"class":64},[29,690,691,694,697,699,701,703,705,707,709,712],{"class":31,"line":92},[29,692,693],{"class":35},"HAVING",[29,695,696],{"class":64}," COUNT",[29,698,623],{"class":39},[29,700,626],{"class":64},[29,702,169],{"class":39},[29,704,529],{"class":64},[29,706,633],{"class":39},[29,708,358],{"class":35},[29,710,711],{"class":64}," 1",[29,713,101],{"class":39},[29,715,716],{"class":31,"line":380},[29,717,719],{"emptyLinePlaceholder":718},true,"\n",[29,721,723,725,728,731,734],{"class":31,"line":722},7,[29,724,292],{"class":35},[29,726,727],{"class":35}," INDEX",[29,729,730],{"class":298}," idx_recettes_titre",[29,732,733],{"class":35}," ON",[29,735,736],{"class":39}," recettes (titre);\n",[103,738,739,749],{},[106,740,741],{},[109,742,743,746],{},[112,744,745],{},"Fonction",[112,747,748],{},"Calcule",[119,750,751,766],{},[109,752,753,763],{},[124,754,755,198,757,198,760],{},[26,756,620],{},[26,758,759],{},"SUM",[26,761,762],{},"AVG",[124,764,765],{},"nombre, somme, moyenne",[109,767,768,776],{},[124,769,770,198,773],{},[26,771,772],{},"MIN",[26,774,775],{},"MAX",[124,777,778],{},"plus petit, plus grand",[10,780,781,783,784,786,787,790,791,169],{},[26,782,55],{}," filtre les lignes, ",[26,785,693],{}," filtre les groupes. ",[26,788,789],{},"EXPLAIN"," montre le plan d'exécution. Détails : ",[165,792,599],{"href":793},"\u002Fsql\u002Fagregats-et-index",[14,795,797],{"id":796},"transactions-et-paramètres","Transactions et paramètres",[19,799,801],{"className":21,"code":800,"language":23,"meta":24,"style":24},"BEGIN;\nUPDATE recettes SET temps_minutes = 40 WHERE id = 1;\nCOMMIT;   -- ou ROLLBACK; pour annuler\n",[26,802,803,810,835],{"__ignoreMap":24},[29,804,805,808],{"class":31,"line":32},[29,806,807],{"class":35},"BEGIN",[29,809,101],{"class":39},[29,811,812,814,816,818,820,822,825,827,829,831,833],{"class":31,"line":43},[29,813,209],{"class":35},[29,815,212],{"class":39},[29,817,215],{"class":35},[29,819,58],{"class":39},[29,821,220],{"class":35},[29,823,824],{"class":64}," 40",[29,826,226],{"class":35},[29,828,229],{"class":39},[29,830,220],{"class":35},[29,832,711],{"class":64},[29,834,101],{"class":39},[29,836,837,840,843],{"class":31,"line":52},[29,838,839],{"class":35},"COMMIT",[29,841,842],{"class":39},";   ",[29,844,846],{"class":845},"sd6ml","-- ou ROLLBACK; pour annuler\n",[19,848,852],{"className":849,"code":850,"language":851,"meta":24,"style":24},"language-ts shiki shiki-themes github-light-default github-dark-default github-dark-default","await client.query('SELECT * FROM recettes WHERE titre = $1', [titre])\n","ts",[26,853,854],{"__ignoreMap":24},[29,855,856,859,862,865,867,870],{"class":31,"line":32},[29,857,858],{"class":35},"await",[29,860,861],{"class":39}," client.",[29,863,864],{"class":298},"query",[29,866,623],{"class":39},[29,868,869],{"class":77},"'SELECT * FROM recettes WHERE titre = $1'",[29,871,872],{"class":39},", [titre])\n",[10,874,875,876,198,879,882,883,169],{},"Ne colle jamais du texte d'utilisateur dans une requête : passe-le en paramètre (",[26,877,878],{},"$1",[26,880,881],{},"$2","). Détails : ",[165,884,886],{"href":885},"\u002Fsql\u002Ftransactions-et-injection","Transactions et injection SQL",[888,889,890],"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 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}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 .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}",{"title":24,"searchDepth":43,"depth":52,"links":892},[893,894,895,896,897,898],{"id":16,"depth":43,"text":17},{"id":172,"depth":43,"text":173},{"id":281,"depth":43,"text":282},{"id":465,"depth":43,"text":466},{"id":598,"depth":43,"text":599},{"id":796,"depth":43,"text":797},"Le mémo de SQL avec PostgreSQL : lire, écrire, créer des tables, joindre, agréger, indexer, transactions et requêtes paramétrées.","md",{},[903,904,5,905,36,510,682,906,907,908],"mémo","aide-mémoire","PostgreSQL","INSERT","CREATE TABLE","transaction","memo","\u002Fsql",null,{"title":5,"description":899},[914,917],{"nom":915,"url":916},"Documentation PostgreSQL en français","https:\u002F\u002Fdocs.postgresql.fr\u002Fcurrent\u002F",{"nom":918,"url":919},"Documentation PostgreSQL (en anglais)","https:\u002F\u002Fwww.postgresql.org\u002Fdocs\u002Fcurrent\u002F","sql\u002Findex","VdMVR7p1WGNhjzZ1YSFYuFOYog0hmb863DyxEkaDdSU",[923,925,927,929,931,933,935],{"path":167,"title":168,"stem":924},"sql\u002F01.base-relationnelle",{"path":277,"title":278,"stem":926},"sql\u002F02.modifier-les-donnees",{"path":462,"title":282,"stem":928},"sql\u002F03.creer-des-tables",{"path":594,"title":595,"stem":930},"sql\u002F04.jointures",{"path":793,"title":599,"stem":932},"sql\u002F05.agregats-et-index",{"path":885,"title":886,"stem":934},"sql\u002F06.transactions-et-injection",{"path":910,"title":5,"stem":920},[911,937],{"title":168,"path":167,"stem":924,"description":938,"children":-1},"Comprendre les tables, les lignes, les colonnes et la clé primaire, puis lire des données avec SELECT, WHERE, ORDER BY et LIMIT.",[],[941,943,944,945,947,948,950],{"path":167,"title":168,"niveau":942,"stem":924},"debutant",{"path":277,"title":278,"niveau":942,"stem":926},{"path":462,"title":282,"niveau":942,"stem":928},{"path":594,"title":595,"niveau":946,"stem":930},"intermediaire",{"path":793,"title":599,"niveau":946,"stem":932},{"path":885,"title":886,"niveau":949,"stem":934},"avance",{"path":910,"title":5,"niveau":909,"stem":920},1794583432506]