Site hosted by Angelfire.com: Build your free website today!

aprende Visual Basic - www.usuarios.com/ib307182


SQL (Parte I)

Sentencia SELECT

La sentencia SELECT nos va a permitir seleccionar registros de una o varias tablas, que cumplan con ciertas condiciones, con una gran comodidad para, posteriormente, realizar las operaciones que deseemos con los registros seleccionados, mostrar, modificar, eliminar, añadir, etc...

Si, por ejemplo, queremos saber cuales son las películas que quedan sin devolver en un videoclub o los libros no devueltos en una biblioteca, únicamente con consultar la posible tabla de operaciones no sería suficiente puesto que allí sólo encontraríamos el código de cada película o cada libro, el titulo lo tendríamos que buscar en otra tabla. Todo esto se puede hacer con una sola linea de codigo SQL con lo que ganamos mucho en comodidad y claridad en el código.

Una sentencia SELECT se compone de varias palabras clave: FROM, WHERE, GROUP BY, HAVING y ORDER BY.

Las únicas obligatorias son SELECT y FROM, demás son opcionales aunque su uso añade una mayor potencia a nuestra sentencia.

 

Opciones de SELECT

Lo primero que debemos indicar son los campos que aparecerán en la selección:

SELECT campo1, campo2, ......, campoN

Si queremos obtener todos los campos de la tabla o tablas seleccionadas lo indicaremos un con asterisco.

SELECT *

Si el campo es compuesto lo pondremos entre corchetes. 

SELECT Nombre, [Año Nacimiento]

También podemos asignar un alias a cualquier campo, ese alias será el nombre con el que aparecerá el campo en la selección. Esta opción es válida con un nombre de campo no representa adecuadamente los datos que contiene ese campo, o pensamos que para nuestro propósito a ese campo le viene mejor un nombre en particular.

SELECT [Año Nacimiento] AS FechaNac

En este caso es más cómodo trabajar con FechaNac.

Si realizamos la selección entre varias tablas que contienen campos que se llaman igual, debemos anteponer la tabla de la que proceden si queremos que alguno de esos campos aparezcan en la selección:

SELECT Empresas.codigo, Empleados.codigo FROM Empresas, Empleados

Al estar repetido el campo codigo en las dos tablas hemos indicado la tabla de la que proceden. Aqui hemos puesto la clausula FROM que debe aparecer en todas las SELECT, su sintaxis es muy simple, ya que tan solo hay que indicar los nombres de la tabla o tablas sobre las que hacemos la consulta, aunque luego veremos como puede complicarse.

 

ORDER BY: Nos permite indicar el campo o campos por los que se ordenarán los registros, y si lo hacen de forma ascendente o descendente:

    SELECT Apellidos, Nombre FROM Empleados ORDER BY Apellidos, Nombre DESC

Obtenemos una consulta de los empleados ordenada por Apellidos y Nombre de forma descendente, si dos empleados tienen los mismos apellidos (deben de ser familiares) , se ordenarán también por el Nombre.

También podemos ordenar los registros por campos que no aparezcan en la consulta, y si queremos ordenar de forma ascendente no hace falta que pongamos ninguna palabra ya que es como se ordenan de forma predeterminada, de todas formas la cláusula es ASC.

 

Antes de ver un ejemplo práctico del uso de SELECT desde Visual Basic vamos a comentar una de la clausulas opcionales: DISTINCT, la cual nos servirá para obtener los campos que deseemos sin mostrarnos los valores repetidos, por ejemplo, si nos interesa saber la procedencia de nuestros clientes y varios de ellos son de Mexico, el valor México sólo aparecería una vez.

SELECT DISTINCT Pais FROM Clientes

Ahora sí vamos a ver unos ejemplos del uso de SELECT desde Visual Basic. A partir del fichero de base de datos Biblio.mdb, usaremos la tabla Publishers para obtener las distintas ciudades  de las editoriales sin repetirlas usando DISTINCT.

En este primer ejemplo usaremos el control Data y el DBGrid para mostrar el resultado:

En la propiedad DataBaseName indicaremos la base de datos Biblio.mdb que en la versión 6 de Visual Basic lo podemos encontrar en la carpeta c:\Archivos de Programa\Visual Studio\VB98 tal y como aparece en la imagen:

 

En el control DBgrid la única propiedad que necesitaremos modificar es DataSource en la que seleccionaremos Data1.

En el formulario de la aplicación añadiremos un Textbox y un CommandButton que nos servirán para introducir la sentencia SELECT que queramos, y para mostrar el resultado.

