Inngangur

SQL er forritunarmál hannað til að „tala við“ venslagagnasöfn. Það er mikilvægt tæki í gagnastjórnun sem gerir notendum kleift að framkvæma fyrirspurnir, búa til, breyta og eyða gögnum.

Um SQL

Markmið námskeiðsins er að kynnast fyrirspurnarmálinu SQL:

  • búa til fyrirspurnir,
  • skilja fyrirspurnir sem þið sjáið,
  • geta notað SQL til að framkvæma gagnagreiningu.

SQL (Structured Query Language), borið fram eins og „sequel“ eða „ess-cue-ell“, er staðlað fyrirspurnarmál sem er notað til að hafa samskipti við venslagagnasöfn.

Ólík fyrirspurnarmál og gagnagrunnskerfi

Það eru til alls konar gagnagrunnskerfi og þau nota ekki öll sama fyrirspurnarmál. Sum eru hefðbundin SQL-kerfi, eins og PostgreSQL, SQLite, MySQL, Oracle og Microsoft SQL Server. Sum kerfi nota SQL en eru sérhæfð fyrir gagnavöruhús eða gagnaplatform, til dæmis Snowflake og Databricks SQL. Önnur eru óhefðbundnari fyrirspurnarumhverfi, til dæmis MongoDB og Redis.

Taflan hér fyrir neðan sýnir nýlega stöðu vinsælla gagnagrunnskerfa samkvæmt DB-Engines Ranking. Dagsetningin kemur fram í töflunni sjálfri, því hana má endurnýja mánaðarlega. Hún er ekki listi yfir það sem þið þurfið að kunna allt saman. Hún sýnir bara landslagið: SQL er stór hluti af því, en ekki eina leiðin til að spyrja gagnakerfi.

438 kerfi í röðun, september 2026

Sæti Fyrri mán. Fyrra ár Gagnagrunnskerfi Gagnalíkan Einkunn Breyting frá fyrri mán. Breyting frá fyrra ári
1 1 1 Oracle Relational, Multi-model 1122.27 -1.17 -48.36
2 2 2 MySQL Relational, Multi-model 844.82 +2.50 -46.95
3 3 3 Microsoft SQL Server Relational, Multi-model 698.69 +4.13 -18.63
4 4 4 PostgreSQL Relational, Multi-model 683.26 -1.32 +26.08
5 5 5 MongoDB Document, Multi-model 381.31 -3.57 +0.81
6 6 6 Snowflake Relational 211.61 -4.28 +21.42
7 7 9 Databricks Multi-model 168.34 +2.53 +44.27
8 8 7 Redis Key-value, Multi-model 158.06 +1.55 +12.89
9 9 8 IBM Db2 Relational, Multi-model 110.57 -1.50 -13.61
10 11 11 SQLite Relational 97.05 +1.11 -10.83
AthugasemdUm töfluna

Taflan er afrit af efstu 10 sætunum í DB-Engines Ranking. Hún er geymd sem stöðug tafla í námsefninu og má endurnýja mánaðarlega með scripts/update_db_engines_ranking.py.

Í þessu námskeiði munum við fyrst og fremst kynnast SQLite og PostgreSQL. SQLite er þægilegt fyrir lítil staðbundin verkefni og æfingar. PostgreSQL er dæmi um öflugt SQL-kerfi sem er mikið notað í raunverulegum kerfum.

Líkindi milli SQL fyrirspurnarmála

Flest SQL fyrirspurnarmál fylgja svipuðum grunnatriðum og setningafræði. Þau leyfa notendum að framkvæma fyrirspurnir á gagnagrunnum á einfaldan hátt. Þrátt fyrir að smávægilegur munur geti verið til staðar milli mismunandi gagnagrunnskerfa, eins og PostgreSQL og SQLite, eru grunnskipanirnar oft mjög keimlíkar og auðvelt að aðlaga sig á milli kerfa. Fyrir frekari upplýsingar um hvernig SELECT skipanir eru búnar til, sem verða útskýrð betur í grunnatriði í SQL.

Hér eru sömu grunnfyrirspurnir í nokkrum algengum SQL-kerfum. Takið eftir að fyrstu tvær fyrirspurnirnar eru eins í öllum dæmunum. Munurinn sést helst þegar við viljum takmarka fjölda raða.

Skjölun: PostgreSQL LIMIT og OFFSET

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
LIMIT 10;

