Tilbake
6.3
SQL – grunnleggende spørringer

6.3 SQL – grunnleggende spørringer

Lær SELECT, INSERT, UPDATE og DELETE for å arbeide med data i en database.

65 min
8 oppgaver
SELECTINSERT INTOUPDATEDELETE
Du leser den tradisjonelle versjonen
Din fremgang i kapitlet
0 / 8 oppgaver

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:

elevidfornavnetternavnfodselsdatoklasseid
1EmmaHansen2008-03-151
2OliverJohansen2008-07-221
3NoraOlsen2008-01-102
...............

Hente spesifikke kolonner


SELECT fornavn, etternavn FROM elever;
Resultat:
fornavnetternavn
EmmaHansen
OliverJohansen
NoraOlsen
......

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

OperatorBetydningEksempel
=Likklasse_id = 1
<> eller !=Ulikkarakter <> 6
<Mindre ennkarakter < 4
>Større ennkarakter > 4
<=Mindre enn eller likkarakter <= 3
>=Større enn eller likkarakter >= 5

Eksempler


-- Alle elever i klasse 10A (klasse_id = 1)
SELECT fornavn, etternavn FROM elever WHERE klasse_id = 1;
fornavnetternavn
EmmaHansen
OliverJohansen
SofieBerg

-- 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_idkarakter
36
15
55
SELECT-setningens oppbygging

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;
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;
✏️Eksempel: Komplett CRUD-sekvens

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';
elevidfornavnetternavnfodselsdatoklasseid
9SaraEriksen2008-09-052

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;

fornavnetternavnklasse_id
SaraEriksen1

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.)

📝Oppgave 6.3.1

Hvilken SQL-kommando brukes for å hente ut data fra en tabell?

📝Oppgave 6.3.2

Hva returnerer denne spørringen?

SELECT fornavn, etternavn FROM elever WHERE klasse_id = 2;

📝Oppgave 6.3.3

Hva gjør denne SQL-kommandoen?

UPDATE elever SET klasse_id = 3 WHERE etternavn = 'Hansen';

📝Oppgave 6.3.4

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

📝Oppgave 6.3.5

Hva skjer hvis du kjører denne kommandoen?

DELETE FROM karakterer;

📝Oppgave 6.3.6

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

📝Oppgave 6.3.7

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)

📝Oppgave 6.3.8

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


BegrepForklaring
SELECTHenter data fra en tabell
WHEREFiltrerer rader på en betingelse
INSERTSetter 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.