Вы находитесь на странице: 1из 7

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!

Direccin General de Servicios de Cmputo Acadmico


Direccin de Cmputo para la Docencia
CURSO: Lenguaje de Programacin Visual Basic
INSTRUCTOR: L.I. Raymundo Lumbreras Lpez
Nombre del participante: __________________________________________________________________

Prctica No. 8
Objetivo: Que el Participante disee una Base de Datos y al menos una tabla, que construya el formulario y los
objetos necesarios para llevar a cabo una buena administracin de sus datos.

Instrucciones: Capture la siguiente Informacin considerando que el diseo de la Base de Datos y las Tablas
alternas se llevara a cabo utilizando el Manejador de Bases de Datos Acces.
Desarrollo:

Objeto Name
form
frmSql
Objeto
TextBox

Caption
Ejecucin de Sentencias SQL

Name
TxtSql

Text
(Nada)

Objeto Name RecordSource


Data Base Name
Data
dbSql Authors
C:\curvb6\Biblio.mdb
Objeto
CommandButton

Multiline
True

Objeto
DBGrid

Name
cmdEjecuta

Name
dbgSql

DataSource
DbSql

Caption
Ejecutar

[Hoja 1 de 7]

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!
Cdigo para el Botn de Comando:
Private Sub cmdEjecuta_Click()
dbSql.RecordSource = txtSql.Text
dbSql.Refresh
End Sub

Instruccin SELECT
La instruccin SELECT lanza consultas, determinando cules son los campos (columnas) que queremos leer y su
organizacin. La sintaxis es:
SELECT <columnas>
FROM <tablas>
[WHERE <condiciones>]
[GROUP BY <columnas>]
[HAVING <condiciones>]
[ORDER BY <columnas>]
Slo son obligatorias las clusulas que no estn entre corchetes. Por ejemplo para obtener el nombre y la direccin de todos
los registros de una tabla: SELECT NOMBRE, DIRECCION FROM CLIENTES
Si quisieramos recuperar todos los campos de todos los registros, escribiramos: SELECT * FROM CLIENTES
Donde el asterisco representa todos los campos de la tabla.
Para leer todos los clientes que sean de Monterrey: SELECT * FROM CLIENTES WHERE POBLACION=Monterrey
Tambin se pueden utilizar frmulas para obtener datos. SELECT ARTICULO, PRECIO*16/100 FROM ARTICULOS,
nos ofrece directamente el IVA y el precio final de todos los artculos de la tabla
SELECT SUM(PRECIO*16/100) FROM LINEASFACTURA WHERE NUMFACTURA=100, nos proporciona el precio
final de na factura a partir de la suma de los precios de las lneas de la factura nmero 100.
SELECT COUNT(NOMBRE) WHERE POBLACION=Monterrey. Cuenta los registros que cumplen una condicin.
SELECT * FROM ARTICULOS ORDER BY VENTAS. Se solicitan los datos en un orden concreto.
Podemos utilizar un sistema de consultas multitabla. Solicitaremos todos los libros de un autor determinado junto con su
nombre.
SELECT Authors.Au_ID, Authors. Author, Titles.Au_ID, Titles.Title
FROM Authors, Titles
WHERE Authors.Au_ID = Titles.Au_ID
La clusula GROUP BY se utiliza para agrupar filas cuando se emplean funciones como SUM y COUNT, las cuales no
toman campos Lnea por Lnea, sino resultados globales de suma de todas las filas.

Clusula LIKE para cadenas alfanumricas


La clusula LIKE nos permite encontrar coincidencias parciales entre cadenas de texto. Una coincidencia parcial es algo as
como una semblanza entre cadenas de texto. En la prctica esto representa que podemos localizar registros con campos que
contengan poblaciones que comiencen por una letra, o que no diferencien las maysculas y las minsculas, o que terminen
en una determinada palabra

Curso: Lenguaje de Programacin Visual Basic. Prctica 8


