Está en la página 1de 35

Introducción a TSQL

Unidad 2

Autor
Isabel Ponce
Unidad 2

Consultas Simples

Objetivos

• Limitar los resultados (WHERE)


• Usar criterios compuestos (AND/OR)
• Agrupación de criterios
• Operadores de comparación
• Rangos (BETWEEN)
• Pertenencia de conjuntos (IN)
• Correspondencia de patrones (LIKE)
• Caracteres de escape
• Valores Nulos (NULL)
• Negación (NOT)
WHERE
(Restricción de renglones)

• Hasta este momento hemos


retornado el contenido completo de
una tabla. Esto normalmente no es
muy práctico.

• Suponiendo que sólo queremos ver


a los autores que viven en California.

• Podríamos hacer select * from


authors y recorrer el resultado
obtenido para buscar aquellos donde
la columna state = CA.

• Aunque esto es fácil de hacer en


tablas pequeñas, no es práctico para
grandes volúmenes de información.

• Así que, para limitar el resultado de


acuerdo a nuestras necesidades,
usaremos la tercera cláusula mayor
de SQL: where.
WHERE
(Restricción de renglones)

• La cláusula where le indica a la base


de datos cuáles renglones extraer y
consta de la palabra WHERE
seguida de una condición de
búsqueda.

• Para extraer sólo aquellos autores


que viven en CA, podríamos usar la
siguiente instrucción:

• select au_lname, au_fname, state


from authors where state = 'CA‘

au_lname au_fname state 


­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­ 
White   Johnson  CA    
Green    Marjorie CA    
Carson  Cheryl  CA    
O'Leary   Michael CA    
...
(15 row(s) affected)

• Esto limita nuestro resultado a sólo


los autores en CA.
Criterio Compuesto
(Operadores Lógicos -AND)

• Aún así, la lista de autores podría ser


muy larga y podríamos estar
buscando sólo aquellos autores que
tengan el apellido Green, para
obtenerlos podemos indicar:

select au_lname, au_fname, state


from authors
where state = 'CA'
and au_lname = 'Green'
au_lname          au_fname  state 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­ ­­­­­ 
Green       Marjorie    CA    

(1 row(s) affected)

• Se debe tener cuidado con la


ortografía ya que SQL Server puede
configurarse para ser sensible a las
mayúsculas. La base de datos es
insensible a las mayúsculas pero
esto no aplica necesariamente a los
valores de los datos.

• Green no es lo mismo que GREEN.


Criterio Compuesto
(Operadores Lógicos –OR)

• También se debe tener cuidado en


poner apóstrofes antes y después de la
cadena de caracteres.
• Ahora que sabemos cómo obtener a
los autores que viven en CA, ¿cómo
obtenemos también aquellos que viven
en KS?
• Para conseguirlo usamos el operador
OR en vez del operador AND:
select *
from authors
where state = 'CA' or state = 'KS'
au_lname au_fname state 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­ ­­­­­ 
White  Johnson CA    
Green Marjorie CA    
Straight Dean CA    
Smith Meander KS    
Bennet Abraham CA    
Dull Ann CA    
Gringlesby Burt CA    
Locksley Charlene CA    
...
(16 row(s) affected)
Criterio Compuesto
(Operadores Lógicos)

• Por lo tanto, ¿cuál es la diferencia


entre usar un AND y un OR?

• El AND es exclusivo
– Esto significa que, los renglones deben
cumplir con las dos condiciones para ser
seleccionados.

• El OR es inclusivo
– Esto significa que, para que un renglón
sea seleccionado, debe cumplir sólo uno
de los criterios.

• Ahora vamos a complicar esto un


poco más.

• Queremos seleccionar todos los


autores que viven en KS con apellido
Smith y también a todos los autores
de CA.
Criterio Compuesto
(Operadores Lógicos)

• Sabemos cómo obtener la primera


parte:
select au_lname, au_fname, state
from authors
where state = 'KS'
and au_lname = 'Smith‘

• También cómo obtener la segunda


parte:
select au_lname, au_fname, state
from authors
where state = 'CA'

• Sólo necesitamos ponerlo junto:


select au_lname, au_fname, state
from authors
where state = 'KS'
and au_lname = 'Smith'
or state = 'CA'
Criterio Compuesto
(Operadores Lógicos)

au_lname au_fname state 


­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­ ­­­­­ 
Smith George CA    
White Johnson CA    
Green Marjorie CA    
Carson Cheryl CA    
O'Leary Michael CA    
Straight Dean CA    
Smith Meander KS    
Bennet Abraham CA    
...
(17 row(s) affected)

• Aunque esta instrucción SQL retorna


