SQL

**SQL** (skammstöfun fyrir „**S**tructured **Q**uery **L**anguage“) er mjög algengt fyrirspurnarmál sem notað er til að búa til, vinna með og sækja gögn úr gagnagrunnum.

SQL fylgir alþjóðlegum stöðlum en framleiðendur gagnagrunnskerfa auka gjarnan við málið með því að bæta við gagnatögum, lesstökum, segðum og aðgerðum sem auðvelda smíði fyrirspurna eða gera notendum kleyft að smíða stefjur með lykkjum, ef-setningum og frávikameðhöndlun.  Yfirleitt eru slíkar mállýskur yfirmengi einhverrar staðlaðrar útgáfu SQL og því hægt að mynda sömu fyrirspurn í gagnagrunnskerfi bæði á mállýsku þess eða á stöðluðu SQL.  SQL er skilgreiningarforritunarmál þar sem notandinn skilgreinir eða lýsir þeirri niðurstöðu sem hann vill fá og gagnagrunnskerfið sér um að ákvarða hvernig best er að skila henni og nýtir til þess fyrirspurnarbestun.  Þetta er ólíkt gildingarforritunarmálum sem segja nákvæmlega fyrir um hvernig og í hvaða röð aðgerðir eru framkvæmdar.  Upphaflega og algengast enn í dag er að nota SQL í venslagrunnum en það þekkist í öðrum gagnagrunnskerfum og hefur haft áhrif á önnur fyrirspurnarmál, til dæmis á atburðastreymiskerfi eins og Apache Kafka.

SQL var þróað hjá IBM af þeim Donald D. Chamberlin and Raymond F. Boyce eftir að þeir komust í kynni við töflulíkan Edgar F. Codd snemma á áttunda áratug 20. aldar. Forveri þess SEQUEL var fyrirspurnarmál fyrir gagnagrunnskerfið System R sem IBM þróaði, en það var ekki venslagrunnur í þeim skilningi sem Codd sá fyrir sér.  Töflulíkan og venslaalgebra Edgar F. Codd byggir á mengjafræði, algebrumynstrum og þrígildri rökfræði.  Hver yrðing getur því verið sönn, ósönn eða tóm.  Tómagildið `NULL` er almennt notað til þess að tákna að gögn vanti í ákveðið stak eða eigi ekki við; sem dæmi gæti þjóðskrá verið tafla sem inniheldur lista yfir alla ríkisborgara og eitt eigindi eða dálkur hennar verið *maki* sem væri tilvísun í annan einstakling í töflunni (til dæmis kennitala maka), ef einstaklingur hefur engan maka væri hægt að setja tómagildið `NULL` í stað einkvæms lykils sem vísar í makann.

## Dæmi
SQL skipanir skilgreina ekki hvernig á að framkvænma ákveðnar aðgerðir, heldur hvað eigi að gera. Samkvæmt SQL staðli verða þær að enda á semíkommu (en þó krefjast ekki allir gagnagrunnar að þær fylgi með).

Dæmi um mjög einfalda SQL skipun er


```
SELECT nafn, heimili, postnumer 
FROM vidskiptamenn;
```


Ofangreind skipun sækir gögn úr töflunni `vidskiptamenn`. Engar takmarkanir eru setta við því hvaða færslur eru sóttar, þannig að allar færslurnar sem eru í töflunni verða sóttar. Ekki er gerð nein krafa um í hvaða röð færslurnar eiga að koma þannig að þær geta komið í hvaða röð sem er, og röðin getur hæglega breyst frá fyrirspurn til fyrirspurnar.

Fyrirspurnin:


```
SELECT nafn, heimili, postnumer 
FROM vidskiptamenn
WHERE postnumer = '101'
ORDER BY heimili, nafn;
```


myndi hins vegar alltaf skila færslum í röð eftir heimili og innan heimilisfangs í nafnaröð. Einnig takmarkar þessi fyrirspurn færslur við þá sem búa í póstnúmeri 101.

Til þess að útbúa töflur notum við `CREATE` skipunina:


