Inngangur
Af hverju mengi og rökfræði hjálpa okkur að hugsa um SQL áður en við byrjum að skrifa fyrirspurnir.
SQL verður auðveldara þegar við hugsum fyrst um niðurstöðuna sem við viljum fá, ekki skrefin sem tölvan á að taka.
Í hefðbundinni forritun skrifum við oft lykkju: „farðu í gegnum hverja línu, prófaðu skilyrði og bættu við niðurstöðu“. Í SQL lýsum við frekar eiginleikum niðurstöðunnar: hvaða raðir eiga að koma út og hvaða dálkar skipta máli.
Þessi hluti námskeiðsins undirbýr ykkur fyrir SQL með nokkrum hugtökum úr mengjum og rökfræði. Markmiðið er ekki að læra mengjafræði eða strjála stærðfræði sem sjálfstætt námsefni hér. Markmiðið er að geta horft á litlar töflur, spáð fyrir um niðurstöður fyrirspurna og skilja af hverju SQL-hegðun er stundum öðruvísi en venjulegur kóði.
Rauði þráðurinn
Við notum lítið Stjörnustríðsdæmi. Þetta er ekki gagnagrunnur um Stjörnustríðsfræði. Þetta er æfingavöllur fyrir spurninguna sem skiptir mestu í SQL:
Hvaða raðir og dálkar eiga að vera í niðurstöðunni?
Nöfnin í dæminu sækja innblástur í íslensku þýðinguna.1
Í stað þess að setja allt í eina stóra töflu skiptum við gögnunum í nokkrar litlar töflur. Þá getum við spurt skýrar spurningar eins og:
- hverjir eru uppreisnarmenn?
- hverjir eru Væringjar (e. Jedi)?
- hverjir birtast í
Ný von? - hverjir eru bæði í Andspyrnunni og Frumreglunni?
- hverjir eru hvorki í Uppreisnarmönnum né Keisaradæminu?
Finnur er skemmtilegt dæmi fyrir skörun milli tveggja hópa, því hann hefur tengingu við Frumregluna en endar með Andspyrnunni. Boba Fett er svo gott dæmi um „hvorki né“: hann er til í gögnunum, en er hvorki skráður í Uppreisnarmenn né í Keisaradæmið.
Litli gagnheimurinn okkar
Byrjum á þremur litlum grunntöflum. Þær geyma hluti sem við viljum geta vísað í aftur og aftur: persónur, lið og kvikmyndir.
character
| character_id | nafn |
|---|---|
| 1 | Logi |
| 2 | Lilja |
| 3 | Hans Óli |
| 4 | Svarthöfði |
| 5 | Jóda |
| 6 | Loðinn |
| 7 | Finnur |
| 8 | Boba Fett |
faction
| faction_id | lið |
|---|---|
| 100 | Uppreisnarmenn |
| 200 | Keisaradæmið |
| 300 | Væringjar |
| 400 | Andspyrnan |
| 500 | Frumreglan |
| 600 | Hausaveiðarar |
movie
| movie_id | mynd |
|---|---|
| 10 | Ný von |
| 20 | Gagnárás keisaradæmisins |
| 30 | Jedinn snýr aftur |
| 40 | Mátturinn vaknar |
Svo bætum við við tveimur litlum venslatöflum. Þær geyma tengingar milli hluta.
member_of
| character_id | faction_id |
|---|---|
| 1 | 100 |
| 1 | 300 |
| 2 | 100 |
| 3 | 100 |
| 4 | 200 |
| 4 | 300 |
| 5 | 300 |
| 6 | 100 |
| 7 | 400 |
| 7 | 500 |
| 8 | 600 |
appears_in
| character_id | movie_id |
|---|---|
| 1 | 10 |
| 1 | 20 |
| 1 | 30 |
| 2 | 10 |
| 2 | 20 |
| 2 | 30 |
| 3 | 10 |
| 3 | 20 |
| 3 | 30 |
| 4 | 10 |
| 4 | 20 |
| 4 | 30 |
| 5 | 20 |
| 5 | 30 |
| 6 | 10 |
| 6 | 20 |
| 6 | 30 |
| 7 | 40 |
| 8 | 20 |
| 8 | 30 |
Töflurnar segja okkur ekki söguna sjálfar. Við þurfum að lesa þær sem litlar staðreyndir:
- röðin
(1, 100)ímember_ofsegir að Logi sé í Uppreisnarmönnum, - röðin
(7, 500)ímember_ofsegir að Finnur hafi tengingu við Frumregluna, - röðin
(7, 400)ímember_ofsegir að Finnur sé líka í Andspyrnunni, - röðin
(8, 600)ímember_ofsegir að Boba Fett sé hausaveiðari, - röðin
(1, 10)íappears_insegir að Logi birtist íNý von.
Á næstu síðum notum við þessar töflur til að tala um yrðingar, sanntöflur, mengi, vensl, tómar niðurstöður og NULL.
Hvað kemur næst?
Í þessum hluta förum við í gegnum:
- hvernig fullyrðingar geta verið sannar eða ósannar,
- hvernig
og,eðaogekkivirka í sanntöflum, - hvernig mengi hjálpa okkur að hugsa um hópa,
- hvernig litlar töflur geta táknað hluti og vensl milli þeirra,
- hvernig þessi hugsun verður síðar að
WHERE,AND,ORogNOTí SQL.
Ef þið getið spáð fyrir um litla niðurstöðu með höndunum áður en þið keyrið SQL, eruð þið komin með rétta hugarlíkanið.
- Mengi: tafla er mengi af línum.
- Vensl: tafla skilgreinir vensl.
- Yrðingar: við veljum úttakið með yrðingu, skilyrðinu í
WHERE. - Reglulegar segðir: yrðingar geta notað reglulegar segðir.
Af hverju SQL frekar en lykkjur?
Markmiðið hér er ekki að kenna strjála stærðfræði (e. discrete mathematics) vegna hennar sjálfrar, heldur að sýna af hverju SQL er svona öflugt. Í venjulegri forritun segjum við tölvunni hvernig hún á að finna svarið: farðu í gegnum raðirnar, berðu saman, safnaðu niðurstöðum. Í SQL lýsum við bara hvaða niðurstöðu við viljum, og gagnagrunnurinn velur sjálfur bestu leiðina að henni.
Það gengur upp af því að SQL hvílir á rökfræði, mengjum og venslum. Skilyrði eru yrðingar, töflur eru mengi og samtengingar eru vensl. Þess vegna getum við treyst því að tvær ólíkt skrifaðar fyrirspurnir skili sama svari, og þess vegna er betra að hugsa á þessu stigi en að skrifa lykkjurnar sjálf.
Hvernig er þessi hluti byggður upp?
Fyrstu síðurnar nota Stjörnustríðsdæmið til að byggja upp innsæið:
Hinar síðurnar fara dýpra í hvert efni og sýna tenginguna við SQL nánar. Þær enda á æfingum með lausnum, og það má sleppa þeim ef tíminn er knappur:
- Rökfræði: Jafngildar yrðingar, Virkjar: „fyrir öll“ og „til er“ og Rökleiðsla.
- Mengi: Að lýsa mengjum og Mengjaaðgerðir og jafngildi.
- Vensl: Mengjamargfeldi og samskeyting, Föll og lyklar og Eiginleikar vensla og lokanir.
Auka myndbandsfyrirlestrar
Hér að neðan eru fyrirlestraraðir á YouTube um rökfræði, mengi og vensl.
Samkvæmt íslensku Wikipediu um Stjörnustríð gerði Hersteinn Pálsson fyrstu íslensku þýðinguna á sögunni í bókinni Stjörnustríð árið 1978. Þar voru mörg sérheiti íslenskuð; nöfn eins og Svarthöfði og Logi Geimgengill hafa lifað áfram, meðan önnur, eins og Hans Óli, eru meira dásamlegar þýðingaperlur úr sögunni.↩︎