Instructor: L.I. Raymundo Lumbreras Lpez [Hoja 2 de 7]

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!
Por ejemplo, la sentencia SELECT * FROM Clientes WHERE Nombre LIKE C* Localizar todos los clientes cuyo
nombre empiece con C. Tendramos a Carlos, Carolina, Cleofas, Cleotilde, etc. Estamos utilizando como patrn de
bsqueda el asterisco. EL asterisco solo sirve para el motor de Access. En el resto de los sistemas gestores de bases de datos
relacionales se emplea el smbolo de porcentaje %.
Cuando se utilice el ODBC se ver que si atacamos el motor de Access, deberemos utilizar la sintaxis LIKE con el
asterisco. Si atacamos a ODBC deberemos utilizar la sintaxis LIKE con el porcentaje. Y si estamos atacando al motor de
Access a travs de ODBC debemos utilizar tambin el porcentaje. La misma sentencia que selecciona los clientes que
empiezan con C, actuando contra ODBC sera SELECT * FROM Clientes WHERE Nombre LIKE C%
La clusula LIKE tambin permite seleccionar todos los artculos cuyo cdigo contiene en cualquier posicin -C1,
SELECT * FROM Articulos WHERE Codigo LIKE *-C1-*
EL motor de Access tambin nos permite buscar todos los cdigos de artculos que tengan dos dgitos cualquiera y slo
dos y despus -C1- seguido de cualquier nmero de caracteres:
SELECT * FROM Articulos WHERE Codigo LIKE ??-C1-*

Funciones escalares para SELECT


Disponemos de cinco funciones especiales que podemos aplicar a la sentencia SELECT para operaciones matemticas y
estadsticas bsicas de nuestra base de datos. SUM, COUNT, AVG MAX MIN.
La funcin SUM nos proporciona la suma de un campo. Por ejemplo, si nosotros queremos encontrar la suma de todos los
totales de las lneas de la factura 100, enviaremos esta sentencia SELECT.
SELECT SUM(Total) FROM LineasFactura WHERE NumFactura=100 esta consulta nos devolver un solo dato; es
decir, una sola columna y una sola fila; la suma total. Si por ejemplo quisiramos hallar el saldo de un cliente como
resultado de la suma de todos sus campos DEBE y la resta de todos sus campos HABER, bastara con :
SELCT SUM(DEBE) - SUM(HABER) FROM Clientes WHERE CodigoCli = 100
EL promedio es la suma de sus ventas dividido por el nmero de vendedores es decir:
SELECT SUM(Ventas) / COUNT(Ventas) FROM Vendedores WHERE Ventas > 100000
otra manera
SELECT AVG(Ventas) FROM Vendedores WHERE Ventas >100000

SELECT de fechas
SQL emplea el carcter de almohadilla (tambin llamado sostenido o makoki) para delimitar fechas. Por ejemplo
SELECT * FROM Apuntes WHERE Fecha > #10/02/1996#
Deseamos ver las ventas de un producto registradas entre los das 3 y 4 de febrero
SELECT * FROM Ventas WHERE Fecha BETWEEN #03/02/1997# AND #04/02/1997#
Solo aparecern las ventas del da 3 de febrero y no las del da 4. Por qu ? Porque cuando nosotros le especificamos 3 de
Febrero, el motor de Access entiende 3 de Febrero a las cero horas, cero minutos, cero segundos. Lo mismo sucede con el 4
de Febrero. En el caso de la fecha inicial no hay problema, pero en la fecha final est excluyendo las veinticuatro horas del
segundo da.

La clusula IN. Seleccionando dentro de un conjunto


Imaginemos que queremos seleccionar los clientes de tres ciudades. Tenemos dos posibilidades, una de ellas siguiendo la
sintaxis clsica y componiendo una clusula de filtro WHERE basada en tres condiciones concatenadas:
SELECT * FROM Clientes WHERE Ciudad = Monterrey OR Ciudad = Guadalajara OR Ciudad = D.F.
Otra posibilidad es utilizar la clusula IN
SELECT * FROM Clientes WHERE Ciudad IN ( Monterrey, Guadalajara, D.F.)
Curso: Lenguaje de Programacin Visual Basic. Prctica 8
Instructor: L.I. Raymundo Lumbreras Lpez [Hoja 3 de 7]

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!

