Lær SELECT, INSERT, UPDATE og DELETE for å arbeide med data i en database.
SQL – grunnleggende spørringer
Nå som du forstår hvordan databaser og tabeller er strukturert, er det på tide å lære selve språket vi bruker for å kommunisere med databasen: SQL (Structured Query Language). SQL uttales enten «ess-kju-ell» eller «sequel», og begge uttalene er aksepterte.
SQL er et deklarativt språk, noe som betyr at du beskriver hva du vil ha, ikke hvordan datamaskinen skal gjøre det. Når du skriver SELECT fornavn FROM elever WHERE klasse = '10A', sier du til databasen: «Gi meg fornavnene til alle elever i klasse 10A.» Databasen finner selv ut den mest effektive måten å hente ut dataene på.
I dette kapittelet skal du lære de fire grunnleggende SQL-kommandoene som tilsvarer CRUD-operasjonene:
- SELECT – Hente ut data (Read)
- INSERT INTO – Sette inn data (Create)
- UPDATE – Oppdatere data (Update)
- DELETE – Slette data (Delete)
Vi bruker skoledatabasen fra forrige kapittel som eksempel gjennom hele kapittelet.
For å følge eksemplene i dette kapittelet, la oss sette opp en database med noen testdata:
-- Opprett tabellene
CREATE TABLE klasser (
klasse_id INTEGER PRIMARY KEY AUTOINCREMENT,
klassenavn TEXT NOT NULL
);
CREATE TABLE elever (
elev_id INTEGER PRIMARY KEY AUTOINCREMENT,
fornavn TEXT NOT NULL,
etternavn TEXT NOT NULL,
fodselsdato DATE,
klasse_id INTEGER,
FOREIGN KEY (klasse_id) REFERENCES klasser(klasse_id)
);
CREATE TABLE fag (
fag_id INTEGER PRIMARY KEY AUTOINCREMENT,
fagnavn TEXT NOT NULL,
laerer TEXT
);
CREATE TABLE karakterer (
karakter_id INTEGER PRIMARY KEY AUTOINCREMENT,
elev_id INTEGER,
fag_id INTEGER,
karakter INTEGER,
termin TEXT,
FOREIGN KEY (elev_id) REFERENCES elever(elev_id),
FOREIGN KEY (fag_id) REFERENCES fag(fag_id)
);
-- Sett inn testdata
INSERT INTO klasser (klassenavn) VALUES ('10A'), ('10B'), ('10C');
INSERT INTO elever (fornavn, etternavn, fodselsdato, klasse_id) VALUES
('Emma', 'Hansen', '2008-03-15', 1),
('Oliver', 'Johansen', '2008-07-22', 1),
('Nora', 'Olsen', '2008-01-10', 2),
('Jakob', 'Larsen', '2008-11-03', 2),
('Sofie', 'Berg', '2008-05-28', 1),
('Liam', 'Dahl', '2008-09-17', 3),
('Ella', 'Nilsen', '2008-02-05', 3),
('Noah', 'Andreassen', '2008-06-30', 2);
INSERT INTO fag (fagnavn, laerer) VALUES
('Matematikk', 'Kari Nordli'),
('Norsk', 'Per Haugen'),
('Naturfag', 'Lise Vik'),
('Engelsk', 'Tom Bakke');
INSERT INTO karakterer (elev_id, fag_id, karakter, termin) VALUES
(1, 1, 5, 'H2024'), (1, 2, 4, 'H2024'), (1, 3, 5, 'H2024'),
(2, 1, 3, 'H2024'), (2, 2, 4, 'H2024'), (2, 3, 3, 'H2024'),
(3, 1, 6, 'H2024'), (3, 2, 5, 'H2024'), (3, 3, 6, 'H2024'),
(4, 1, 4, 'H2024'), (4, 2, 3, 'H2024'),
(5, 1, 5, 'H2024'), (5, 2, 5, 'H2024'), (5, 3, 4, 'H2024'),
(6, 1, 2, 'H2024'), (6, 2, 3, 'H2024'),
(7, 1, 4, 'H2024'), (7, 2, 4, 'H2024'), (7, 3, 5, 'H2024'),
(8, 1, 3, 'H2024'), (8, 2, 2, 'H2024');Du kan kjøre denne koden i DB Browser for SQLite eller en online SQL-editor for å følge med på eksemplene.
SELECT er den mest brukte SQL-kommandoen. Den brukes til å hente ut data fra en eller flere tabeller.Grunnleggende syntaks
SELECT kolonne1, kolonne2, ... FROM tabellnavn;Hente alle kolonner
Bruk * (stjerne) for å hente alle kolonner:
SELECT * FROM elever;Resultat:
| elevid | fornavn | etternavn | fodselsdato | klasseid |
|---|---|---|---|---|
| 1 | Emma | Hansen | 2008-03-15 | 1 |
| 2 | Oliver | Johansen | 2008-07-22 | 1 |
| 3 | Nora | Olsen | 2008-01-10 | 2 |
| ... | ... | ... | ... | ... |
Hente spesifikke kolonner
SELECT fornavn, etternavn FROM elever;Resultat:| fornavn | etternavn |
|---|---|
| Emma | Hansen |
| Oliver | Johansen |
| Nora | Olsen |
| ... | ... |
DISTINCT – fjerne duplikater
SELECT DISTINCT klasse_id FROM elever;Gir bare de unike verdiene: 1, 2, 3 (selv om mange elever deler samme klasse_id).
WHERE-klausulen lar deg filtrere hvilke rader som returneres. Den brukes med sammenligningsoperatorer og logiske operatorer.Sammenligningsoperatorer
| Operator | Betydning | Eksempel |
|---|---|---|
= | Lik | klasse_id = 1 |
<> eller != | Ulik | karakter <> 6 |
< | Mindre enn | karakter < 4 |
> | Større enn | karakter > 4 |
<= | Mindre enn eller lik | karakter <= 3 |
>= | Større enn eller lik | karakter >= 5 |
Eksempler
-- Alle elever i klasse 10A (klasse_id = 1)
SELECT fornavn, etternavn FROM elever WHERE klasse_id = 1;| fornavn | etternavn |
|---|---|
| Emma | Hansen |
| Oliver | Johansen |
| Sofie | Berg |
-- Alle karakterer som er 5 eller bedre
SELECT * FROM karakterer WHERE karakter >= 5;Logiske operatorer: AND, OR, NOT
-- Elever i klasse 1 født etter juli 2008
SELECT fornavn, etternavn, fodselsdato
FROM elever
WHERE klasse_id = 1 AND fodselsdato > '2008-07-01';-- Elever i klasse 1 eller klasse 2
SELECT fornavn, etternavn, klasse_id
FROM elever
WHERE klasse_id = 1 OR klasse_id = 2;-- Alle elever UTENOM klasse 1
SELECT fornavn, etternavn, klasse_id
FROM elever
WHERE NOT klasse_id = 1;LIKE – søk med jokertegn
-- Elever med etternavn som starter med 'H'
SELECT * FROM elever WHERE etternavn LIKE 'H%';
-- Elever med etternavn som inneholder 'sen'
SELECT * FROM elever WHERE etternavn LIKE '%sen%';% matcher null eller flere tegn. _ matcher nøyaktig ett tegn.IN – flere verdier
-- Elever i klasse 1 eller 3
SELECT * FROM elever WHERE klasse_id IN (1, 3);BETWEEN – verdiintervall
-- Karakterer mellom 3 og 5 (inkludert)
SELECT * FROM karakterer WHERE karakter BETWEEN 3 AND 5;ORDER BY – sortere resultater
-- Elever sortert etter etternavn (A-Å)
SELECT fornavn, etternavn FROM elever ORDER BY etternavn ASC;
-- Karakterer sortert fra høyest til lavest
SELECT * FROM karakterer ORDER BY karakter DESC;
-- Sorter etter flere kolonner
SELECT * FROM elever ORDER BY klasse_id ASC, etternavn ASC;ASC = stigende (standard), DESC = synkende.
LIMIT – begrense antall resultater
-- De tre høyeste karakterene
SELECT * FROM karakterer ORDER BY karakter DESC LIMIT 3;
-- De 5 første elevene sortert etter etternavn
SELECT fornavn, etternavn FROM elever ORDER BY etternavn LIMIT 5;Kombinere alt
-- Topp 3 karakterer i matematikk (fag_id = 1), sortert synkende
SELECT elev_id, karakter
FROM karakterer
WHERE fag_id = 1
ORDER BY karakter DESC
LIMIT 3;Resultat:
| elev_id | karakter |
|---|---|
| 3 | 6 |
| 1 | 5 |
| 5 | 5 |
En fullstendig SELECT-setning har følgende struktur (elementer i klammer er valgfrie):
SELECT [DISTINCT] kolonne1, kolonne2, ...
FROM tabellnavn
[WHERE betingelse]
[ORDER BY kolonne [ASC|DESC]]
[LIMIT antall];Rekkefølgen er viktig: SELECT kommer alltid før FROM, som kommer før WHERE, som kommer før ORDER BY, som kommer før LIMIT. Denne rekkefølgen må alltid følges. Databasen behandler derimot setningen i en annen rekkefølge: FROM (finn tabellen), deretter WHERE (filtrer rader), deretter SELECT (velg kolonner), deretter ORDER BY (sorter), og til slutt LIMIT (begrens).
INSERT INTO brukes for å legge til nye rader i en tabell.Sette inn én rad
INSERT INTO elever (fornavn, etternavn, fodselsdato, klasse_id)
VALUES ('Maja', 'Strand', '2008-04-12', 1);Legg merke til at vi ikke oppgir elev_id – den fylles automatisk fordi den er definert som AUTOINCREMENT.
Sette inn flere rader
INSERT INTO elever (fornavn, etternavn, fodselsdato, klasse_id) VALUES
('Aksel', 'Moe', '2008-08-20', 2),
('Ingrid', 'Lund', '2008-12-01', 3),
('Henrik', 'Aasen', '2008-10-15', 1);Sette inn i alle kolonner
Hvis du oppgir verdier for alle kolonner (inkludert primærnøkkel), kan du utelate kolonnenavnene:
INSERT INTO fag VALUES (5, 'Samfunnsfag', 'Anne Holm');Men det er anbefalt å alltid skrive kolonnenavnene eksplisitt. Da er koden lettere å lese, og den fortsetter å fungere selv om tabellstrukturen endres.
UPDATE brukes for å endre eksisterende data i en tabell.Syntaks
UPDATE tabellnavn
SET kolonne1 = ny_verdi1, kolonne2 = ny_verdi2
WHERE betingelse;Eksempler
-- Flytt eleven med elev_id 4 til klasse 10A (klasse_id 1)
UPDATE elever SET klasse_id = 1 WHERE elev_id = 4;
-- Endre læreren for matematikk
UPDATE fag SET laerer = 'Morten Berg' WHERE fagnavn = 'Matematikk';
-- Øk alle karakterer i norsk (fag_id 2) med 1 (maks 6)
UPDATE karakterer
SET karakter = MIN(karakter + 1, 6)
WHERE fag_id = 2;Hvis du glemmer WHERE-klausulen i en UPDATE- eller DELETE-setning, vil alle rader i tabellen bli påvirket!
-- FARLIG! Dette sletter ALLE elever:
DELETE FROM elever;
-- FARLIG! Dette endrer ALLE karakterer til 1:
UPDATE karakterer SET karakter = 1;Dobbeltsjekk alltid at du har en WHERE-klausul som velger riktige rader. Et godt tips er å først kjøre en SELECT med samme WHERE-betingelse for å se hvilke rader som vil bli påvirket:
-- Sjekk først hvilke rader som treffes:
SELECT * FROM elever WHERE klasse_id = 3;
-- Hvis resultatet ser riktig ut, kjør DELETE:
DELETE FROM elever WHERE klasse_id = 3;DELETE brukes for å fjerne rader fra en tabell.Syntaks
DELETE FROM tabellnavn WHERE betingelse;Eksempler
-- Slett eleven med elev_id 6
DELETE FROM elever WHERE elev_id = 6;
-- Slett alle karakterer for termin V2023
DELETE FROM karakterer WHERE termin = 'V2023';
-- Slett alle elever i klasse 10C (klasse_id 3)
DELETE FROM elever WHERE klasse_id = 3;NULL-verdier
NULL representerer en manglende eller ukjent verdi. Du kan ikke bruke = for å sammenligne med NULL – bruk i stedet IS NULL eller IS NOT NULL:
-- Finn elever uten fødselsdato
SELECT * FROM elever WHERE fodselsdato IS NULL;
-- Finn fag som har en lærer
SELECT * FROM fag WHERE laerer IS NOT NULL;La oss gjøre alle fire CRUD-operasjonene i rekkefølge:
1. CREATE – Legg til en ny elev:
INSERT INTO elever (fornavn, etternavn, fodselsdato, klasse_id)
VALUES ('Sara', 'Eriksen', '2008-09-05', 2);2. READ – Se at eleven ble lagt til:
SELECT * FROM elever WHERE fornavn = 'Sara';| elevid | fornavn | etternavn | fodselsdato | klasseid |
|---|---|---|---|---|
| 9 | Sara | Eriksen | 2008-09-05 | 2 |
3. UPDATE – Flytt Sara til en annen klasse:
UPDATE elever SET klasse_id = 1 WHERE elev_id = 9;4. Verifiser endringen:
SELECT fornavn, etternavn, klasse_id FROM elever WHERE elev_id = 9;| fornavn | etternavn | klasse_id |
|---|---|---|
| Sara | Eriksen | 1 |
5. DELETE – Fjern eleven (f.eks. byttet skole):
DELETE FROM elever WHERE elev_id = 9;6. Verifiser slettingen:SELECT * FROM elever WHERE elev_id = 9;(Ingen resultater – raden er slettet.)
Du kan legge til kommentarer i SQL-koden for å forklare hva spørringene gjør:
-- Dette er en kommentar på én linje
/* Dette er en
kommentar over
flere linjer */
SELECT fornavn, etternavn -- Velg navn
FROM elever -- Fra elevtabellen
WHERE klasse_id = 1; -- Bare klasse 10AKommentarer er spesielt nyttige i lange og komplekse spørringer.
Hvilken SQL-kommando brukes for å hente ut data fra en tabell?
Hva returnerer denne spørringen?
SELECT fornavn, etternavn FROM elever WHERE klasse_id = 2;Hva gjør denne SQL-kommandoen?
UPDATE elever SET klasse_id = 3 WHERE etternavn = 'Hansen';Skriv SQL-spørringer for følgende oppgaver (bruk eksempeldatabasen fra kapittelet):
a) Hent fornavn og etternavn for alle elever, sortert etter etternavn
b) Hent alle karakterer som er 5 eller høyere
c) Sett inn en ny elev: «Amalie Sørensen», født 2008-02-14, klasseid 2
d) Endre karakteren til 4 for karakterid 6
Hva skjer hvis du kjører denne kommandoen?
DELETE FROM karakterer;Skriv SQL-spørringer for følgende oppgaver:
a) Finn alle elever med etternavn som slutter på «sen»
b) Finn alle elever som er født mellom mars og august 2008
c) Finn alle karakterer for elev_id 1 eller 3, sortert fra høyeste til laveste karakter
d) Slett alle karakterer for termin «V2023» som er lavere enn 3
Hva er resultatet av denne spørringen?
SELECT fornavn, etternavn
FROM elever
WHERE klasse_id = 1 AND fodselsdato > '2008-06-01'
ORDER BY fornavn ASC
LIMIT 2;Elever i klasse 1: Emma (2008-03-15), Oliver (2008-07-22), Sofie (2008-05-28)
Du har en nettbutikk-database med tabellene kunder, produkter, bestillinger og bestillingslinjer (fra kapittel 6.2). Skriv SQL-spørringer for:
a) Legg til et nytt produkt: «Trådløse hodetelefoner», pris 899.00, 25 på lager
b) Hent alle produkter med pris mellom 100 og 500 kr, sortert fra billigst til dyrest
c) Oppdater prisen på produktet «Trådløse hodetelefoner» til 799.00 (tilbud)
d) Hent alle bestillinger med status «ny», sortert etter bestillingsdato (nyeste først)
Oppsummering
I dette kapittelet har du lært:
- SELECT: henter ut data, ofte med WHERE for filtrering.
- INSERT INTO: setter inn nye rader.
- UPDATE: oppdaterer eksisterende data.
- DELETE: sletter data.
- Klausuler: ORDER BY, LIMIT, LIKE, IN og BETWEEN.
Noekkelbegreper
| Begrep | Forklaring |
|---|---|
| SELECT | Henter data fra en tabell |
| WHERE | Filtrerer rader på en betingelse |
| INSERT | Setter inn nye rader |
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.