En el botón introduciremos el siguiente código, el cual asignará la sentencia SELECT al control Data y lo refrescará para que aparezca el resultado en el DBgrid:

 

Al ejecutar este ejemplo y pulsar el botón, este es el resultado que obtendremos:

Aparecen las ciudades sin repetirse, si se consulta la tabla Publishers desde Access se puede comprobar que una determinada ciudad aparece varias veces.

Hemos utilizado la propiedad Recordsource del control Data para indicar la sentencia SELECT que queremos ejecutar. Como hemos visto, esta propiedad la podemos utilizar tanto para asignar una tabla o una sentencia select. Según asignemos un tipo de datos u otro, deberemos cambiar la propiedad RecordSourceType para indicarlo:

Valores de RecordSourceType:

  • Table: Sólo para tablas.

  • Dynaset o Snapshot: para tablas o sentencias SELECT

 

 

DISTINCTROW: Mediante esta clausula obtendremos los registros de una tabla o selección de tablas que no se repitan. Este caso no se debe repetir ningún campo de todos los que componen el registro con lo cual esta clausula es menos restrictiva que DISTINCT en la que sólo aparecen los registros en los que los campos que le indiquemos no se repitan.

 

TOP: Devuelve el número de registros indicados situados en la parte superior o inferior según el orden de los registros con ORDER BY.

     SELECT TOP 10 Nombre FROM TenistasATP ORDER BY PuntosATP

Obtendríamos los 10 tenistas mejor clasificados en la ATP, y no hace falta que pongamos el ASC.

Con PERCENT le decimos que nos devuelva un porcentaje en lugar de un número exacto de registros. Si queremos obtener una lista con el 5% de los paises con menor población:

SELECT TOP 5 PERCENT Nombrepais FROM paises ORDER BY poblacion DESC

 

SELECCIONAR VARIAS TABLAS

Como dijimos anteriormente la clausula FROM, tan simple en aparencia, se complica un poco cuando hacemos uso de varias tablas en nuestra consulta. Si queremos obtener una lista con los empleados y el nombre del departamento al que pertenecen, siempre que el diseño de la base de datos sea correcto, ambos datos estarán en tablas distintas relacionadas por el código del departamento.

Si utilizamos la siguiente sentencia para conseguir el listado:

SELECT Nombre, Departamento FROM Empleados, Departamentos

Si suponemos que tenemos 10 empleados y 10 departamentos en las tablas, obtendremos 100 registros en total, ya que no hemos relacionado las tablas en la consulta, y lo que ha hecho el motor de la base de datos es relacionar cada empleado con cada uno de los departamentos.

 

RELACIONAR TABLAS

Ya sabemos que para obtener registros de varias tablas a la vez, debemos relacionarlas por un campo determinado para que nos aparezca el resultado esperado.

Dentro de la propia clausula FROM indicaremos la relación utilizando una de las 3 formas posibles:

SELECT Nombre, Departamento FROM Empleados INNER JOIN Departamentos ON Empleados.Departamento=Departamentos.Codigo

Suponiendo que en la tabla Empleados el campo Departamento contenga el codigo de departamento al que están asignados, el cual debe corresponderse con el campo Codigo de la tabla Departamentos.

Mediante un ejemplo vamos a ver como obtener, a partir de la base de datos Biblio.mdb, una consulta con las editoriales, los titulos publicados por cada una  y ordenados por el año de publicación de forma descendente.

El código es prácticamente igual al ejemplo de DISTINCT, únicamente cambiamos la sentencia SELECT:

y aquí tenemos el resultado cuando pulsamos sobre el CommandButton:

Hemos utilizado los alias para sustituir los nombres de los campos en inglés por los correspondientes en nuestro idioma. Como podéis observar para ordenar los campos no se utiliza el alias sino el nombre real del campo.

 

Volviendo al ejemplo anterior, si hubiesemos utlizado LEFT JOIN hubiesemos obtenido todas las editoriales, tengan o no algun libro publicado. Las editoriales sin ningún titulo publicado (su campo PubId no se corresponde con ninguno de la tabla Titles), aparecerían en la consulta con los campos Titulo y Año en blanco.

Aprovechando las características de LEFT JOIN veremos un ejemplo en el que obtendremos únicamente las editoriales sin ningún título publicado. para ello utilizaremos la clausula WHERE, que veremos más adelante, la cual nos servirá para indicar que el valor del campo PubID de la tabla Titles no exista, es decir, que ese campo sea Nulo:

En la tabla hemos obtenido las editoriales que no tienen ningún título publicado ( o que por lo menos no aparecen en la tabla Titles).

