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 – grunnleggjande spørjingar

No som du forstår korleis databasar og tabellar er strukturerte, er det på tide å lære sjølve språket vi bruker for å kommunisere med databasen: SQL (Structured Query Language). SQL blir uttalt anten «ess-kju-ell» eller «sequel», og begge uttalane er aksepterte.

SQL er eit deklarativt språk, noko som betyr at du skildrar kva du vil ha, ikkje korleis datamaskina skal gjere det. Når du skriv SELECT fornavn FROM elever WHERE klasse = '10A', seier du til databasen: «Gi meg fornamna til alle elevar i klasse 10A.» Databasen finn sjølv ut den mest effektive måten å hente ut dataa på.

I dette kapittelet skal du lære dei fire grunnleggjande SQL-kommandoane som svarar til CRUD-operasjonane:
- SELECT – Hente ut data (Read)
- INSERT INTO – Setje inn data (Create)
- UPDATE – Oppdatere data (Update)
- DELETE – Slette data (Delete)

Vi bruker skuledatabasen frå førre kapittel som eksempel gjennom heile kapittelet.

For å følgje eksempla i dette kapittelet, la oss setje opp ein database med nokre 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 køyre denne koden i DB Browser for SQLite eller ein online SQL-editor for å følgje med på eksempla.

SELECT er den mest brukte SQL-kommandoen. Han blir brukt til å hente ut data frå ein eller fleire tabellar.

Grunnleggjande syntaks

SELECT kolonne1, kolonne2, ... FROM tabellnavn;

Hente alle kolonnar

Bruk * (stjerne) for å hente alle kolonnar:

SELECT * FROM elever;

Resultat:

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

Hente spesifikke kolonnar


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

DISTINCT – fjerne duplikat

SELECT DISTINCT klasse_id FROM elever;

Gir berre dei unike verdiane: 1, 2, 3 (sjølv om mange elevar deler same klasse_id).

WHERE-klausulen lèt deg filtrere kva for rader som blir returnerte. Han blir brukt med samanlikningsoperatorar og logiske operatorar.

Samanlikningsoperatorar

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

Eksempel


-- 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 operatorar: 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 jokerteikn

-- 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%';
% matchar null eller fleire teikn. _ matchar nøyaktig eitt teikn.

IN – fleire verdiar


-- 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 resultat

-- 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 = stigande (standard), DESC = synkande.

LIMIT – avgrense talet på resultat

-- 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
Oppbygginga av SELECT-setninga

Ei fullstendig SELECT-setning har følgjande struktur (element i klammer er valfrie):

SELECT [DISTINCT] kolonne1, kolonne2, ...
FROM tabellnavn
[WHERE betingelse]
[ORDER BY kolonne [ASC|DESC]]
[LIMIT antall];

Rekkjefølgja er viktig: SELECT kjem alltid før FROM, som kjem før WHERE, som kjem før ORDER BY, som kjem før LIMIT. Denne rekkjefølgja må alltid følgjast. Databasen handsamar derimot setninga i ei anna rekkjefølgje: FROM (finn tabellen), deretter WHERE (filtrer rader), deretter SELECT (vel kolonnar), deretter ORDER BY (sorter), og til slutt LIMIT (avgrens).

INSERT INTO blir brukt for å leggje til nye rader i ein tabell.

Setje inn éi rad

INSERT INTO elever (fornavn, etternavn, fodselsdato, klasse_id)
VALUES ('Maja', 'Strand', '2008-04-12', 1);

Legg merke til at vi ikkje oppgir elev_id – han blir fylt automatisk fordi han er definert som AUTOINCREMENT.

Setje inn fleire 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);

Setje inn i alle kolonnar

Har du oppgir verdiar for alle kolonnar (inkludert primærnøkkel), kan du utelate kolonnenamna:

INSERT INTO fag VALUES (5, 'Samfunnsfag', 'Anne Holm');

Men det er tilrådd å alltid skrive kolonnenamna eksplisitt. Då er koden lettare å lese, og han held fram med å fungere sjølv om tabellstrukturen blir endra.

