Lenguaje de consulta estructurado ( SQL ) ( / ˌ ɛ s ˌ k juː ˈ ɛ l / ⓘ SQL, a veces / ˈ s iː k w əl / "secuela" por razones históricas)[4][5]es unlenguaje de dominio específicoque se utiliza para administrar datos, especialmente en unsistema de administración de bases de datos relacionales(RDBMS). Es particularmente útil en el manejode datos estructurados, es decir, datos que incorporan relaciones entre entidades y variables.
Introducido en la década de 1970, SQL ofrecía dos ventajas principales sobre las API de lectura y escritura más antiguas , como ISAM o VSAM . En primer lugar, introdujo el concepto de acceder 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 índice .
Originalmente basado en álgebra relacional y cálculo relacional de tuplas , SQL consta de muchos tipos de declaraciones, [6] que pueden clasificarse informalmente como sublenguajes , comúnmente: un lenguaje de consulta de datos (DQL), [a] un lenguaje de definición de datos (DDL), [b] un lenguaje de control de datos (DCL) y un lenguaje de manipulación de datos (DML). [c] [7] El alcance de SQL incluye consulta de datos, manipulación de datos (insertar, actualizar y eliminar), definición de datos ( creación y modificación de esquemas ) y control de acceso a 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 bases 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 los cumple plenamente, y la mayor parte 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 (Lenguaje de consulta estructurado en inglés), 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 San José había desarrollado durante la década de 1970. [13]
El primer intento de Chamberlin y Boyce con un lenguaje de base de datos relacional fue SQUARE (especificación de consultas en un entorno relacional), pero era difícil de utilizar 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 Hawker , con sede en el Reino Unido. Siddeley Dynamics Engineering Sociedad limitada. [15] La etiqueta SQL se convirtió más tarde en el acrónimo de Lenguaje de Consulta Estructurado.
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. [dieciséis]
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. , Central Intelligence. Agency y otras agencias gubernamentales de EE. UU . En junio de 1979, Relational Software introdujo una de las primeras implementaciones de SQL disponibles comercialmente, Oracle V2 (Versión 2) para computadoras VAX .
En 1986, los grupos de estándares ANSI e ISO adoptaron oficialmente la definición de lenguaje estándar "Lenguaje de base de datos 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 del lenguaje, que incluyen:
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 de procedimientos , como construcciones de control de flujo.
Además de las extensiones SQL/PSM estándar y las extensiones SQL propietarias, la programabilidad orientada a objetos y de procedimientos está disponible en muchas plataformas SQL a través de la integración DBMS con otros lenguajes. El estándar SQL define extensiones SQL/JRT (rutinas y tipos SQL para el lenguaje de programación Java) para admitir código Java en bases de datos SQL. Microsoft SQL Server 2005 utiliza SQLCLR (SQL Server Common Language Runtime) para alojar ensamblados .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, los mensajes de texto NULL
y la distinción entre mayúsculas y minúsculas 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, Foo
debería ser equivalente a FOO
no foo
conforme a la norma.
Las implementaciones populares de SQL comúnmente omiten la compatibilidad con funciones básicas de SQL estándar, como los tipos de datos DATE
o TIME
. Los ejemplos más obvios, y dicho sea de paso, los DBMS SQL comerciales y propietarios más populares, son Oracle (que DATE
se comporta como DATETIME
, [24] [25] y carece de un TIME
tipo) [26] y MS SQL Server (anterior a la versión 2008). Como resultado, el código SQL rara vez se puede transferir entre sistemas de bases de datos sin modificaciones.
Varias razones para la falta de portabilidad entre sistemas de bases de datos incluyen:
SQL fue adoptado como estándar por ANSI en 1986 como SQL-86 [28] y por ISO en 1987. [11] Es mantenido por 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 el cumplimiento de SQL DBMS con el estándar SQL. Los proveedores ahora autocertifican la conformidad de sus productos. [29]
El estándar original declaraba que la pronunciación oficial de "SQL" era un inicialismo : / ˌ ɛ s ˌ k juː ˈ ɛ l / ("ess cue el"). [9] Independientemente, 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ː k w əl / ("secuela"), [31] reflejando el nombre de desarrollo previo al lanzamiento del idioma. , "CONTINUACIÓN". [13] [15] [30]
El estándar SQL ha pasado por varias revisiones:
El estándar se indica comúnmente con el patrón: ISO/IEC 9075-n:yyyy Parte n: título o, como atajo, ISO/IEC 9075 . Las partes interesadas pueden adquirir los documentos de normas de ISO, [36] IEC o ANSI. Algunos borradores antiguos están disponibles gratuitamente. [37] [38] [39]
ISO/IEC 9075 se complementa con ISO/IEC 13249: Paquetes de aplicaciones y multimedia SQL y algunos informes técnicos .
Se debe hacer una distinción entre alternativas a SQL como lenguaje y alternativas al modelo relacional en sí. A continuación se proponen alternativas relacionales al lenguaje SQL. Consulte la base de datos de navegación y NoSQL para conocer alternativas al modelo relacional.
La Arquitectura de Base de Datos Relacional Distribuida (DRDA) fue diseñada por un grupo de trabajo dentro de IBM de 1988 a 1994. DRDA permite que las bases de datos relacionales conectadas a la 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 en respuesta desde RDB remotas. Las sentencias SQL también se pueden compilar y almacenar en RDB remotos como paquetes y luego invocarlas por el nombre del paquete. Esto es importante para el funcionamiento eficiente de los programas de aplicación que emiten consultas complejas y de alta frecuencia. Es especialmente importante cuando las tablas a las que se accede están ubicadas 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 de SQL distribuido ala DRDA se distingue 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 se puede emplear en consultas (por ejemplo, en la cláusula LIMIT). Los críticos argumentan que SQL debería reemplazarse con un lenguaje que regrese estrictamente a la base original: por ejemplo, consulte The Third Manifesto de Hugh Darwen y CJ Date (2006, ISBN 0-321-39942-0 ).
Las primeras especificaciones no admitían funciones importantes, como claves primarias. No se pudieron nombrar los conjuntos de resultados y no se habían definido subconsultas. Estos se agregaron 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 nulo es objeto de cierto debate . El marcador Nulo indica la ausencia de un valor y es distinto de un valor de 0 para una columna de números enteros o de una cadena vacía para una columna de texto. El concepto de Nulos impone 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 duplicar filas, 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. Por lo general, esto se evita declarando una clave principal, o una restricción única, con una o más columnas que identifiquen de forma única una fila de la tabla.
En un sentido similar al desajuste de impedancia relacional-objeto , se produce un desajuste entre el lenguaje SQL declarativo y los lenguajes de procedimiento en los que normalmente se incrusta SQL. [ cita necesaria ]
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, para lenguaje de consulta estructurado, y el producto se conoció como SQL/DS.
PostgreSQL se enorgullece de cumplir con los estándares.
Su implementación SQL se ajusta firmemente al 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 ningún tipo de datos de Oracle correspondiente:...
TIME
SQL (pronunciado correctamente "ess cue ell", en lugar de la algo común "secuela")...