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

Seguidamente te enumero algunas de las formas de la sintaxis SQL que podes utilizar, estudialas, porque podras utilizar menos

cdigo con el comando COUNT y WHERE Select SELECT "nom de colonne" FROM "nombre_tabla" Distinct SELECT DISTINCT "nombre_columna" FROM "nombre_tabla" Where SELECT "nombre_columna" FROM "nombre_tabla" WHERE "condition" And/Or SELECT "nombre_columna" FROM "nombre_tabla" WHERE "condicin simple" {[AND|OR] "condicin simple"}+ In SELECT "nombre_columna" FROM "nombre_tabla" WHERE "nombre_columna" IN ('valor1', 'valor2', ...) Between SELECT "nombre_columna" FROM "nombre_tabla" WHERE "nombre_columna" BETWEEN 'valor1' AND 'valor2' Like SELECT "nombre_columna" FROM "nombre_tabla" WHERE "nombre_columna" LIKE {patrn} Order By SELECT "nombre_columna" FROM "nombre_tabla" [WHERE "condicin"] ORDER BY "nombre_columna" [ASC, DESC] Count SELECT COUNT("nombre_columna") FROM "nombre_tabla" Group By SELECT "nombre_columna 1", SUM("nombre_columna 2") FROM "nombre_tabla" GROUP BY "nombre_columna 1" Having SELECT "nombre_columna 1", SUM("nombre_columna 2") FROM "nombre_tabla" GROUP BY "nombre_columna 1" HAVING (condicin de funcin aritmtica)

Create Table CREATE TABLE "nombre_tabla" ("columna 1" "tipo_de_datos_para_columna_1", "columna 2" "tipo_de_datos_para_columna_2", ... ) Drop Table DROP TABLE "nombre_tabla" Truncate Table TRUNCATE TABLE "nombre_tabla" Insert Into INSERT INTO "nombre_tabla" ("colonne 1", "colonne 2", ...) valorS ("valor 1", "valor 2", ...) Update UPDATE "nombre_tabla" SET "colonne 1" = [nuevo valor] WHERE {condition} Delete From DELETE FROM "nombre_tabla" WHERE {condicin}

EJEMPLO formulario de Login usando base de datos(Access) Lo siguiente utiliza una base de datos con una tabla que tiene dos campos, uno llamado " Nombre " y otro campo llamado " Password ". Al ejecutar el programa, se inicia desde un SubMain y un formulario de Login. Este ltimo , se conecta a la base de datos utilizando Ado para traer los datos del usuario al recordset y comprobar si son correctos y poder entrar al formulario principal --Pasos para crear el ejemplo: *Crear una tabla llamada Usuarios *Dentro de esta tabla aadir dos campos, uno llamado *Nombre y otro Password(En Access) *Al proyecto aadir dos formularios ( frmLogin y frmPrincipal ) *Un mdulo bas *Aadir la referencia a Microsoft Activex xx Data Objects para poder utilizar ADO --El formulario frmLogin debe tener dos textBox ( txt_Usuario y txt_Password ) y dos commandButton ( cmdEntrar y cmdSalir ) --Luego indicar desde el men Proyecto > Propiedades del proyecto .. en la opcin " Objeto

inicial " , el procedimiento Sub Main --A continuacin sigue el cdigo a agregar en el mdulo bas y el cdigo del formulario frmLogin **Cdigo fuente del mdulo bas Option Explicit Public Sub Main()

' Abre el formulario para el ingreso _ del Usuario y la contrasea frmLogin.Show vbModal MsgBox " ..bienvenido ", vbInformation, " Login Correcto " ' Abre el formulario principal del programa FrmPrincipal.Show End Sub -----Cdigo fuente en el formulario FrmLogin------------Option Explicit Flag Dim OK As Boolean Private Sub cmdEntrar_Click() ' Cadena de conexin ( INDICAR EL PATH DE LA BASE DE DATOS ) Const C_CADENA = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & "c:\bd1.mdb" & ";" ' Variable para el recordset Dim Rst_Login As Recordset ' crea el recordset Set Rst_Login = New Recordset Dim SQL As String ' consulta SQL ( Campos: Nombre y Password) _ Textbox ( txt_Usuario y txt_Password) _ Tabla: Usuarios SQL = "SELECT Nombre, Password " & _ "FROM Usuarios " & _ "WHERE Nombre = '" & txt_Usuario.Text & "'" _