UPDATE blir brukt for å endre eksisterande data i ein tabell.

Syntaks

UPDATE tabellnavn
SET kolonne1 = ny_verdi1, kolonne2 = ny_verdi2
WHERE betingelse;

Eksempel

-- 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 blir brukt for å fjerne rader frå ein tabell.

Syntaks

DELETE FROM tabellnavn WHERE betingelse;

Eksempel

-- 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-verdiar

NULL representerer ein manglande eller ukjend verdi. Du kan ikkje bruke = for å samanlikne med NULL – bruk i staden 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 gjere alle fire CRUD-operasjonane i rekkjefølgje:

1. CREATE – Legg til ein ny elev:

INSERT INTO elever (fornavn, etternavn, fodselsdato, klasse_id)
VALUES ('Sara', 'Eriksen', '2008-09-05', 2);

2. READ – Sjå at eleven blei lagt til:

SELECT * FROM elever WHERE fornavn = 'Sara';
elevidfornavnetternavnfodselsdatoklasseid
9SaraEriksen2008-09-052

3. UPDATE – Flytt Sara til ein annan klasse:
UPDATE elever SET klasse_id = 1 WHERE elev_id = 9;

4. Verifiser endringa:

SELECT fornavn, etternavn, klasse_id FROM elever WHERE elev_id = 9;

fornavnetternavnklasse_id
SaraEriksen1

5. DELETE – Fjern eleven (t.d. bytte skule):
DELETE FROM elever WHERE elev_id = 9;
6. Verifiser slettinga:
SELECT * FROM elever WHERE elev_id = 9;

(Ingen resultat – rada er sletta.)

📝Oppgave 6.3.1

Kva for SQL-kommando blir brukt for å hente ut data frå ein tabell?

📝Oppgave 6.3.2

Kva returnerer denne spørjinga?

SELECT fornavn, etternavn FROM elever WHERE klasse_id = 2;

📝Oppgave 6.3.3

Kva gjer denne SQL-kommandoen?

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

📝Oppgave 6.3.4

Skriv SQL-spørjingar for følgjande oppgåver (bruk eksempeldatabasen frå kapittelet):

a) Hent fornamn og etternamn for alle elevar, sortert etter etternamn

b) Hent alle karakterar som er 5 eller høgare

c) Sett inn ein ny elev: «Amalie Sørensen», fødd 2008-02-14, klasseid 2

d) Endre karakteren til 4 for karakterid 6

📝Oppgave 6.3.5

Kva skjer dersom du køyrer denne kommandoen?

DELETE FROM karakterer;

📝Oppgave 6.3.6

Skriv SQL-spørjingar for følgjande oppgåver:

a) Finn alle elevar med etternamn som sluttar på «sen»

b) Finn alle elevar som er fødde mellom mars og august 2008

c) Finn alle karakterar for elev_id 1 eller 3, sortert frå høgaste til lågaste karakter

d) Slett alle karakterar for termin «V2023» som er lågare enn 3

📝Oppgave 6.3.7

Kva er resultatet av denne spørjinga?

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 ein nettbutikk-database med tabellane kunder, produkter, bestillinger og bestillingslinjer (frå kapittel 6.2). Skriv SQL-spørjingar for:

a) Legg til eit nytt produkt: «Trådlause hovudtelefonar», pris 899.00, 25 på lager

b) Hent alle produkt med pris mellom 100 og 500 kr, sortert frå billegast til dyrast

c) Oppdater prisen på produktet «Trådlause hovudtelefonar» til 799.00 (tilbod)

d) Hent alle bestillingar med status «ny», sortert etter bestillingsdato (nyaste først)

Oppsummering

I dette kapittelet har du lært:

- SELECT: hentar ut data, ofte med WHERE for filtrering.
- INSERT INTO: set inn nye rader.
- UPDATE: oppdaterer eksisterande data.
- DELETE: slettar data.
- Klausular: ORDER BY, LIMIT, LIKE, IN og BETWEEN.

Nøkkelomgrep


OmgrepForklaring
SELECTHentar data frå ein tabell
WHEREFiltrerer rader på eit vilkår
INSERTSet 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.