El lenguaje de consulta estructurado ( SQL ) ( pronunciado S-QL ; o alternativamente como "sequel") [4] [5] es un lenguaje específico de dominio utilizado para gestionar datos, especialmente en un sistema de gestión de bases de datos relacionales (RDBMS). Es particularmente útil en el manejo de datos estructurados , es decir, datos que incorporan relaciones entre entidades y variables.
SQL, que se introdujo en la década de 1970, ofrecía dos ventajas principales con respecto a las API de lectura y escritura más antiguas, como ISAM o VSAM . En primer lugar, introdujo el concepto de acceso a muchos registros con un solo comando . En segundo lugar, elimina la necesidad de especificar cómo llegar a un registro, es decir, con o sin un índice .
SQL, que originalmente se basaba en el álgebra relacional y el cálculo relacional de tuplas , consta de muchos tipos de instrucciones, [6] que pueden clasificarse informalmente como sublenguajes , comúnmente: lenguaje de consulta de datos (DQL), lenguaje de definición de datos (DDL), lenguaje de control de datos (DCL) y lenguaje de manipulación de datos (DML). [7]
El alcance de SQL incluye la consulta de datos, la manipulación de datos (insertar, actualizar y eliminar), la definición de datos ( creación y modificación de esquemas ) y el control de acceso a los datos. Aunque SQL es esencialmente un lenguaje declarativo ( 4GL ), también incluye elementos procedimentales .
SQL fue uno de los primeros lenguajes comerciales en utilizar el modelo relacional de Edgar F. Codd . El modelo fue descrito en su influyente artículo de 1970, "Un modelo relacional de datos para grandes bancos de datos compartidos". [8] A pesar de no adherirse completamente al modelo relacional descrito por Codd , SQL se convirtió en el lenguaje de base de datos más utilizado. [9] [10]
SQL se convirtió en un estándar del Instituto Nacional Estadounidense de Estándares (ANSI) en 1986 y de la Organización Internacional de Normalización (ISO) en 1987. [11] Desde entonces, el estándar ha sido revisado varias veces para incluir un conjunto más amplio de características e incorporar extensiones comunes. A pesar de la existencia de estándares, prácticamente ninguna implementación existente se adhiere a él por completo, y la mayoría del código SQL requiere al menos algunos cambios antes de ser portado a diferentes sistemas de bases de datos .
SQL fue desarrollado inicialmente en IBM por Donald D. Chamberlin y Raymond F. Boyce después de aprender sobre el modelo relacional de Edgar F. Codd [12] a principios de la década de 1970. [13] Esta versión, inicialmente llamada SEQUEL (Structured English Query Language), fue diseñada para manipular y recuperar datos almacenados en el sistema de gestión de bases de datos cuasirelacional original de IBM, System R , que un grupo del Laboratorio de Investigación de IBM en San José había desarrollado durante la década de 1970. [13]
El primer intento de Chamberlin y Boyce de crear un lenguaje de base de datos relacional fue SQUARE (Specifying Queries in A Relational Environment), pero era difícil de usar debido a la notación de subíndice/superíndice. Después de mudarse al Laboratorio de Investigación de San José en 1973, comenzaron a trabajar en una secuela de SQUARE. [12] El nombre original SEQUEL, que se considera ampliamente como un juego de palabras con QUEL , el lenguaje de consulta de Ingres , [14] se cambió más tarde a SQL (eliminando las vocales) porque "SEQUEL" era una marca registrada de la empresa Hawker Siddeley Dynamics Engineering Limited con sede en el Reino Unido. [15] La etiqueta SQL más tarde se convirtió en el acrónimo de Structured Query Language.
Después de probar SQL en los sitios de prueba de los clientes para determinar la utilidad y practicidad del sistema, IBM comenzó a desarrollar productos comerciales basados en su prototipo System R, incluidos System/38 , SQL/DS e IBM Db2 , que estuvieron disponibles comercialmente en 1979, 1981 y 1983, respectivamente. [16]
A finales de la década de 1970, Relational Software, Inc. (ahora Oracle Corporation ) vio el potencial de los conceptos descritos por Codd, Chamberlin y Boyce, y desarrolló su propio RDBMS basado en SQL con aspiraciones de venderlo a la Marina de los EE . UU. , la Agencia Central de Inteligencia y otras agencias gubernamentales de los EE. UU . En junio de 1979, Relational Software presentó una de las primeras implementaciones de SQL disponibles comercialmente, Oracle V2 (Version2) para computadoras VAX .
En 1986, los grupos de normalización ANSI e ISO adoptaron oficialmente la definición del lenguaje estándar "Database Language SQL". Se publicaron nuevas versiones del estándar en 1989, 1992, 1996, 1999, 2003, 2006, 2008, 2011, [12] 2016 y, más recientemente, 2023. [17]
El lenguaje SQL se subdivide en varios elementos de lenguaje, entre ellos:
SQL está diseñado para un propósito específico: consultar datos contenidos en una base de datos relacional . SQL es un lenguaje de programación declarativo basado en conjuntos , no un lenguaje de programación imperativo como C o BASIC . Sin embargo, las extensiones de SQL estándar agregan funcionalidad de lenguaje de programación procedimental , como construcciones de control de flujo.
Además de las extensiones estándar de SQL/PSM y las extensiones de SQL propietarias, la programación orientada a objetos y procedimental está disponible en muchas plataformas SQL a través de la integración de DBMS con otros lenguajes. El estándar SQL define extensiones SQL/JRT (SQL Routines and Types for the Java Programming Language) para admitir código Java en bases de datos SQL. Microsoft SQL Server 2005 utiliza SQLCLR (SQL Server Common Language Runtime) para alojar ensambles .NET administrados en la base de datos , mientras que las versiones anteriores de SQL Server estaban restringidas a procedimientos almacenados extendidos no administrados escritos principalmente en C. PostgreSQL permite a los usuarios escribir funciones en una amplia variedad de lenguajes, incluidos Perl , Python , Tcl , JavaScript (PL/V8) y C. [19]
Las implementaciones de SQL son incompatibles entre proveedores y no necesariamente siguen completamente los estándares. En particular, la sintaxis de fecha y hora, la concatenación de cadenas, NULL
s y la distinción entre mayúsculas y minúsculas en las comparaciones varían de un proveedor a otro. PostgreSQL [20] y Mimer SQL [21] se esfuerzan por cumplir con los estándares, aunque PostgreSQL no se adhiere al estándar en todos los casos. Por ejemplo, el plegado de nombres sin comillas a minúsculas en PostgreSQL es incompatible con el estándar SQL, [22] que dice que los nombres sin comillas deben plegarse a mayúsculas. [23] Por lo tanto, según el estándar, Foo
debería ser equivalente a FOO
, no foo
.
Las implementaciones populares de SQL suelen omitir el soporte para las características básicas de SQL estándar, como los tipos de datos DATE
o . Los ejemplos más obvios de este tipo, y por cierto los DBMS SQL comerciales y propietarios más populares, son Oracle (cuyo comportamiento es como , [24] [25] y carece de un tipo) [26] y MS SQL Server (antes de la versión 2008). Como resultado, el código SQL rara vez se puede trasladar entre sistemas de bases de datos sin modificaciones.TIME
DATE
DATETIME
TIME
Entre las razones de la falta de portabilidad entre sistemas de bases de datos se incluyen las siguientes:
SQL fue adoptado como estándar por la ANSI en 1986 como SQL-86 [28] y por la ISO en 1987. [11] Lo mantiene ISO/IEC JTC 1, Tecnología de la información, Subcomité SC 32, Gestión e intercambio de datos .
Hasta 1996, el programa de estándares de gestión de datos del Instituto Nacional de Estándares y Tecnología (NIST) certificaba la conformidad de los DBMS SQL con el estándar SQL. Ahora los proveedores certifican por sí mismos la conformidad de sus productos. [29]
El estándar original declaraba que la pronunciación oficial de "SQL" era un acrónimo : / ˌɛsˌkjuːˈɛl / ( " ess cue el"). [ 9] A pesar de ello, muchos profesionales de bases de datos de habla inglesa (incluido el propio Donald Chamberlin [30]) utilizan la pronunciación similar a un acrónimo de /ˈs iːkwəl / ( " secuela " ) , [ 31 ] que refleja el nombre de desarrollo previo al lanzamiento del lenguaje, "SEQUEL". [13] [ 15] [30]
El estándar SQL ha pasado por varias revisiones:
La norma se denota comúnmente por el patrón: ISO/IEC 9075-n:yyyy Parte n: título o, como abreviatura, ISO/IEC 9075. Las partes interesadas pueden comprar los documentos de las normas a ISO, [36] IEC o ANSI. Algunos borradores antiguos están disponibles gratuitamente. [37] [38] [39]
La norma ISO/IEC 9075 se complementa con la norma ISO/IEC 13249: Paquetes de aplicaciones y multimedia SQL y algunos informes técnicos .
Se debe hacer una distinción entre las alternativas a SQL como lenguaje y las alternativas al modelo relacional en sí. A continuación se proponen alternativas relacionales al lenguaje SQL. Consulte Bases de datos de navegación y NoSQL para conocer las alternativas al modelo relacional.
La arquitectura de base de datos relacional distribuida (DRDA) fue diseñada por un grupo de trabajo dentro de IBM entre 1988 y 1994. DRDA permite que las bases de datos relacionales conectadas en red cooperen para cumplir con las solicitudes SQL. [41] [42]
Un usuario o programa interactivo puede emitir sentencias SQL a una RDB local y recibir tablas de datos e indicadores de estado como respuesta de las RDB remotas. Las sentencias SQL también se pueden compilar y almacenar en RDB remotas como paquetes y luego invocarse por nombre de paquete. Esto es importante para el funcionamiento eficiente de los programas de aplicación que emiten consultas complejas de alta frecuencia. Es especialmente importante cuando las tablas a las que se debe acceder se encuentran en sistemas remotos.
Los mensajes, protocolos y componentes estructurales de DRDA están definidos por la arquitectura de gestión de datos distribuidos . El procesamiento SQL distribuido de DRDA es diferente de las bases de datos SQL distribuidas contemporáneas .
SQL se desvía en varios aspectos de su fundamento teórico, el modelo relacional y su cálculo de tuplas. En ese modelo, una tabla es un conjunto de tuplas, mientras que en SQL, las tablas y los resultados de las consultas son listas de filas; la misma fila puede aparecer varias veces y el orden de las filas puede emplearse en las consultas (por ejemplo, en la cláusula LIMIT). Los críticos argumentan que SQL debería reemplazarse por un lenguaje que vuelva estrictamente a la base original: por ejemplo, véase The Third Manifesto de Hugh Darwen y CJ Date (2006, ISBN 0-321-39942-0 ).
Las primeras especificaciones no admitían funciones importantes, como las claves primarias. No se podían nombrar los conjuntos de resultados y no se habían definido subconsultas. Estas se añadieron en 1992. [12]
La falta de tipos de suma se ha descrito como un obstáculo para el uso completo de los tipos definidos por el usuario de SQL. Por ejemplo, fue necesario agregar compatibilidad con JSON mediante un nuevo estándar en 2016. [43]
El concepto de Null es objeto de cierto debate . El marcador Null indica la ausencia de un valor y es distinto de un valor de 0 para una columna de números enteros o una cadena vacía para una columna de texto. El concepto de Nulls refuerza la lógica de 3 valores en SQL , que es una implementación concreta de la lógica general de 3 valores . [12]
Otra crítica popular es que permite filas duplicadas, lo que dificulta la integración con lenguajes como Python , cuyos tipos de datos pueden dificultar la representación precisa de los datos, [12] en términos de análisis y por la ausencia de modularidad. Esto generalmente se evita declarando una clave principal, o una restricción única, con una o más columnas que identifiquen de forma única una fila en la tabla.
En un sentido similar al desajuste de impedancia objeto-relacional , se produce un desajuste entre el lenguaje SQL declarativo y los lenguajes procedimentales en los que SQL está normalmente integrado. [ cita requerida ]
El estándar SQL define tres tipos de tipos de datos (capítulo 4.1.1 de SQL/Foundation):
Los tipos construidos son ARRAY, MULTISET, REF(erence) o ROW. Los tipos definidos por el usuario son comparables a las clases en lenguaje orientado a objetos con sus propios constructores, observadores, mutadores, métodos, herencia, sobrecarga, sobrescritura, interfaces, etc. Los tipos de datos predefinidos son intrínsecamente compatibles con la implementación.
Cambiamos el nombre original "SEQUEL" a SQL porque recibimos una carta del abogado de alguien que decía que el nombre "SEQUEL" le pertenecía. Lo acortamos a SQL, por Structured Query Language, y el producto se conoció como SQL/DS.
PostgreSQL se enorgullece de cumplir con los estándares. Su implementación de SQL cumple estrictamente con el estándar ANSI-SQL:2008.
Para cada
valor, Oracle almacena la siguiente información: siglo, año, mes, fecha, hora, minuto y segundo
DATE
Los tipos de datos de fecha y hora son
...
DATE
No defina columnas con los siguientes tipos de datos SQL/DS y DB2, porque no tienen un tipo de datos Oracle correspondiente:...
TIME
SQL (pronunciado correctamente "ess cue ell", en lugar del común "sequel")...