Kapittel 3 · Forelesning 3–6 · Lærebok 3.1–5.4

SQL — fra SELECT til triggere

Det praktiske språket man faktisk bruker. Fire forelesninger, fire deler — fra grunnleggende spørringer til prosedyrer og rekursjon.

01 · Helhetsbilde

SQL er flere språk i ett

SQL ble utviklet av IBM tidlig på 1970-tallet som Sequel, en del av System R-prosjektet, og standardisert av ANSI/ISO i 1986. I dag er det det udiskutable standardspråket for relasjonsdatabaser. Men SQL er ikke ett språk — det er en familie underspråk som dekker alt fra å definere skjemaer til å gi rettigheter til brukere.

Kjenner du dimensjonene under, blir det mye lettere å forstå hvor i SQL en gitt kommando hører hjemme:

DDL data-definition CREATE ALTER DROP CREATE INDEX CREATE VIEW skjema, struktur DML data-manipulation SELECT INSERT UPDATE DELETE MERGE data inn/ut DCL data-control GRANT REVOKE CREATE ROLE rettigheter TCL transaction BEGIN COMMIT ROLLBACK SAVEPOINT begynner/avslutter
SQL er fire underspråk som lever i samme syntaks. Forelesning 3–4 er nesten utelukkende DML; F5 berører DDL og DCL; F6 går videre til kontrollflyt.
Nøkkelinnsikt

SQL er deklarativt: du sier hva du vil ha, ikke hvordan det skal hentes. Optimalisatoren oversetter SELECT … FROM … WHERE … til en eksekverbar plan basert på indekser, statistikk og kostnadsmodeller. Vi lærer SQL i kap. 3, men optimaliseringen ligger i kap. 7.

Sjekkpunkt · Lett
Du legger til en kolonne i en eksisterende tabell. Hvilket underspråk er det?
Riktig. ALTER TABLE … ADD COLUMN … endrer strukturen (skjemaet) til relasjonen, ikke radene. Det er DDL-territorium.
02 · Anatomi

Hjertet i SQL: SELECT … FROM … WHERE …

Selv om mye av kapitlet handler om DDL, integritet og prosedyrer, er det SELECT-spørringen du møter mest. Den har tre obligatoriske komponenter pluss flere valgfrie. Husk: SQL skrives i én rekkefølge, men evalueres i en helt annen.

SLIK SKRIVER DU SELECT name, salary*1.1 FROM instructor WHERE dept_name = 'CS' GROUP BY dept_name HAVING COUNT(*) > 2 ORDER BY salary DESC LIMIT 5; SLIK EVALUERES DEN 1. FROM → kartesisk produkt 2. WHERE → filtrer rader 3. GROUP BY → bunt rader 4. HAVING → filtrer grupper 5. SELECT → kolonner/uttrykk 6. ORDER BY → sorter 7. LIMIT → top-N SELECT skrives først, men evalueres nesten sist
Klikk gjennom stegene under for å se evalueringsrekkefølgen som styrer hva som er lovlig hvor (f.eks. hvorfor WHERE ikke kan referere til en kolonnealias fra SELECT).
Steg 1 / 6
Vanlig fallgruve

Fordi SELECT evalueres etter WHERE, kan du ikke bruke en kolonnealias definert i SELECT i en WHERE-betingelse på samme spørringsnivå. Dette er en hyppig eksamensspørsmål-felle.

Sjekkpunkt · Middels
Hvilken av spørringene under kompilerer ikke?
Korrekt. WHERE evalueres før SELECT, så aliaset hike finnes ikke ennå. ORDER BY evalueres derimot etter SELECT og kan trygt bruke aliaser.
04 · Sjekkliste

Når du er ferdig med kap. 3 skal du …