Las columnas Titulo y Año aparecen en blanco y las editoriales aparecen ordenadas por su nombre

 

 

CLAUSULA «WHERE»

Mediante esta cláusula indicaremos cuales son las condiciones que deben cumplir los registros para que nos aparezcan en la consulta. Su uso es muy parecido a las comparaciones que se realizaban con FindFirst en el capítulo de búsquedas.

Dependiendo de los tipos de datos con los que vayamos a trabajar, cambia la forma en realizaremos las comparaciones:

Es la forma más sencilla de realizar las comparaciones, no tenemos más que colocar el nombre del campo, el operador y la cantidad.

             Edad > 18

             Nota >=5

Los operadores posibles son =,>,<,>=,<= y <>. Tambien podemos unir las comparaciones con AND y OR si queremos que se cumplan todas las comparaciones o sólo una de ellas respectivamente

 NumPedidos>0  AND  UnidadesStock=0

 

La cadena de caracteres que vayamos a comparar la colocaremos entre comillas simples:

Nombre = 'Javier'

También podemos utilizar el operador LIKE el cual nos permite comparar con partes de una cadena utilizando los comodines * y ?:

                        *: para comparar con un conjunto de caracteres

                        ?: para comparar con un solo caracter.

Ejemplos:

CompanyName LIKE 'Mc*' 

Obtenemos los que empiezan por «Mc»

ComanyName LIKE '?ase'

Obtenemos las que empiezan por cualquier caracter y acaban en «ase»

Titulo LIKE '*visual basic*'

Busca la cadena «visual basic» en cualquier parte del campo Titulo.

    

Deberemos encerrar las fechas entre el signo #, tal y como ocurría con FindFirst en las búsquedas, y también debemos realizar las comparaciones con el formato  mm/dd/aaaa , esto es con formato americano colocando el mes antes que el dia.

Si queremos obtener los libros publicados a partir del 15 de Enero de 1990:

FechaPublicacion >= #01/15/1990#

Para obtener los libros publicados en un año determinado, por ejemplo 1995:

FechaPublicación >=  #01/01/1995# AND FechaPublicacion <= #12/31/1995#

o también

FechaPublicacion BEETWEN  #01/01/1995#  AND  #12/31/1995#

o con LIKE:

FechaPublicacion LIKE   "*/*/1995"

Cuando se usa LIKE podemos utilizar los comodines y la fecha debe estar entre comillas.

 

APLICACION DE EJEMPLO

Un tema que han pedido muchos usuarios es como limitar los registros de una consulta a partir de los datos que ellos introducen en un formulario y eso es lo que vamos a hacer.

A partir de la tabla Empleados de la base de datos Biblio haremos un formulario que nos permita saber que cuales son los que han nacido entre las dos fechas que le digamos y que tengan en su nombre la cadena de caracteres que introduzcamos.

Para facilitar el trabajo con fechas vamos a introducir un nuevo control: Mask Edit Box , lo tendremos que agregar a nuestra ToolBox mediante la opción de menú Proyect / Components bajo el nombre Microsoft Masked Edit Control. A los 2 controles que he puesto en el formulario les he cambiado las propiedades:

Mask

##/##/####

MaxLenght

10

Con ese valor en la propiedad Mask las barras aparecen automaticamente y obligamos o colocar el año con 4 dígitos y así hacemos que nuestro ejemplo sea válido para el manido efecto 2000.

Para el diseño del formulario hemos incluido un Textbox donde introduciremos los caracteres que deberán contener los nombres de los empleados y los controles MaskEditbox para las fechas.

Una vez el usuario haya introducido las fechas correctamente, las convertiremos al formato mm/dd/aaaa para que sean admitidas por la sentencia SELECT sin que tengamos problemas. Esto lo hacemos con la función Format, la cual admite una gran variedad de posibilidades que podemos consultar en la ayuda.

 Aquí tenemos el código que se ejecutará al pulsar sobre el botón que ejecuta la consulta, una vez se han introducido los datos:

Hemos utilizado la función IsDate para comprobar si las fechas son válidas antes de hacer la conversión a formato americano y pasarselas a la sentencia SELECT.

Para saber si los caracteres tecleados en el campo Nombre estan contenidos en los nombres de los empleados hemos utilizado el operador LIKE con los asteriscos.

Este es el resultado de buscar los empleados con una "n" en su nombre y nacidos entre el 15/01/1950 y el 20/08/1970:

Con este ejemplo terminamos el primero de los 2 temas dedicados al SQL. En el siguiente tema veremos las clausulas GROUP BY y HAVING, así como otras sentencias de SQL como INSERT, DELETE, UPDATE, etc..