Skjölun: MySQL SELECT

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
LIMIT 10;

Skjölun: SQLite SELECT

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
LIMIT 10;

Skjölun: SQL Server TOP

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT TOP (10) *
FROM tbl
ORDER BY col1;

Skjölun: Oracle SELECT

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
FETCH FIRST 10 ROWS ONLY;

Skjölun: IBM Db2 FETCH FIRST

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
FETCH FIRST 10 ROWS ONLY;

Skjölun: Snowflake LIMIT / FETCH

Snowflake notar SQL og styður bæði LIMIT og FETCH. Hér er PostgreSQL-líka leiðin:

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
LIMIT 10;

Skjölun: Databricks SQL LIMIT

Databricks SQL styður líka LIMIT:

-- Select all rows from a table
SELECT *
FROM tbl;

-- Select specific columns and sort by a column
SELECT col1, col2
FROM tbl
ORDER BY col1 DESC;

-- Select the first 10 rows after sorting
SELECT *
FROM tbl
ORDER BY col1
LIMIT 10;

MongoDB og Redis eru öðruvísi en SQL-kerfin hér að ofan. Samt er gagnlegt að sjá hvernig sama hugsun birtist í þeim: velja gögn, raða þeim og takmarka fjölda niðurstaðna.

Skjölun: MongoDB find()

MongoDB er skjalagagnagrunnur, svo dæmið er ekki SQL heldur mongosh skipun. Hugmyndin er samt svipuð: finna skjöl, velja reiti, raða og takmarka fjölda niðurstaðna.

// Select all documents from a collection
db.tbl.find({});

// Select specific fields and sort by a field
db.tbl
  .find({}, { col1: 1, col2: 1, _id: 0 })
  .sort({ col1: -1 });

// Select the first 10 documents after sorting
db.tbl
  .find({})
  .sort({ col1: 1 })
  .limit(10);

Skjölun: Redis FT.SEARCH

Redis er lykil-gildis gagnagrunnur. Fyrir leit í skjölum er oft notað Redis Search, þar sem FT.SEARCH getur raðað og takmarkað niðurstöður. Þetta dæmi gerir ráð fyrir að til sé index sem heitir idx.

# Return matching documents
FT.SEARCH idx "*"

# Return selected fields and sort by a field
FT.SEARCH idx "*" RETURN 2 col1 col2 SORTBY col1 DESC

# Return the first 10 matches after sorting
FT.SEARCH idx "*" SORTBY col1 ASC LIMIT 0 10

Gagnasafnskerfi

Gagnastjórnun er aðferð til að safna, geyma og nota gögn á öruggan, árangursríkan og kostnaðarlega hagkvæman hátt. Markmiðið er að auðvelda notkun gagna þannig að hægt sé að nota þau til ákvarðanatöku og skapa virði fyrir fyrirtæki.

Helsta vinna gagnastjórnunar

  • Búa til, stýra aðgengi og uppfæra gögn á fjölbreyttu gagnasviði.
  • Hýsing gagna, til dæmis í skýi (e. data cloud) eða á staðnum.
  • Gott aðgengi til notanda (t.d. margir notendur, rafmagnsleysi og fleira).
  • Tryggja persónuvernd gagna (t.d. GDPR lögin) og fylgja reglugerðum þar sem við á.
  • Eyðing gagna: Hvenær má eyða gögnum og hverju?
  • Notkun gagna í fjölbreyttum öppum, greiningartólum og reikniritum.

Tegundir gagnasafnskerfa

Gagnasafnskerfi samanstanda af margs konar tækni og tólum sem geta verið notuð til gagnastjórnunar. Algengasta gerð gagnasafnskerfa eru venslagagnasöfn (e. relational database management systems), þar sem gögn eru geymd á skipulögðu formi, skipt niður í töflur með röðum og dálkum sem innihalda stök (e. database records). Skyld stök í öðrum töflum eru tengd saman með lyklum (primary og foreign keys) til að koma í veg fyrir tvítekningar. Þetta fyrirkomulag byggir á forritunarmálinu SQL og gagnalíkani/skemum.

Aðrir möguleikar

  • Gagnasafnskerfi fyrir gríðargögn (e. big data): t.d. NoSQL gagnagrunnar sem byggja ekki á SQL og leyfa óskipulögð eða hálf skipulögð gögn, eins og skynjaragögn (e. sensor data).
  • Vöruhúsgagna (e. data warehouses): byggð á vensla- og/eða dálka-gagnasöfnum, tekin saman úr mismunandi kerfum, sett saman og undirbúin fyrir greiningar.
  • Gagnalindir (e. data lakes): geyma gríðargögn til notkunar í spálíkanagerð, gervigreind, og fleira.