Skrive
CREATE TABLE med PK, FK, NOT NULL, CHECK og forklare hvorfor integritetskravene er der.
Lese
En 3-5-tabell-spørring og forutsi resultatsettet — inkludert NULL-oppførsel og duplikathåndtering.
Velge
Riktig JOIN-type. Vite forskjellen på INNER, LEFT, FULL, og når en CROSS JOIN er det du faktisk vil ha.
Omforme
En IN-subquery til EXISTS og motsatt — og forklare når NOT IN feiler i møte med NULL.
Kjenne
Når en VIEW er oppdaterbar, og hva CHECK OPTION gjør.
Forstå
Hva en BEFORE/AFTER row-trigger faktisk kjører på, og hvorfor trigger-kaskader er farlige.
Skrive
En WITH RECURSIVE-spørring som regner ut transitive lukning (forfedre, naborelasjoner).
Begrunne
Når GRANT … WITH GRANT OPTION er nyttig og hvilken risiko det medfører.
05 · Test deg selv

Konsept-quiz

Tolv flervalgsspørsmål på tvers av hele kapitlet. Detaljerte spørsmål per tema finner du på hver delside.

Q1 · Lett
Hvilken kommando fjerner radene uten å slette skjemaet til tabellen?
DELETE FROM r; fjerner alle rader, men beholder definisjonen. DROP TABLE ville slettet selve tabellen.
Q2 · Lett
SQL fjerner duplikater i resultatet kun når du …
Default-semantikken i SQL er multiset (bag), ikke set. Du må be om dedup eksplisitt.
Q3 · Middels
SELECT COUNT(*) og SELECT COUNT(salary) kan gi forskjellige svar fordi …
Aggregatfunksjoner (untatt COUNT(*)) ignorerer NULL.
Q4 · Middels
WHERE x = NULL returnerer aldri rader. Hva er den rette forklaringen?
SQL bruker tre-verdi-logikk. Bruk x IS NULL for å sjekke om x mangler.
Q5 · Middels
En INNER JOIN mellom to tabeller på en match-betingelse er logisk ekvivalent med …
JOIN er bare syntaktisk sukker for kartesisk produkt + filter. NATURAL JOIN er en spesialvariant som matcher alle felles attributter.
Q6 · Vanskelig
Hvilken spørring er ekvivalent med WHERE x IN (SELECT y FROM t) selv når y kan være NULL?
= ANY er teoretisk ekvivalent, men EXISTS er mest robust. Den klassiske fellen er NOT IN — den feiler stille om subqueryen returnerer minst én NULL.
Q7 · Middels
En view CREATE VIEW v AS SELECT a, b FROM t WHERE c > 0 er ikke oppdaterbar via INSERT hvis …
Et view er oppdaterbart kun hvis SQL kan invertere mappingen entydig. En NOT NULL-kolonne som er skjult av view-et hindrer INSERT.
Q8 · Middels
Hva betyr ON DELETE CASCADE i en foreign key-deklarasjon?
Alternativene er RESTRICT (default — nekt sletting), SET NULL og SET DEFAULT.
Q9 · Vanskelig
Når er en CHECK-betingelse ikke tilstrekkelig for å håndheve en regel?
CHECK gjelder per rad. Krav på tvers av rader trenger en ASSERTION (sjeldent støttet) eller en trigger.
Q10 · Middels
Du vil at en trigger skal kjøre én gang når én UPDATE-setning oppdaterer 1000 rader. Hva velger du?
FOR EACH ROW kjører 1000 ganger. FOR EACH STATEMENT kjører én gang per setning, uavhengig av antall berørte rader.
Q11 · Vanskelig
En rekursiv WITH RECURSIVE krever et anker (basistilfelle) og et rekursivt uttrykk. Hva er anker-uttrykket?
Anker-leddet er den ikke-rekursive SELECT-en som starter iterasjonen. UNION ALL kombinerer anker med det rekursive leddet.
Q12 · Vanskelig
Hvilket utsagn er sant om GRANT … WITH GRANT OPTION?
Mottakeren kan GRANT-e videre. Når kilden REVOKE-er, faller hele kjeden av delegasjoner kaskadert (cascading revoke).

Klar for mer fordypning? Hopp til 3A — DDL og spørringer.