**SQL** (angle *Structured Query Language*, strukturhava serĉmenda lingvo) estas komputillingvo por rilataj datumbazoj. Ĝia relative malkomplika sintakso similas al tiu de la angla kaj provizas la uzanton per komandoj por la manipulado de datumaroj (kiel aldoni, ŝanĝi kaj forigi datumerojn, strukturigi tabelojn, ktp.) kaj por serĉmendi datumojn. Pro sia kvazaŭa normeco SQL subtenas la sendependecon de programoj disde la datumbazo, kiun ili uzas. La plej multaj el la realigoj de SQL krome ebligas la uzon de aldonaj funkcioj kaj komandoj nenormaj.

Historio
--------

La fundamenton de ĉiuj datumbazoj rilataj kreis en 1970 Edgar F. Codd per sia artikolo *A Relational Model of Data for Large Shared Data Banks* (rilateca modelo de datumoj por grandaj komune uzataj datumbazoj). La artikoloj sekvintaj ĉi-artikolon interalie temis pri la kreo de *rilataj lingvoj*, el kiuj la plej grava estis *Structured English Query Language* aŭ *SEQUEL*, evoluigita en 1974 ĉe IBM. En 1976 oni difinis *SEQUEL/2* kaj alinomis ĝin *SQL* pro leĝaj kialoj. Ties prototipo, *System R*, estis finevoluigita en 1977 kaj jam enhavis la plejparton de SQL.

Pro la sukceso de *System R* poste multaj aliaj firmaoj decidis enkonduki produktojn SQL-kapablajn en la merkaton, interalie

* 1980 Oracle fare de Relational Software Inc.
* 1981 SQL/DS fare de IBM,
* 1983 DB2 fare de IBM,
* 1985 INGRES, kaj
* 1986 SYBASE.

Ene de dek jaroj *SQL* iĝis la laŭfakta normo de datumbazoj.

La *American National Standards Institute* (ANSI) ordonis 1982 la normigon de rilata lingvo, kiun oni subskribis en 1986 (ĉi-tial nomata *SQL/86*) kaj kiun plejparte konsistigis la SQL-dialekto de IBM. En 1987, ĝi ankaŭ estis akceptita kiel ISO-normo; ĝisdatigoj sekvis per *SQL/89*, *SQL/92* kaj *SQL/99*.

Novan version (*SQL:2003*) oni decidis en 2003 en Stokholmo.

Ekzemploj
---------

La komandojn oni partigas en tri kategoriojn:

### Datumdifino

La komandoj por datumdifino estas *CREATE*, *ALTER* kaj *DROP*.

* `CREATE TABLE adresoj (nomo VARCHAR(30), antnomo VARCHAR(40))`

Kreu novan tabelon nomatan *adresoj* kun la kolumnoj *nomo* kaj *antnomo*, kiuj povas enhavi tekstojn ĝis 30 aŭ 40 literojn longajn.
* `ALTER TABLE adresoj ADD COLUMN urbo VARCHAR(30)`

Aldonu kolumnon *urbo* al la tabelo *adresoj*.
* `DROP TABLE adresoj`

Forigu la tutan tabelon *adresoj*.
* `CREATE INDEX indekso_nomo ON adresoj (nomo)`

Kreu indekson nomata *indekso\_nomo* por la tabelo *adresoj* kiu enhavu la liniojn ordigitaj laŭ *nomo*.
* `DROP INDEX indekso_nomo`

Forigu la indekson *indekso\_nomo*.
### Datummanipulado

La komando por serĉmendi estas *SELECT*.

* `SELECT * FROM adresoj WHERE nomo='Schmidt'`

Montru ĉiujn kolumnojn el la tabelo *adresoj*, kies kolumno *nomo* egalas al *Schmidt*.
* `SELECT nomo FROM adresoj ORDER BY nomo`

Montru la kolumnon *nomo* de ĉiuj linioj en la tabelo *adresoj*, kaj ordigu ilin laŭ *nomo*.
* `SELECT COUNT(*) AS nombro_de_adresoj FROM adresoj`

Montru la nombron de linioj en *adresoj* kaj nomu la rezultkolumnon *nombro\_de\_adresoj*.
* `SELECT nomo,COUNT(nomo) FROM adresoj GROUP BY nomo`

Montru ĉiujn unikajn nomojn kune kun iliaj nombroj.
La komandoj por ŝanĝi datumojn estas *INSERT*, *UPDATE* kaj *DELETE*.

* `INSERT INTO adresoj (nomo,antnomo,urbo) VALUES ('Schmidt','Philipp','Hamburg')`

Aldonu linion kies kolumnoj *nomo*, *antnomo*, kaj *urbo* havas la valorojn montratajn en la tabelon *adresoj*.
* `UPDATE adresoj SET urbo='Berlin' WHERE nomo='Schmidt'`

Ŝanĝu la kolumnon *urbo* de ĉiu linio, kies kolumno *nomo* egalas al *Schmidt*.
* `DELETE FROM adresoj WHERE urbo!='London'`

Forigu el la tabelo ĉiujn liniojn, kies kolumno *urbo* malegalas al *London*.
* `DELETE FROM adresoj`

Forigu ĉiujn liniojn el la tabelo *adresoj*.
### Datumkontrolo

La komandoj de datumkontrolo estas *GRANT* kaj *REVOKE*.

* `GRANT SELECT,UPDATE ON TABLE adresoj TO karlo`

Rajtigu la uzanton *karlo* fari mendojn kaj ŝanĝi ekzistantajn liniojn.
* `REVOKE ALL ON TABLE adresoj FROM alia_uzanto`

Malpermesu ĉiujn komandojn al la uzanto *alia\_uzanto*.

SQL-datumbazoj
--------------

* Microsoft Access
* MySQL
* PostgreSQL
* Oracle

kaj krome ankaŭ

* Adabas
* DB2
* dBase IV
* Firebird
* GUPTA
* Informix
* INGRES
* InterBase
* JetSQL
* Microsoft SQL Server
* MaxDB (antaŭe SAP DB)
* Progress (datumbazo kaj 4GL)
* SQLite
* SYBASE
* T-SQL
* Teradata

Eksteraj ligiloj
----------------

* Kategorio SQL en la Vikimedia Komunejo (Multrimedaj datumoj)

* Comparison of Different SQL Implementations – la komparo diversajn SQL efektiviĝojn: SQL:2008, PostgreSQL, DB2, MS SQL Server, MySQL, Oracle kaj Informix (angle)

Vidu ankaŭ
----------

* NoSQL