Iniciemos:
Teclear en el cuadro de texto SELECT * FROM Titles (visualice los resultados en el Grid)
Calcular cuantos ttulos de libros tiene la tabla SELECT COUNT(Title) FROM Titles (visualice los resultados en el
Grid)
Preguntemos cual es la media de edad de los autores de los cules tenemos el dato de la edad.
Podemos tener campos con nombres compuestos de varias palabras separadas por espacios. Muchos analistas optan por
eliminar este tipo de nombres para los campos, pero frecuentemente nos vemos en la tesitura de tener que utilizarlos. Para
esos casos hay que evitar que el analizador sintctico de SQL se equivoque, viendo dos campos en lugar de uno.
Para solucionarlos encerraremos la expresin entre corchetes cuadrados y convertiremos a enteros.
SELECT INT(AVG(1999-[Year Born])) FROM Authors WHERE [Year Born] > 0
Lancemos una consulta que nos de el cdigo de autor y el cdigo de cada libro que ha escrito ese mismo author,
ordenndolos por sus respectivos cdigos.
SELECT Authors.au_id [Title author].au_id, ISBN FROM Authors, [Title Author]
WHERE Authors.au_id=[Title Author].au_id

Curso: Lenguaje de Programacin Visual Basic. Prctica 8


Instructor: L.I. Raymundo Lumbreras Lpez [Hoja 4 de 7]

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!

SELECTS contra varias tablas


En la base de datos de pruebas tenemos una tabla de autores, otra tabla de ttulos y una tabla intermedia con los campos de
identificador de autor e identificador de titulo. Para qu sirve esta ultima tabla?
Puede haber un autor que tenga varios libros publicados, pero a la vez puede darse el caso de que un solo libro sea escrito
por varios autores. Si creamos una tabla de autores y Libros podremos relacionar N autores con M libros. Para encontrar la
relacin entre los autores y los libros que han escrito, vamos a preguntar a nuestra base de datos cules son los libros que ha
escrito cada autor, ordenando cada uno segn el cdigo de autor.
Lancemos una consulta que nos d el cdigo de autor y el cdigo de cada libro que ha escrito, ordenndolos por sus
respectivos cdigos.
SELECT Authors.au_id, [Title Author].au_id, ISBN FROM Authors, [Title Author]
WHERE Authors.au_id=[Title Author].au_id
De este modo vemos que el autor 1 ha escrito dos libros, el autor 2 ha escrito 5 libros, etc.,
Vamos ahora a preguntar wl nombre del autor a partir del Au_ID y el ttulo del libros a partir del ISBN
SELECT Authors.au_id, [Title Author].au_id, [Title Author].ISBN,Titles.ISBN, Titles.Title
FROM Authors, [Title Author],Titles
WHERE Authors.au_id=[Title Author].au_id AND [title Author].ISBN=Titles.ISBN

Inner joins, outer joins, let joins, right joins


Qu pasara si un autor no hubiera escrito ningn libro? Saldra o no en la lista?
Por defecto, el motor de Access realiza enlaces entre tablas (en ingls joins) de tipo inner join.. Un inner join o join interno
es aquel en el que si no se cumplen las dos partes de la igualdad, no aparece la fila en la vista.
Un outer join depende del lado en el que se d la igualdad para que aparezca en la vista. Existen 2 tipos de outer join:
En un Left Join aparecen todos los registros de la tabla que est a la izquierda de la igualdad, tenga o no tenga registros
con correspondencia en la otra tabla. Si tiene correspondencia, los campos la muestran. Si no tiene correspondencia, los
campos que no cuadran aparecen vacos
En un right join es justamente el caso simtrico; aparecen todos los registros de la tabla que est a la derecha, tenga o no
tenga correspondencia con la que est a la izquierda. Si tiene correspondencia, todos los campos aparecen llenos, y si no
tiene correspondencia, los campos que no cuadran aparecen vacos.
Ejemplo: Dar de alta 2 Autores nuevos. De este modo habr dos autores en la base de datos que no tengan libros.
Si hacemos un INNER JOIN (join por defecto) con una clusula WHERE normal y corriente, y pedimos todos los ISBN de
cada autor a partir de las tablas Authors y Title Author, no aparecern aquellos registros de autores que no tengan ttulos
escritos.
SELECT * FROM Authors, [Title Author] WHERE Authors.Au_ID=[Title Author].Au_ID
Ahora Probaremos un OUTER JOIN de tipo LEFT JOIN. La tabla que manda es la tabla de autores; es decir, queremos que
aparezcan todos los autores, tengan o no tengan libros. Haremos el left join poniendo a la izquierda la tabla de autores:
SELECT * FROM Authors
Left join [Title Author] on Authors.Au_ID=[Title Author].Au_Id

