martes, 15 de julio de 2014

Receta T-SQL No. 1-8: Negación de la Condición de una Búsqueda

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión del a Solución
3.1 Ejemplos de uso
3.1.1 IN
3.1.2 IS NULL
3.1.4 LIKE
3.1.5 BETWEEN
4. Práctica: Código T-SQL
5. Conclusiones
6. Glosario
7. Literatura & Enlaces

0. Introducción

En esta octava receta de T-SQL aprenderemos a utilizar el operador de negación lógica. Veremos que este tipo de construcción del lenguaje de consulta estructura, T-SQL, facilita la especificación de consultas más intuitivas y naturales. En los ejemplos, se demostrará su uso con otras construcciones como INLIKE, BETWEEN, IS NULL.

1. Problema

Debemos crear sentencias SQL que expresen intuitiva y naturalmente las condiciones que deben cumplir los datos para ser parte del conjunto de resultados que se espera para diseñar, por ejemplo, un reporte.

2. Solución

El lenguaje de consulta estructura de SQL Server cuenta con el operador lógico de negación NOT. Este operador invierte los valores de verdad (i.e., TRUE, y FALSE) a sus respectivas contrapartes (i.e., TRUE, y FALSE).

En líneas simples, una expresión de selección o consulta queda construida así:

SELECT <conjunto de campos> FROM nombre_table WHERE NOT <condicion>;

3. Discusión de la Solución

El operador NOT se utiliza para invertir o negar valores de verdad calculados en una condición. En lógica se expresa con el carácter ¬. Representamos la preposición con la letra p; ahora, los únicos posibles valores de verdad para p son TRUE y FALSE. Neguémosla:
Tabla de verdad para ¬p
Figura 0. Tabla de verdad para ¬p.
Esta brevísima introducción al uso del operador lógico NOT, nos servirá para comprender su funcionalidad en el lenguaje T-SQL. Veamos.


Su utilidad comprende la construcción de condiciones de búsqueda que incluyan todos aquellos valores que NO queremos que sean parte del conjunto de resultados. Asumamos que desde la tabla Person.Person solo queremos aquellos valores de la columna LastName diferentes de:

  • Sánchez
  • Duffy
  • Walter
entonces la sentencia SQL queda de la siguiente manera:

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
FROM Person.Person
WHERE NOT (LastName = 'Sánchez' OR LastName = 'Duffy' OR LastName = 'Walter');


Esta sentencia ejecutada en SQL Server 2014 Management Studio nos genera el siguiente resultado (versión reducida debido a su longitud {19965 filas}):
Uso del operador NOT
Figura 1. Uso del operador NOT.

Ahora imaginémonos si hubiéramos omitido o desconociéramos el operador NOT, hubiéramos tenido que escribir todos los apellidos excepto los tres anteriores, que en realidad comprenden 1203 apellidos distintos en la tabla Person.Person. Tedioso, además de fatigante, ¿verdad?


Por otra parte, el operador NOT puede ser usado con otras construcciones del lenguaje SQL:

  • IN
  • IS NULL
  • LIKE
  • BETWEEN
Veamos algunos ejemplos con cada uno de estos:

3.1 Ejemplos de uso

3.1.1 IN

La sentencia de ejemplo anterior, también puede escribir de la siguiente manera usando el condicional IN:

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
  FROM Person.Person
WHERE LastName NOT IN ('Sanchez', 'Duffy', 'Walter');

El resultado es exactamente el mismo al que se muestra en la Figura 1.

3.1.5 IS NULL

Con esta sentencia SQL recuperamos el valor de la columna Title cuyo valor NO sea NULL:

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
FROM Person.Person
WHERE Title IS NOT NULL;


Resultado de ejecución de la sentencia previa:
Resultado de uso operador NOT con IS NULL
Figura 2. Resultado de uso operador NOT con IS NULL.

3.1.3 LIKE

Omitamos aquellas personas cuyo apellido empiece con la letra 'A':

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
FROM Person.Person
WHERE LastName NOT LIKE 'A%';


Resultado de ejecución de la sentencia:
Resultado de uso operador NOT con LIKE
Figura 3. Resultado de uso operador NOT con LIKE.

3.1.4 BETWEEN

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
Figura 4. Resultado de uso operador NOT con BETWEEN.

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

¿Aún más práctica? Sí. En este sección crearemos otro ejemplo (adaptado de [1]) que consiste en recuperar los registros de la tabla Person.Person que no incluyan los valores 'Ms.' y 'Mrs.' para la columna Title.

Al escribir la consulta SQL usando el operador NOT tenemos:

SELECT FirstName AS 'Nombre' , LastName AS 'Apellido'
FROM Person.Person
WHERE NOT (Title = 'Ms.' OR Title = 'Mrs.');

Resultado:
Ejemplo de uso operador NOT
Figura 5. Ejemplo de uso operador NOT.

5. Conclusiones

Receta T-SQL en la que hemos comprendido el uso del operador NOT. Este operador nos permite la creación de sentencias de selección más intuitivas y naturales, además de breves. En el primer ejemplo introducido en la sección 3 demostramos que la especificación de todos los valores posibles para un campo puede resultar tedioso y fatigante. (El operador NOT evita esto) En la próxima receta aprenderemos a especificar rangos de valores, útiles para valores númericos, fechas.

6. Glosario

  • Lógica
  • Negación lógica
  • Operación lógica
  • Rango
  • Sentencia
  • SQL
  • 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]: 125 Using the NOT Logical Connective to Negate the Search Condition in a WHERE Clause - SQL Tips & Techniques (Miscellaneous): - http://flylib.com/books/en/1.490.1.129/1/
[3]: Negation - Wikipedia, the free encyclopedia - http://en.wikipedia.org/wiki/Negation
[4]: use the NOT operator to negate a condition. : Not « Query « SQL Server / T-SQL Tutorial - http://www.java2s.com/Tutorial/SQLServer/0020__Query/usetheNOToperatortonegateacondition.htm


S

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.