Mostrando entradas con la etiqueta SELECT. Mostrar todas las entradas
Mostrando entradas con la etiqueta SELECT. Mostrar todas las entradas

martes, 19 de agosto de 2014

Receta T-SQL No. 1-14: Especificación del Orden de los Resultados de una Consulta

Índice

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En la receta T-SQL anterior aprendimos cómo ordenar los resultados de una búsqueda especificando el nombre de una columna como expresión de orden. En esta receta agregaremos los conceptos de orden ascendente y descendente. Por ejemplo para valores numéricos podemos especificar de menor a mayor, o en sentido contrario, de mayor a menor. Veamos cómo se realiza esta tarea usando el lenguaje de consulta estructurado T-SQL.

1. Problema

Además de ordenar los resultados por grupo de columnas especifíficas, ahora es requisito sine qua non establecer en qué orden (i.e., mayor a menor, o menor a mayor) se deben, valga el pleonasmo, ordenar los resultados para ese conjunto de columnas.

2. Solución

Sobre la cláusula ORDER BY podemos especificar de forma explícita el modo de ordenamiento: ascencente o descente, a través de las palabras claves ASC y DESC, respectivamente.

3. Discusión de la Solución

La cláusula ORDER BY [2] ordena los resultados generados por una consulta. Su uso puede aplicarse en situaciones como:
  • Ordenamiento del resultado a partir de un listado de columnas. El orden se establece a partir de la primera columna, luego por la segunda, y así sucesivamente. (La omisión de la cláusula ORDER BY no garantiza un orden específico cada vez que ejecutemos una consulta, es por eso que debe ser explícita su inclusión al final de la consulta.)
  • Generación de un límite de filas en un orden específico.
Sintaxis T-SQL [2]:

ORDER BY order_by_expression
    [ ASC | DESC ] 
Descripción puntual:
  • order_by_expression: Grupo de columnas a partir de las cuales se realizará el orden de los resultados de la consulta. Los nombres de las columnas deben ser únicos y el tamaño total de las columnas no debe exceder los 8060 bytes.
  • ASC | DESC (opcional): Los valores de las columnas son ordenados ya sea en orden ascendente (ASC) o descedente (DESC).
[Nota: Esta descripción sintáctica de la cláusula ORDER BY comprende su uso básico, en [2] podrán encontrar su versión extendida.]

De manera predeterminada los resultados se orden ascendentemente (ya sean valores numéricos o alfabéticos). Para hacerlo explícito entonces utilizamos la palabra clave ASC por delante del nombre de la columna. Lo mismo hacemos para el orden inverso.

Veamos un ejemplo básico de uso de la cláusula ORDER BY:

Ordenemos por el ID de producto todos aquellos productos que su nombre empiece por la cadena de caracteres Lock Washer, además de que el ID del producto se se orde descendentemente:

SELECT ProductID AS 'ID Producto', Name AS 'Nombre'
FROM Production.Product
WHERE Name LIKE 'Lock Washer%'
ORDER BY ProductID DESC;

La ejecución de esta consulta sobre SQL Server 2014 Management Studio genera el siguiente resultado ordenado:
Orden descendente de resultados
Figura 1. Orden descendente de resultados de una búsqueda.

4. Práctica: Código T-SQL

Recurramos a un ejemplo más complejo para afianzar nuestro conocimiento sobre el uso de la cláusula ORDER BY:

SELECT p.Name AS 'Nombre Producto',
h.EndDate AS 'Fecha',
h.ListPrice AS 'Precio de Lista'
FROM Production.Product AS p
INNER JOIN Production.ProductListPriceHistory AS h
ON p.ProductID = h.ProductID
ORDER BY p.Name DESC,
h.EndDate DESC;

En esta consulta queremos mostrar todos aquellos registros de las tablas Product y ProductListPriceHistory que coincidan con el ID de producto (p.ProductID = h.ProductID). (Más adelante comprenderemos el uso de INNER JOIN.) El resultado de esta consulta estará ordenado de forma descedente por el nombre del producto (p.Name), y por la fecha del historial de precios de producto (h.EndDate).

Probemos ejecutando esta consulta para obtener el resultado:
Orden descendente para las columnas Name y EndDate.
Figura 2. Orden descendente para las columnas Name y EndDate.

5. Conclusiones

Aprendimos cómo ordenar las columnas del resultado de una consulta especificando ya sea en orden ascendente (ASC) o descendente (DESC) en conjugación con la cláusula ORDER BY. En la siguiente receta estudiarémos cómo realizar el orden de columnas no enlistadas en la cláusula SELECT.

