SQL (por sus siglas en inglés Structured Query Language; en español lenguaje de consulta estructurada) es un lenguaje específico de dominio, diseñado para administrar, y recuperar información de sistemas de gestión de bases de datos relacionales. Una de sus principales características es el manejo del álgebra y el cálculo relacional para efectuar consultas con el fin de recuperar, de forma sencilla, información de bases de datos, así como realizar cambios en ellas.

Originalmente basado en el álgebra relacional y en el cálculo relacional, SQL consiste en un lenguaje de definición de datos, un lenguaje de manipulación de datos y un lenguaje de control de datos. El alcance de SQL incluye la inserción de datos, consultas, actualizaciones y borrado, la creación y modificación de esquemas y el control de acceso a los datos. También el SQL a veces se describe como un lenguaje declarativo, también incluye elementos procesales.

SQL fue uno de los primeros lenguajes comerciales para el modelo relacional de Edgar Frank Codd como se describió en su artículo de investigación de 1970 El modelo relacional de datos para grandes bancos de datos compartidos. A pesar de no adherirse totalmente al modelo relacional descrito por Codd, pasó a ser el lenguaje de base de datos más usado.

SQL pasó a ser el estándar del Instituto Nacional Estadounidense de Estándares (ANSI) en 1986 y de la Organización Internacional de Normalización (ISO) en 1987. Desde entonces, el estándar ha sido revisado para incluir más características. A pesar de la existencia de ambos estándares, la mayoría de los códigos SQL no son completamente portables entre sistemas de bases de datos diferentes sin otros ajustes.

Orígenes y evolución Los orígenes de SQL están ligados a las bases de datos relacionales, específicamente las que residían en máquinas IBM bajo el sistema de gestión System R, desarrollado por un grupo de la IBM en San José, California.