los datos que esperamos, no es muy
clara.

• Cuando usamos criterios


compuestos en una cláusula where,
debemos siempre agrupar los
criterios para asegurarnos de
obtener el resultado deseado.
Agrupación de Criterios

• Para agrupar se usan paréntesis.

• La instrucción SQL correcta es la


siguiente:

select *
from authors
where (state = 'KS'
and au_lname = 'Smith')
or state = 'CA'
Condiciones de Búsqueda
(Operadores Relacionales y de Cadena)

• Las condiciones básicas de


búsqueda (predicados) que ofrece
SQL son:

– Comparación. Operadores
relacionales (=, <>, <, >, <=, >=)

– Rango (BETWEEN)

– Pertenencia a conjunto (IN)

– Correspondencia de patrón (LIKE)

– Valor nulo (IS NULL)


Opreadores Relaciones
y de Cadena

• Además de usar el operador =,


podemos usar cualquier otro
operador relacional: >, <, <=, >=.

• Supongamos que queremos retornar


todos los libros con un precio mayor
que $10.00
select title_id, price
from titles
where price > 10

• También podríamos escribir:


select title_id, price
from titles
where price > $10.00
title_id price                      
­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­ 
BU1032 19.99                      
BU1111 11.95                      
BU7832 19.99                      
MC2222 19.99                      
PC1035 22.95                      
PC8888 20.00                      
...
(12 row(s) affected)
Opreadores Relaciones
y de Cadena

• Una ventaja de los operadores


relacionales es que no sólo aplican a
datos de tipo numérico.

• También pueden usarse sobre datos


de tipo carácter.

• Para seleccionar a todos los autores


que viven en estados que estén
después de MA podríamos usar lo
siguiente:

select au_lname, state


from authors
where state > 'MA'
au_lname state 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­ 
Greene TN    
Blotchet­Halls OR    
del Castillo MI    
Panteley MD    
Ringer UT    
Ringer UT    

(6 row(s) affected)
Rangos (BETWEEN)

• Suponiendo que queremos


seleccionar a todos los autores que
viven en CA, MI, KS y UT.

• Podríamos escribir lo siguiente:


select au_lname, state
from authors
where state = 'CA'
or state = 'MI'
or state = 'KS'
or state = 'UT'

• Cuando las listas son largas, esto es


muy tedioso y toma mucho tiempo
escribirlo.

• Afortunadamente, SQL nos


proporciona algo mucho mejor.
Rangos (BETWEEN)

• Ahora queremos seleccionar todos


los libros que tienen un precio mayor
o igual a $10, pero también menor o
igual a $20.

• Podríamos escribir lo siguiente:


select title_id, price
from titles
where price >= 10
and price <= 20

• Pero existe una forma más simple.

• SQL nos brinda el operador


between:
select title_id, price
from titles
where price between 10
and 20
Pertenencia a
conjunto (IN)

• En vez de usar múltiples ORs,


podemos usar un operador IN:

select au_lname, state


from authors
where state in ('CA','KS','MI','UT')

• Esto retornará la misma lista:


au_lname state 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­ 
Smith  CA    
White  CA    
...
Straight  CA    
Smith  KS    
Bennet  CA    
...
Yokomoto  CA    
del Castillo  MI    
Stringer  CA    
...
McBadden CA    
Ringer UT    
Ringer UT    

(20 row(s) affected)
Expresiones Regulares
LIKE y Comodines

• Algunas veces no sabemos


exactamente lo que estamos
buscando.

• O buscamos un grupo de datos que


coinciden con cierto patrón.

• En este caso podemos usar el


operador LIKE y comodines con la
cláusula where.

• SQL tiene dos caracteres


comodines:

– El símbolo de porcentaje (%) que se


refiere a cualquier cadena de
caracteres desde cero a N
caracteres.
– El guión bajo (_) que se refiere a un
sólo carácter.
Expresiones Regulares
LIKE

• Supongamos que queremos selec-


cionar a todos los autores cuya
primera letra de sus nombres sea
una M:

select au_fname, au_lname


from authors
where au_fname like 'M%'
au_fname au_lname                                
 
­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
Marjorie Green                         
           
Michael O'Leary                       
           
Meander Smith                                   
 
Morningstar Greene                                  
 
Michel DeFrance                                
 

(5 row(s) affected)

• Si queremos seleccionar todos los


autores cuyo nombre sea Carl.

• Se debe tener cuidado ya que Carl


Expresiones Regulares
LIKE

select au_fname, au_lname


from authors
where au_fname like '_arl'
au_fname             au_lname                                 
­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
Carl                 Burns                                    
Karl                 Johnson                                  

(2 row(s) affected)