& "AND Password = '" & txt_Password.Text & "'" With Rst_Login ' Abre el recordset .Open SQL, C_CADENA ' Si el recordset est vaco es por que es incorrecto If .EOF Then MsgBox " El usuario o Password es incorrecto ", _ vbCritical, " Login incorrecto " ' Cierra y descarga el Recordset Rst_Login.Close Set Rst_Login = Nothing Exit Sub End If End With ' Cierra y descarga el Recordset Rst_Login.Close Set Rst_Login = Nothing 'Cambia el Flag para que no cierre el programa con End OK = True ' Descarga el formulario y prosigue en el SubMain Unload Me End Sub Private Sub cmdSalir_Click() OK = False Unload Me End Sub Private Sub Form_Unload(Cancel As Integer) Set frmLogin = Nothing If OK = False Then End End If End Sub

-----------

SENTENCIAS DE SELECCIN O CONSULTAS Bien, SQL permite realizar consultas mediante sentencias de seleccin "SELECT".

Lo q hace esta sentencia SELECT es tomar datos de una base de datos para devolverlos a quien se lo pidi (en nuestro caso quien se lo pide es el objeto TBL). SELECT consta de seis clusulas: las dos primeras obligatorias (SELECT y FROM) y las otras opcionales (WHERE, GROUP BY, HAVING, UNION, ORDER BY).

SELECT y FROM

FUNCIONES DE AGRUPAMIENTO

WHERE

GROUP BY

HAVING

UNION

ORDER BY

CONSULTAS A MAS DE UNA TABLA

SELECT y FROM

Veamos, con un ejemplo, como funciona:

SQL = "SELECT * FROM tabla1"

Set TBL = BDD.OpenRecordset(SQL) 'TBL almacena todos los valores de la tabla

Nuestra orden SQL es: seleccionar (SELECT) todos los campos (*) de (FROM) la tabla1.

Ahora vamos a mostrar en la lista lo q almacenamos.

TBL.MoveFirst 'nos posicionamos en el primer registro de la tabla

Do Until TBL.EOF ''La propiedad EOF se pone TRUE cuando se a llegado al final de la tabla List1.AddItem TBL("nombre") TBL.MoveNext 'pasamos al siguiente registro Loop De esta manera, al ejecutar, nos debe aparecer en la lista todos los nombres de la tabla.

Si queremos mostrar "nombre" "apellido":

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("nombre") & " " & TBL("apellido") TBL.MoveNext

Loop

Si queremos listar "nombre" "apellido" tiene "edad":

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("nombre") & " " & TBL("apellido") & " tiene " & TBL("edad") TBL.MoveNext Loop

Qu sucede si solo quera tomar de la tabla1 los campos nombre y edad (no el apellido). En este caso la sentencia SQL quedara:

SQL = "SELECT nombre,edad FROM tabla1" Por lo tanto el formato de la sentencia SELECT hasta ahora es: SELECT campo1,campo2,...,campoN FROM nombre_de_la_tabla

NOTA: si ya terminamos de trabajar con la tabla y con la base de datos las podemos cerrar de la siguiente manera:

TBL.Close 'cierra tabla BDD.Close 'cierra base de datos

FUNCIONES DE AGRUPAMIENTO Las funciones de agrupamiento son:

DISTINCT: Dijimos q si usabamos el * nos seleccionaba todos los campos. Tambin hay un operador llamado DISTINCT, ste elimina las filas o registros duplicados del resultado de la consulta. Esto se ve bien en el siguiente ejemplo:

SQL = "SELECT DISTINCT edad FROM tabla1" 'almacena todas las edades sin repetirlas Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("edad") TBL.MoveNext Loop

COUNT: Este operador nos devuelve la cantidad de valores en una columna. Por ejemplo, COUNT(nombre) devolver el nmero de registros con valores no nulos en el campo nombre. Pero si usamos COUNT(*), nos devuelve el nmero de registros incluyendo aquellos registros con valores nulos.

SQL = "SELECT COUNT(*) FROM tabla1" 'para saber la cantidad de registros (incluye los nulos) Set TBL = BDD.OpenRecordset(SQL)

List1.AddItem TBL("expr1000") 'expr1000 es el name del item de TBL q almacena el resultado del operador de agrupamiento

SUM: Devuelve la suma total de los valores de una expresin de columna o campo NUMERICA (si no es numerica les da error!) . Por ejemplo, SUM(edad) devolver la sumatoria de las edades.

SQL = "SELECT SUM(edad) FROM tabla1" 'sumatoria de las edades Set TBL = BDD.OpenRecordset(SQL)

List1.AddItem TBL("expr1000")