Curso: Lenguaje de Programacin Visual Basic. Prctica 8


Instructor: L.I. Raymundo Lumbreras Lpez [Hoja 5 de 7]

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!
En el resultado de la consulta aparecen primero los campos que cumplen con la condicin. Los registros que no estn
vinculados aparecen siempre al final. Y es aqu donde aparecen los ltimos dos registros que capturamos.
Si ahora cambiamos la orden a right join, veremos que la tabla que manda ahora es la de ttulo y autor:
SELECT * FROM Authors
right join [Title Author] on Authors.Au_ID=[Title Author].Au_Id
ya que todos los ttulos estn vinculados al autor, no se vern registros sin campo Au_ID
Crear la siguiente Tabla. Nombre Explosivos
Ao Toneladas Millones_1987
Tipo
1987
2887
1915 Explosivos
1986
3389
3915 Explosivos
1985
7674
6827 Explosivos
1984
3331
2124 Explosivos
1983
7674
8270 Explosivos
1982
4908
1892 Explosivos
1981
2618
948 Explosivos
1980
5343
1421 Explosivos
1987
5342
6147 Armas y Municiones
1986
3342
5334 Armas y Municiones
1985
3881
7200 Armas y Municiones
1984
4673
7311 Armas y Municiones
1983
3881
8721 Armas y Municiones
1982
4714
10811 Armas y Municiones
1981
1831
5596 Armas y Municiones
1980
1623
7161 Armas y Municiones
Configure la interfaz para que responda al GRID

TRANSFORM SELECT: Transposicin de matrices


Una matriz traspuesta es aquella en las que las filas cambian por las columnas, como si girase 90 grados
Nos interesa trasponer la matriz para ver la evolucin de los millones de pesos a lo largo de los aos
TRANSFORM Sum(Explosivos.Millones_1987) AS millones
SELECT Explosivos.Tipo
FROM Explosivos
GROUP BY Explosivos.Tipo
PIVOT Explosivos.Ao
Si nos fijamos en los datos, veremos que slo estamos mostrando los millones de ventas y no las toneladas. Para ver las
toneladas modifique:
TRANSFORM Sum(Toneladas) AS Tones
PIVOT especifica cual ser el campo de criterio para colocar su contenido como nombre de cabecera de columnas.
Curso: Lenguaje de Programacin Visual Basic. Prctica 8
Instructor: L.I. Raymundo Lumbreras Lpez [Hoja 6 de 7]

!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!"!
Para forzar la existencia de columnas concretas se utiliza la clusula IN a continuacin de PIVOT
PIVOT Explosivos.Ao IN (1986,1987,1988)
Generar las siguientes tablas dentro de la base de datos Armas

BajaCalifornia
Cdigo Cliente
1 Beatriz
2 Bernardo
3 Bonifacio
4 Braulio

Colima
Cdigo
Cliente
5 Carlos
6 Concepcin
7 Carla
8 Clara

Guadalajara
Cdigo Cliente
13 Gabriela
14 Gonzalo
15 Gerardo
16 Guillermo

Torren
Cdigo Cliente
9 Toms
10 Thala
11 Teresa
12 Telsforo

SELECT UNION: unir varios SELECTs


La instruccin SELECT con la clusula UNION permite mostrar en un solo conjunto de registros el resultado de varios
SELECTs
SELECT * FROM BajaCalifornia UNION SELECT * FROM Colima
Si deseamos obtener todos los clientes de todas las ciudades utilizaremos:
SELECT * FROM BajaCalifornia UNION
SELECT * FROM Colima UNION
SELECT * FROM Guadalajara UNION
SELECT * FROM Torren
Para obtener los clientes de BajaCalifornia cuyo cdigo sea mayor de 2 junto con los de Torren cuyo cdigo sea divisible
por tres, utilizaremos:
SELECT * FROM BajaCalifornia WHERE Cdigo > 2 UNION
SELECT * FROM Torren WHERE Cdigo / 3=INT(Cdigo / 3)

Curso: Lenguaje de Programacin Visual Basic. Prctica 8


Instructor: L.I. Raymundo Lumbreras Lpez [Hoja 7 de 7]

Вам также может понравиться