Introducción a las consultas de datos con T-SQL (Parte 3)


Continuando el pasado post con el tema respecto a las consultas de datos con T-SQL en MS SQL Server 2012, tratare a continuación el siguiente tema:

ELEMENTOS DEL LENGUAJE T-SQL

Los elementos del lenguaje T-SQL que les expondré y explicaré brevemente son los siguientes:

  • Predicados y operadores.
  • Funciones.
  • Variables.
  • Expresiones.
  • Separadores de lotes.
  • Flujos de control, errores y transacciones.
  • Comentarios.

Al igual que muchos lenguajes de programación como todos lo deben de saber, el lenguaje T-SQL contiene muchos elementos que nosotros utilizamos en nuestras consultas en las bases de datos. Nosotros usaremos los predicados para filtrar registros de datos, los operadores para realizar comparaciones, las funciones y las expresiones para manipular los datos con lo cual, recuperamos información del sistema, y por ultimo, los comentarios para documentar eficientemente el código que hayamos generado. A su vez, si necesitamos ir más allá de la escritura del comando SELECT para crear procedimientos almacenados ‘Store Procedure’, disparadores ‘Triggers’ y otros objetos, podemos utilizar también elementos como lo son los controles de flujo, las variables para almacenar temporalmente los valores, y los separadores de lotes.

Los siguientes ítems expuestos, nos permitirá conocer muchos de estos elementos en general de manera simple y dinámica.

El propósito de esta tercera entrega y más explícitamente de este post, es la de introducirnos en los elementos mas comunes del lenguaje T-SQL, presentándose aquí en un nivel conceptualmente alto. En futuros post, hablare con mas detalle de cada uno de los componentes del lenguaje mismo según se de el requerimiento del tema a tratar, vale.

PREDICADOS Y OPERADORES

El lenguaje T-SQL proporciona los elementos necesarios para la especificación y evaluación de expresiones lógicas, comúnmente utilizadas en nuestro trabajo diario como programadores sean principiantes, intermedio o avanzados. En las instrucciones SELECT, podemos utilizar las expresiones lógicas para definir filtros en conjunto con las cláusulas WHERE y HAVING. A continuación les expondré estas expresiones que utilizan generalmente los predicados y operadores.

GRÁFICO No. 1

Los predicados soportados por el lenguaje T-SQL son los siguientes:

  • IN, utilizado para determinar si un valor coincide con cualquier valor en una lista o una subconsulta.
  • BETWEEN, utilizado para especificar un rango de valores.
  • LIKE, utilizado para que coincidan caracteres contra un patrón común del mismo.

Ahora, debemos también tener en cuenta que los operadores incluyen varias categorías comunes y se las enuncio a continuación:

  • Comparativa‘, para probar igualdad y desigualdad de un contexto especifico: =, <, >, >=, <=, !=, !>, !< (Se debe tener en cuenta que !>, !<, != ya no están soportados bajo el estándar ISO. Es una buena práctica el utilizar las opciones estándar cuando las mismas no existen.)
  • Lógica‘, para comprobar la validez de una condición: AND, OR, NOT.
  • Aritmética‘, para realizar operaciones matemáticas: +, -, *, /, % (módulo).
  • Concatenación‘, para combinar cadenas de caracteres: +.
  • Asignación‘, para el establecimiento de un valor: =.

Al igual que con otros ambientes matemáticos, los operadores están sujetos a normas que rigen la precedencia. La siguiente tabla describe el orden en que los operadores de T-SQL se evalúan, y estos son importantes tenerlos en cuenta a la hora de programar, utilizándolos:

GRÁFICO No. 2

FUNCIONES

MS SQL Server 2012 ofrece una amplia gama de funciones disponibles para generar y ejecutar las consultas T-SQL. Estas van desde las funciones escalares como lo es el SYSDATETIME, estas devuelven un resultado de un solo valor, así como las funciones que operan sobre conjuntos completos, tales como las funciones de ventanas las cuales calculan un valor para cada fila en un conjunto de resultados derivado de la ventana, siendo esta un conjunto de filas especificado por el usuario que la ejecuta.

GRÁFICO No. 3

Al igual que con los operadores, las funciones de MS SQL Server 2012 se pueden organizar en categorías. Estas son algunas de las categorías comunes de las funciones escalares, ósea de valor simple, las cuales están disponibles para que escribamos eficientes consultas para indagar nuestros datos. A continuación se las enumero:

Funciones de cadena
Funciones de fecha y hora
Funciones de agregado
Funciones matemáticas

VARIABLES

