viernes, 29 de enero de 2016

WHERE y Operadores Lógicos en SQL



Buenos días queridos lectores, vamos a continuar con los post de SQL Server, ahora con la cláusula WHERE, pero, ¿para qué sirve la cláusula WHERE?, pues muy sencillo, sirve para filtrar los resultados obtenidos en alguna consulta, si quieren empezar a hacer consultas y han seguido los artículos del post ya saben que en post pasados publiqué es script de una base de datos de prueba, sobre la que haremos las consultas, si no lo sabían les dejo la liga del script, solo hace falta copiar el script y pasarlo al Managment Studio. Script de Ejemplo 


Buenos días queridos lectores, vamos a continuar con los post de SQL Server, ahora con la cláusula WHERE, pero, ¿para qué sirve la cláusula WHERE?, pues muy sencillo, sirve para filtrar los resultados obtenidos en alguna consulta, si quieren empezar a hacer consultas y han seguido los artículos del post ya saben que en post pasados publiqué es script de una base de datos de prueba, sobre la que haremos las consultas, si no lo sabían les dejo la liga del script, solo hace falta copiar el script y pasarlo al Managment Studio.
Pero comencemos pues la explicación y sobre todo, los ejemplos.

Operadores Lógicos

Los operadores lógicos tienen por misión comprobar la veracidad de alguna condición. Estos, como los operadores de comparación, devuelven un tipo de datos BOOLEAN con el valor Verdadero (TRUE), Falso (FALSE) o desconocido (UNKNOWN). En la siguiente tabla se mostrarán los diferentes operadores lógicos que existen:

Operador
Explicación
AND
Representa la Y lógica en la cual, dos expresiones deben ser TRUE para poder devolver TRUE
ANY
Devuelve TRUE si alguna expresión del conjunto de expresiones es TRUE
BETWEEN
Devuelve TRUE si el valor se encuentra dentro de un rango ya sea numérico o de cadena
EXIST
Devuelve TRUE si una determinada subconsulta devuelve por lo menos una fila d registros
IN
Devuelve TRUE si el operando se encuentra dentro de una lista de valores específicos.
LIKE
Devuelve TRUE si el operando coincide a lo más con un patrón especifico. Dicho patrón contiene la cadena de caracteres que se va a buscar en una expresión, los comodines a usar son:
%
Representa uno o más caracteres. Puede ser cualquier tipo de carácter, ya sea numérico, texto o símbolo.
_
Representa un solo carácter de cualquier tipo
[]
Representa cualquier carácter individual dentro de un intervalo o conjunto de caracteres
[^]
Representa cualquier carácter individual fuera del intervalo especificado
IS NOT NULL
Representa al contenido de una columna que no esté vacía
NOT
Invierte el valor booleano de una expresión del mismo tipo
OR
Representa la O lógica en la cual dos expresiones solo serán del tipo FALSE cuando ambas sean FALSE
SOME
Devuelve TRUE si alguna de las comparaciones de un conjunto de comparaciones es TRUE

En la mayoría de los casos cuando se usa un operador lógico se necesitará también símbolos que representen a los operadores lógicos y tenemos los siguientes:

=
Igualdad de expresiones
<> !=
Diferencia de expresiones
>|>=
Mayor | Mayor o igual
<|<=
Menor | Menor o igual


Ejemplo 1:
Script que permita mostrar los pasajeros que sean de código de país 0001 y tengan correo electrónico en HOTMAIL.

Primero mostraremos toda la tabla de pasajeros, como ya saben la sentencia será la siguiente:

SELECT *
             FROM PASAJERO
GO

Como ven, tenemos dos registros que cumplen con la condición del código del país que sea 0001, sin embargo solo los dos primeros son de HOTMAIL, ya que el tercero es de GMAIL, entonces para mostrar los registros, hay 2 condiciones; por lo tanto debemos unir ambas expresiones por medio de un operador lógico en este caso utilizaremos AND, ya que esta obligado a ser del pais 0001 y a la vez sea correo de HOTMAIL. Por lo cual utiliaremos la siguiente sentencia


SELECT *
             FROM PASAJERO
             WHERE IDPAIS='0001' AND EMAIL LIKE '%HOTMAIL%'
