# Lektion 15 — Forberedelse

I lektion 13 bor patientlisten i serverens hukommelse. Det, I POST'er,
forsvinder, når programmet stopper. En tabel bor i databasen — et andet
program, på en anden maskine — som gemmer den. Forberedelsen er, hvad en
tabel er, at du selv har skrevet `SELECT`, `WHERE` og `INSERT`, og at du har
en database klar i Neon. I timen samler vi op og skriver i jeres egen
PostgreSQL. Routen kalder databasen i lektion 17.

Forberedelsen er ca. 75 minutter.

## 1. Tabel, SQL og nøgler (~40 min)

En relationel database gemmer rækker i tabeller. SQL er de sætninger, der
opretter tabellen og lægger rækker i den.

**[Relational Databases](https://www.freecodecamp.org/learn/relational-databases-v9/)**

Kapitel **Relational Databases**, modulet **SQL and PostgreSQL**. Lav disse
lectures:

1. [What Are Relational Databases, and How Do They Differ from Non-Relational Databases?](https://www.freecodecamp.org/learn/relational-databases-v9/lecture-working-with-relational-databases/what-are-relational-databases-and-how-do-they-differ-from-non-relational-databases)
2. [What Is SQL, and How Can You Create a Database with Tables?](https://www.freecodecamp.org/learn/relational-databases-v9/lecture-working-with-relational-databases/what-is-sql-and-how-can-you-create-a-database-with-tables)
3. [What Are the Basic Data Types in SQL?](https://www.freecodecamp.org/learn/relational-databases-v9/lecture-working-with-relational-databases/what-are-the-basic-data-types-in-sql)
4. [How Do You Insert and View Data in a Table?](https://www.freecodecamp.org/learn/relational-databases-v9/lecture-working-with-relational-databases/how-do-you-insert-and-view-data-in-a-table)
5. [What Are Primary and Foreign Keys in SQL, and How Do They Work?](https://www.freecodecamp.org/learn/relational-databases-v9/lecture-working-with-relational-databases/what-are-primary-and-foreign-keys-in-sql-and-how-do-they-work)

Fokusér på, at en tabel har kolonner og rækker, og at en række er én
patient, ét produkt eller én film. `CREATE TABLE` navngiver kolonnerne og
deres type. `INSERT INTO` med kolonnenavne lægger en række i. `SELECT` henter
rækker, og `WHERE` vælger hvilke. En primærnøgle udpeger én række. En
fremmednøgle peger på primærnøglen i en anden tabel.

`VARCHAR` og `INTEGER` er typer, du skal kunne genkende. `SERIAL` er
PostgreSQL's måde at nummerere primærnøglen på. Den taster du i timen.

Spring lecturen om at installere Postgres over. Spring **relationstyper** og
**joins** over. Modulet **SQL and Bash** (normalisering, SQL injection, N+1)
og værkstedet **Build a Database of Video Game Characters** er ikke
forberedelse.

## 2. Skriv `SELECT`, `WHERE` og `INSERT` (~25 min)

**[SQLBolt](https://sqlbolt.com/)**

Lav disse lektioner. De kører i browseren. Tabellen hedder `movies`: én række
pr. film, kolonner for titel, år og instruktør. Det er samme form som
patientlisten, bare med andre kolonner.

1. [SELECT queries 101](https://sqlbolt.com/lesson/select_queries_introduction)
2. [Queries with constraints (Pt. 1)](https://sqlbolt.com/lesson/select_queries_with_constraints)
3. [Inserting rows](https://sqlbolt.com/lesson/inserting_rows)

Lektion 3 til 12 er filtre, joins og aggregater. Spring dem over via menuen,
og gå til lektion 13. Løsningen ligger bag et link, hvis du sidder fast. Brug
den først, når du har prøvet selv.

## 3. Din database i Neon (~10 min)

[Neon](https://neon.com) kører PostgreSQL på en server for dig. Du skriver SQL
i en editor i browseren. Databasen kører hos Neon, ikke på din bærbare.

1. Åbn [https://neon.com](https://neon.com) og vælg **Sign up**.
   ![Neons forside med Log in og Sign up](screenshots/01-neon-forside.png)
2. Vælg **GitHub** under *Create your free account*.
   ![Create your free account: Google, GitHub eller Microsoft](screenshots/02-sign-up-github.png)
3. Godkend at Neon må læse din e-mail fra GitHub: **Authorize neondatabase**.
   ![GitHub spørger om du vil godkende Neon Console](screenshots/03-authorize.png)
4. Du lander på **Projects** i din egen organisation. Den er tom. Tryk
   **Create project**.
   ![Projects-siden: You currently have no projects, med Create project](screenshots/04-projects.png)
5. På **Create project**:
   - **Project name**: `lektion15`. Billedet viser et andet navn.
   - **Region**: skift fra *AWS US East 2 (Ohio)* til **AWS Europe
     Central 1 (Frankfurt)**. Regionen kan ikke ændres bagefter.
   - **Services**: lad kun **Postgres database** være slået til. Resten
     bruger vi ikke.
   - Tryk **Create project** nederst til højre.
   ![Create project med navn, region Frankfurt og kun Postgres database slået til](screenshots/05-create-project.png)
6. Projektet er oprettet. Spring **Agent prompt** over — I skriver selv
   forbindelsen til databasen i lektion 17. Tryk **Go to project**.
   ![Your new project was created, med Agent prompt og Go to project](screenshots/06-project-created.png)
7. Du lander på **Branch overview**. Øverst til venstre står projektet og
   branchen **production**. Det er jeres database — branches bruger vi ikke.
   Tryk **Postgres database** i menuen til venstre.
   ![Branch overview for production, med Postgres database i menuen](screenshots/07-branch-overview.png)
8. Menuen folder ud med **Tables**, **SQL Editor**, **Backup & Restore** og
   **Computes**. Tryk **SQL Editor**.
   ![Postgres database foldet ud, med SQL Editor under Tables](screenshots/08-menu-sql-editor.png)
9. SQL-editoren åbner med Neons eksempel, der opretter tabellen
   `playing_with_neon`. Kør det **ikke**. Markér alt (Ctrl+A, på Mac Cmd+A),
   og slet det. Tjek øverst til højre, at databasen er **neondb**.
   ![SQL Editor med eksempelkode, Run-knappen og neondb øverst til højre](screenshots/09-sql-editor.png)
10. Skriv `SELECT 1;` og tryk **Run**. Under knappen står **Connected**, og
    svaret er en tabel med én række og værdien `1`. Sætningen kommer også i
    **History** til venstre.
    ![SELECT 1 kørt: Connected, 1 row og værdien 1](screenshots/10-select-1.png)

Det er din egen database til øvelserne. Gruppens fælles database opretter I i
timen.

**Hvis du sidder fast:** Er **New project** gråt, og står der *To create a
new project, use the Neon Postgres integration in Vercel*, så er du i en
organisation, Vercel styrer. Det sker, hvis din Neon-konto er oprettet via
Vercel. Klik på organisationsnavnet øverst til højre, vælg **Create
organization** → **Free**, og opret projektet dér.

## Når du er færdig

Du skal kunne forklare:

- at en tabel er kolonner og rækker, og at én række er én ting (en patient, en
  film)
- at `SELECT` henter rækker, `WHERE` filtrerer dem, og `INSERT INTO` lægger en
  ny række i
- at en primærnøgle udpeger én række, og at en fremmednøgle peger på en
  primærnøgle i en anden tabel
- at listen i `server.js` stadig bor i serverens hukommelse. Den er endnu
  ikke en tabel

Og du skal have løst de tre SQLBolt-lektioner og kørt `SELECT 1;` i Neon.

`CREATE TABLE` på en patienttabel, `UPDATE` og `DELETE` tager vi i timen. At
en Express-route kalder databasen, er lektion 17.

## Praktisk

- freeCodeCamp kræver login (gratis), hvis du vil gemme din fremgang.
- SQLBolt kræver ingen konto.
- Neon kræver en konto (gratis). Log ind med GitHub. Der skal ikke
  installeres noget.
- `server.js` skal blive stående, som den er fra lektion 13.
- SQLBolt kører SQLite. `SELECT`, `WHERE` og `INSERT` er de samme sætninger,
  som du skriver i PostgreSQL.