```
CREATE TABLE vidskiptamenn
(vskm_numer varchar(10) CONSTRAINT pk_vskm PRIMARY KEY,
 nafn varchar(100) NOT NULL,
 heimili varchar(100), 
 postnumer char(3)
);
```


Lesstök eins og `CREATE` geta verið hvort heldur sem er í há eða lágstöfum. Hér er búin tafla sem heitir `vidskiptamenn` og sett á hana þau skilyrði að dálkur sem kallast vskm_numer sé aðallykill að færslum í töflunni. Einnig er sett það skilyrði að nafn verður alltaf að vera tilgreint. 

Gögn eru sett inn í töflur með `INSERT` skipunum:


```
INSERT INTO vidskiptamenn (vskm_numer, nafn, heimili, postnumer)
VALUES ('VSK001', 'Nýja Búðin', 'Austurstræti 1', '101');
```


Engin skylda er að lesstök séu með stórum staf, en margir vilja að þau séu áberandi. Gagnatög („gagnatýpurnar“) eins og `CHAR` eða `VARCHAR`, er smekksatriði hvort séu líka með stórum en oft haft með litlum líkt of dálkaheitin.

## Valkostir
Valkostir í stað SQL (sem sumir hverjir virka með sömu SQL gagnagrunnunum því þeir "þýða" yfir í SQL), eru t.d. LINQ,
Java Persistence Query Language (JPQL),
Object Query Language, XQuery og fleiri.
Margir staðlanna eru sögulega áhugaveðir mögulega úreldir eða voru gerðir til að leysa SQL af hólmi en hafa ekki enn gert að nokkru ráði: 
Tutorial D,
Datalog,
IBM Business System 12 (IBM BS12),
QBE (Query By Example) búið til af Moshè Zloof hjá IBM 1977
og Quel (frá 1974; U.C. Berkeley Ingres project).

Til eru svokallaðir NoSQL gagnagrunnar (nýrri en SQL grunnar, en "fræðin" á bak við þá ef svo má kalla, er í einhverjum tilvikum lík "network" grunnum sem SQL/venslagrunnarnir leystu af hólmi), stundum kallaðir *not only SQL*, því sumir "noSQL" grunnar styðja nú líka SQL. Þetta er flokkur mismunandi gagnagrunna (t.d. "key-value" ein tegund og "graph" önnur), sem upphaflega studdu ekki SQL, og hefðbundið innihalda "unstructured" gögn. Sem flokkur hafnaði þessi tegund grunna SQL og að einhverju eða öllu leiti, venslagrunnsfræðum (og "normaliseringu"), sem óþörfum, eða að þau ættu aðeins vel við fyrir gögn á ákvenu formi ("structured" gögn). Uppbygging þeirra er önnur og notendur/forritarar nálgast þá/hanna á annan hátt. T.d. er fyrirspurnamálið (frá þeirra upphafsdögum) ekki SQL, og niðurstaðan úr fyrirspurn í þá hefbundið ekki "tafla" (sem SQL grunnar skila), en getur verið á nokkrum mismunandi formum eftir tegund þeirra, en oftast er boðið upp á eina tegund niðursöðu sem líklegast á JSON (eða álíka) formi. Þar sem SQL fyrirspurnamálið hefur sína kosti, er í auknum mæli að framleiðendur bæti þeim möguleika við. Á sama hátt hafa framleiðendur SQL/venslagrunna bætt við "noSQL" möguleika. Annað hvort einhverju með svipað notagildi eða með sömu forritaskilum (og t.d. MongoDB, einum af vinsælu noSQL grunnunum, einn af upphaflegu). PostgreSQL hefur t.d. bætti við JSON gagnatagi (og JSONB, B fyrir "binary", hliðstætt við BSON í MongoDB).

## Tengill
* Heimasíða MySQL, frjáls SQL-gagnagrunns (líka til sem MariaDB afbrigði)
* Heimasíða PostgreSQL, frjáls SQL-gagnagrunns, sem styður SQL staðla einna best