Venslagagnasöfn

Venslagagnasöfn (e. relational databases) eru oft notuð til að skipuleggja og geyma gögn á skilvirkan hátt. Þau byggja á mengjum og venslum, eins og tvístæðum venslum.

Kostir

  • Gögn eru geymd á skipulögðu formi.
  • Geyma gögn á öruggan hátt.
  • Hraðvirk leit að gögnum.

Gallar

  • Skemað (töflur, dálkar og gagnatög) þarf að skilgreina fyrirfram, og breytingar á því síðar geta verið þungar í vöfum.
  • Henta illa óskipulögðum eða síbreytilegum gögnum, eins og skynjaragögnum eða frjálsum texta. Þar eru NoSQL-kerfi oft betri kostur (sjá Aðrir möguleikar hér að ofan).
  • Netþjónakerfi eins og PostgreSQL krefjast uppsetningar og reksturs. Það á þó ekki við um öll venslagagnasöfn: SQLite er ein skrá sem þarf enga uppsetningu, og þess vegna hentar það vel fyrir lítil verkefni og æfingar.

Skipulagið er því tvíeggjað. Það er það sem gerir leit hraða og gögnin áreiðanleg, en líka það sem gerir líkanið ósveigjanlegt þegar gögnin passa ekki í fyrirfram skilgreindar töflur.

Mengi og vensl

Í kaflanum Rökfræði og mengi æfum við fyrst að lesa töflur sem hópa, yrðingar og vensl áður en við skrifum SQL. Hér tengjum við sömu hugmyndir við venslagagnasöfn.

Mengi eru oft notuð til þess að halda utan um hópa hluti sem hafa svipaða eiginleika, eins og allir nemendur í upplýsingaverkfræði eða allir nemendur Háskóla Íslands. Mengi eru óraðað safn af hlutum, og hlutir í mengi eru kallaðir stök. Vensl segja okkur til um samband staka milli mengja, eins og mengi starfsmanna og mengi launa eða einstaklingar og ættingjar.

Tvístæð vensl frá \(A\) til \(B\) er mengið \(R\) af röðuðum pörum þar sem fyrsta stakið af hverju röðuðu pari kemur frá \(A\) og það síðara frá \(B\). Þegar \((a,b)\) tilheyrir \(R\) þá er \(a\) sagt vera með vensl í \(b\) með \(R\) (skrifað \(aRb\)).

Dæmi um tvístæð vensl \(R\) frá mengi \(A\) til \(B\): \(A = \{0,1,2\}\), \(B = \{a, b\}\). Tvístæð vensl væru þá t.d. \(R: \{(0, a), (0, b), (1, a), (2, b)\}\). Athugið, við þurfum ekki að hafa öll pör af tengingum milli mengja.

Töflur eru oft notaðar til að sýna vensl. Dálkur er mengið sjálft, og hver lína í dálki er stak. Tvístæð vensl hafa tvo dálka.

Þá væri til dæmis tvístæðu venslin: \(\{\)(Helga, Upplýsingaverkfræði), (Rögnvaldur, Tæknileg kerfi), (Tómas, Aðgerðagreining)\(\}\) hægt að setja fram sem:

Kennari Námskeið
Helga Upplýsingaverkfræði
Rögnvaldur Tæknileg kerfi
Tómas Aðgerðagreining

Röð raða er ekki tryggð

Vensl eru mengi raðaðra para. Hvert par er raðað, en mengið af pörum hefur enga röð. Venslin hér að ofan eru sama mengið hvort sem parið (Helga, Upplýsingaverkfræði) er skrifað fyrst eða síðast. Sama gildir um töflur í venslagagnasafni: taflan geymir raðirnar, en hún lofar engu um í hvaða röð þær koma til baka. Viljum við ákveðna röð þurfum við að biðja um hana með ORDER BY, sjá Röð úttaks.

Kostir venslalíkansins

  • Einfalt og gagnsætt líkan.
  • Allt er sett fram sem töflur.
  • Traustar stærðfræðilegar undirstöður, eins og venslareikningur og mengi.
  • Passar oftast vel við raunveruleg gögn.
  • Hraðvirkar útfærslur.