Professional Documents
Culture Documents
CAPTULO 21
ndice de contenido
INTRODUCCIN................................................................................................................................2
MANOS A LA OBRA.....................................................................................................................2
PRIMERA INCURSIN: CONSULTAS DE SELECCIN...............................................................2
UN INCISO SOBRE LA LLAMADA A LOS CAMPOS...............................................................2
SELECCIN DE TODOS LOS CAMPOS DE UNA TABLA.......................................................3
SELECCIN DE CAMPOS DE VARIAS TABLAS NO RELACIONADAS...............................3
ORDENANDO NUESTROS RESULTADOS................................................................................3
PRACTIQUEMOS CON UN EJEMPLO............................................................................................4
SQL SIMPLE..............................................................................................................................4
SQL COMPUESTA.................................................................................................................5
SQL ORDENADA......................................................................................................................5
PREDICADOS.....................................................................................................................................7
TOP..................................................................................................................................................7
DISTINCT.......................................................................................................................................8
OTRA MANERA DE CONSEGUIR EL MISMO RESULTADO...........................................10
DISTINCTROW............................................................................................................................10
UTILIZACIN DE LA CLUSULA WHERE.................................................................................11
CARACTERES COMODN.........................................................................................................11
OPERADORES.............................................................................................................................12
MARCO SEGN EL TIPO DE DATOS.......................................................................................12
CLUSULA WHERE, COMODINES Y OPERADORES...........................................................12
EJEMPLOS CON OPERADORES MATEMTICOS............................................................13
EJEMPLOS CON OPERADORES DE COMPARACIN......................................................14
BETWEEN... AND..............................................................................................................14
IN..........................................................................................................................................14
LIKE.....................................................................................................................................15
EJEMPLOS CON COMPARADORES LGICOS..................................................................17
AND.....................................................................................................................................17
OR........................................................................................................................................18
XOR......................................................................................................................................18
IMP / EQV............................................................................................................................19
NOT......................................................................................................................................20
ISNULL / NOT ISNULL.....................................................................................................21
PARA ACABAR ESTE CAPTULO.................................................................................................22
1
Vistame en http://siliconproject.com.ar/neckkito/
INTRODUCCIN
MANOS A LA OBRA
Empezaremos nuestra andadura prctica por SQL con el
aprendizaje de los comandos DML que comentbamos en el
primer captulo, creo yo que por ser los ms intuitivos
para quien no ha visto SQL (o ha visto muy poco) en su
construccin y significado.
La BD que utilizaremos de ejemplo para ir desarrollando este captulo fue la que construimos
(o nos bajamos) en el captulo 1. De todas maneras ya habris visto en la nota a pie de pgina
anterior que os podis bajar la BD con los ejemplos desarrollados de este captulo, por si
queris usarla como consulta o gua.
Y dicho lo anterior no perdamos ms tiempo con discursos y entremos de lleno ya en materia.
Vistame en http://siliconproject.com.ar/neckkito/
Como podemos observar, hemos separado utilizando comas (,) tanto los campos que
queremos como las tablas que queremos.
Evidentemente, si queremos ordenar por dos campos, nuestra sentencia quedara as:
SELECT nomTabla.nomCampo1, nomTabla.nomCampo2, nomTabla.nomCampo3
FROM nomTabla ORDER BY nomTabla.nomCampoX, nomTabla.nomCampoY
Lo anterior nos da una ordenacin ascendente (de la A a la Z). Qu ocurre si queremos una
ordenacin descendente?
Pues que debemos indicrselo a travs de la palabra DESC.
La estructura quedara, pues, as:
SELECT nomTabla.nomCampo1, nomTabla.nomCampo2
FROM nomTabla ORDER BY nomTabla.nomCampoX DESC
Vistame en http://siliconproject.com.ar/neckkito/
SQL SIMPLE
Insertamos un botn de comando, al que llamaremos cmdSimpleSobreClientes. Lo que vamos
a hacer es extraer toda la informacin de la tabla TClientes. El cdigo que debemos generar al
botn en el evento Al hacer click es el siguiente:
Si queremos podemos cambiar el asterisco por ALL *, y comprobaremos que los resultados
son los mismos.
Para abundar ms en el tema vamos a realizar una consulta que nos d el nombre del cliente y
su poblacin. Para ello creamos un nuevo botn de comando, lo llamamos cmdNomyPoblCli y
le generamos el siguiente cdigo (os recomiendo que intentis crearla vosotros antes de echar
un vistazo al cdigo):
Vistame en http://siliconproject.com.ar/neckkito/
SQL COMPUESTA
Vamos a imaginarnos que necesitamos crear una consulta
como la anterior, pero que necesitamos, en cada registro,
que nos aparezca el nombre del usuario activo.
Recordemos que no existe ninguna relacin entre TClientes y
TUsuarioAct (que es donde tenemos informado el nombre del
usuario activo).
Creamos el botn cmdClientesYUser y... cmo sera el cdigo? Pues as:
SQL ORDENADA
Vamos a ordenar nuestros resultados. Para ello insertaremos un nuevo botn de comando
(cmdOrdenadoAsc) y vamos a generarle el siguiente cdigo:
Vistame en http://siliconproject.com.ar/neckkito/
nomQuery = "CNombreYPoblacionClientesAscendente"
Call eliminaConsulta(nomQuery)
miSql
=
"SELECT
TClientes.NomCli,
TClientes.PoblCli FROM TClientes" _
& " ORDER BY TClientes.NomCli"
Call creaConsulta(nomQuery, miSql)
DoCmd.OpenQuery nomQuery
End Sub
Podemos realizar varias ordenaciones por diferentes campos en la misma consulta. El orden de
ordenacin lo estableceremos nosotros por el orden en que escribamos tras el ORDER BY. Por
ejemplo, si queremos ordenar por poblacin y, dentro de esta ordenacin, a su vez ordenar por
cliente deberamos escribir este cdigo en el botn cmdOrdenadoAsc2:
Como vemos, la estructura es igual a nuestra consulta simple; simplemente lo que hacemos es
aadir el ORDER BY identificando a continuacin el campo que nos dar la ordenacin.
En la ilustracin de la izquierda podemos ver los resultados de la primera ordenacin, y en la
de la derecha los resultados de la segunda.
Y si queremos el orden descendente? Pues ya deberamos saber hacerlo, pero por si las
moscas el cdigo asignado al botn cmdOrdenadoDesc sera:
Vistame en http://siliconproject.com.ar/neckkito/
Fcil, no?
PREDICADOS
Aprovecharemos lo que hemos aprendido anteriormente para aplicar predicados a nuestras
SQL's.
De hecho, ya hemos utilizado un predicado, que ha sido ALL.
La estructura de las SQL, en general, con los predicados, sera:
SELECT <PREDICADO> ...
Echemos un vistazo a otros predicados:
TOP
Supongamos que queremos ver el importe ms alto de todas las ventas que hemos realizado.
Para ello necesitaramos utilizar el predicado TOP. Como queremos ver una (1) sola venta (la
mayor) necesitaremos indicrselo al TOP. Es decir:
SELECT TOP 1 ...
El cdigo que nos dara la consulta con dicho resultado sera:
Vistame en http://siliconproject.com.ar/neckkito/
DoCmd.OpenQuery nomQuery
End Sub
Sigamos con el TOP. Imaginemos que no queremos utilizar valores absolutos, sino que
queremos utilizar porcentajes. Es decir, que queremos saber el 10% de las ventas ms altas.
Para ello utilizaramos la estructura:
SELECT TOP XX PERCENT
Donde XX sera el porcentaje deseado.
Nuestro cdigo debera quedar de esta manera:
Y el resultado sera:
DISTINCT
Si realizramos una seleccin de los clientes a los cuales hemos vendido gnero podramos
utilizar la siguiente SQL:
Vistame en http://siliconproject.com.ar/neckkito/
Call eliminaConsulta(nomQuery)
miSql = "SELECT TVentas.IdCliVta FROM TVentas"
Call creaConsulta(nomQuery, miSql)
DoCmd.OpenQuery nomQuery
End Sub
Como podemos ver, este listado no nos es demasiado prctico, porque se producen
repeticiones del nombre de cliente.
Para obtener valores nicos podemos utilizar el predicado DISTINCT, de acuerdo a la siguiente
estructura:
SELECT DISTINCT
De manera que modificando ligeramente el cdigo anterior por:
Vistame en http://siliconproject.com.ar/neckkito/
DISTINCTROW
Con DISTINCTROW, a diferencia de DISTINC (que slo examina el contenido de los campos
seleccionados), se examina el contenido del registro completo independientemente de los
campos indicados en el SELECT.
Para poder realizar un ejemplo vamos, en nuestra tabla TTrabPersonal, a insertar un nuevo
trabajador, con la caracterstica que va a compartir apellido con uno de los trabajadores ya
existentes. Por ejemplo, yo he aadido el siguiente registro:
Vistame en http://siliconproject.com.ar/neckkito/
nomQuery = "CTrabDistinctRow"
Call eliminaConsulta(nomQuery)
miSql
=
"SELECT
DISTINCTROW
TTrabPersonal.ApellTrab FROM TTrabPersonal"
Call creaConsulta(nomQuery, miSql)
DoCmd.OpenQuery nomQuery
End Sub
Con el resultado:
CARACTERES COMODN
Podemos utilizar, en combinacin con la clusula WHERE, los operadores que vimos en el
primer captulo (operadores matemticos y operadores lgicos), y podemos tambin utilizar lo
que se denominan caracteres comodn.
Tenemos los siguientes caracteres comodn:
Vistame en http://siliconproject.com.ar/neckkito/
Si yo escribo [a-c]* podr obtener resultados como azul, barco, casa, pero no dedo, porque
estoy buscando palabras que empiecen por a, b o c.
Si yo escribo [a-c, f-g]* podr obtener todas las palabras
que empiecen por a, b, c, f y g.
Si yo escribo [!w-z]* podr obtener todas las palabras
que empiecen por cualquier letra del abecedario,
exceptuando las que comiencen por w, x, y, z.
Si yo escribo A[*]A slo podr obtener el valor A*A, porque al
encerrar el asterisco entre corchetes estoy indicando que no quiero
el asterisco como comodn, sino como literal.
Veremos un par de ejemplos de utilizacin de estos caracteres comodn un poco ms adelante.
OPERADORES
Como comentbamos en el captulo primero, tenemos dos tipos de operadores: los operadores
matemticos y los operadores lgicos.
Su combinacin con la clusula WHERE nos permite una gran versatilidad de filtros y de
bsquedas para extraer los datos que nos interesan.
Como ya los comentamos en el captulo anterior los veremos a travs de diversos ejemplos.
TIPO DE CAMPO
LO ENCERRAREMOS ENTRE
Numrico / Moneda
Texto
Fecha
Almohadillas (#)
Booleano
Vamos a empezar con una serie de ejemplos de cmo podemos utilizar los diferentes
elementos que hemos visto hasta ahora.
12
Vistame en http://siliconproject.com.ar/neckkito/
Imaginemos que queremos conocer las ventas realizadas a partir de abril 2012. En este caso
estamos trabajando con un dato de tipo fecha, por lo que debemos recordar enmarcarlo entre
almohadillas.
La SQL que nos devolvera esos valores sera:
Importante: fijaos que he tenido que escribir la fecha en formato ingls (mm/dd/yy) para
conseguir devolver unos resultados correctos. Hay varios factores que influyen en cmo
examina Access el formato de fecha que tenemos en nuestra BD (aunque en la interfaz grfica
veamos las fechas en formato espaol -dd/mm/yy-). Es importante comprobar si los
resultados que nos devuelve la SQL para saber si, en nuestra BD, debemos emplear un
formato u otro.
Como podemos ver, la operativa con operadores matemticos es sencilla y no creo que
necesitemos ms ejemplos sobre el tema.
13
Vistame en http://siliconproject.com.ar/neckkito/
BETWEEN
<valor1>
Fijaos que he enmarcado las fechas entre almohadillas y que he utilizado el formato de fecha
ingls de nuevo.
IN
El operador IN nos permite seleccionar registros con valores que coincidan con la condicin
marcada en el propio IN.
La estructura del WHERE con el operador IN sera:
WHERE nomTabla.nomCampo IN (<valor1>, <valor2>, , <valorN>)
Por ejemplo, queremos saber qu clientes tenemos en las poblaciones de Valencia y Badajoz.
Nuestra SQL sera:
14
Vistame en http://siliconproject.com.ar/neckkito/
DoCmd.OpenQuery nomQuery
End Sub
LIKE
El operador LIKE nos sirve para buscar por aproximacin, y lo utilizamos combinndolo con los
caracteres comodn que hemos visto unos apartados ms arriba.
La estructura del WHERE con LIKE sera:
WHERE nomTabla.nomCampo LIKE <condicin>
Supongamos que queremos saber qu trabajadores estn relacionados con el departamento de
ventas. Podramos pues filtrar por aquellos cuyo cargo contenga las palabras ven.
Nuestra SQL podra ser as:
Fijaos que, como estamos buscando una cadena de texto, debemos enmarcar la condicin
entre comillas simples.
15
Vistame en http://siliconproject.com.ar/neckkito/
Supongamos que queremos mostrar todos los trabajadores cuyo apellido empiece por las
letras de la F a la J.
Nuestra SQL sera:
Del mismo modo, si quisiramos aadir a la anterior bsqueda aquellos trabajadores cuyo
apellido empiece tambin por las letras que van de la V a la Z escribiramos:
Si, por el contrario, lo que queremos es ver todos los trabajadores menos aquellos cuyo
apellido empiece por las letras de la F a la J escribiramos:
Otro ejemplo con dgitos. Imaginemos que queremos conocer aquellos trabajadores cuyo
telfono acabe con un 2 seguido de cualquier dgito. Nuestra SQL sera:
16
Vistame en http://siliconproject.com.ar/neckkito/
Private Sub cmdTrabTfno2x_Click()
Dim miSql As String, nomQuery As String
nomQuery = "CTrabTfno2x"
Call eliminaConsulta(nomQuery)
miSql
=
"SELECT
TTrabPersonal.ApellTrab,
TTrabPersonal.TfnoTrab FROM TTrabPersonal" _
& " WHERE TTrabPersonal.TfnoTrab LIKE '*2#'"
AND
El operador AND obliga a que se cumplan todas las condiciones especificadas para devolver
registros.
Su estructura sera:
WHERE nomTabla.nomCampoX <operador><condicion> AND
nomTabla.nomCampoY <operador><condicion> AND
Por ejemplo, vamos a recuperar los clientes que sean de Valencia y en su nombre aparezcan
las letras Frut.
17
Vistame en http://siliconproject.com.ar/neckkito/
El cdigo sera:
OR
Con el operador se nos devuelven registros siempre que se cumpla una de las dos condiciones,
o ambas (pueden ser ms de dos, ojo).
La estructura es idntica a la de AND:
WHERE nomTabla.nomCampoX <operador><condicion> OR
nomTabla.nomCampoY <operador><condicion> OR
Por ejemplo, si queremos saber qu clientes tenemos en Madrid o en Bilbao deberamos
escribir:
XOR
Con el operador XOR obtenemos el registro si slo se cumple una de las condiciones; si se
cumplen ambas o no se cumple ninguna no obtenemos ningn registro.
La estructura es la misma que la especificada para OR:
WHERE nomTabla.nomCampoX <operador><condicion> XOR
18
Vistame en http://siliconproject.com.ar/neckkito/
IMP / EQV
A modo de informacin os comentar que existen los operadores IMP y EQV. No realizaremos
ningn ejemplo sobre los mismos, pero s os dejar indicadas sus tablas de verdad, por si en
alguna ocasin os pudieran ser de utilidad.
19
Vistame en http://siliconproject.com.ar/neckkito/
IMP
Expresin1
Expresin2
Devuelve
Verdadero
Verdadero
Verdadero
Verdadero
Falso
Falso
Verdadero
Null
Null
Falso
Verdadero
Verdadero
Falso
Falso
Verdadero
Falso
Null
Verdadero
Null
Verdadero
Verdadero
Null
Falso
Null
Null
Null
Null
EQV
Expresin1
Expresin2
Devuelve
Verdadero
Verdadero
Verdadero
Verdadero
Falso
Falso
Falso
Verdadero
Falso
Falso
Falso
Verdadero
NOT
El uso del NOT es de lo ms sencillo: se antepone a todos los operadores que hemos visto
anteriormente y convierte su significado en el contrario.
Es decir, que su estructura sera:
WHERE nomTabla.nomCampo NOT <expresin>
Por ejemplo, en un epgrafe anterior hemos visto cmo podamos sacar los meses impares. Si
quisiramos sacar los meses pares aprovechando el cdigo que ya tenemos escrito podramos
utilizar el operador NOT, con lo que obtendramos:
Vistame en http://siliconproject.com.ar/neckkito/
nomQuery = "CMesesConNOTIN"
Call eliminaConsulta(nomQuery)
miSql = "SELECT TMeses.NumMes, TMeses.NomMes
FROM TMeses" _
& " WHERE TMeses.NumMes NOT IN (1,3,5,7,9,11)"
Call creaConsulta(nomQuery, miSql)
DoCmd.OpenQuery nomQuery
End Sub
21
Vistame en http://siliconproject.com.ar/neckkito/
22
Vistame en http://siliconproject.com.ar/neckkito/