6. Glosario

  • ASC
  • Ascendente
  • Cláusula
  • Consulta
  • DESC
  • Descendente
  • Orden
  • SQL Server
  • T-SQL

7. Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: ORDER BY Clause (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms188385.aspx


S

martes, 22 de julio de 2014

Receta T-SQL No. 1-10: Comprobación de Valores NULL

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

Aprendamos a través de esta receta T-SQL cómo comprobar si una o varias columnas de una tabla tienen asignados el valor NULL. Aprenderemos que el uso apropiado de las expresiones IS NULL y IS NOT NULL corresponde con un método de validación para la creación de consultas robustas y la remoción de inconsistencias en los resultados, por ejemplo, para la carga de información en un reporte.

1. Problema

Necesitamos encontrar una construcción de T-SQL que nos permita validar si una columna o varias poseen valores NULL (o lo que es lo mismo, ausencia de valor).

2. Solución

T-SQL cuenta con las construcciones IS NULL y IS NOT NULL para validar si el valor de una columna es NULL o no es NULL, respectivamente.

3. Discusión de la Solución

Con la expresión o construcción IS [NOT] NULL, podemos determinar si una expresión (columna, variable, constante, &c.) es NULL.

Sintaxis:

expression IS [ NOT ] NULL

Argumentos:
  • expression: es cualquier expresión valida (constante, columna, variable, o función escalar [más adelante hablaremos sobre este tipo de expresión]).
  • NOT: Negación de la expresión. TRUE si el el valor no es NULL, en caso contrario FALSE.
Tipos de Resultado:
  • Lógico (boolean)
Valores de retorno:
  • Si el valor de la expression es NULL, IS NULL retorna TRUE; en caso contrario, FALSE.
  • Si el valor de la expression es NULL, IS NOT NULL retorna FALSE; en caso contrario, TRUE.
A lo anterior, hay que sumar que los operadores de comparación como = y != no deben ser usados para validar la ausencia de valor, para ello utilice cualquier de las construcciones descritas anteriormente. En caso de usar uno de estos operadores de comparación, el valor de retorno de la evaluación de la expresión será UNKNOWN.

Ejemplo de uso:

A través de la siguiente consulta recuperaremos el peso de todos los productos cuyo peso es menor a 10 kilos o que su color está ausente (i.e., NULL):

SELECT Name AS 'Nombre', Weight AS 'Peso', Color
FROM Production.Product
WHERE Weight < 10.00 OR Color IS NULL
ORDER BY Name;


Al ejecutar esta consulta, obtenemos los siguientes resultados (parciales):
Nombre, Peso y Color de la tabla Product
Figura 1. Nombre, Peso y Color de la tabla Product.

Observemos que en la Figura 1, es resaltan (propio de SQL Server 2014 Management Studio) los campos que poseen valore NULL. Por otra parte, debido a que el predicado:

Weight < 10.00 OR Color IS NULL


consiste en una expresión o inclusiva: es posible que para uno o más registros (filas) resulten los campos Weight (Peso) y Color con valores NULL.



¿Qué pasa si usamos el operador de igualdad (=) para NULL?


Color = NULL


Los resultados de la consulta van a ser diferentes. (Pueden comprobarlo ejecutando esta consulta en SQL Server 2014 Management Studio).


Nota en [1]:
«NULL values and their improper handling are one of the most prevalant sources of query mistakes.»

4. Práctica: Código T-SQL

Creemos un ejemplo adicional. En esta ocasión vamos a enumerar aquellos productos a los que no se las asignado un valor (NULL):

SELECT Name AS 'Nombre', Weight AS 'Peso'
FROM Production.Product
WHERE Weight IS NULL;


Al ejecutar esta consulta, obtenemos:
Peso NULL
Figura 2. Peso NULL.

Nuevamente vemos resaltado con amarillo los valores del campo Peso, a razón de que se trata de valores NULL.

5. Conclusiones

Aprendimos que el operador IS [NOT] NULL nos permite validar si los valores de una columna se hayan ausentes (i.e., NULL). En la nota al final de la sección 3, nos advierten que el mal uso de valores NULL es uno de los errores más comunes en la especificación o retorno de valores de una consulta.

6. Glosario

  • Ausente
  • Consulta
  • Desconocido
  • Expresión
  • NULL
  • SQL SErver
  • T-SQL

Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: IS [NOT] NULL (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms188795.aspx


J

martes, 15 de julio de 2014

Receta T-SQL No. 1-9: Cómo Especificar un Rango de Valores

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En la preparación de esta receta T-SQL aprenderemos a especificar un rango de valores para diferentes tipos de datos (numéricos, fechas) con el operador BETWEEN. El rango especificado con este operador se representa como una condición de búsqueda y puede combinarse con el operador de negación lógico NOT para invertir la selección. Veremos que los valores que integran el rango también forman parte de la evaluación, es decir, que BETWEEN especifica un rango inclusivo.

1. Problema

Estamos en la búsqueda de una alternativa que permita la especificación de un rango de valores a evaluar en la condición de búsqueda. Sabemos muy bien que lo podemos hacer a través de los operadores relacionales menor que (<) y mayor que (>), sin embargo, queremos tecnificarnos aún más sobre las potencialidades de T-SQL.

2. Solución

La alternativa al uso de los operadores relacionales menor que (<) y mayor que (>) es precisamente BETWEEN. Con esta construcción podemos especificar un rango de valores para evaluar en la condición de búsqueda.

3. Discusión de la Solución

La sintaxis del operador BETWEEN [2] se describe así:

expresión [ NOT ] BETWEEN expresion_inicial AND expresion_final

Descripción puntual:
  • Argumentos:
    • expresión: Es la expresión (e.g., columna) que se utilizará para evaluar en el rango.
    • NOT: Niega el predicado (Negación de la Condición de una Búsqueda).
    • expresion_inicial: Corresponde con la expresión para el valor inferior del rango.
    • expresion_final: Corresponde con la expresión para el valor superior del rango.
    • AND: Enlaza los valores (expresion_inicial y expresion_final) del rango a evaluar.
  • Tipo retorno:
    • Boolean
El operador BETWEEN retorna TRUE si la expresión a evaluar está incluida entre los valores del rango. En caso contrario, FALSE.

Ejemplo de uso:


En este ejemplo de uso veremos como retornar un conjunto de ordenes (Sales.SalesOrderHeader) que han ocurrido entre la fecha 2005-07-01 y 2005-07-04:


SELECT SalesOrderID AS 'No. de Orden', Status AS 'Estado Orden'
FROM Sales.SalesOrderHeader
WHERE OrderDate BETWEEN '2007-07-01T00:00:00' AND '2007-07-04T00:00:00';


Notemos que las fechas '2007-07-01T00:00:00' y '2007-07-04T23:59:59' incluyen también la hora de la orden. Para la expresión final ('2007-07-04T23:59:59') hemos especificado la hora del final del día, para incluir todas aquellas ordenes que ocurrieren durante el 4 de julio hasta la media noche.


Resultado:
Ordenes hechas durante 4 días
Figura 1. Uso de BETWEEN para obtener las ordenes hechas durante 4 días.

[Nota: Pueden encontrar otros ejemplos más complejos en [2].]

4. Práctica: Código T-SQL

Con la condición BETWEEN y el operador de negación NOT podemos excluir los valores de un rango especificado. Veamos esto con un ejemplo:

Desde la tabla Sales.CreaditCard excluiremos aquellas tarjetas cuyo mes de expiración no esté entre abril (4) y agosto (8):

SELECT CardType AS 'Tipo Tarjeta', ExpMonth AS 'No. Mes Expiración'
FROM Sales.CreditCard
WHERE ExpMonth NOT BETWEEN 4 AND 8;

Resultado ejecución sentencia:
Resultado de uso operador NOT con BETWEEN

5. Conclusiones

Hemos trabajado con el operador BETWEEN, el cual es útil para la especificación de rango de valores correspondientes a un columna o expresión. Podemos combinarlo con el operador NOT para invertir el predicado y excluir aquellos registros (filas) que no nos interesa en el rango. Para la siguiente ocasión aprenderemos a verificar valores NULL.

6. Glosario

  • Base de datos
  • Condición de búsqueda
  • Operador
  • Rango
  • Sentencia
  • SQL Server
  • T-SQL

Literatura & Enlaces

[1]: SQL Server 2012 T-SQL Recipes - A Problem-Solucion Approach by Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield. Copyright 2012 Jason Brimhall, David Dye, Jonathan Gennick, Andy Roberts, and Wayne Sheffield, 978-1-4302-4200-0.
[2]: BETWEEN (Transact-SQL) - http://msdn.microsoft.com/en-us/library/ms187922.aspx


S