AVG: Devuelve el promedio de los valores de una expresin de columna. Por ejemplo, AVG(edad) devolver el promedio de las edades. Esto seria dividir SUM(edad)/COUNT(edad).

SQL = "SELECT AVG(edad) FROM tabla1"

MAX: Devuelve el valor ms alto de los contenidos en una expresin de columna.

Si hacemos: SQL = "SELECT MAX(edad) FROM tabla1" Nos dir la edad mas alta.

MIN: Si hay un MAX, por q no puede haber un MIN? ya se habran dado cuenta lo q hace.

Entonces, si SQL = "SELECT MIN(edad) FROM tabla1" Nos dir la edad mas baja.

EJEMPLO: quiero saber cuntos registro tengo, cual es la menor edad y cual es el promedio de todas las edades

Dim BDD As Database Dim TBL As Recordset Dim SQL As String

Set BDD = OpenDatabase("c:\mis documentos\base1.mdb")

SQL = "SELECT COUNT(*), MIN(edad), AVG(edad) FROM tabla1" Set TBL = BDD.OpenRecordset(SQL)

List1.AddItem "total de reg: " & TBL("expr1000") List1.AddItem "MINIMA EDAD: " & TBL("expr1001") List1.AddItem "PROMEDIO EDADES: " & TBL("expr1002")

TBL.Close BDD.Close

WHERE

Con WHERE indicamos condiciones para la seleccin de ciertos registros. Veamos un ejemplo:

Antes q nada nuestra sentencia SELECT quedara asi:

SELECT campo1,campo2,...,campoN FROM nombre_de_la_tabla WHERE condicion1 AND condicion2 AND ... AND condicionN

Dim BDD As Database

Dim TBL As Recordset Dim SQL As String

Set BDD = OpenDatabase("c:\mis documentos\base1.mdb") SQL = "SELECT * FROM tabla1 WHERE edad < 30" Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("edad") TBL.MoveNext Loop TBL.Close BDD.Close

Con esta instruccin decimos q: seleccione (SELECT) todos los campos (*) de (FROM) tabla1 q cumplan la condicin (WHERE) edad < 30

GROUP BY Esta clusula se utiliza para agrupar segun lo q especifiquemos. Por ejemplo, podemos listar todos los datos de nuestra tabla1, pero agrupados por edad. SQL = "SELECT edad, nombre, apellido FROM tabla1 GROUP BY edad,nombre, apellido" Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("nombre") & " " & TBL("apellido") & " tiene " & TBL("edad") TBL.MoveNext Loop Entonces el formato es: GROUP BY expresion1, expresin2, ..., expresinN.

IMPORTANTE: Todas las expresiones deben coincidir con lo q pusimos en SELECT. Por lo tanto lo siguiente no funciona:

SQL = "SELECT * FROM tabla1 GROUP BY edad,nombre, apellido" 'no se puede agrupar mediante los campos seleccionados con * SQL = "SELECT edad FROM tabla1 GROUP BY apellido" SQL = "SELECT nombre, apellido, edad FROM tabla1 GROUP BY edad"

HAVING Asi como la clusula WHERE especifica condiciones para la seleccin de registros, HAVING especifica condiciones para el agrupamiento (GROUP BY). Por lo tanto HAVING funciona solo si se especifica un GROUP BY.

SQL = "SELECT edad, nombre, apellido FROM tabla1 GROUP BY edad,nombre, apellido HAVING edad<30" Con este ejemplo agrupamos segn la edad, pero solo los q su campo edad es menos a 30.

UNION Con este operador lo q hacemos es juntar dos resultados de dos sentencias SELECT diferentes. El resultado de la union son todos los registros devueltos en ambas sentencias, y los registros repetidos se omiten a no ser q utilicemos la palabra ALL. La forma es: SELECT sentencia1 UNION ALL SELECT sentencia2 'sentencia1 debe coincidir con sentencia2

veamos q sucede si hacemos lo siguiente SQL = "SELECT * FROM tabla1 UNION SELECT * FROM tabla1" Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("nombre") & " " & TBL("apellido") & " tiene " & TBL("edad") TBL.MoveNext Loop En este caso unimos la tabla1 con la misma tabla1, por lo tanto todos los resultados son repetidos y se omiten.

Veamos q pasa con ALL SQL = "SELECT * FROM tabla1 UNION ALL SELECT * FROM tabla1" Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst Do Until TBL.EOF List1.AddItem TBL("nombre") & " " & TBL("apellido") & " tiene " & TBL("edad") TBL.MoveNext Loop Otra vez todos los datos se repiten pero en este caso le decimos q no omita ninguno, por lo tanto cada valor de la tabla1 estar repetido dos veces. Hacer esto no tiene sentido, es decir q la union debera ser con la seleccin de dos tablas diferentes.

