En mi último artículo, describí a grandes rasgos en qué se diferencia el SQL estándar del T-SQL y quién debería aprender cuál. Ahora me gustaría centrarme en las diferencias sintácticas e ilustrar estas diferencias con ejemplos. Si piensas que T-SQL es una extensión que implementa todas las características de SQL estándar, no estás en lo cierto. Sin embargo, en SQL Server, encontrarás casi todas las características del estándar SQL. En este artículo, encontrará ejemplos de algunas de las diferencias de sintaxis entre el SQL estándar y el Transact-SQL.

#1 Nombres de los objetos de la base de datos

En los sistemas de bases de datos relacionales, nombramos las tablas, las vistas y las columnas, pero a veces necesitamos utilizar el mismo nombre como palabra clave o utilizar caracteres especiales. En SQL estándar, puedes colocar este tipo de nombre entre comillas («»), pero en T-SQL, también puedes colocarlo entre paréntesis (). Mira estos ejemplos para el nombre de una tabla en T-SQL:

CREATE TABLE dbo.test."first name" ( Id INT, Name VARCHAR(100));CREATE TABLE dbo.test. ( Id INT, Name VARCHAR(100));

Sólo el primer delimitador (las comillas) para el nombre especial también forma parte del estándar SQL.

¿Qué hay de diferente en una sentencia SELECT?

El estándar SQL no tiene una sintaxis para una consulta que devuelva valores o valores procedentes de expresiones sin hacer referencia a ninguna columna de una tabla, pero MS SQL Server sí permite este tipo de expresiones. ¿Cómo? Se puede utilizar una sentencia SELECT sola con una expresión o con otros valores que no provengan de columnas de la tabla. En T-SQL, se parece al ejemplo siguiente:

SELECT 12/6 ;

En esta expresión, no necesitamos una tabla para evaluar 12 dividido por 6, por lo tanto, se puede omitir la sentencia FROM y el nombre de la tabla.

#3 Limitación de registros en un conjunto de resultados

En el estándar SQL, se puede limitar el número de registros en los resultados utilizando la sintaxis que se ilustra a continuación:

SELECT * FROM tab FETCH FIRST 10 ROWS ONLY

T-SQL implementa esta sintaxis de una manera diferente. El ejemplo siguiente muestra la sintaxis de MS SQL Server:

SELECT * FROM tab ORDER BY col1 DESC OFFSET 0 ROWS FETCH FIRST 10 ROWS ONLY;

Como se puede observar, esto utiliza una cláusula ORDER BY. Otra forma de seleccionar filas, pero sin ORDER BY, es utilizando la cláusula TOP en T-SQL:

SELECT TOP 10 * FROM tab;

#4 Generación automática de valores

El estándar SQL permite crear columnas con valores generados automáticamente. La sintaxis para hacerlo se muestra a continuación:

CREATE TABLE tab (id DECIMAL GENERATED ALWAYS AS IDENTITY);

En T-SQL también podemos generar valores automáticamente, pero de esta manera:

CREATE TABLE tab (id INTEGER IDENTITY);

#5 Funciones matemáticas

Varias funciones matemáticas comunes forman parte del estándar SQL. Una de estas funciones matemáticas es CEIL(x), que no encontramos en T-SQL. En su lugar, T-SQL proporciona las siguientes funciones no estándar: SIGN(x), ROUND(x,) para redondear el valor decimal x al número de posiciones decimales, TRUNC(x) para truncar a un número dado de posiciones decimales, LOG(x) para devolver el logaritmo natural de un valor x, y RANDOM() para generar números aleatorios. El número más alto o más bajo de una lista en el estándar SQL es devuelto por las funciones MAX(list) y MIN(list), pero en Transact-SQL, se utilizan las funciones GREATEST(list) y LEAST(list).

T-SQL function ROUND:SELECT ROUND(col) FROM tab;

#6 Funciones de agregación

Encontramos otra diferencia sintáctica con las funciones de agregación. Las funciones COUNT, SUM y AVG toman un argumento relacionado con un recuento. T-SQL permite el uso de DISTINCT antes de estos valores de argumento para que las filas se cuenten sólo si los valores son diferentes de otras filas. El estándar SQL no permite el uso de DISTINCT en estas funciones.

Standard SQL:SELECT COUNT(col) FROM tab;T-SQL:SELECT COUNT(col) FROM tab;SELECT COUNT(DISTINCT col) FROM tab;

Pero en T-SQL no encontramos una función de covarianza poblacional: COVAR_POP(x,y), que está definida en el estándar SQL.

#7 Recuperación de partes de fechas y horas

La mayoría de los sistemas de bases de datos relacionales entregan muchas funciones para operar con fechas y horas.

En SQL estándar, la función EXTRACT(YEAR FROM x) y otras funciones similares para seleccionar partes de fechas son diferentes de las funciones T-SQL como YEAR(x) o DATEPART(year, x).

También hay una diferencia en la obtención de la fecha y hora actuales. El SQL estándar permite obtener la fecha actual con la función CURRENT_DATE, pero en MS SQL Server no existe una función similar, por lo que tenemos que utilizar la función GETDATE como argumento en la función CAST para convertir a un tipo de dato DATE.

