La sintaxis del lenguaje de programación SQL está definida y mantenida por la norma ISO/IEC SC 32 como parte de la norma ISO/IEC 9075. Esta norma no está disponible de forma gratuita. A pesar de su existencia, el código SQL no es completamente portable entre diferentes sistemas de bases de datos sin realizar ajustes.
El lenguaje SQL se subdivide en varios elementos de lenguaje, entre ellos:
SELECT
, COUNT
y YEAR
) o no (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. También se pueden usar independientemente de este modo mediante comillas simples invertidas: `YEAR`
.Operador | Descripción | Ejemplo |
---|---|---|
= | Igual a | Author = 'Alcott' |
<> | No es igual a (muchos dialectos también lo aceptan != ) | Dept <> 'Sales' |
> | Más que | Hire_Date > '2012-01-31' |
< | Menos que | Bonus < 50000.00 |
>= | Mayor o igual que | Dependents >= 2 |
<= | Menor o igual que | Rate <= 0.05 |
[NOT] BETWEEN [SYMMETRIC] | Entre un rango inclusivo. SIMÉTRICO invierte los límites del rango si el primero es mayor que el segundo. | Cost BETWEEN 100.00 AND 500.00 |
[NOT] LIKE [ESCAPE] | Comienza con un patrón de carácter. | Full_Name LIKE 'Will%' |
Contiene un patrón de caracteres. | Full_Name LIKE '%Will%' | |
[NOT] IN | Igual a uno de múltiples valores posibles | DeptCode IN (101, 103, 209) |
ES [NO] NULO | Comparar con nulo (datos faltantes) | Address IS NOT NULL |
IS [NOT] TRUE o IS [NOT] FALSE | Prueba de valor de verdad booleano | PaidVacation IS TRUE |
NO ES DISTINTO DE | Es igual al valor o ambos son nulos (datos faltantes) | Debt IS NOT DISTINCT FROM - Receivables |
AS | Se utiliza para cambiar el nombre de una columna al ver los resultados. | SELECT employee AS department1 |
En ocasiones se han sugerido o implementado otros operadores, como el operador skyline (para encontrar solo aquellas filas que no sean "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' DE LO CONTRARIO 'cero' FIN
SQL prueba WHEN
las condiciones en el orden en que aparecen en la fuente. Si la fuente no especifica una ELSE
expresión, SQL toma como valor predeterminado ELSE NULL
. También se puede utilizar una sintaxis abreviada denominada "caso simple":
CASO n CUANDO 1 ENTONCES 'Uno' CUANDO 2 ENTONCES 'Dos' DE LO CONTRARIO 'No puedo contar tan alto' FIN
Esta sintaxis utiliza comparaciones de igualdad implícita, con las advertencias habituales para la comparación con NULL .
Hay dos formas abreviadas 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.
COALESCE ( x1 , x2 )
es equivalente a:
CASO CUANDO x1 NO ES NULO ENTONCES x1 DE LO CONTRARIO x2 FIN
La NULLIF
expresión tiene dos operandos y devuelve NULL si los operandos tienen el mismo valor; de lo contrario, tiene el valor del primer operando.
NULLIF ( x1 , x2 )
es equivalente a
CASO CUANDO x1 = x2 ENTONCES NULO DE LO CONTRARIO x1 FIN
El SQL estándar permite dos formatos para los 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, hace uso de la SELECT
sentencia declarativa. SELECT
recupera datos de una o más tablas o expresiones. SELECT
Las sentencias estándar 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) realice la planificación , la optimización y la ejecución de las operaciones físicas necesarias para producir ese resultado según lo elija.
Una consulta incluye una lista de columnas que se incluirán 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 sentencia más compleja de SQL, con palabras clave y cláusulas opcionales que incluyen:
FROM
cláusula que indica las tablas de las que se obtendrán datos. La FROM
cláusula puede incluir subcláusulas opcionales JOIN
para especificar las reglas para unir tablas.WHERE
cláusula incluye un predicado de comparación que restringe las filas que devuelve la consulta. La WHERE
cláusula elimina todas las filas del conjunto de resultados en las que 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. [ Aclaración necesaria ] GROUP BY
Se utiliza a menudo junto con funciones de agregación de 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 que se utiliza para filtrar las filas resultantes de la GROUP BY
cláusula. Dado que actúa sobre los resultados de la GROUP BY
cláusula, se pueden utilizar funciones de agregación en el HAVING
predicado de la cláusula.ORDER BY
cláusula identifica qué columna(s) se deben utilizar para ordenar los datos resultantes y en qué dirección hacerlo (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 que se devolverán. 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 mediante el número del lado derecho. Es el siguiente:
SELECT <columns> | 5. |
FROM <table> | 1. |
WHERE <predicate on rows> | 2. |
GROUP BY <columns> | 3. |
HAVING <predicate on groups> | 4. |
ORDER BY <columns> | 6. |
OFFSET | 7. |
FETCH FIRST | 8. |
El siguiente ejemplo de SELECT
consulta devuelve una lista de libros caros. La consulta recupera todas las filas de la tabla Book en las que la columna price contiene un valor mayor que 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 Book deben incluirse en el conjunto de resultados.
SELECCIONAR * DE Libro DONDE precio > 100 . 00 ORDENAR POR título ;
El siguiente ejemplo demuestra una consulta de múltiples tablas, agrupación y agregación, devolviendo una lista de libros y la cantidad de autores asociados con cada libro.
SELECCIONAR Libro . título COMO Título , contar ( * ) COMO Autores DE Libro UNIR Libro_autor EN Libro . isbn = Libro_autor . isbn AGRUPAR POR Libro . título ;
El resultado de ejemplo podría parecerse al siguiente:
Título Autores---------------------- -------Ejemplos y guía de SQL 4La alegría de SQL 1Introducció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 llamada título solo exista en la tabla Libro , se podría reescribir la consulta anterior en la siguiente forma:
SELECCIONAR título , contar ( * ) COMO Autores DE Libro NATURAL UNIRSE Libro_autor AGRUPAR POR título ;
Sin embargo, muchos proveedores de [ cuantificación ] no admiten este enfoque o requieren ciertas convenciones de nombres de columnas para que las uniones naturales funcionen de manera efectiva.
SQL incluye operadores y funciones para calcular valores a partir de 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 sales_tax adicional que contiene una cifra de impuesto a las ventas calculada al 6 % del precio .
SELECCIONAR isbn , título , precio , precio * 0,06 COMO impuesto_venta DE Libro DONDE precio > 100,00 ORDENAR POR título ;
Las consultas se pueden anidar de modo que los resultados de una consulta se puedan utilizar en otra consulta a través de 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 tabla 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 DE Libro DONDE precio < ( SELECCIONAR AVG ( precio ) DE 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, generalmente llamadas expresiones de tabla comunes (también llamadas factorización de subconsultas ). Las CTE también pueden ser recursivas haciendo referencia a sí mismas; 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 referenciar una subconsulta SQL en una cláusula FROM. Básicamente, la tabla derivada es una subconsulta de la que se puede seleccionar o unir. La funcionalidad de tabla derivada permite al usuario hacer referencia a la subconsulta como una tabla. A veces, la tabla derivada se denomina vista en línea o subselección .
En el siguiente ejemplo, la sentencia SQL implica una unión de la tabla inicial "Book" a la tabla derivada "sales". Esta tabla derivada captura la información de ventas de libros asociada utilizando el ISBN para unirse a la tabla "Book". 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 . empresa_nm DE Libro b UNIR ( SELECCIONAR SUMA ( Artículos_vendidos ) Artículos_vendidos , Empresa_Nm , ISBN DE Libro_Ventas AGRUPAR POR Empresa_Nm , ISBN ) ventas EN ventas . isbn = b . isbn
El concepto de Null permite a SQL tratar 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 Null. Las comparaciones con Null, por ejemplo la igualdad (=) en las cláusulas WHERE, dan como resultado un valor de verdad Unknown. En las instrucciones SELECT, SQL devuelve solo los resultados para los que la cláusula WHERE devuelve un valor True; es decir, excluye los resultados con valores False y también excluye aquellos cuyo valor es Unknown.
Junto con Verdadero y Falso, el Desconocido resultante de comparaciones directas con Nulo trae así un fragmento de lógica de tres valores a SQL. Las tablas de verdad que SQL utiliza 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 los valores nulos en SQL debido a su tratamiento fuera de las comparaciones directas. Como se ve en la tabla anterior, las comparaciones de igualdad directa entre dos valores nulos en SQL (por ejemplo, NULL = NULL
) devuelven un valor de verdad de 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 "marca" para la información faltante. Sin embargo, el principio de que dos valores nulos no son iguales entre sí se viola efectivamente en la especificación SQL para los operadores UNION
y INTERSECT
, que identifican los valores 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 involucran comparaciones explícitas con NULL (por ejemplo, las de una WHERE
cláusula discutida 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 las operaciones de conjuntos ocurre "en un nivel de detalle más bajo que las pruebas de igualdad en la evaluación de las 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 los valores nulos en SQL". [7]
Además, debido a que los operadores SQL devuelven Unknown 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 o no Null. [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 TRUE a menos que ambos operandos sean iguales o ambos sean NULL. Del mismo modo, IS NOT DISTINCT FROM 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 Unknown si es nulo. En la práctica, varios sistemas (por ejemplo, PostgreSQL ) implementan el BOOLEAN Unknown como un BOOLEAN NULL, que 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:Ejemplo de ACTUALIZACIÓN SET columna1 = 'valor actualizado' DONDE columna2 = 'N' ;
DELETE
elimina filas existentes de una tabla, por ejemplo:ELIMINAR DE ejemplo DONDE columna2 = 'N' ;
MERGE
Se utiliza para combinar los datos de varias tablas. Combina los elementos INSERT
y UPDATE
. Se define 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 ON ( condición ) CUANDO COINCIDE ENTONCES ACTUALIZAR ESTABLECER columna1 = valor1 [, columna2 = valor2 ...] CUANDO NO COINCIDE ENTONCES INSERTAR ( columna1 [, columna2 ...]) VALORES ( valor1 [, valor2 ...])
Las transacciones, si están disponibles, encapsulan las 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 en absoluto.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 ); CONFIRMACIÓN ; ACTUALIZAR tbl_1 ESTABLECER id = 200 DONDE id = 1 ; PUNTO DE GUARDADO id_1upd ; ACTUALIZAR tbl_1 ESTABLECER id = 1000 DONDE id = 2 ; RETROCEDER a id_1upd ; SELECCIONAR id 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
, y deja los datos como estaban antes de esos cambios. Una vez que COMMIT
se completa la instrucción, los cambios de la transacción no se pueden revertir.COMMIT
y ROLLBACK
terminar 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 clásica transacción 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 ESTABLECER monto = monto - 200 DONDE número_de_cuenta = 1234 ; ACTUALIZAR Cuenta ESTABLECER monto = monto + 200 DONDE número_de_cuenta = 2345 ; SI ERRORES = 0 CONFIRMACIÓN ; SI ERRORES <> 0 RETROCESO ;
El lenguaje de definición de datos ( DDL) administra la estructura de tablas e índices. Los elementos más básicos del DDL son las instrucciones CREATE
, ALTER
, y :RENAME
DROP
TRUNCATE
CREATE
crea un objeto (una tabla, por ejemplo) en la base de datos, por ejemplo:Ejemplo CREAR TABLA ( columna1 ENTERO , 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:Ejemplo de ALTER TABLE ADD column4 INTEGER DEFAULT 25 NOT NULL ;
TRUNCATE
Elimina todos los datos de una tabla de forma muy rápida, eliminando los datos dentro de la tabla y no la tabla en sí. Suele implicar una operación COMMIT posterior, es decir, no se puede revertir (los datos no se escriben en los registros para su posterior reversión, a diferencia de DELETE).Ejemplo de TRUNCATE TABLE ;
DROP
elimina un objeto de la base de datos, generalmente de forma irrecuperable, es decir, no se puede revertir, por ejemplo:Ejemplo de DROP TABLE ;
Cada columna de una tabla SQL declara el tipo o 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 ): objeto grande de carácter con un tamaño máximo de n [ K | M | G | T ] caracteresCLOB(n [ K | M | G | T ])
NATIONAL CHARACTER(n)
(o ): cadena de ancho fijo que admite un conjunto de caracteres internacionalesNCHAR(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 | M | G | T ] caracteresNCLOB(n [ K | M | G | T ])
Para los tipos de datos CHARACTER LARGE OBJECT
y , se pueden utilizar opcionalmente NATIONAL CHARACTER LARGE OBJECT
los multiplicadores K
(1 024), M
(1 048 576), G
(1 073 741 824) y (1 099 511 627 776) al especificar la longitud.T
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 | M | G | 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
), SMALLINT
yBIGINT
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 la cantidad de dígitos significativos en una base particular (binaria o decimal). La escala es un entero no negativo. Una escala de 0 indica que el número es un 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
para FLOOR
redondear valores numéricos. (Las funciones específicas de los proveedores más populares son TRUNC
(Informix, DB2, PostgreSQL, Oracle y MySQL) y ROUND
(Informix, SQLite, Sybase, Oracle, PostgreSQL, Microsoft SQL Server y Mimer SQL).)
DATE
:para valores de fecha (por ejemplo 2011-05-03
).TIME
:para valores de tiempo (por ejemplo 15:51:36
).TIME WITH TIME ZONE
:lo mismo que TIME
, pero incluyendo detalles sobre la zona horaria en cuestión.TIMESTAMP
:Esto es a DATE
y a TIME
puestos juntos en una variable (por ejemplo 2011-05-03 15:51:36.123456
).TIMESTAMP WITH TIME ZONE
:lo mismo que TIMESTAMP
, pero incluyendo detalles sobre la zona horaria en cuestión.La función SQL EXTRACT
se puede utilizar para extraer un único campo (segundos, por ejemplo) de un valor de fecha y hora o de intervalo. La fecha y hora del sistema actual del servidor de base de datos se puede llamar mediante 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
, y .)DAYOFYEAR
DAYOFMONTH
DAYOFWEEK
YEAR(precision)
:un numero de añosYEAR(precision) TO MONTH
:un número de años y mesesMONTH(precision)
:un número de mesesDAY(precision)
:un numero de diasDAY(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)
:un número de minutosMINUTE(precision) TO SECOND(scale)
:un número de minutos y segundosEl lenguaje de control de datos (DCL) autoriza a los usuarios a acceder y manipular datos. Sus dos enunciados principales son:
GRANT
autoriza a uno o más usuarios a realizar una operación o un conjunto de operaciones en un objeto.REVOKE
elimina una concesión, que puede ser la concesión predeterminada.Ejemplo:
CONCEDER SELECCIONAR , ACTUALIZAR EN ejemplo A algún_usuario , otro_usuario ; REVOCAR SELECCIONAR , ACTUALIZAR EN ejemplo DE algún_usuario , otro_usuario ;
Aunque el argumento UNIQUE es idéntico a DISTINCT, no es un estándar ANSI.
[...] la palabra clave DISTINCT [...] elimina los duplicados del conjunto de resultados.