Al igual que muchos lenguajes de programación, T-SQL proporciona un mecanismo para almacenar temporalmente valores de un tipo de datos específico. Sin embargo, a diferencia de otros entornos de programación, todas las variables creadas por el usuario son locales en el lote y/o bloque de T-SQL que los creó, y sólo se ve en el mismo. Es importante entender que no existen ni hay variables globales o públicas disponibles para los usuarios de SQL Server, ok.

Para crear una variable local en T-SQL, debe proporcionar un nombre, un tipo de datos y un valor inicial. El nombre debe empezar con un único símbolo @ (arroba) y el tipo de datos debe ser suministrado por el sistema o algún que haya sido definido por el usuario con anterioridad, almacenando el código en la base de datos se ejecutará en el momento que sea llamado dicho lote.

También podemos encontrar referencias en muchas fuentes de aprendizaje de SQL Server así como en sitios web entre otros, a las denominadas “variables del sistema”, cuyo nombre se definen con un doble arroba @@, como por ejemplo @@ERROR. Es mucho más coherente referirse a ellas como las funciones del sistema, ya que los usuarios no pueden asignar un valor para ellos, vale. El objetivo de este tópico es diferenciar objetivamente las variables locales o de los usuarios que comienzan con una sola arroba (@) a las de las funciones del sistema con el prefijo @@, lo ven.

Si la variable no se inicializa en la instrucción DECLARE, se creará con un valor de NULL y, posteriormente, podemos asignarle un valor con el comando SET. En MS SQL Server 2008 se introdujo la capacidad de nombrar e inicializar una variable en la misma declaración lo cual nos ahorro escribir código por su enorme bondad provista.

El siguiente ejemplo crea una variable local numérico entero llamado ‘MiVariable’ y le asignamos un valor inicial de 41:

DECLARE @MiVariable INT = 41;

El siguiente ejemplo crea una variable de tipo fecha local llamado ‘MiFechaDeCumpleanhos’ y separadamente le asignamos el valor inicial de 04 de noviembre de 1970:

DECLARE @FCHMiFechaDeCumpleanhos DATE;
SET @MiFechaDeCumpleanhos = ‘19701104’;

EXPRESIONES

T-SQL nos proporciona el uso eficiente de combinaciones tanto de identificadores, símbolos así como de operadores que son evaluados por SQL Server para devolver un único resultado. Estas combinaciones se conocen en nuestro entorno como “Expresiones”.

Las expresiones son una herramienta muy útil y poderosa para su uso en las consultas de datos. En las instrucciones SELECT, podemos usar expresiones:

  • La cláusula SELECT se utiliza para operar la manipulación de los datos en las columnas.
  • La expresión CASE nos permite remplazar los valores que coincidan de una expresión lógica con otro valor.
  • La cláusula WHERE la utilizamos para construir predicados con el fin de filtrar las filas.
  • Las expresiones de tipo tabla las utilizamos para crear conjuntos temporales de datos que se utilizan para su posterior procesamiento lo cual es una maravilla.

Ahora, cabe destacar también que las expresiones pueden basarse en una función escalar, ósea de un solo valor, o también en un valor constante, o dado caso en una variable. Las mismas se pueden unir a través de los operadores si tienen el mismo tipo de datos, o pueden ser convertidos a partir de una menor prioridad a una mayor, por ejemplo, de INT a MONEY.

El siguiente ejemplo que les mostraré a continuación, es la forma como una expresión opera sobre una columna para añadir un número entero en los resultados de la función YEAR en una columna de tipo DATETIME, ósea de fecha y hora:

SELECT YEAR(FechaFactura) AS AnhoActual, YEAR(FechaFactura) + 1 AS AnhoSiguiente
FROM Ventas.Facturas;

Lo ven, podemos darnos cuenta que el ejemplo anterior, utiliza las técnicas de T-SQL como son los alias en las columnas y las funciones de fecha, que los trataré en futuros post de esta serie, vale.

SEPARADORES DE LOTES

Las herramientas cliente de SQL Server, como lo es el SSMS, envían llamadas al motor de base de datos en conjuntos denominados lotes y/o bloques de código. Si se está ejecutando código manualmente, como en un editor de consultas, vosotros elegís si deseas enviar todo el texto en una secuencia de comandos como un lote pero también, podemos elegir insertar separadores entre ciertas secciones del código. Que a mi parecer es la mejor practica que debemos hacer.

La especificación de un separador de lotes es manejada por la herramienta de cliente, por ejemplo, la palabra clave ‘GO‘ es el separador de lotes por defecto en SSMS. Podemos cambiar esta palabra en el menú Consultas|Opciones de consulta (Query|Query Options), o globalmente en ‘Tools|Options|Query Execution’  (Herramientas|Opciones|Ejecución de la consulta).