GO

Como vemos, en resultado solo nos muestra dos registros, si analizamos el Query, vemos que estamos obligando al sistema a mostrarnos únicamente los registros cuyo país sea 0001, pero también, mediante el uso del LIKE le decimos que solo los que contengan la palabra HOTMAIL en el campo EMAIL, veamos otro ejemplo

Ejemplo 2:
El administrador de una aerolínea anualmente hace una comparación entre el total de los costos acumulados en la reserva de acuerdo a un monto establecido como meta. Se pide implementar un script que permita mostrar un mensaje de EL MONTO NO SUPERA AL BASE ANUAL solo en caso que el acumulado de costos no superara el valor programado, caso contrario mostrará el mensaje EL MONTO CUMPLE CON LA BASE ANUAL. Considere que los valores de la base anual y el año a comparar deben ser ingresados por el usuario. Usaremos operadores Transact-SQL.

Muy bien comencemos mostrando la estructura de la tabla RESERVA



SELECT * FROM
                    RESERVA
GO

 Este es el resultado que arroja la consulta, entonces procederemos a realizar lo que se nos pide en el ejemplo




Solución con ANY
DECLARE @AÑO INT=2012
DECLARE @MONTO MONEY = 10000

IF @MONTO > ANY (
                           SELECT SUM(COSTO)
                                        FROM RESERVA
                                        GROUP BY YEAR(FECHA)
                                        HAVING YEAR (FECHA) = @AÑO)
       PRINT 'EL MONTO NO SUPERA LA BASE ANUAL'
       ELSE
       PRINT 'EL MONTO CUMPLE CON LA BASE ANUAL'
GO

Solución con SOME
DECLARE @AÑO INT=2012
DECLARE @MONTO MONEY = 10000

IF @MONTO > SOME (
                           SELECT SUM(COSTO)
                                        FROM RESERVA
                                        GROUP BY YEAR(FECHA)
                                        HAVING YEAR (FECHA) = @AÑO)
       PRINT 'EL MONTO NO SUPERA LA BASE ANUAL'
       ELSE
       PRINT 'EL MONTO CUMPLE CON LA BASE ANUAL'
GO

En el script se declararon dos variables @AÑO y @MONTO con valores predeterminados, en post anteriores había escrito sobre las variables en SQL, les dejo la liga para quien no tuvo oportunidad de leerlo Variables en SQL SERVER, usted podrá modificar dichos valores para probar el script

Luego se compara el @MONTO con una consulta escalar (se dice que una consulta es escalar cundo el resultado de la consulta es de un solo valor), analizaremos la consulta desde el FROM que hace referencia ala tabla RESERVA de donde obtendremos los costos a comparar, GROUP BY YEAR(FECHA) permite agrupar los registros por años ya que el ejemplo solicita comparaciones por años, HAVING YEAR(@FECHA)=@AÑO permite condicionar el resultado de la agrupación por año es por eso que se iguala a @AÑO ingresado por el usuario, finalmente SUM(COSTO) permite acumular los costos, según la condicional o la agrupación de la sentencia.

SOME o ANY devuelve TRUE cuando la comparación especificada también es TRUE entre la expresión @MONTO>SOME; en caso que sea verdadero, el mensaje será EL MONTO NO SUPERA LA BASE ANUAL; en caso contrario mostrará el mensaje EL MONTO CUMPLE CON LA BASE ANUAL.

Veamos otro ejemplo de la cláusula WHERE

Ejemplo 2:
Script que permita mostrar las reservas cuyo costo se encuentre entre 400 y 700. Usando el operador BETWEEN

SELECT *
       FROM RESERVA
       WHERE COSTO BETWEEN 400 AND 700
GO

En el script se condiciona la columna COSTO para que muestre aquellas reservas que se encuentren entre 400 y 700. También se pudo implementar obviando el operador BETWEEN de la siguiente manera:




SELECT *
       FROM RESERVA
       WHERE COSTO>=400 AND COSTO<=700
GO

Ejemplo 3:
Script que permita mostrar los pasajeros cuya letra inicial de su nombre se encuentre entre A y L. Utilizaremos el operado lógico BETWEEN

