# Structured Query Language

SQL (Structured Query Language o Llenguatge d'interrogació estructurat) és un llenguatge estàndard de comunicació amb bases de dades relacionals. És a dir, un llenguatge normalitzat que permet treballar amb la majoria de bases de dades relacionals. L'SQL es pot hostatjar (es pot utilitzar) dins d'altres llenguatges de programació. La principal característica d'aquest llenguatge és la seua simplicitat, ja que amb pocs coneixements es poden fer consultes bàsiques sobre una base de dades, encara que no per això deixa de ser un llenguatge complet, tant relacionalment com computacionalment (a partir de la versió SQL3 publicada el 1999).
El llenguatge SQL es pot dividir en tres conjunts d'instruccions o sentències segons la seva funció:
* Les sentències de definició (DDL Data Definition Language) permeten crear, modificar i esborrar estructures de dades.
* Les sentències de manipulació (DML Data Manipulation Language) permeten llegir, inserir, modificar i esborrar registres.
* Les sentències de control (DCL Data Control Language) permeten finalitzar o rebutjar transaccions i autoritzar o revocar els permisos dels usuaris.
L'SQL també estandarditza les sentències que s'utilitzen per hostatjar-se dins d'altres llenguatges.

## Orígens i evolució

Els orígens de l'SQL estan lligats a les bases de dades relacionals. El 1970 Codd proposa el model relacional, i associat a aquest un subllenguatge d'accés a les dades basat en el càlcul de predicats. A partir d'aquestes idees els laboratoris d'IBM defineixen el llenguatge SEQUEL (Structured English QUEry Language) que més tard fou àmpliament implementat pel SGBD experimental System R, desenvolupat el 1977 també per IBM. Tot i així, va ser Oracle qui el va introduir per primer cop el 1979 en un programa comercial.
El SEQUEL acabà sent el predecessor de SQL, que n'és una versió evolucionada. El SQL passa a ser el llenguatge per excel·lència dels diversos SGBD relacionals sorgits als anys següents i per fi és estandarditzat el 1986 per l'ANSI, donant lloc a la primera versió estàndard d'aquest llenguatge, el SQL-86 o SQL1. L'any següent aquest estàndard és adoptat per l'ISO.
Tot i així aquest primer estàndard no cobreix totes les necessitats dels desenvolupadors i inclou funcionalitats de definició d'emmagatzematges que es consideren eliminar. Així el 1992 es llença un nou estàndard ampliat i revisat d'SQL anomenat SQL-92 o SQL2.
Actualment SQL és l'estàndard de facto de la immensa majoria dels SGBD comercials. I, tot i que creix la diversitat de complements particulars que inclouen les diferents implementacions comercials del llenguatge, el suport estàndard SQL-92 és general i molt ampli.
L'ANSI SQL va sofrir diverses revisions i ampliacions al llarg del temps:
| Any | Nom | Àlies | Comentaris |
| 1986 | SQL-86 | SQL-87 | Primera publicació feta per ANSI. Confirmada per l'ISO el 1987 |
| 1989 | SQL-89 | FIPS 127-1 | Revisió menor |
| 1992 | SQL-92 | SQL2, FIPS 127-2 | Revisió major (ISO 9075) |
| 1999 | SQL:1999 | SQL3 | Es van afegir expressions regulars, consultes recursives (per relacions jeràrquiques), triggers i algunes característiques orientades a objectes |
| 2003 | SQL:2003 | | Introdueix algunes característiques d'XML, canvis en les funcions, estandardització de l'objecte sequence i de les columnes auto-numèriques. (Vegeu Eisenberg et al.: SQL:2003 Has Been Published.) |
| 2006 | SQL:2006 | | ISO/IEC 9075-14:2006 Defineix les maneres en les quales l'SQL es pot utilitzar conjuntament amb XML. Defineix maneres d'importar i desar dades XML en una base de dades SQL, manipulant-les dins de la base de dades i publicant l'XML i les dades SQL convencionals en forma XML. A més, proporciona facilitats que permeten a les aplicacions integrar dins del seu codi SQL l'ús de XQuery, llenguatge de consulta XML publicat pel W3C (World Wide Web Consortium) per a accés concurrent a dades ordinàries SQL i documents XML. |

## Característiques generals

SQL és un llenguatge d'accés a bases de dades que explota la flexibilitat i potència dels sistemes relacionals cosa que permet de fer-hi una gran varietat d'operacions.
És un llenguatge declaratiu d'alt nivell o de no procediment, que gràcies a la seva forta base teòrica i la seva orientació a la gestió de conjunts de registres, i no a registres individuals, permet una altra productivitat de codificació. D'aquesta forma una sola sentència pot equivaldre a un o més programes que utilitzessin un llenguatge de baix nivell orientat a registre.

### Funcionalitat

SQL proporciona una rica funcionalitat més enllà de la simple consulta (o recuperació) de dades. Assumeix el paper de llenguatge de definició de dades (LDD), llenguatge de definició de vistes (LDV) i llenguatge de manipulació de dades (LMD). A més permet la concessió i denegació de permisos, la implementació de restriccions d'integritat i controls de transacció i l'alteració d'esquemes.
Les primeres versions de SQL incloïen funcions pròpies de llenguatge de definició d'emmagatzematge (LDA) però van ser suprimides pels estàndard més nous a fi de mantenir els estàndards més nous amb l'objectiu de mantenir el llenguatge només a nivell conceptual i extern.

### Modes d'ús

El SQL permet dos modes d'ús:
* Un ús interactiu, destinat principalment als usuaris finals avançats o ocasionals, en el que les diverses sentències SQL s'escriuen i s'executen a la línia d'ordres, o un entorn semblant.
* Un ús integrat, destinat a l'ús per part dels programadors dins de programes escrits en qualsevol llenguatge de programació amfitrió. En aquest cas SQL agafa el paper de subllenguatge de dades.
En el cas de fer un ús incrustat del llenguatge podem usar dues tècniques de programació. En una, en la que el llenguatge s'anomena SQL estàtic, les sentències usades no canvien durant l'execució del programa. En l'altra, on el llenguatge rep el nom de SQL dinàmic, es produeix una modificació total o parcial de les sentències en el transcurs de l'execució del programa.
La utilització de SQL dinàmic permet més flexibilitat i més complexitat en les sentències, però com a contrapunt obtenim una eficiència menor i l'ús de tècniques de programació més complexes en la gestió de memòria i variables.

### Optimització

Com ja s'ha comentat, i com sol ser comú en els llenguatges d'accés a bases de dades d'alt nivell, SQL és un llenguatge declaratiu. Això vol dir que especifica que és el que es necessita i no com aconseguir-ho, per tant una sentència no estableix explícitament una ordre d'execució.
L'ordre d'execució intern d'una sentència pot afectar greument l'eficiència del SGBD, per tant es fa necessari que aquest porti a terme una optimització abans de l'execució d'aquesta. Moltes vegades, l'ús d'índexs accelera una instrucció de consulta, però alenteix l'actualització de les dades. Depenent de l'ús de l'aplicació, es donarà prioritat a l'accés indexat o a una ràpida actualització de la informació. L'optimització varia sensiblement a cada motor de base de dades i depèn de molts factors.
Hi ha una ampliació de SQL coneguda com a FSQL (Fuzzy SQL, SQL difús) que permet l'accés a bases de dades difuses, usant la lògica difusa. Aquest llenguatge ha sigut implementat a nivell experimental i està evolucionant ràpidament.

## Llenguatge de definició de dades (DDL)

El llenguatge de definició de dades (en anglès Data Definition Language, o DDL), és el que s'encarrega de la modificació de l'estructura dels objectes de la base de dades. Existeixen quatre operacions bàsiques: CREATE, ALTER, DROP i TRUNCATE.

### CREATE (Crear)

Aquesta ordre permet crear objectes de dades, com noves bases de dades, taules, vistes i procediments emmagatzemats.

#### Exemple (crear una taula)
### ALTER (Alterar)

Aquesta ordre permet modificar l'estructura d'una taula o objecte. Es poden afegir/treure camps a una taula, modificar el tipus d'un camp, afegir/treure índexs a una taula, modificar un trigger, etc.

#### Exemple (afegir columna a una taula)
### DROP (Eliminar)

Aquesta ordre elimina un objecte de la base de dades. Pot ser una taula, vista, índex, trigger, funció, procediment o qualsevol objecte que el motor de la base de dades suport. Es pot combinar amb la sentència ALTER.

#### Exemple
### TRUNCATE (Truncar)

Aquesta ordre només s'aplica a taules i la seva funció és esborrar el contingut complet de la taula especificada. L'avantatge sobre l'ordre DELETE, és que si es vol esborrar tot el contingut de la taula, és molt més ràpid, especialment si la taula és molt gran. El desavantatge és que TRUNCATE només serveix quan es vol eliminar absolutament tots els registres, ja que no es permet la clàusula WHERE. Si bé, al principi, aquesta sentència semblaria ser DML (Llenguatge de Manipulació de Dades), és en realitat una DDL, ja que internament, l'ordre TRUNCATE esborra la taula i la torna a crear i no executa cap transacció.

## Disparadors

Els disparadors, també coneguts com a desencadenants (triggers), són definits sobre la taula dins la que opera la sentència INSERT. Els desencadenants són avaluats en el context de l'operació. Els desencadenants BEFORE INSERT, permeten la modificació dels valors que insertarem a la taula. Els desencadenants AFTER INSERT, no poden modificar dades en endavant, però es poden utilitzar per iniciar accions en altres taules, com per exemple per aplicar mecanismes d'auditoria.

## Extensions de procediment

SQL està dissenyat per a un propòsit específic: consultar dades contingudes en una base de dades relacional. SQL és un llenguatge de programació declaratiu basat en conjunt, no un llenguatge de programació imperatiu com C o BASIC. No obstant això, les extensions a l'SQL estàndard afegeixen funcionalitat de llenguatge de programació procedimental, com ara construccions de control de flux.
A més de les extensions SQL/PSM estàndard i les extensions SQL pròpies, la programabilitat procedimental i orientat a objectes està disponible en moltes plataformes SQL mitjançant la integració de DBMS amb altres llenguatges. L'estàndard SQL defineix extensions SQL/JRT (Rutines i tipus SQL per al llenguatge de programació Java) per donar suport al codi Java a les bases de dades SQL. Microsoft SQL Server 2005 utilitza SQLCLR (SQL Server Common Language Runtime) per allotjar conjunts gestionats .NET a la base de dades, mentre que versions anteriors de SQL Server estaven restringits a procediments emmagatzemats ampliats no gestionats escrits principalment en C. PostgreSQL permet als usuaris escriure funcions en una gran varietat d'idiomes, inclosos Perl, Python, Tcl, JavaScript (PL/V8) i C.

## Interoperabilitat

El llenguatge de consultes dels diferents sistemes de gestió de bases de dades són incompatibles entre ells i no necessàriament segueixen completament l'estàndard. En particular, la sintaxi de data i temps, la concatenació de cadenes, nul·les, i la comparació de textos quant al tractament de majúscules i minúscules varien d'un proveïdor a un altre. Una excepció particular és PostgreSQL, que s'esforça per assolir el compliment de l'estàndard.
Les implementacions populars de SQL ometen comunament suport per a funcions bàsiques de SQL estàndard, com la dels tipus de dada DATE o TIME. És el cas del manejador de bases de dades d'Oracle (el tipus del qual DATE es comporta com DATETIME, i no té un tipus TIME) i MS SQL Server (abans de la versió del 2008). Com a resultat, el codi SQL poques vegades pot ser portat entre els sistemes de base de dades sense modificacions.
Hi ha diverses raons per a aquesta manca de portabilitat entre sistemes de bases de dades:
* La complexitat i la mida de l'estàndard SQL fa que la majoria de les implementacions de SQL no siguin compatibles amb la norma completa.
* La norma no especifica el comportament de la base de dades en diverses àrees importants (per exemple, índexs, emmagatzematge de fitxers, etc.), deixant a les implementacions decidir com comportar-se.
* L'estàndard SQL especifica amb precisió la sintaxi que un sistema de base de dades conforme ha d'implementar. Tanmateix, no està tan ben definida l'especificació a l'estàndard de la semàntica de les construccions del llenguatge, cosa que porta a ambigüitat.
* Molts proveïdors de bases de dades tenen grans bases de clients existents, per la qual cosa introduir canvis per adaptar-se l'estàndard podria produir incompatibilitats a les instal·lacions dels usuaris i el proveïdor pot no estar disposat a abandonar la compatibilitat amb versions anteriors.
* Hi ha poc incentiu comercial perquè un proveïdor faciliti als usuaris canviar de proveïdor de bases de dades.
* Els usuaris que avaluen el programari de base de dades tendeixen a valorar més altres factors com ara el rendiment més alt a les seves prioritats sobre les conformitat a l'estàndard.
L'estàndard ODBC (Open Database Connectivity) permet accedir a la informació des de qualsevol aplicació independentment del sistema de gestió de base de dades (DBMS) en què estigui emmagatzemada la informació, desacoblant així l'aplicació de la base de dades.

## Vegeu també

* IBM DB2
* Join (SQL)
* Microsoft SQL Server
* MySQL
* Oracle
* PostgreSQL
* SQLite

## Referències

* ↑ Rockoff, Larry. Course Technology/Cengage Learning. The language of SQL, 2011.
* ↑ «PostgreSQL server programming». PostgreSQL 9.1 official documentation. postgresql.org, 2011. [Consulta: 9 març 2012].
* ↑ «About PostgreSQL». PostgreSQL 9.1 official website, 2012. [Consulta: 8 juny 2016]. «PostgreSQL prides itself in standards compliance. Its SQL implementation strongly conforms to the ANSI-SQL:2008 standard»
* ↑ «Basic Elements of Oracle SQL: Data Types». A: Oracle Database SQL Language Reference 11g Release 2 (11.2).

## Bibliografia

* Codd, Edgar F «A Relational Model of Data for Large Shared Data Banks». Communications of the ACM, vol. 13, 6, 01-06-1970, pàg. 377–87. DOI: 10.1145/362384.362685.
* Discussion on alleged SQL flaws (C2 wiki)
* C. J. Date with Hugh Darwen: A Guide to the SQL standard : a users guide to the standard database language SQL, 4th ed., Addison Wesley, USA 1997, ISBN 978-0-201-96426-4