Para ejemplificar lo emitido anteriormente, muchas veces no se aplica esta buena práctica ya que no se utilizan separadores de lote, como lo presentaré en una única consulta de manera general. Sin embargo, cuando necesitemos crear y manipular objetos, podríamos que necesitemos separar las declaraciones en distintos lotes como a continuación se los mostraré.

Una instrucción CREATE VIEW (Crear una vista), no podrá estar incluida en el lote con otras declaraciones.

CREATE TABLE TBL_Tabla1 (INTColumna1 INT);
CREATE VIEW VWV_Vista1 AS SELECT * FROM TBL_Tabla1;

Devuelve el siguiente error:

Msg 111, Level 15, State 1, Line 2
‘CREATE VIEW’ must be the first statement in a query batch.

Tengamos en cuenta que las variables declaradas por el usuario se consideran locales para el lote en el que se declaran. Sin embargo, si una variable se declara en un lote y se hace referencia en otro, el segundo sería un fracaso como lo veremos a continuación. Las siguientes declaraciones se han enviados juntas como un trabajo por lotes correctamente:

DECLARE @Cliente = 5;
SELECT IdCliente, Nombre, Contacto
FROM Ventas.Clientes
WHERE IdCliente = @INTIdCliente;

Sin embargo, si un separador de lotes fue insertado entre la declaración de variable y la consulta en la que se utiliza la variable, se producirá un error. En el ejemplo siguiente, se separa la declaración de la variable de su uso en una consulta:

DECLARE @Cliente = 5;
GO
SELECT IdCliente, Nombre, Contacto
FROM Ventas.Clientes
WHERE IdCliente = @INTIdCliente;

Devuelve el siguiente error:

Msg 137, level 15, State 2, Line 3
Must declare the scalar variable “IdCliente”

FLUJO DE CONTROL, ERRORES Y TRANSACCIONES

Mientras que T-SQL es un lenguaje primordialmente para la recuperación de datos y no un lenguaje procedural como los que habitualmente nosotros los programadores hemos venido acostumbrados, es compatible con un conjunto limitado de comandos que ofrecen algún tipo de control de flujo durante la ejecución del código.

Algunos de los de uso común usados son los siguientes:

  • IF… ELSE, nos proporciona el control en la toma de decisión sobre la base de una prueba lógica.
  • WHILE, nos repite una instrucción o un bloque de instrucciones mientras una condición es verdadera.
  • BEGIN… END, nos define la extensión de un bloque de comandos T-SQL.
  • TRY… CATCH, nos define la estructura de manejo de excepciones.
  • BEGIN TRANSACTION, nos marcar un bloque de instrucciones como parte de una transacción explicita.
  • Y para finalizar, COMMIT TRANSACTION o ROLLBACK TRANSACTION que nos insta ha aprobar o rechazar una ejecución dada de una transacción.

Ahora, las instrucciones de control de flujo no se utilizan en consultas independientes. y es importante tenerlo claro ya que su papel principal es el de un escritor de informe, por ejemplo, es poco probable que nosotros tengamos que usarlas. Sin embargo, si nuestras responsabilidades incluyen la creación de objetos tales como procedimientos almacenados (Stored Procedure) y disparadores (Triggers), encontrará estos elementos útiles.

COMENTARIOS

T-SQL proporciona dos mecanismos para documentar código y al mismo tiempo, instruye al motor de base de datos para omitir ciertas declaraciones que hayamos emitido en el texto. El método que se utilizará normalmente dependerá el número de líneas de código que desea marcar como ignorado:

  • Para las líneas individuales, o muy pocas líneas de código, se debe utilizar la opción –(doble guion), precediendo el texto a ser marcado como un comentario. Ignorando a su vez, cualquier texto siguiendo los guiones por SQL Server.
  • Para los largos bloques de código, escriba el texto entre los caracteres /* y */ porque con estos, se omitirá cualquier código entre los caracteres especiales por SQL Server.

En el ejemplo siguiente se utiliza el método –(doble guion) para marcar un comentario:

— Toda esta línea de texto será ignorada.
DECLARE @MiVariable INT = 42; — Sólo el texto siguiendo los guiones será ignorado.

En el ejemplo siguiente se utiliza este método /* bloque de comentario */ para marcar comentarios:

*/
Este es el texto del comentario que será ignorado.
*/

Puedes también personalizar por medio de la herramienta de edición de código a través de SSMS, utilizando la opción del menú Herramientas|Opciones (Tools|Options) como se los indique en el post titulado “Introducción a SQL Server Management Studio 2012 (1ra. entrega)“.

Espero que el presente post les ayude a enteder simplemente tópicos de los cuales muchas veces no nos percatamos de la importancia que tiene su comprensión plena, ok..

Nos pillamos en una próxima entrega, vale. Open-mouthed smile!!!