SQL

**SQL** (poles sos sigles n'inglés **Structured Query Language**; n'asturianu **llinguaxe de consulta estructurada**) ye un llinguaxe específicu del dominiu que da accesu a un sistema de xestión de bases de datos rellacionales que dexa especificar diversos tipos d'operaciones nellos. Una de les sos carauterístiques ye'l manexu del álxebra y el cálculu relacional que dexen efectuar consultes col fin de recuperar, de forma senciella, información de bases de datos, según faer cambeos nelles.

Orixinalmente basáu na álxebra relacional y nel cálculu relacional, SQL consiste nun llinguaxe de definición de datos, un llinguaxe de manipulación de datos y un llinguaxe de control de datos. L'algame de SQL inclúi l'insertamientu de datos, consultes, actualizaciones y borráu, la creación y cambéu d'esquemes y el control d'accesu a los datos. Tamién el SQL dacuando descríbese como un llinguaxe declarativo, tamién inclúi elementos procesales.

SQL foi unu de los primeros llinguaxes comerciales pal modelu relacional d'Edgar Frank Codd como se describió nel so papel de 1970 *El modelu relacional de datos pa grandes bancos de datos compartíos*. A pesar de nun xuntase totalmente al modelu relacional descritu por Codd, pasó a ser el llinguaxe de base de datos más usáu.

SQL pasó a ser l'estándar del Institutu Nacional d'Estándares d'Estaos Xuníos (ANSI) en 1986 y de la Organización Internacional de Normalización (ISO) en 1987. De magar, l'estándar foi revisáu pa incluyir más carauterístiques. A pesar de la esistencia de dambos estándares, la mayoría de los códigos SQL nun son dafechu portables ente sistemes de bases de datos distintos ensin axustes.

## Oríxenes y evolución
Los oríxenes de SQL tán amestaos a les bases de datos de les pc o móvil entá a los de les bases de datos rellacionales. En 1970 Y. F. Codd propón el modelu relacional y acomuñáu a este un sublenguaje d'accesu a los datos basáu nel cálculu de predicaos. Basándose nestes idees, los llaboratorios d'IBM definieron el llinguaxe SEQUEL (Structured English Query Language) que más tarde foi llargamente implementáu pol sistema de xestión de bases de datos (SGBD) esperimental System R, desenvueltu en 1977 tamién por IBM. Sicasí, foi Oracle quien lo introdució per primer vegada en 1979 nun productu comercial.

El SEQUEL terminó siendo'l predecesor de SQL, que ye una versión evolucionada del primeru. SQL pasa a ser el llinguaxe por excelencia de los diversos sistemes de xestión de bases de datos relacionales surdíos nos años siguientes y foi por fin estandarizado en 1986 pol ANSI, dando llugar a la primer versión estándar d'esti llinguaxe, "SQL-86" o "SQL1". Al añu siguiente esti estándar ye tamién adoptáu por ISO.

Sicasí, esti primer estándar nun cubrir toles necesidaes de los desarrolladores ya incluyía funcionalidades de definición d'almacenamientu que consideró suprimise les. Asina que, en 1992, llanzóse un nuevu estándar ampliáu y revisáu de SQL llamáu "SQL-92" o "SQL2".

Na actualidá SQL ye l'estándar *de facto* de la inmensa mayoría de los SGBD comerciales. Y, anque la diversidá d'agregos particulares qu'inclúin les distintes implementaciones comerciales del llinguaxe ye amplia, el soporte al estándar SQL-92 ye xeneral y bien ampliu.

El ANSI SQL sufrió delles revisiones y amestaos a lo llargo del tiempu:

## Carauterístiques xenerales de SQL
SQL ye un llinguaxe d'accesu a bases de datos qu'esplota la flexibilidá y potencia de los sistemes relacionales y dexa asina gran variedá d'operaciones.

Ye un llinguaxe declarativo de "altu nivel" o "de non procedimientu" que, gracies a la so fuerte base teórica y la so orientación al manexu de conxuntos de rexistros —y non a rexistros individuales— dexa una alta productividá en codificación y l'orientación a oxetos. D'esta forma, una sola sentencia puede equivalir a unu o más programes que s'utilizaríen nun llinguaxe de baxu nivel empobináu a rexistros.
SQL tamién tien les siguientes carauterístiques:

