La sintaxis del lenguaje de programación SQL está definida y mantenida por ISO/IEC SC 32 como parte de ISO/IEC 9075 . Este estándar no está disponible gratuitamente. A pesar de la existencia del estándar, el código SQL no es completamente portátil entre diferentes sistemas de bases de datos sin ajustes.
El lenguaje SQL se subdivide en varios elementos del lenguaje, que incluyen:
SELECT
, COUNT
y YEAR
) o no reservados (por ejemplo ASC
, DOMAIN
y KEY
). Lista de palabras reservadas de SQL .YEAR
se especifica como "YEAR"
.ansi_quotes
modo SQL se aplica el comportamiento estándar de SQL. Estos también se pueden utilizar independientemente de este modo mediante comillas invertidas: `YEAR`
.En ocasiones se han sugerido o implementado otros operadores, como el operador horizonte (para encontrar sólo aquellas filas que no son "peores" que otras).
SQL tiene la case
expresión, que se introdujo en SQL-92 . En su forma más general, que se denomina "caso buscado" en el estándar SQL:
CASO CUANDO n > 0 ENTONCES 'positivo' CUANDO n < 0 ENTONCES 'negativo' ELSE 'cero' FINAL
SQL prueba WHEN
las condiciones en el orden en que aparecen en el código fuente. Si la fuente no especifica una ELSE
expresión, SQL por defecto es ELSE NULL
. También se puede utilizar una sintaxis abreviada llamada "caso simple":
CASO n CUANDO 1 ENTONCES 'Uno' CUANDO 2 ENTONCES 'Dos' MÁS 'No puedo contar tan alto' FINAL
Esta sintaxis utiliza comparaciones de igualdad implícitas, con las advertencias habituales para comparar con NULL .
Hay dos formas breves para CASE
expresiones especiales: COALESCE
y NULLIF
.
La COALESCE
expresión devuelve el valor del primer operando no NULL, que se encuentra trabajando de izquierda a derecha, o NULL si todos los operandos son iguales a NULL.
FUSIONAR ( x1 , x2 )
es equivalente a:
CASO CUANDO x1 NO ES NULO ENTONCES x1 OTRA COSA x2 FINAL
La NULLIF
expresión tiene dos operandos y devuelve NULL si los operandos tienen el mismo valor, en caso contrario tiene el valor del primer operando.
NULO SI ( x1 , x2 )
es equivalente a
CASO CUANDO x1 = x2 ENTONCES NULL ELSE x1 FINAL
SQL estándar permite dos formatos para comentarios : -- comment
, que finaliza con la primera nueva línea , y /* comment */
, que puede abarcar varias líneas.
La operación más común en SQL, la consulta, utiliza la SELECT
declaración declarativa. SELECT
recupera datos de una o más tablas o expresiones. Las declaraciones estándar SELECT
no tienen efectos persistentes en la base de datos. Algunas implementaciones no estándar de SELECT
pueden tener efectos persistentes, como la SELECT INTO
sintaxis proporcionada en algunas bases de datos. [2]
Las consultas permiten al usuario describir los datos deseados, dejando que el sistema de gestión de bases de datos (DBMS) lleve a cabo la planificación , la optimización y la realización de las operaciones físicas necesarias para producir el resultado que elija.
Una consulta incluye una lista de columnas para incluir en el resultado final, normalmente inmediatamente después de la SELECT
palabra clave. *
Se puede utilizar un asterisco (" ") para especificar que la consulta debe devolver todas las columnas de las tablas consultadas. SELECT
es la declaración más compleja en SQL, con palabras clave y cláusulas opcionales que incluyen:
FROM
cláusula, que indica las tablas de las que recuperar datos. La cláusula puede incluir subcláusulas FROM
opcionales para especificar las reglas para unir tablas.JOIN
WHERE
cláusula incluye un predicado de comparación, que restringe las filas devueltas por la consulta. La WHERE
cláusula elimina todas las filas del conjunto de resultados donde el predicado de comparación no se evalúa como Verdadero.GROUP BY
cláusula proyecta filas que tienen valores comunes en un conjunto más pequeño de filas. [ se necesita aclaración ] GROUP BY
se usa a menudo junto con funciones de agregación SQL o para eliminar filas duplicadas de un conjunto de resultados. La WHERE
cláusula se aplica antes de la GROUP BY
cláusula.HAVING
cláusula incluye un predicado utilizado para filtrar las filas resultantes de la GROUP BY
cláusula. Debido a que actúa sobre los resultados de la GROUP BY
cláusula, las funciones de agregación se pueden usar en el HAVING
predicado de la cláusula.ORDER BY
cláusula identifica qué columna(s) usar para ordenar los datos resultantes y en qué dirección ordenarlos (ascendente o descendente). Sin una ORDER BY
cláusula, el orden de las filas devueltas por una consulta SQL no está definido.DISTINCT
palabra clave [3] elimina datos duplicados. [4]OFFSET
cláusula especifica el número de filas que se deben omitir antes de comenzar a devolver datos.FETCH FIRST
cláusula especifica el número de filas a devolver. En cambio, algunas bases de datos SQL tienen alternativas no estándar, por ejemplo LIMIT
, TOP
o ROWNUM
.Las cláusulas de una consulta tienen un orden de ejecución particular, [5] que se indica con el número en el lado derecho. Es el siguiente:
El siguiente ejemplo de SELECT
consulta devuelve una lista de libros caros. La consulta recupera todas las filas de la tabla Libro en las que la columna de precio contiene un valor superior a 100,00. El resultado se ordena en orden ascendente por título . El asterisco (*) en la lista de selección indica que todas las columnas de la tabla Libro deben incluirse en el conjunto de resultados.
SELECCIONAR * DESDE Reservar DONDE precio > 100 . 00 ORDENAR POR título ;
El siguiente ejemplo demuestra una consulta de varias tablas, agrupaciones y agregaciones, al devolver una lista de libros y la cantidad de autores asociados con cada libro.
SELECCIONAR Libro . título AS Título , contar ( * ) AS Autores DESDE Libro ÚNETE Libro_autor EN Libro . isbn = Libro_autor . isbn GRUPO POR Libro . título ;
El resultado de ejemplo podría parecerse al siguiente:
Título Autores---------------------- -------Ejemplos de SQL y guía 4La alegría de SQL 1Una introducción a SQL 2Errores de SQL 1
Bajo la condición previa de que isbn sea el único nombre de columna común de las dos tablas y que una columna denominada título solo exista en la tabla Libro , se podría reescribir la consulta anterior de la siguiente forma:
SELECCIONE el título , cuente ( * ) COMO Autores DEL Libro UNIRSE NATURAL Libro_autor GRUPO POR título ;
Sin embargo, muchos proveedores de [ cuantificar ] no admiten este enfoque o requieren ciertas convenciones de nomenclatura de columnas para que las uniones naturales funcionen de manera efectiva.
SQL incluye operadores y funciones para calcular valores sobre valores almacenados. SQL permite el uso de expresiones en la lista de selección para proyectar datos, como en el siguiente ejemplo, que devuelve una lista de libros que cuestan más de 100,00 con una columna adicional sales_tax que contiene una cifra de impuesto sobre las ventas calculada al 6% del precio .
SELECCIONAR isbn , titulo , precio , precio * 0 . 06 AS sales_tax DESDE Reservar DONDE precio > 100 . 00 ORDENAR POR título ;
Las consultas se pueden anidar para que los resultados de una consulta se puedan utilizar en otra consulta mediante un operador relacional o una función de agregación. Una consulta anidada también se conoce como subconsulta . Si bien las uniones y otras operaciones de tablas proporcionan alternativas computacionalmente superiores (es decir, más rápidas) en muchos casos, el uso de subconsultas introduce una jerarquía en la ejecución que puede ser útil o necesaria. En el siguiente ejemplo, la función de agregación AVG
recibe como entrada el resultado de una subconsulta:
SELECCIONAR isbn , título , precio DEL Libro DONDE precio < ( SELECCIONAR PROMEDIO ( precio ) DEL Libro ) ORDENAR POR título ;
Una subconsulta puede utilizar valores de la consulta externa, en cuyo caso se conoce como subconsulta correlacionada .
Desde 1999, el estándar SQL permite WITH
cláusulas para subconsultas, es decir, subconsultas con nombre, normalmente denominadas expresiones de tabla comunes (también denominadas factorización de subconsultas ). Los CTE también pueden ser recursivos al referirse a sí mismos; el mecanismo resultante permite recorridos de árboles o gráficos (cuando se representan como relaciones) y, de manera más general, cálculos de puntos fijos .
Una tabla derivada es el uso de hacer referencia a una subconsulta SQL en una cláusula FROM. Básicamente, la tabla derivada es una subconsulta de la que se puede seleccionar o unirse. La funcionalidad de tabla derivada permite al usuario hacer referencia a la subconsulta como una tabla. La tabla derivada a veces se denomina vista en línea o subselección .
En el siguiente ejemplo, la instrucción SQL implica una unión de la tabla "Libro" inicial a la tabla derivada "ventas". Esta tabla derivada captura información de ventas de libros asociada utilizando el ISBN para unirla a la tabla "Libro". Como resultado, la tabla derivada proporciona el conjunto de resultados con columnas adicionales (la cantidad de artículos vendidos y la empresa que vendió los libros):
SELECCIONAR B. isbn , b . título , b . precio , ventas . artículos_vendidos , ventas . company_nm FROM Libro b ÚNETE ( SELECCIONAR SUMA ( Artículos_Vendidos ) Artículos_Vendidos , Company_Nm , ISBN FROM Book_Sales GROUP BY Company_Nm , ISBN ) ventas EN ventas . isbn = b . isbn
El concepto de Nulo permite a SQL lidiar con la información faltante en el modelo relacional. La palabra NULL
es una palabra clave reservada en SQL, que se utiliza para identificar el marcador especial nulo. Las comparaciones con Null, por ejemplo la igualdad (=) en las cláusulas WHERE, dan como resultado un valor de verdad desconocido. En las sentencias SELECT, SQL devuelve sólo resultados para los cuales la cláusula WHERE devuelve un valor de Verdadero; es decir, excluye resultados con valores False y también excluye aquellos cuyo valor es Desconocido.
Junto con Verdadero y Falso, lo desconocido resultante de comparaciones directas con Nulo aporta así un fragmento de lógica de tres valores a SQL. Las tablas de verdad que utiliza SQL para AND, OR y NOT corresponden a un fragmento común de la lógica de tres valores de Kleene y Lukasiewicz (que difieren en su definición de implicación, sin embargo, SQL no define tal operación). [6]
Sin embargo, existen disputas sobre la interpretación semántica de Nulls en SQL debido a su tratamiento fuera de las comparaciones directas. Como se ve en la tabla anterior, las comparaciones directas de igualdad entre dos NULL en SQL (por ejemplo, NULL = NULL
) devuelven un valor de verdad Desconocido. Esto está en línea con la interpretación de que Null no tiene un valor (y no es miembro de ningún dominio de datos) sino que es más bien un marcador de posición o una "marca" para la información faltante. Sin embargo, el principio de que dos nulos no son iguales entre sí se viola efectivamente en la especificación SQL para los operadores UNION
y INTERSECT
, que sí identifican nulos entre sí. [7] En consecuencia, estas operaciones de conjuntos en SQL pueden producir resultados que no representan información segura, a diferencia de las operaciones que implican comparaciones explícitas con NULL (por ejemplo, las de una WHERE
cláusula analizada anteriormente). En la propuesta de Codd de 1979 (que fue básicamente adoptada por SQL92), esta inconsistencia semántica se racionaliza argumentando que la eliminación de duplicados en operaciones de conjuntos ocurre "a un nivel de detalle más bajo que las pruebas de igualdad en la evaluación de operaciones de recuperación". [6] Sin embargo, el profesor de informática Ron van der Meyden concluyó que "Las inconsistencias en el estándar SQL significan que no es posible atribuir ninguna semántica lógica intuitiva al tratamiento de nulos en SQL". [7]
Además, debido a que los operadores SQL devuelven Desconocido al comparar algo con Null directamente, SQL proporciona dos predicados de comparación específicos de Null: IS NULL
y IS NOT NULL
prueba si los datos son Null o no. [8] SQL no admite explícitamente la cuantificación universal y debe resolverla como una cuantificación existencial negada . [9] [10] [11] También existe el <row value expression> IS DISTINCT FROM <row value expression>
operador de comparación infijo, que devuelve VERDADERO a menos que ambos operandos sean iguales o ambos sean NULL. Asimismo, NO ES DISTINTO DE se define como NOT (<row value expression> IS DISTINCT FROM <row value expression>)
. SQL:1999 también introdujo BOOLEAN
variables de tipo, que según el estándar también pueden contener valores desconocidos si son anulables. En la práctica, varios sistemas (por ejemplo, PostgreSQL ) implementan BOOLEAN Unknown como BOOLEAN NULL, y el estándar dice que NULL BOOLEAN y UNKNOWN "pueden usarse indistintamente para significar exactamente lo mismo". [12] [13]
El lenguaje de manipulación de datos (DML) es el subconjunto de SQL utilizado para agregar, actualizar y eliminar datos:
INSERTAR EN ejemplo ( columna1 , columna2 , columna3 ) VALORES ( 'prueba' , 'N' , NULL );
UPDATE
modifica un conjunto de filas de tabla existentes, por ejemplo:ACTUALIZAR ejemplo SET columna1 = 'valor actualizado' WHERE columna2 = 'N' ;
DELETE
elimina filas existentes de una tabla, por ejemplo:ELIMINAR DEL ejemplo DONDE columna2 = 'N' ;
MERGE
se utiliza para combinar los datos de varias tablas. Combina los elementos INSERT
y UPDATE
. Está definido en el estándar SQL:2003; Antes de eso, algunas bases de datos proporcionaban una funcionalidad similar a través de una sintaxis diferente, a veces llamada " upsert ". FUSIONAR EN nombre_tabla USANDO referencia_tabla ENCENDIDO ( condición ) CUANDO COINCIDE , ENTONCES ACTUALIZAR CONFIGURAR columna1 = valor1 [, columna2 = valor2 ...] CUANDO NO COINCIDE ENTONCES INSERTAR ( columna1 [, columna2 ...]) VALORES ( valor1 [, valor2 ... ])
Las transacciones, si están disponibles, envuelven operaciones DML:
START TRANSACTION
(o BEGIN WORK
, o BEGIN TRANSACTION
, dependiendo del dialecto SQL) marca el inicio de una transacción de base de datos , que se completa por completo o no se completa.SAVE TRANSACTION
(o SAVEPOINT
) guarda el estado de la base de datos en el punto actual de la transacciónCREAR TABLA tbl_1 ( id int ); INSERTAR EN tbl_1 ( id ) VALORES ( 1 ); INSERTAR EN tbl_1 ( id ) VALORES ( 2 ); COMPROMETERSE ; ACTUALIZAR tbl_1 ESTABLECER id = 200 DONDE id = 1 ; PUNTO DE GUARDADO id_1upd ; ACTUALIZAR tbl_1 ESTABLECER id = 1000 DONDE id = 2 ; VOLVER a id_1upd ; SELECCIONE la identificación de tbl_1 ;
COMMIT
hace que todos los cambios de datos en una transacción sean permanentes.ROLLBACK
descarta todos los cambios de datos desde el último COMMIT
o ROLLBACK
, dejando los datos como estaban antes de esos cambios. Una vez que se completa el COMMIT
extracto, los cambios de la transacción no se pueden revertir.COMMIT
y ROLLBACK
finalizar la transacción actual y liberar los bloqueos de datos. En ausencia de una START TRANSACTION
declaración o similar, la semántica de SQL depende de la implementación. El siguiente ejemplo muestra una transacción clásica de transferencia de fondos, donde se retira dinero de una cuenta y se agrega a otra. Si la eliminación o la adición fallan, se revierte toda la transacción.
INICIAR TRANSACCIÓN ; ACTUALIZAR cuenta SET monto = monto - 200 WHERE número_cuenta = 1234 ; ACTUALIZAR cuenta SET monto = monto + 200 WHERE número_cuenta = 2345 ; SI ERRORES = 0 COMPROMISO ; SI ERRORES <> 0 ROLLBACK ;
El lenguaje de definición de datos (DDL) gestiona la estructura de índices y tablas. Los elementos más básicos de DDL son las declaraciones CREATE
, ALTER
, y :RENAME
DROP
TRUNCATE
CREATE
crea un objeto (una tabla, por ejemplo) en la base de datos, por ejemplo:Ejemplo de CREAR TABLA ( columna1 INTEGER , columna2 VARCHAR ( 50 ), columna3 FECHA NO NULA , CLAVE PRIMARIA ( columna1 , columna2 ) );
ALTER
modifica la estructura de un objeto existente de varias maneras, por ejemplo, agregando una columna a una tabla existente o una restricción, por ejemplo:ALTER TABLE ejemplo AGREGAR columna4 INTEGER DEFAULT 25 NOT NULL ;
TRUNCATE
elimina todos los datos de una tabla de una manera muy rápida, eliminando los datos dentro de la tabla y no la tabla en sí. Por lo general, implica una operación COMMIT posterior, es decir, no se puede revertir (los datos no se escriben en los registros para una reversión posterior, a diferencia de DELETE).Ejemplo de TRUNCAR TABLA ;
DROP
elimina un objeto en la base de datos, generalmente de forma irrecuperable, es decir, no se puede revertir, por ejemplo:Ejemplo de TABLA DROP ;
Cada columna de una tabla SQL declara los tipos que puede contener esa columna. ANSI SQL incluye los siguientes tipos de datos. [14]
CHARACTER(n)
(o ): cadena de n caracteres de ancho fijo , rellenada con espacios según sea necesarioCHAR(n)
CHARACTER VARYING(n)
(o ): cadena de ancho variable con un tamaño máximo de n caracteresVARCHAR(n)
CHARACTER LARGE OBJECT(n [ K | M | G | T ])
(o ): carácter objeto grande con un tamaño máximo de n [ K | METRO | GRAMO | T ] caracteresCLOB(n [ K | M | G | T ])
NATIONAL CHARACTER(n)
(o ): cadena de ancho fijo que admite un juego de caracteres internacionalNCHAR(n)
NATIONAL CHARACTER VARYING(n)
(o ): cadena de ancho variableNVARCHAR(n)
NCHAR
NATIONAL CHARACTER LARGE OBJECT(n [ K | M | G | T ])
(o ): objeto grande de carácter nacional con un tamaño máximo de n [ K | METRO | GRAMO | T ] caracteresNCLOB(n [ K | M | G | T ])
Para los tipos de datos CHARACTER LARGE OBJECT
y NATIONAL CHARACTER LARGE OBJECT
, los multiplicadores K
(1 024), M
(1 048 576), G
(1 073 741 824) y T
(1 099 511 627 776) se pueden utilizar opcionalmente al especificar la longitud.
BINARY(n)
: Cadena binaria de longitud fija, longitud máxima n .BINARY VARYING(n)
(o ): cadena binaria de longitud variable, longitud máxima n .VARBINARY(n)
BINARY LARGE OBJECT(n [ K | M | G | T ])
(o ): objeto binario grande con una longitud máxima n [ K | METRO | GRAMO | T] .BLOB(n [ K | M | G | T ])
Para el BINARY LARGE OBJECT
tipo de datos, los multiplicadores K
(1 024), M
(1 048 576), G
(1 073 741 824) y T
(1 099 511 627 776) se pueden utilizar opcionalmente al especificar la longitud.
BOOLEAN
El BOOLEAN
tipo de datos puede almacenar los valores TRUE
y FALSE
.
INTEGER
( o INT
ySMALLINT
BIGINT
FLOAT
, REAL
yDOUBLE PRECISION
NUMERIC(precision, scale)
oDECIMAL(precision, scale)
DECFLOAT(precision
)Por ejemplo, el número 123,45 tiene una precisión de 5 y una escala de 2. La precisión es un entero positivo que determina el número de dígitos significativos en una base particular (binaria o decimal). La escala es un número entero no negativo. Una escala de 0 indica que el número es un número entero. Para un número decimal con escala S, el valor numérico exacto es el valor entero de los dígitos significativos dividido por 10 S.
SQL proporciona las funciones CEILING
y FLOOR
para redondear valores numéricos. (Las funciones específicas de proveedores populares son TRUNC
(Informix, DB2, PostgreSQL, Oracle y MySQL) e ROUND
(Informix, SQLite, Sybase, Oracle, PostgreSQL, Microsoft SQL Server y Mimer SQL.))
DATE
: para valores de fecha (p. ej 2011-05-03
.).TIME
: para valores de tiempo (p. ej 15:51:36
.).TIME WITH TIME ZONE
: igual que TIME
, pero incluyendo detalles sobre la zona horaria en cuestión.TIMESTAMP
: Esto es a DATE
y a TIME
juntos en una variable (por ejemplo 2011-05-03 15:51:36.123456
).TIMESTAMP WITH TIME ZONE
: igual que TIMESTAMP
, pero incluyendo detalles sobre la zona horaria en cuestión.La función SQL EXTRACT
se puede utilizar para extraer un solo campo (segundos, por ejemplo) de un valor de fecha y hora o intervalo. La fecha/hora actual del sistema del servidor de la base de datos se puede llamar usando funciones como CURRENT_DATE
, CURRENT_TIMESTAMP
, LOCALTIME
o LOCALTIMESTAMP
. (Las funciones específicas de proveedores populares son TO_DATE
, TO_TIME
, TO_TIMESTAMP
, YEAR
, MONTH
, DAY
, HOUR
, MINUTE
, SECOND
, DAYOFYEAR
y .)DAYOFMONTH
DAYOFWEEK
YEAR(precision)
: varios añosYEAR(precision) TO MONTH
: varios años y mesesMONTH(precision)
: varios mesesDAY(precision)
: varios díasDAY(precision) TO HOUR
: un número de días y horasDAY(precision) TO MINUTE
: un número de días, horas y minutosDAY(precision) TO SECOND(scale)
: un número de días, horas, minutos y segundosHOUR(precision)
: un número de horasHOUR(precision) TO MINUTE
: un número de horas y minutosHOUR(precision) TO SECOND(scale)
: un número de horas, minutos y segundosMINUTE(precision)
: varios minutosMINUTE(precision) TO SECOND(scale)
: una cantidad de minutos y segundosEl lenguaje de control de datos (DCL) autoriza a los usuarios a acceder y manipular datos. Sus dos declaraciones principales son:
GRANT
autoriza a uno o más usuarios a realizar una operación o un conjunto de operaciones sobre un objeto.REVOKE
elimina una subvención, que puede ser la subvención predeterminada.Ejemplo:
GRANT SELECT , UPDATE ON ejemplo PARA algún_usuario , otro_usuario ; REVOCAR SELECCIÓN , ACTUALIZAR EN ejemplo DESDE algún_usuario , otro_usuario ;
Aunque el argumento ÚNICO es idéntico a DISTINCT, no es un estándar ANSI.
[...] la palabra clave DISTINCT [...] elimina los duplicados del conjunto de resultados.