SELECT *
             FROM PASAJERO
             WHERE LEFT(NOMBRES,1) BETWEEN 'A' AND 'L'
             ORDER BY NOMBRES
GO

En el script usamos la función LEFT que permite obtener el primer carácter de la columna nombres para poder comparar si dicha letra se encuentra en el rango de A hasta L. Pero veamos otra manera de hacer lo mismo:

SELECT *
             FROM PASAJERO
             WHERE LEFT(NOMBRES,1) LIKE '[A-L]'
             ORDER BY NOMBRES
GO

Esta vez usamos el operador LIKE  que permite comparar solo cadenas de caracteres, al especificar '[A-L]' hacemos referencia a que las letras están entre A y L. Veamos el resultado de la consulta:



También podríamos negar la condicional usando el operador NOT para poder listar a los pasajeros que la letra inicial no se encuentre entre la A y la L. El script quedaría de la siguiente manera:

SELECT *
             FROM PASAJERO
             WHERE NOT LEFT(NOMBRES,1) BETWEEN 'A' AND 'L'
             ORDER BY NOMBRES
GO


Como pueden ver, es el mismo script que se realizó para mostrar los pasajeros cuya letra inicial se encuentre entre A y L solo que aquí se niega el resultado lógico e invierte el contenido mostrado, el resultado es el siguiente:


Ejemplo 4:
Script que permita mostrar las reservas cuya fecha se encuentre incluida en el año 2011 usando el operador lógico BETWEEN.

SELECT *
             FROM RESERVA
             WHERE FECHA BETWEEN '01/01/2011' AND '31/12/2011'
GO


En el script anterior se muestra como se puede implementar el operador BETWEEN en comparaciones con datos de tipo fecha, en este caso, para referenciar fechas se tienen que encerrar entre comillas simples.

También podríamos resolver este caso pero usando el operador AND de la siguiente manera:

SELECT *
             FROM RESERVA
             WHERE FECHA>='01/01/2011' AND FECHA <='31/12/2011'
GO

Y otra opción mucho más corta que las anteriores podría ser el uso de la función YEAR que simplifica los rangos en un solo valor, así podríamos comprobar por medio de un solo valor numérico

SELECT *
             FROM RESERVA
             WHERE YEAR(FECHA)=2011
GO


En cualquiera de los casos, el resultado que vemos es el siguiente:

Como ven, un mismo planteamiento se puede resolver de distintas maneras y todas ellas están correctas, pero es importante saber todas ellas para poder elegir la que más se adecue a nosotros.






Ejemplo 5:
Script que permite verificar si un determinado PAIS fue o no fue registrado en su tabla de origen, mostrando un mensaje para cada caso.

Primero debemos verificar los registro de la tabla PAIS


DECLARE @PAIS VARCHAR(40)='CHINA'
IF EXISTS(SELECT IDPAIS
                                  FROM PAIS
                                  WHERE PAIS=@PAIS)
       PRINT 'EL PAIS YA SE ENCUENTRA REGISTRADO'
ELSE
       PRINT 'EL PAIS NO SE ENCUENTRA REGISTRADO'
GO

La variable @PAIS esta inicializada con el valor CHINA que no se encuentra registrada dentro de la tabla PAIS, entonces el operador EXISTS evalúa que el resultado de la consulta tenga un registro con dicho valor, en este caso mostrará un mensaje EL PAIS YA SE ENCUENTRA REGISTRADO, en caso contrario mostrará un mensaje EL PAIS NO SE ENCUENTRA REGISTRADO como sucede en el caso de CHINA que no se encuentra registrado en la tabla PAIS.

El operador EXISTS solo evalúa la existencia de por lo menos un registro para poder dar como TRUE en una expresión determinada

Ejemplo 6:
Script que permita realizar los pagos realizados en un determinado año usando el operador IN

DECLARE @AÑO INT=2011
SELECT *
       FROM PAGO
       WHERE YEAR(FECHA) IN (@AÑO)
GO

En el script se declara la variable @AÑO de tipo entero que tiene por misión ser el valor de la condicional dentro de la consulta. En este caso se inicializa como 2011 para buscar los pagos realizados ese año.