#8 Operar con cadenas

El uso de funciones para operar con cadenas también es diferente entre el SQL estándar y el T-SQL. La principal diferencia se encuentra en la eliminación de los espacios iniciales y finales de una cadena. En el SQL estándar, existe la función TRIM, pero en el T-SQL, hay varias funciones relacionadas: TRIM (eliminación de espacios finales y finales), LTRIM (eliminación de espacios finales) y RTRIM (eliminación de espacios finales).

Otra función de cadena muy utilizada es SUBSTRING.

La sintaxis estándar de SQL para la función SUBSTRING se parece a:

SUBSTRING(str FROM start ) 

pero en T-SQL, la sintaxis de esta función se parece a:

SUBSTRING(str, start, length)

A veces hay razones para añadir valores procedentes de otras columnas y/o cadenas adicionales. El SQL estándar permite la siguiente sintaxis para hacer esto:

Como puede ver, esta sintaxis hace uso del operador || para añadir una cadena a otra.

Pero el operador equivalente en T-SQL es el carácter del signo más. Mira este ejemplo:

SELECT col1 + col2 FROM tab;

En SQL Server, también tenemos la posibilidad de utilizar la función CONCAT que concatena una lista de cadenas:

SELECT CONCAT(col1, str1, col2, ...) FROM tab;

También podemos repetir un carácter varias veces. El SQL estándar define la función REPEAT(str, n) para hacer esto. Transact-SQL proporciona la función REPLICATE. Por ejemplo:

SELECT REPLICATE(str, x); 

Donde x indica cuántas veces hay que repetir la cadena o carácter.

#9 Operador de desigualdad

Durante el filtrado de registros en una sentencia SELECT, a veces tenemos que utilizar un operador de desigualdad. El SQL estándar define <> como este operador, mientras que el T-SQL permite tanto el operador estándar como el operador !=:

SELECT col3 FROM tab WHERE col1 != col2;

#10 Función ISNULL

En el T-SQL, tenemos la posibilidad de reemplazar los valores NULL procedentes de una columna utilizando la función ISNULL. Esta es una función que es específica de T-SQL y no está en el estándar SQL.

SELECT ISNULL(col1) FROM tab;

¿Qué partes de la sintaxis DML son diferentes?

En T-SQL, la sintaxis básica de las consultas DELETE, UPDATE e INSERT es la misma que la del estándar SQL, pero las diferencias aparecen en las consultas más avanzadas. Veámoslas.

#11 Palabra clave OUTPUT

La palabra clave OUTPUT aparece en las sentencias DELETE, UPDATE e INSERT. No está definida en el SQL estándar.

Usando T-SQL, podemos ver información extra devuelta por una consulta. Devuelve tanto los valores antiguos como los nuevos en UPDATE o los valores añadidos usando INSERT o borrados usando DELETE. Para ver esta información, tenemos que usar prefijos en INSERT, UPDATE y DELETE.

UPDATE tab SET col='new value' OUTPUT Deleted.col, Inserted.col;

Vemos el resultado de cambiar registros con los valores anteriores y nuevos en una columna actualizada. El estándar SQL no soporta esta característica.

#12 Sintaxis para INSERT INTO … SELECT

Otra estructura de una consulta INSERT es INSERT INTO … SELECT. T-SQL le permite insertar datos de otra tabla en una tabla de destino. Mira esta consulta:

INSERT INTO tab SELECT col1,col2,... FROM tab_source;

No es una función estándar sino una característica de SQL Server.

#13 Cláusula FROM en DELETE y UPDATE

SQL Server proporciona una sintaxis extendida de las cláusulas UPDATE y DELETE con FROM. Puede utilizar DELETE con FROM para utilizar las filas de una tabla para eliminar las filas correspondientes en otra tabla haciendo referencia a una clave primaria y una clave externa. Del mismo modo, puede utilizar UPDATE with FROM para actualizar filas de una tabla haciendo referencia a las filas de otra tabla utilizando valores comunes (clave primaria en una tabla y clave foránea en la segunda, por ejemplo, el mismo nombre de ciudad). Un ejemplo es:

DELETE FROM BookFROM AuthorWHERE Author.Id=Book.AuthorId AND Author.Name IS NULL;
UPDATE BookSET Book.Price=Book.Price*0.2FROM AuthorWHERE Book.AuthorId=Author.Id AND Author.Id=12;

El estándar SQL no proporciona esta sintaxis.

#14 INSERTAR, ACTUALIZAR y ELIMINAR con JOIN

También puede utilizar INSERTAR, ACTUALIZAR y ELIMINAR utilizando JOIN para conectarse a otra tabla. Un ejemplo de esto es:

DELETE ItemOrder FROM ItemOrderJOIN Item ON ItemOrder.ItemId=Item.IdWHERE YEAR(Item.DeliveredDate) <= 2017;

Esta característica no está en el estándar SQL.

Resumen

Este artículo no cubre todos los temas sobre las diferencias de sintaxis entre el estándar SQL y T-SQL usando el sistema MS SQL Server. Sin embargo, esta guía ayuda a señalar algunas características básicas propias sólo de Transact-SQL y qué sintaxis del estándar SQL no es implementada por MS SQL Server.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.