Originalmente un acrónimo de "Lenguaje de consulta estructurado" ("Structured Query Language”), fue creado por IBM como un lenguaje unificado para definir, consultar, modificar y controlar los datos en una base de datos relacional. Su nombre se pronuncia oficialmente "ess-cue-ell" (según el American National Standards Institute).

El modelo relacional de gestión de bases de datos fue propuesto en 1970 por el Dr. E. F. Codd en el Laboratorio de Investigación de IBM en San José, California, y se desarrolló durante la década siguiente en universidades y laboratorios de investigación. SQL, uno de varios lenguajes que surgieron de este trabajo inicial, ahora se ha apoderado casi por completo del mundo de los lenguajes de bases de datos relacionales. Los proveedores de sistemas de administración de bases de datos relacionales que inicialmente eligieron otros lenguajes han acudido en masa a SQL; Las organizaciones de normalización nacionales e internacionales han propuesto una versión codificada del lenguaje.

En 1970, E. F. Codd propone el modelo relacional y asociado a este un sublenguaje de acceso a los datos basado en el cálculo de predicados.EF Codd; A relational model of data for large shared data banks. Comm. ACM, 13 (1970), pp.377-387. Basándose en estas ideas, los laboratorios de IBM definieron el lenguaje SEQUEL (Structured English Query Language) que más tarde fue ampliamente implementado por el sistema de gestión de bases de datos (SGBD) experimental System R, desarrollado en 1977 también por IBM. Sin embargo, fue Oracle quien lo introdujo por primera vez en 1979 en un producto comercial.

El SEQUEL terminó siendo el predecesor de SQL, que es una versión evolucionada del primero. SQL pasa a ser el lenguaje por excelencia de los diversos sistemas de gestión de bases de datos relacionales surgidos en los años siguientes y fue por fin estandarizado en 1986 por el ANSI, dando lugar a la primera versión estándar de este lenguaje, "SQL-86" o "SQL1". Al año siguiente este estándar es también adoptado por ISO.

Sin embargo, este primer estándar no cubría todas las necesidades de los desarrolladores e incluía funcionalidades de definición de almacenamiento que se consideró suprimirlas. Así que, en 1992, se lanzó un nuevo estándar ampliado y revisado de SQL llamado "SQL-92" o "SQL2".

En la actualidad SQL es el estándar de facto de la inmensa mayoría de los SGBD comerciales. Y, aunque la diversidad de añadidos particulares que incluyen las distintas implementaciones comerciales del lenguaje es amplia, el soporte al estándar SQL-92 es general y muy amplio.

El ANSI SQL sufrió varias revisiones y agregados a lo largo del tiempo:

Año Nombre Alias Comentarios 1986 SQL-86 SQL-87 Primera publicación hecha por ANSI. Confirmada por la Organización Internacional de Normalización en 1987. 1989 SQL-89 Revisión menor. 1992 SQL-92 SQL2 Revisión mayor. 1999 SQL:1999 SQL2000 Se agregaron expresiones regulares, consultas recursivas (para relaciones jerárquicas), triggers y algunas características orientadas a objetos. 2003 SQL:2003   Introduce algunas características de XML, cambios en las funciones, estandarización del objeto sequence y de las columnas autonuméricas. Eisenberg et al.: SQL:2003 Has Been Published. 2006 SQL:2006   ISO/IEC 9075-14:2006 Define las maneras en las cuales SQL se puede utilizar conjuntamente con XML. Define maneras de importar y guardar datos XML en una base de datos SQL, manipulándolos dentro de la base de datos y publicando el XML y los datos SQL convencionales en forma XML. Además, proporciona facilidades que permiten a las aplicaciones integrar dentro de su código SQL el uso de XQuery, lenguaje de consulta XML publicado por el W3C (World Wide Web Consortium) para acceso concurrente a datos ordinarios SQL y documentos XML. 2008 SQL:2008   Permite el uso de la cláusula ORDER BY fuera de las definiciones de los cursores. Incluye los disparadores del tipo INSTEAD OF. Añade la sentencia TRUNCATE. Aprobación de SQL 2008. 2011 SQL:2011 Datos temporales (PERIOD FOR). Mejoras en las funciones de ventana y de la cláusula FETCH. 2016 SQL:2016 Permite búsqueda de patrones, funciones de tabla polimórficas y compatibilidad con los ficheros JSON.

Características generales de SQL SQL es un lenguaje de acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales y permite así gran variedad de operaciones.

Es un lenguaje declarativo de "alto nivel" o "de no procedimiento" que, gracias a su fuerte base teórica y su orientación al manejo de conjuntos de registros —y no a registros individuales— permite una alta productividad en codificación y la orientación a objetos. De esta forma, una sola sentencia puede equivaler a uno o más programas que se utilizarían en un lenguaje de bajo nivel orientado a registros. SQL también tiene las siguientes características:

Lenguaje de definición de datos: El LDD de SQL proporciona comandos para la definición de esquemas de relación, borrado de relaciones y modificaciones de los esquemas de relación. Lenguaje interactivo de manipulación de datos: El LMD de SQL incluye lenguajes de consultas basado tanto en álgebra relacional como en cálculo relacional de tuplas. Integridad: El LDD de SQL incluye comandos para especificar las restricciones de integridad que deben cumplir los datos almacenados en la base de datos. Definición de vistas: El LDD incluye comandos para definir las vistas. Control de transacciones: SQL tiene comandos para especificar el comienzo y el final de una transacción. SQL incorporado y dinámico: Esto quiere decir que se pueden incorporar instrucciones de SQL en lenguajes de programación como: C++, C, Java, PHP, COBOL, Pascal y Fortran. Autorización: El LDD incluye comandos para especificar los derechos de acceso a las relaciones y a las vistas.

Tipos de datos Algunos de los tipos de datos básicos de SQL son:

Números enteros:

TINYINT(tamaño): -128 a 127 normal. 0 a 255 sin signo. La cantidad máxima de dígitos se puede especificar entre paréntesis SMALLINT(tamaño): -32768 a 32767 normal. 0 a 65535 sin signo. La cantidad máxima de dígitos se puede especificar entre paréntesis MEDIUMINT(tamaño): -8388608 a 8388607 normal. 0 a 16777215 sin signo. La cantidad máxima de dígitos se puede especificar entre paréntesis INT(tamaño): -2147483648 a 2147483647 normal. 0 a 4294967295 sin signo. La cantidad máxima de dígitos se puede especificar entre paréntesis BIGINT(tamaño): -9223372036854775808 a 9223372036854775807 normal. 0 a 18446744073709551615 sin signo. La cantidad máxima de dígitos se puede especificar entre paréntesis Números en punto flotante:

FLOAT (tamaño, d): Un pequeño número con un punto decimal flotante. La cantidad máxima de dígitos se puede especificar en el parámetro de tamaño. El número máximo de dígitos a la derecha del punto decimal se especifica en el parámetro d DOBLE (tamaño, d): Un número grande con un punto decimal flotante. La cantidad máxima de dígitos se puede especificar en el parámetro de tamaño. El número máximo de dígitos a la derecha del punto decimal se especifica en el parámetro d DECIMAL (tamaño, d): Un DOBLE almacenado como una cadena, lo que permite un punto decimal fijo. La cantidad máxima de dígitos se puede especificar en el parámetro de tamaño. El número máximo de dígitos a la derecha del punto decimal se especifica en el parámetro d

Fechas y tiempos

DATE (): Una fecha. Formato: AAAA-MM-DD Nota: el rango admitido es de '1000-01-01' a '9999-12-31' DATETIME (): * Una combinación de fecha y hora. Formato: AAAA-MM-DD HH: MI: SS Nota: el rango admitido es de '1000-01-01 00:00:00' a '9999-12-31 23:59:59' TIMESTAMP (): * Una marca de tiempo. Los valores de TIMESTAMP se almacenan como el número de segundos desde la época de Unix ('1970-01-01 00:00:00' UTC). Formato: AAAA-MM-DD HH: MI: SS Nota: el rango admitido es de '1970-01-01 00:00:01' UTC a '2038-01-09 03:14:07' UTC TIME (): Un tiempo. Formato: HH: MI: SS Nota: el rango admitido es de '-838: 59: 59' a '838: 59: 59' YEAR (): Un año en formato de dos o cuatro dígitos. Nota: Valores permitidos en formato de cuatro dígitos: de 1901 a 2155. Valores permitidos en formato de dos dígitos: 70 a 69, que representan los años de 1970 a 2069

Cadena de caracteres:

CHAR (tamaño): Tiene una cadena de longitud fija (puede contener letras, números y caracteres especiales). El tamaño fijo se especifica entre paréntesis. Puede almacenar hasta 255 caracteres VARCHAR (tamaño): Tiene una cadena de longitud variable (puede contener letras, números y caracteres especiales). El tamaño máximo se especifica entre paréntesis. Puede almacenar hasta 255 caracteres. Nota: si agrega un valor mayor que 255, se convertirá en un tipo de texto TINYTEXT: Tiene una cadena con una longitud máxima de 255 caracteres TEXTO: Tiene una cadena con una longitud máxima de 65.535 caracteres BLOB: Para BLOB (Objetos grandes binarios). Almacena hasta 65.535 bytes de datos MEDIUMTEXT: Tiene una cadena con una longitud máxima de 16,777,215 caracteres MEDIUMBLOB: Para BLOB (Objetos grandes binarios). Tiene capacidad para 16.777.215 bytes de datos LONGTEXT: Tiene una cadena con una longitud máxima de 4.294.967.295 caracteres LONGBLOB: Para BLOB (Objetos grandes binarios). Tiene capacidad para 4.294.967.295 bytes de datos

Enum y set:

Enum (x, y, z, etc.): Permite ingresar una lista de valores posibles. Puede enumerar hasta 65535 valores en una lista ENUM. Si se inserta un valor que no está en la lista, se insertará un valor en blanco. Nota: los valores se ordenan en el orden en que los ingresas. Ingrese los valores posibles en este formato: ENUM ('X', 'Y', 'Z') Set: Similar a ENUM, excepto que SET puede contener hasta 64 elementos de lista y puede almacenar más de una opción

Binarios:

bit: Entero que puede ser 0, 1 o NULL

Optimización