* **Llinguaxe de definición de datos**: El LDD de SQL apurre comandos pa la definición d'esquemes de rellación, borráu de rellaciones y cambeos de los esquemes de rellación.
* **Llinguaxe interactivo de manipulación de datos**: El LMD de SQL inclúi llinguaxes de consultes basáu tantu n'álxebra relacional como en cálculu relacional de tuplas.
* **Integridá**: El LDD de SQL inclúi comandos pa especificar les restricciones d'integridá que tienen de cumplir los datos almacenaos na base de datos.
* **Definición de vistes**: El LDD inclúi comandos pa definir les vistes.
* **Control de transaiciones**: SQL tien comandos pa especificar l'empiezu y el final d'una transaición.
* **SQL incorporáu y dinámicu**: Esto quier dicir que pueden incorporase instrucciones de SQL en llinguaxes de programación como: C++, C, Java, PHP, Cobol, Pascal y Fortran.
* **Autorización**: El LDD inclúi comandos pa especificar los derechos d'accesu a les rellaciones y a les vistes.

### Tipos de datos
Dalgunos de los tipos de datos básicos de SQL son:

* **Varchar**: Recibe cadena de pallabres compuestes de lletres, númberos y calteres especiales.
* **Date**: una fecha de calendariu que contién l'añu (de cuatro cifres), el mes y el día.
* **Time**: La hora del día n'hores, minutos y segundos (el valor predetermináu ye 0).
* **Datetime**: la combinación de Date y Time.

### Optimización
Como yá se dixo antes, y suel ser común nos llinguaxes d'accesu a bases de datos d'altu nivel, SQL ye un llinguaxe declarativo. Esto ye, qu'especifica qué ye lo que se quier y non cómo consiguilo, polo qu'una sentencia nun establez explícitamente un orde d'execución.

L'orde d'execución internu d'una sentencia puede afectar seriamente a la eficiencia del SGBD, polo que se fai necesariu qu'ésti lleve a cabu una optimización antes de la so execución. Munches vegaes, l'usu d'índices acelera una instrucción de consulta, pero ralentiza l'actualización de los datos. Dependiendo del usu de l'aplicación, va priorizase l'accesu indexado o una rápida actualización de la información. La optimización difier sensiblemente en cada motor de base de datos y depende de munchos factores.

Esiste una ampliación de SQL conocida como FSQL (Fuzzy SQL, SQL difusu) que dexa l'accesu a bases de datos difuses, usando la lóxica difusa. Esti llinguaxe foi implementáu a nivel esperimental y ta evolucionando rápido.