• También podemos combinar los


comodines para obtener exacta-
mente lo que necesitamos.

• Suponiendo que necesitamos extraer


a todos los Smith de la base de
datos.

• El apellido se podría escribir Smith,


Smithe, or Smythe. Y queremos a
todos ellos.
Expresiones Regulares
LIKE

• Podríamos realizar la siguiente


consulta:

select au_fname, au_lname


from authors
where au_lname like 'Sm_th%'
au_fname au_lname                                
 
­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
Meander Smith                                   
 
Jim Smithe                                  
 
Patti Smythe                                  
 

(3 row(s) affected)
Expresiones Regulares
LIKE y Caracteres de Escape

• Pero, qué sucede si queremos


encontrar un % dentro del dato.

• Para encontrar este dato empleamos


un carácter de escape.

select notes
from titles
where notes like '%@%%' escape '@'

• Esto le dice al DBMS que trate el


siguiente carácter después del
carácter de escape (@) como una
cadena literal:
notes                                           
                                                
                                                
                                                
         

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
­­­­­­­­­­­­­­­­­­­­
What happens when the data runs dry?%           
Expresiones Regulares
LIKE y Patrones

• Y, ¿qué hacer cuando sabemos qué


buscamos pero también sabemos que
puede tener muchas variaciones?.

• Además de usar comodines, podemos


usar una técnica que se llama
correspondencia de patrones.

• Esta técnica puede mezclar comodines


con conjuntos de caracteres que se
requieren que estén presentes en la
cadena

• Estos son diseñados con corchetes [ ]


dentro de la cadena que queremos que
corresponda
Expresiones Regulares
LIKE y Patrones

• Si quisiéramos extraer todos los


autores cuyo apellido empiece con
cualquiera de las letras L, M o S.

• Podemos escribir:
select au_lname, au_fname
from authors
where au_lname like '[LMS]%'
au_lname au_fname             
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­ 
Locksley Charlene             
MacFeather Stearns              
McBadden Heather              
Smith George               
Smith Meander              
Smithe  Jim                  
Smythe  Patti                
Straight Dean                 
Stringer Dirk                 

(9 row(s) affected)

MSQL:
where au_lname rlike ‘^[LMS]'
• Supongamos ahora que queremos
extraer todos los autores que tengan
nombres de cuatro letras donde sólo
el primer carácter es mayúscula.
Expresiones Regulares
LIKE y Patrones

• Queremos ahora obtener sólo los


autores cuyo nombre tiene sólo
cuatro caracteres.
select au_lname, au_fname
from authors
where au_fname like '____'
(Son cuatro caracteres guión bajo)

au_lname au_fname             
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
­­­­­­­­­­­­­­­­­­­­ 
Burns           Carl                 
Gringlesby                  Burt                 
Johnson                      Karl                 
Ringer                         Ann                 
Straight                     Dean                
 
Stringer            Dirk                 

(6 row(s) affected)

• Como podemos observar, en el


listado aparece Ann aunque sólo
tiene tres caracteres.
Valor Nulo (IS NULL)

• Existen ocasiones en que no contamos


con toda la información, ya sea porque
se ha extraviado, no aplica o no se ha
podido recabar completamente.

• Para manejar esta información faltante,


la mayoría de los DBMSs utilizan el
concepto de valor nulo.

• Un nulo no significa cero y tampoco


significa espacios en blanco.

• Un nulo indica que se desconoce un


valor, no está disponible, está
incompleto o es inaplicable.

• Los nulos representan una cantidad o


valor desconocido.

• No se puede garantizar que un nulo no


sea igual a cualquier otro valor.
Nulos cont.

• Un nulo también puede o no ser


igual a otro valor nulo.

• Tomando la tabla authors como


ejemplo, si dejamos en blanco el
valor de la columna state para un
autor, esto podría sugerir varias
situaciones:

– El autor es de CA
– El autor no es de CA
– El autor es de algún otro estado?

• La respuesta a alguna o a ninguna


de las preguntas anteriores podría
ser verdadera.

• Por lo tanto, cualquier pregunta


acerca de un valor nulo podría
proporcionar tres respuestas: si, no,
o tal vez.
Nulos cont.

• Esto podría sugerir que usar valores


nulos ocasiona serios problemas, ya
que los renglones son seleccionados
basados en que un criterio sea
verdadero.

• Afortunadamente, los creadores de


RDBMSs han planeado cuidadosa-
mente el manejo de los valores nulos
dentro de las bases de datos.

• Asi, se tienen algunas reglas para el


manejo de valores nulos:

– Un nulo indica que un valor es


desconocido.
– Un nulo no es igual que algún otro
valor.
– Un nulo no es igual a otro nulo.
Nulos cont.

