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:
|
||||||||||
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
No hay comentarios.:
Publicar un comentario