ORDER BY Para ordenar los resultados utilizamos ORDER BY. Cuando omitimos esta clusula, los resultados se ordenan por el primer campo que sea clave en el ndice que se haya utilizado. Veamos las siguientes sentencias: SQL = "SELECT * FROM tabla1 ORDER BY edad ASC" ' ordenado por edad en forma ascendente SQL = "SELECT * FROM tabla1 ORDER BY edad" ' ordenado por edad, por defecto lo ordena en forma ascendente SQL = "SELECT * FROM tabla1 ORDER BY edad DESC" ' ordenado por edad en forma descendente SQL = "SELECT * FROM tabla1 ORDER BY 1" 'ordenado por el primer campo de la tabla SQL = "SELECT nombre, apellido, edad FROM tabla1 ORDER BY 3,2,1" 'ordenado por edad, apellido y nombre Entonces podemos indicar el nombre_de_campo, nmero_de_campo y si es ASCendente o DESCendente.

CONSULTAS A MAS DE UNA TABLA

Supongamos q tenemos una base de datos con dos tablas llamadas tabla1 y tabla2. Tabla1 tiene como campos nombre, apellido y edad. Mientras q la tabla2 tiene nombre y email.

Bien, por ejemplo yo podria querer los emails de las personas q estan en ambas tablas, esto es q el nombre de la tabla1 tiene q ser igual al nombre de la tabla2.

Veamos como lo indicamos...

SQL = "SELECT tabla1.nombre,email FROM tabla1,tabla2 WHERE tabla1.nombre=tabla2.nombre" Set TBL = BDD.OpenRecordset(SQL)

TBL.MoveFirst

Do Until TBL.EOF List1.AddItem TBL("nombre") & " " & TBL("email") TBL.MoveNext Loop

Nuestra sentencia SQL quedo as:

1- Indicamos los campos a seleccionar (SELECT). Observar q el campo nombre aparece en las dos tablas, por lo tanto debemos indicar de q tabla los voy a seleccionar (tabla1.nombre). Por el contrario el campo email solo aparece en la tabla2, por lo tanto no hace falta indicarle de q tabla lo queremos ya q es obvio de cual va a ser.

2- Despues indicamos cuales tablas van a ser consultadas (FROM). Le indicamos q tabla1, tabla2. El orden es importante porq de cada registro de la primer tabla se efectua una busqueda en la segunda.

3- por ultimo indicamos la condicin (WHERE). Decimos q el campo nombre de la tabla1 debe ser igual al de la tabla2.

Ahora vamos a ver el mismo ejemplo pero usando ALIAS. Un alias es un nombre temporal q le asignamos a una tabla. Por ejemplo a la tabla1 la podemos llamar t1 y a la tabla2 t2. De esta manera es mas facil escribir t1 q tabla1.

SQL = "SELECT t1.nombre,email FROM tabla1 t1,tabla2 t2 WHERE t1.nombre=t2.nombre"

En el FROM escribimos nombre_tabla alias_tabla. En el resto de la sentencia usamos el alias en vez de el nombre.

Ahora, supongamos q tenemos una tercer tabla q contiene nombre y telefono como campos. Queremos consultar los campos nombre, email y telefonos.

SQL = "SELECT t1.nombre,email,telefono FROM tabla1 t1,tabla2 t2, tabla3 t3 WHERE t1.nombre = t2.nombre AND t1.nombre = t3.nombre"

Lo importante de estas consultas es el orden en q se escriben las tablas luego del FROM, ya q esto va a influir en la velocidad de la consulta.

Para terminar la seccin de consultas vamos a ver las SELECT ANIDADAS. Esto es una SELECT dentro de otra. Es muy simple. Veamos un ejemplo.

SQL = "SELECT t1.nombre,email,telefono FROM tabla1 t1,tabla2 t2, tabla3 t3 WHERE t1.nombre = t2.nombre AND t1.nombre = t3.nombre AND (SELECT COUNT(*) FROM tabla1)< 100" Es la misma condicin anterior solo q se agrego una condicin mas: (SELECT COUNT(*) FROM tabla1)< 100, esto es, q la tabla1 tenga menos de 100 registros. Entonces cuando insertamos una nueva SELECT dentro de otra, debemos ponerla entre parentesis.