Al especificar la condición se usó la función YEAR para determinar el año de la columna FECHA, este deberá ser incluido dentro de la lista especificada en IN, como en el caso solo solicita de un determinado año, entonces la clausula IN solo tendrá el parámetro @AÑO.

Ejemplo 7:
Realizar un script que permita mostrar los pasajeros condicionados a tres posibles países usando el operador IN

DECLARE @PAIS1 VARCHAR(40)='PERU'
DECLARE @PAIS2 VARCHAR(40)='ECUADOR'
DECLARE @PAIS3 VARCHAR(40)='BRASIL'

SELECT *
       FROM PASAJERO
       WHERE IDPAIS IN (
                                  SELECT IDPAIS
                                               FROM PAIS
                                               WHERE PAIS IN (@PAIS1, @PAIS2, @PAIS3))
GO

 En el script se declaran tres variables de tipo varchar que permitirán inicializar los tres posibles paises para que la consulta pueda mostrar a los pasajeros que cumplan con dicha condición.

En la columna IDPAIS es la condición para mostrar los pasajeros, entonces se usa el operador IN para determinar si los códigos de los paises registrados en la tabla PASAJERO se encuentra en la tabla PAIS en este caso se aplica una subconsulta para tal proceso. En esta subconsulta se utiliza nuevamente el operador IN para determinar si los paises asignados a las variables se encuentran en la tabla PAIS de la siguiente forma IN (@PAIS1, @PAIS2, @PAIS3). El resultado de esa consulta es el siguiente:


Ejemplo 8:
Script que permita mostrar los pasajeros cuyo nombre inicie con la letra A usando el operador LIKE y el comodín %

SELECT P.*
       FROM PASAJERO P
       WHERE P.NOMBRES LIKE 'A%'
GO



En el script se condiciona la columna NOMBRES donde el primer carácter es la letra A, seguida de cualquier carácter, ésto está representado por el comodín % usando para este caso LIKE por ser una comparación de tipo carácter

Ahora, haremos una pequeña modificación para mostrar los pasajeros cuyo nombre tenga incluido una letra A en cualquier lugar.

SELECT P.*
       FROM PASAJERO P
       WHERE P.NOMBRES LIKE '%A%'
GO


En este caso la letra A se encierra con el comodín % para representar que dicho carácter podría estar en cualquier lugar.

Para mostrar los pasajeros cuya segunda letra de su nombre sea la letra A tendríamos que modificar el script de la siguiente manera:

SELECT P.*
       FROM PASAJERO P
       WHERE P.NOMBRES LIKE '_A%'
GO

En este caso usamos el comodín _ que representa a un solo carácter de cualquier tipo, seguidamente se colocó la letra A justamente en el segundo lugar, como lo solicita el caso, no olvidarse de colocar el comodín % para representar los demás caracteres , un error sería colocar de la siguiente forma '_A', ya que aquí estaría buscando los nombres de los pasajeros que solo tengan dos caracteres.

Ejemplo 9:
Script que permita mostrar los pasajeros cuyo segundo carácter de su nombre sea la letra A,O o U usando el operador LIKE y el comodín %_[].

SELECT P.*
       FROM PASAJERO P
       WHERE P.NOMBRES LIKE '_[AOU]%'
GO


En este script las letras a buscar son especificadas dentro de los corchetes de la siguiente forma [AOU] pero como se indica que tienen que ser en la segunda posición, entonces se usa el comodín _ y finalmente, como son de segundo caracter se tienen que especificar los demás caracteres con el comodín %

Ejemplo 10:
Script que permita mostrar los pasajeros cuyo segundo carácter de su nombre sea diferente alas vocales A, O y U usando el operador LIKE y el comodín %^_[].

SELECT P.*
       FROM PASAJERO P
       WHERE P.NOMBRES LIKE '_[^AOU]%'
GO


 Hasta aquí el post queridos lectores, se que es mucha información, pero recuerdes que es TRANSACT SQL y por lo tanto es más avanzado, pero se que le podrán entender. Muy bien, espero compartan, den +1, comenten o por lo menos denle clic a algún anuncio de su interés, me despido de ustedes.

Un abrazo



Banderas de Visitantes

Flag Counter