„SQL“: Munur á milli breytinga

Efni eytt Efni bætt við
Comp.arch (spjall | framlög)
Ekkert breytingarágrip
Comp.arch (spjall | framlög)
"Ingres project", g.r.f. að "prjoect sé ekki hluti af nafninu (væri þá með stórum staf?) og þýði bara. Mun fleiri staðlar taldir upp á ensku SQL síðunni, en ég tók bara það helsta og ekki í stafrófsröð. Færa OQL?
Lína 1:
'''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 [[gagnagrunnur|gagnagrunnum]]. Málið er [[ANSI]] og [[ISO]] [[staðall|staðlað]] en framleiðendur gagnagrunnskerfa útfæra SQL oft á mismunandi hátt, stundum með því að útfæra ekki allt sem staðallinn skilgreinir, og stundum með því að bæta við eiginleikum sem ekki eru tilgreindir í staðlinum. Auk þess bjóða margir framleiðendur gagnagrunnskerfa sérstök stefjumál mál svo sem [[Transact-SQL]] fyrir Microsoft SQL Server, [[PL/SQL]] fyrir Oracle og [[PostgreSQL]] hefur mál, [[PL/pgSQL]], keimlíkt þeirra. Líka hefur mál, [[SQL/PSM]], verið staðlað. Þessi mál eru stundum notuð til að búa til föll og stefjur sem keyra í grunninum sjálfum.
 
Auk grunn SQL bjóða margir framleiðendur gagnagrunnskerfa sérstök stefjumál mál svo sem [[Transact-SQL]] fyrir Microsoft SQL Server, [[PL/SQL]] fyrir Oracle og [[PostgreSQL]] hefur mál, [[PL/pgSQL]], keimlíkt þeirra. Líka hefur mál, [[SQL/PSM]], verið staðlað. Þessi mál eru stundum notuð til að búa til föll og stefjur sem keyra í grunninum sjálfum. [[IBM Db2]] hefur eigið mál, sem er líkt þeim staðli. Sumir grunnar, hafa ekki haft stefjumál um árabil, enda er hægt í flestum tilvikum að komast hjá því að nota, og nota grunn SQL eingöngu. Þetta átti við um MySQL, sem á endanum fékk stefjumál.
 
SQL málið er [[ANSI]] og [[ISO]] [[staðall|staðlað]] (fyrst staðlað 1986, svo í mörgum útgáfum: t.d. SQL-92, þá án t.d. stefjumálsins). Framleiðendur gagnagrunnskerfa útfæra SQL oft á mismunandi hátt (flest kerfi uppfylla SQL-92 hið minnsta, en sennilega nær enginn nýjustu staðla fá að fullu upp í SQL:2016), jafnvel sama gamla staðalinn eða hafa hið minnsta ekki tekið inn nýlegar breytingar, og stundum með því að bæta við eiginleikum sem ekki eru tilgreindir í stöðlunum (sem gerir færanleika forrita milli gagnagrunna erfiðan, hið minnsta ef nýlegir fídusar eru notaður sem aðrir hafa ekki enn uppfyllt).
 
SQL notast við þrígilda lógik (e. ''three-valued logic'' (3VL) ''(true/false/unknown)'')<!-- or Boolean truth values and are used to limit the effects of statements and queries, or to change program flow.--> þ.e. ekki "[[Rökaðgerð|Boolean]]" (ísl. ''Búlska'') lógík (eingöngu), sem notast bara við ''satt'' og ''ósatt''. Þriðju möguleikinn, sá "óþekkti", sem er ekki í Boolean lógík, gengur undir nafninu NULL í SQL. Þ.e. hægt er að athuga sem dæmi, ekki aðeins er_í_sambúð = true, eða er_í_sambúð = false (sumir grunnar leyfa t.d. 't' og 'f' í stað true og false), heldur líka er_í_sambúð IS NULL (eða er_í_sambúð IS NOT NULL), og fá þannig fram þá sem ekki er vitað um (eða hefur ekki enn verið skráð um í gagnagrunninn). Í mörgm tilvikum viljum við ekki þurfa að huga að þeim möguleika, sem flækir réttar fyrirspurnir; þá þvingum við fram að ekki sé hægt að skrá NULL (sem sjálfgefið gildi ef ekki talið upp í INSERT skipun, en skilar annars villu með þessum fyrirvara, sem forrit ætti að grípa), til að byrja með, í viðkomandi svæði í grunninum, með því að skilgreina þau sem NOT NULL í CREATE skipun (eða breyta eftirá með ALTER). NOT NULL er sjálfgefið fyrir PRIMARY KEY svæði, svæði sem töflur ættu að hafa skilgreint (annars er réttleiki ekki tryggður). Einnig er hægt að skilgreina önnur einkvæm svæði með UNIQUE skigreiningu.
 
Flestir SQL gagnagrunnar eru "strang-tagaðir", ein af fáum undantekningum er [[SQLite]]. Hann er líka sérhæfður "embedded" gagnagrunnur (látinn fylgja með öðrum forritum, jafnvel stýrikerfum, sem nota, t.d. macOS í tilfelli SQLite), ekki hugsaður sem "fjölnotenda" (ólíkt flestum SQL grunnum), þ.e. hver grunnur er ekki notaður af mörgum notendum í einu. Hins vegar er eitt eintak keyrandi t.d. í mörgum vöfrum, og þar með t.d. í nær öllum smartsímum, svo samanlagður notendafjöldi er himinhár og SQLite vinsælasti gagnagrunnur í heimi, meira notaður en þessir hefbundu (sem eru t.d. notaðir af bönkum út um allan heim).
 
== 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ð).<!--SQL statements also include the semicolon (";") statement terminator. Though not required on every platform, it is defined as a standard part of the SQL grammar.-->
 
Dæmi um mjög einfalda SQL skipun er
Lína 8 ⟶ 16:
<pre>
SELECT nafn, heimili, postnumer
FROM vidskiptamenn;
</pre>
 
Lína 19 ⟶ 27:
FROM vidskiptamenn
WHERE postnumer = '101'
orderORDER byBY heimili, nafn;
</pre>
 
Lína 29 ⟶ 37:
CREATE TABLE vidskiptamenn
(vskm_numer varchar(10) CONSTRAINT pk_vskm PRIMARY KEY,
nafn varchar(100) notNOT nullNULL,
heimili varchar(100),
postnumer char(3)
);
</pre>
 
Lína 41 ⟶ 49:
<pre>
INSERT INTO vidskiptamenn (vskm_numer, nafn, heimili, postnumer)
VALUES ('VSK001', 'Nýja Búðin', 'Austurstræti 1', '101');
</pre>
 
Engin skylda er að lykilorðin séu með stórum staf, en margir vilja að þau séu áberandi. Gagnatögin ("gagnatýpurnar") t.d. CHAR or VARCHAR (strangt til tekið ekki lykilorð), er smekksatriði hvort séu líka með stórum en oft haft með litlum líkt of dálkaheitin. Flestir grunnar hafa VARCHAR, alla vega undir öðru nafni, en t.d. nafn hér að ofan geymir þannig ekki alltaf jafn mörg bæti til að spara pláss, á meðan CHAR fyllir upp í aftan á strengi með bilum og eyðir diskplássi. Sumir grunnar, t.d. PostgreSQL, leyfa að skilgreina ný gagnatög; sem dæmi gæti "[[kennitala]]" verið notað í stað char(10), sem þó er mjög algengt að nota (en aldrei gagnatag fyrir tölur, því þær tína núllum framan af "textastrengjum"). Meira gagnleg ný gagnatög væri POINT (sem geymir x, y eða x, y og z), ekki af því að miklu máli skiptir að geyma hnit sem "object" upp á hraða við t.d. skráningu, eða að sem object tækju gögn minna pláss (gerir það sennilega ekki), heldur í sumum grunnum, eru til dæmis indexar á meira en gögn í einni vídd. Það getur skipt miklu máli við uppflettingu á gögnum í sérhæfðum kerfum, t.d. landupplýsingakerfum.
 
== Valkostir ==
Valkostir í stað SQL (sem sumir hverjir virka með sömu SQL gagnagrunnunum því þeir "þýða" yfir í SQL), eru t.d. LINQ<!--: Runs SQL statements written like language constructs to query collections directly from inside .Net code.-->,
Java Persistence Query Language (JPQL)<!--: The query language used by the Java Persistence API and Hibernate persistence library-->,
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<!--: critics suggest that Datalog has two advantages over SQL: it has cleaner semantics, which facilitates program understanding and maintenance, and it is more expressive, in particular for recursive queries.-->,
IBM Business System 12 (IBM BS12)<!--: one of the first fully relational database management systems, introduced in 1982-->,
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 ==
* [https://www.mysql.com/ Heimasíða MySQL], frjáls SQL-gagnagrunns (líka til sem MariaDB afbrigði)
* [https://www.postgresql.org/ Heimasíða PostgreSQL], frjáls SQL-gagnagrunns, sem styður SQL staðalstaðla einna best <!-- er MySQL
 
[[Flokkur:SQL]]