## Llinguaxe de definición de datos (DDL)
El llinguaxe de definición de datos (n'inglés *Data Definition Language*, o *DDL*), ye'l que s'encarga del cambéu de la estructura de los oxetos de la base de datos. Inclúi órdenes pa modificar, borrar o definir les tables nes que s'almacenen los datos de la base de datos. Esisten cuatro operaciones básiques: CREATE, ALTER, DROP y TRUNCATE.

### CREATE | CREAR
Esti comandu dexa crear oxetos de datos, como nueves bases de datos, tables, vistes y procedimientos almacenaos.
;Exemplu (crear una tabla)

```sql
CREATE TABLE 'CUSTOMERS';
```


### ALTER | MODIFICAR
Esti comandu dexa modificar la estructura d'una tabla o oxetu. Pueden amestase/quitar campos a una tabla, modificar el tipu d'un campu, amestar/quitar índices a una tabla, modificar un trigger, etc.
;Exemplu (amestar columna a una tabla)

```sql
ALTER TABLE 'ALUMNOS' ADD EDÁ INT UNSIGNED;
```


### DROP | ESANICIAR
Esti comandu esanicia un oxetu de la base de datos. Puede ser una tabla, vista, índiz, trigger, función, procedimientu o cualquier oxetu que'l motor de la base de datos soporte. Puede combinase cola sentencia ALTER.

;Exemplu 
 DROP TABLE 'ALUMNOS';
 

### TRUNCATE | BORRAR TABLA
Esti comandu ataya tol conteníu d'una tabla. La ventaya sobre'l comandu DROP, ye que si se quier borrar tol conteníu de la tabla, ye muncho más rápido, especialmente si la tabla ye bien grande. La desventaxa ye que TRUNCATE namái sirve cuando quier esaniciase absolutamente tolos rexistros, yá que nun se dexa la cláusula WHERE. Magar, nun principiu, esta sentencia paecería ser DML (Llinguaxe de Manipulación de Datos), ye en realidá una DDL, yá que internamente, el comandu TRUNCATE borra la tabla y volver a crear y nun executa nenguna transaición.

;Exemplu 
 TRUNCATE TABLE 'NOME_TABLA';


## Llinguaxe de manipulación de datos DML(Data Manipulation Language)

### Definición
Un llinguaxe de manipulación de datos (*Data Manipulation Language*, o *DML* n'inglés) ye un llinguaxe proporcionáu pol sistema de xestión de base de datos que dexa a los usuarios llevar a cabu les xeres de consulta o manipulación de los datos, entamaos pol modelu de datos fayadizu.

El llinguaxe de manipulación de datos más popular güei día ye SQL, usáu pa recuperar y manipoliar datos nuna base de datos relacional.

### SELECT | ESCOYER
La sentencia **SELECT** déxanos consultar los datos almacenaos nuna tabla de la base de datos.

#### Forma básica
**<code>SELECT </code>**`['''ALL | DISTINCT ''']<br />
 <''nome_campu''> [{,<''nome_campu''>}]<br />
 '''FROM''' <''nome_tabla''>|<''nome_vista''> <br />
 [{,<''nome_tabla''>|<''nome_vista''>}]<br />
 ['''WHERE''' <''condición''> [{ '''AND'''|'''OR''' <condición>}]]<br />
 ['''GROUP BY '''<''nome_campu''> [{,<''nome_campu'' >}]]<br />
 ['''HAVING''' <''condición''>[{ '''AND'''|'''OR''' <condición>}]]<br />
 ['''ORDER BY''' <''nome_campu''>|<índiz_campu> ['''ASC''' | '''DESC''']<br />
 [{,<''nome_campu''>|<índiz_campu> ['''ASC''' | '''DESC''' ]}]]`

Exemplu:

Pa formular una consulta a la tabla Coches y recuperar los campos matricula, marca, modelu, color, numberu_kilometros, num_places tenemos d'executar la siguiente consulta. Los datos van ser devueltos ordenaos por marca y por modelu n'orde ascendente, de menor a mayor. La pallabra clave **FROM** indica que los datos van ser recuperaos de la tabla Coches.

 `'''SELECT''' matricula, marca, modelu, color, numberu_kilometros, num_places
 '''FROM''' Coches
 '''ORDER BY''' marca,modelu;`

Exemplu de Consulta simplificada al traviés d'un comodín de Campos (*):

L'usu del asteriscu indica que queremos que la consulta devuelva tolos campos qu'esisten na tabla y los datos van ser devueltos ordenaos por marca y por modelu.
 `'''SELECT''' * '''FROM''' Coches '''ORDER BY''' marca, modelu;`

#### Cláusula WHERE
La cláusula* WHERE* ye la instrucción que nos dexa penerar la resultancia d'una sentencia **SELECT**. Davezu nun deseyamos llograr tola información esistente na tabla, sinón que queremos llograr namái la información que nos resulte preséu nesi momentu. La cláusula **WHERE** penera los datos antes de ser devueltos pola consulta. Cuando na cláusula WHERE queremos incluyir un tipu testu, tenemos d'incluyir el valor ente comines simples.

Exemplos:

Nel nuesu exemplu, deseyar consultar un coche en concretu, pa esto amestóse una cláusula **WHERE**. Esta cláusula especifica una o delles condiciones que tienen de cumplise por que la sentencia **SELECT** devuelva los datos. Nesti casu la consulta va devolver namái los datos del coche con matrícula por que la consulta devuelva namái los datos del coche con matrícula `MF-234-ZD `o bien la matrícula `FK-938-ZL` . Puede utilizase la cláusula **WHERE** solamente, ó en combinación con tantes condiciones como queramos.

 `'''SELECT''' matricula, marca, modelu, color, numberu_kilometros, num_places
 '''FROM''' Coches<br />
 '''WHERE''' matricula = 'MF-234-ZD'
 '''OR''' matricula = 'FK-938-ZL' ;`

Una Condición WHERE pue ser negada al traviés del Operador Lóxicu NOT. La Siguiente consulta va devolver tolos datos de la tabla Coches, menos el que tenga la Matrícula `MF-234-ZD` .

 `'''SELECT''' matricula, marca, modelu, color, numberu_kilometros, num_places
 '''FROM''' coches
 '''WHERE NOT''' matricula = 'MF-234-ZD';`

La Siguiente consulta utiliza la condicional **DISTINCT**, que va devolvenos tolos valores distintos formaos pelos Campos *Marca y Modelu*. de la tabla *coches*.
 **SELECT DISTINCT** marca, modelu **FROM** coches;

#### Cláusula ORDER BY
La cláusula* ORDER BY* ye la instrucción que nos dexa especificar l'orde nel que van ser devueltos los datos. Podemos especificar la ordenación ascendente o descendente al traviés de les pallabres clave **ASC **y **DESC**. La ordenación depende del tipu de datos qu'esti definíu na columna, de forma que un campu numbérico va ser ordenáu como tal, y un alfanumbéricu va ordenar de l'A a la Z, anque'l so conteníu sía numbéricu. El valor predeterminado ye ASC si nun s'especifica al faer la consulta.

Exemplos:

***'SELECT''' '''matricula, <br /> marca, <br /> modelu, <br /> color, <br /> numberu_kilometros, <br /> num_places <br />
***'FROM***' coches<br />
***'ORDER BY***' marca ***'ASC***', modelu ***'DESC***';
Esti exemplu, escueye tolos campos matricula, marca, modelu, color, numberu_kilometros y num_places de la tabla coches, ordenar pelos campos marca y modelu, marca en forma ascendente y modelu en forma descendente.
 ***'SELECT** **matricula,  marca,  modelu,  color,  numberu_kilometros, num_places 
 ***'FROM***' coches
 ***'ORDER BY***' 2;

Esti exemplu, escueye tolos campos matrícula, marca, modelu, color, numberu_kilometros y num_places de la tabla coches, ordenar pel campu *marca*, yá que apaez en segundu llugar dientro de la llista de campos que componen la **SELECT.**

### SUBCONSULTAS
Una subconsulta ye una sentencia SELECT que ta enfiñida nuna cláusula d'otra sentencia SQL.

Les subconsultas pueden resultar útiles si precises escoyer files d'una tabla con una condición que depende de los datos de la mesma tabla o d'otra tabla.

La subconsulta (consulta interna), execútase antes de la consulta principal; la resultancia de la subconsulta ye utilizáu pola consulta principal (consulta esterna).
```sql
SELECT c.matricula, c.modelu FROM
 coches c
WHERE c.matricula IN
 (
 SELECT m.matricula FROM
 multes m
 WHERE m.importe > 100
 );
```
Nesti exemplu, escuéyense matricular y los modelos de los coches que les sos multes superen los o$s 100.

### INSERT | INXERTAR
Una sentencia *INSERT* de SQL amiesta unu o más rexistros a una (y namái una) tabla nuna base de datos relacional.

#### Forma básica

```sql
INSERT INTO 'tabla' ('columnaA',['columnaB,... '])
VALUES ('valor1', ['valor2,...'])

O tamién puede utilizase como:
INSERT INTO tabla VALUES ('valor1','valor2')
```


Les cantidaes de columnes y valores tienen de ser iguales. Si una columna nun s'especifica, va se-y asignáu'l valor por omisión. Los valores especificaos (o implícitos) pola sentencia `INSERT` tendrán de satisfaer toles restricciones aplicables. Si asocede un error de sintaxis o si dalguna de les restricciones ye violada, nun s'amiesta la fila y devuélvese un error.

#### Exemplu

```sql
INSERT INTO axenda_telefonica (nome, numberu)
VALUES ('Roberto Jeldrez', 4886850);
```


Cuando s'especifiquen tolos valores d'una tabla, puede utilizase la sentencia encurtiada:


```sql
INSERT INTO nombreTabla VALUES ('valor1', ['valor2,...'])
```


Exemplu (asumiendo que 'nome' y 'númberu' son les úniques columnes de la tabla 'axenda_telefonica'):


```sql
INSERT INTO axenda_telefonica
VALUES ('Jhonny Aguilar', 080473968);
```


#### Formes avanzaes
Una carauterística de SQL (dende SQL-92) ye l'usu de *constructores de files* pa inxertar múltiples files al empar, con una sola sentencia SQL:


```sql
INSERT INTO ''tabla'' (''columna1'', [''columna2,... ''])
VALUES (''valor1a'', [''valor1b,...'']), (''value2a'', [''value2b,...'']),...;
```


Esta carauterística ye soportada por DB2, PostgreSQL (dende la versión 8.2), MySQL, y H2.

Exemplu (asumiendo que 'nome' y 'númberu' son les úniques columnes na tabla 'axenda_telefonica'):


```sql
INSERT INTO axenda_telefonica VALUES ('Roberto Fernández', '4886850'), ('Alejandro Sosa', '4556550');
```


Que podía ser realizáu poles sentencies


```sql
INSERT INTO axenda_telefonica VALUES ('Roberto Fernández', '4886850');
INSERT INTO axenda_telefonica VALUES ('Alejandro Sosa', '4556550');
```


Notar que les sentencies separaes pueden tener semántica distinta (especialmente con al respective de los triggers), y puede tener distintu rendimientu que la sentencia d'insertamientu múltiple.

Pa inxertar delles files en MS SQL puede utilizar esa construcción:


```sql
INSERT INTO phone_book
SELECT 'John Doe', '555-1212'
UNION ALL
SELECT 'Peter Doe', '555-2323';
```


Tenga en cuenta que nun se trata d'una sentencia SQL válida acordies con l'estándar SQL (), por cuenta de la cláusula subselect incompleta.

Pa faer lo mesmo en Oracle úsase la Tabla DUAL, siempres que se trate de solo una simple fila:


```sql
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM DUAL
UNION ALL
SELECT 'Peter Doe','555-2323' FROM DUAL
```


Una implementación conforme al estándar d'esta lóxica amuésase'l siguiente exemplu, o como s'amuesa enriba (nun aplica en Oracle):


```sql
INSERT INTO phone_book
SELECT 'John Doe', '555-1212' FROM LLATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT 'Peter Doe','555-2323' FROM LLATERAL ( VALUES (1) ) AS t(c)
```


##### Copia de files d'otres tables
Un INSERT tamién puede utilizase pa recuperar datos d'otros, modificar si ye necesariu ya inxertala direutamente na tabla. Tou esto fai nuna sola sentencia SQL que nun implica nengún procesamientu entemediu na aplicación vecera. Un SUBSELECT utilizar en llugar de la cláusula VALUES. El SUBSELECT puede contener JOIN, llamaes a funciones, y puede inclusive consultar na mesma TABLA los datos que s'enserta. Lóxicamente, el SELECT evalúase primero que la operación INSERT tea empecipiada. Un exemplu dase de siguío.


```sql
INSERT INTO phone_book2

SELECT *
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe')
```


Una variación ye necesaria cuando dalgunos de los datos de la tabla fonte ta ensertándose na nueva tabla, pero non tol rexistru. (O cuando los esquemes de les tables nun son iguales.)


```sql
INSERT INTO phone_book2 ( [name], [phoneNumber] )

SELECT [name], [phoneNumber]
FROM phone_book
WHERE name IN ('John Doe', 'Peter Doe')
```


El SELECT produz una tabla (temporal), y l'esquema de la tabla temporal tien de coincidir col esquema de la tabla onde los datos son inxertaos.

### UPDATE
Una sentencia *UPDATE* de SQL ye utilizada pa modificar los valores d'un conxuntu de rexistros esistentes nuna tabla.

#### Exemplu

```sql
UPDATE My_table SET field1 = 'updated value asd' WHERE field2 = 'N';
```


### DELETE
Una sentencia *DELETE* de SQL borra unu o más rexistros esistentes nuna tabla.

#### Forma básica

```sql
DELETE FROM tabla WHERE columna1 = 'valor1';
```


#### Exemplu

```sql
DELETE FROM My_table WHERE field2 = 'N';
```


## Recuperación de clave
Los diseñadores de base de datos qu'usen una clave suplente como la clave principal pa cada tabla, va executar nel ocasional escenariu nel que ye necesariu recuperar automáticamente la base de datos, xenerando una clave primaria d'una sentencia SQL INSERT pal so usu n'otres sentencies SQL. La mayoría de los sistemes nun dexen sentencies SQL INSERT pa retornar fila de datos. Poro, faise necesariu aplicar una solución en tales escenarios.

Implementaciones comunes inclúin:

* Utilizando un procedimientu almacenáu específicu de base de datos que xenera la clave suplente, realice la operación INSERT, y finalmente devuelve la clave xenerada.
* Utilizando una sentencia SELECT especifica de base de datos, sobre una tabla temporal que contién la última fila inxertada. DB2 implementa esta carauterística de la siguiente manera:


```sql
SELECT *
FROM NEW TABLE ( INSERT INTO phone_book VALUES ( 'Cristobal Jeldrez','0426.817.10.30' ) ) AS t
```


* Utilizando una sentencia SELECT dempués de la sentencia INSERT con función específica de base de datos, que devuelve la clave primaria xenerada pol rexistru inxertáu más apocayá.
* Utilizando una combinación única d'elementos del orixinal SQL INSERT nuna posterior sentencia SELECT.
* Utilizando un GUID na sentencia SQL INSERT y recuperar nuna sentencia SELECT.
* Utilizando la función de PHP mysql_insert_id() de MySQL dempués de la sentencia INSERT.
* Utilizando un INSERT cola cláusula RETURNING para Oracle, que namái se puede utilizar dientro d'un PL/SQL bloque, nel casu de PostgreSQL puede usase tamién tantu con SQL como con PL/SQL.


```sql
INSERT INTO phone_book VALUES ( 'Cristobal Jeldrez','0426.817.10.30' )
RETURNING phone_book_id INTO v_pb_id
```
.

* Nel casu de MS SQL puede utilizase la siguiente instrucción:

```sql
Set NoCount On;
INSERT INTO phone_book VALUES ( 'Cristobal Jeldrez','0426.817.10.30' );
Select @@Identity as id
```
.

## Disparadores
Los disparadores, tamién conocíos como desencadenantes (*triggers* n'inglés) son definíos sobre la tabla na qu'opera la sentencia INSERT, y son evaluaos nel contestu de la operación. Los desencadenantes BEFORE INSERT dexen el cambéu de los valores que se van inxertar na tabla. Los desencadenantes AFTER INSERT nun puede modificar los datos d'equí p'arriba, pero puede utilizase pa empecipiar aiciones n'otres tables, por casu p'aplicar mecanismos d'auditoría Excel.

## Sistemes de xestión de base de datos
Los sistemes de xestión de base de datos con soporte SQL más utilizaos son, por orde alfabéticu:

* DB2
* Firebird
* HSQL
* Informix
* Interbase
* MariaDB
* Microsoft SQL Server
* MySQL
* Oracle
* PostgreSQL
* PervasiveSQL
* SQLite
* Sybase GARRA

## Interoperabilidad
El llinguaxe de consultes de los distintos sistemes de xestión de bases de datos son incompatibles ente ellos y non necesariamente siguen dafechu l'estándar. En particular, la sintaxis de fecha y tiempu, la concatenación de cadenes, nules, y la comparanza de testos en cuanto al tratamientu de mayúscules y minúscules varien d'un provisor a otru. Una esceición particular ye PostgreSQL, que s'esforcia por llograr el cumplimientu del estándar.

Les implementaciones populares de SQL omiten comúnmente soporte pa funciones básiques de SQL estándar, como la de los tipos de datu `DATE` o `TIME`. Ye'l casu del manejador de bases de datos d'Oracle (que'l so tipu `DATE` pórtase como `DATETIME`, y escarez d'un tipu `TIME`) y MS SQL Server (antes de la versión de 2008). Como resultancia, el códigu SQL escasamente puede ser portáu ente los sistemes de base de datos ensin cambeos.

Hai delles razones pa esta falta de portabilidad ente sistemes de bases de datos:

* La complexidá y el tamañu del estándar SQL trai a que la mayoría de les implementaciones de SQL nun sían compatibles cola norma completa.
* La norma nun especifica'l comportamientu de la base de datos en delles árees importantes (por casu, índices, almacenamientu d'archivos, etc.), dexando a les implementaciones decidir cómo portase.
* L'estándar SQL especifica con precisión la sintaxis qu'un sistema de base de datos conforme tien d'implementar. Sicasí, nun ta tan bien definida la especificación nel estándar de la semántica de les construcciones del llinguaxe, lo que lleva a ambigüedá.
* Munchos provisores de bases de datos tienen grandes bases de veceros esistentes, polo qu'introducir cambeos p'afaese l'estándar podría producir incompatibilidaes nes instalaciones de los usuarios y el provisor puede nun tar dispuestu a abandonar la compatibilidá con versiones anteriores.
* Hai pocu incentivu comercial por que un provisor facilite a los usuarios el camudar de provisor de bases de datos.
* Los usuarios qu'evalúen el software de base de datos tienden a valorar más otros factores tales como'l rendimientu más altu nes sos prioridaes sobre les conformidá al estándar.

L'estándar ODBC (Open Database Connectivity) dexa aportar a la información dende cualquier aplicación independientemente del sistema de xestión de base de datos (DBMS) nel que tea almacenada la información, desacoplando asina l'aplicación de la base de datos.

## Ver tamién
* Llinguaxe de definición de datos
* SQL injection
* FSQL
* AQL
* Modelu de base de datos

## Referencies