• Ya que se está colocando el mismo


"valor" (un nulo) dentro de una
columna, ¿cómo puede ser que un nulo
no sea igual a otro nulo?

• Un nulo representa la inexistencia de


un dato y algo que no existe no puede
ser comparado con otra cosa que
tampoco existe.

• Si se pudieran comparar, esto


implicaría que los valores que se están
comparando existen actualmente. Esto
viola la definición de valor nulo.

• Todo esto parece ser demasiado


profundo y teórico, pero, aunque
existen varios libros dedicados por
completo al estudio de los valores
nulos, en este momento nos interesa
su aplicación práctica en la teoría de
SQL.
Nulos cont.

• Para tal fin, las únicas cosas que se


requieren recordar son las
siguientes:

– SQL permite seleccionar renglones


que tengan valores nulos.
– Un valor nulo no es igual a otro valor
nulo.

• Suponiendo que queremos obtener


todos los títulos que no tienen
asignados derechos de autor
(royalty)

• Basándonos en la experiencia previa


probablemente haríamos lo
siguiente:
– select * from titles where royalty = null
Aplicación de los Nulos

• Aunque esta instrucción no causaría


un mensaje de error en la mayoría
de los DBMSs, no necesariamente
mostraría los renglones buscados.

• La forma correcta es ser explícito en


lo que se está preguntando.

• Realmente queremos saber en qué


renglones los valores son nulos.

select title, royalty


from titles
where royalty is null
title royalty     

­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
­­­­­­­­­­­­­ ­­­­­­­­­­­ 
The Psychology of Computer Cooking (null)  
    
Net Etiquette (null)      

(2 row(s) affected)
Operador de Negación

• El operador de negación es NOT.

• En una consulta anterior se


obtuvieron todos los autores que
viven en CA, MI, KS y UT.

• Ahora queremos extraer todos los


nombres excepto esos:
select au_lname, state, state
from authors
where state not in ('CA','KS','MI','UT') 
• Si se desean extraer los renglones
que no tienen valores nulos, se
puede indicar:

select title, royalty


from titles
where royalty is not null
Operador Relacional
Diferente de
• Seleccionar todos los autores que no
viven en CA:

select au_fname, au_lname, state


from authors
where state <> 'CA'

• Dependiendo del DBMS, esto puede


también ser escrito como:

select au_fname, au_lname, state


from authors
where state != 'CA'
au_fname au_lname state 
­­­­­­­­­­­­­­­­­­­­ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­ 
­­­­­ 
Carl Burns MA    
Karl Johnson MA    
Patti Smythe MA    
Jim Smithe MA    
Meander Smith KS    
Morningsta Greene TN    
Reginald Blotchet­Halls OR    
Innes del Castillo MI    
Michel DeFrance IN    
Sylvia Panteley MD    
Anne Ringer UT    
Albert Ringer UT    

(12 row(s) affected)
Resumen

• Una cláusula WHERE permite


restringir los resultados.

• Se pueden combinar múltiples


criterios en una sola cláusula where
usando AND/OR.

• Se pueden usar operadores de


comparación para especificar rangos
de datos.

• IN permite especificar fácilmente una


lista de valores a encontrar

• BETWEEN simplifica algunas


búsquedas de rangos y es inclusivo
(Los valores especificados como
mayor y menor son también
extraídos).
Resumen (Cont.)

• El uso del operador LIKE y los


comodines % y _ permiten hacer
búsquedas sofisticadas.

• Los caracteres de escape logran


que SQL ignore un comodín y lo
trate como literal.

• Los comodines se pueden combinar


con patrones de correspondencia
para especificar patrones de datos.

• Las búsquedas se niegan mediante


NOT, ^, <> ó !=

• Los valores nulos (null) son usados


para representar la inexistencia de
datos.

• Un nulo no es igual a otro nulo.


Ejercicios

1. Extraer a todos los autores que viven en


California
2. Extraer todos los autores que viven en
California o Michigan
3. Listar todos los autores de apellido Smith
que viven en Kansas y todos los autores de
California
4. Indicar tres métodos de extracción de todos
los autores con apellido entre L y S sin
incluir aquellos que empiezan con S
5. Mostrar todos los autores que se llamen
Smith o alguno de sus derivados.
6. Listar todos los títulos que no tengan
anotaciones.
7. Extraer todos los títulos con un precio
mayor a 15 y menor a 25
8. Listar los títulos con precio igual a 10, 20 o
15.
9. Mostrar todos los títulos que no tengan
anticipos (advance).
10. Mostrar todos los títulos que no tengan
precio o tengan un precio superior a 12.

También podría gustarte