¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. VBA Access (versión 2019 y Office 365)
  3. El lenguaje SQL aplicado a Access
Extrait - VBA Access (versión 2019 y Office 365) Programar en Access
Extractos del libro
VBA Access (versión 2019 y Office 365) Programar en Access
2 opiniones
Volver a la página de compra del libro

El lenguaje SQL aplicado a Access

El lenguaje SQL

El lenguaje SQL (Structured Query Language) es el lenguaje utilizado en Access para extraer, actualizar o eliminar datos que pertenecen a diferentes tablas de la base de datos. El objetivo de las siguientes secciones es explicar las diferentes estructuras y sintaxis que se pueden utilizar para este fin. Aunque se permite usar un amplio abanico de las instrucciones normalizadas SQL, Access y por extensión VBA no respetan la integridad de las funciones llamadas nativas de SQL.

El comando SELECT

La sintaxis general de una consulta SQL es la siguiente:

SELECT [DISTINCT o ALL] <* o lista de los Campos> 
FROM <Nombre de las Tablas> 
[WHERE <Predicados>] 
[GROUP BY orden de los grupos] 
[HAVING condición] 
[ORDER BY] <lista de los Campos> 

La palabra clave DISTINCT permite visualizar solo resultados únicos, al contrario que los resultados duplicados que se mostrarán con la palabra clave ALL.

Cuando se desea extraer datos de las tablas, es necesario simplemente listar los campos que se han de extraer.

SELECT ANI_NOMBRE, ANI_ESTERILIZACION, ANI_FECHA_NACIMIENTO 
FROM ENI_ANIMAL_ANI 

Los campos ANI_NOMBRE, ANI_ESTERILIZACION y ANI_FECHA_NACIMIENTO, de la tabla ENI_ANIMAL_ANI, se mostrarán en el resultado. Cada campo seleccionado se separa del resto por una coma.

El símbolo * permite seleccionar todos los campos disponibles en las tablas que aparecen en la cláusula FROM.

El origen FROM

1. Sintaxis general

Las diferentes tablas disponibles en la base de datos de Access pueden servir de fuente de datos. Por lo tanto, cada tabla puede aparecer en la cláusula FROM, separada del resto de las tablas por una coma.

SELECT ANI_NOMBRE, ADO_NOMBRE, ADO_CIUDAD 
FROM ENI_ANIMAL_ANI, ENI_ADOPTANTE_ADO 

2. Los joins

Es posible indicar en la consulta si se deben tener en cuenta algunas correspondencias entre las diferentes tablas. Hay tres tipos de correspondencias SQL en Access:

SELECT *  
FROM Tabla_1 [INNER o LEFT o RIGHT] JOIN Tabla_2 
ON <condiciones del join > 

a. Join interno INNER JOIN

El join INNER JOIN permite tener en cuenta solo los registros para los que existe una correspondencia exacta entre las tablas.

SELECT ANI_NOMBRE, ADO_NOMBRE, ADO_CIUDAD 
FROM ENI_ANIMAL_ANI INNER JOIN ENI_ADOPTANTE_ADO 
ON ENI_ANIMAL_ANI.ID = ENI_ADOPTANTE_ADO.ID 

b. Join externo LEFT JOIN

El join izquierdo externo LEFT JOIN permite visualizar todos los registros contenidos en la tabla de la izquierda (más abajo ENI_ANIMAL_ANI), incluso si no hay correspondencia en la tabla de la derecha (más abajo ENI_ADOPCION_ADO). De esta manera, se muestran todos los nombres de los animales, incluso si no han sido adoptados por un adoptante (caso de los animales no esterilizados o todavía lactantes, por ejemplo).

SELECT ANI_NOMBRE, ADO_NOMBRE, ADO_CIUDAD 
FROM ENI_ANIMAL_ANI LEFT JOIN ENI_ADOPCION_ADO 
ON ENI_ANIMAL_ANI.ID = ENI_ADOPTANTE_ADO.ID...

La cláusula WHERE

En una consulta de extracción de datos, es posible aplicar algunos criterios de valores para filtrar los registros, según el valor de sus campos. Estos criterios se expresan en la cláusula WHERE de la consulta SQL.

SELECT ANI_NOMBRE, ANI_SEXO 
FROM ENI_ANIMAL_ANI 
WHERE ANI_LACTANTE = TRUE 

Esta consulta permite encontrar los nombres y el sexo de los animales para aquellos ya destetados.

1. Los diferentes criterios existentes

Es posible filtrar según varios criterios: igualdad (=), diferencia (<, >, <=, >=, <>), nulidad (Is Null), correspondencia de texto (LIKE), pertenencia a un intervalo (BETWEEN) o lista (IN), etc. Los diferentes criterios se pueden combinar entre ellos gracias a los operadores booleanos (AND, OR, XOR y NOT).

2. Algunos ejemplos

La siguiente consulta muestra los campos ANI_NOMBRE y ANI_FECHA_NACIMIENTO de los registros de la tabla ENI_ANIMAL_ANI, cuyas fechas For_Fecha están entre el 1 de enero de 2016 y el 1 de junio de 2018.

SELECT ANI_NOMBRE, ANI_FECHA_NACIMIENTO 
FROM ENI_ANIMAL_ANI 
WHERE ANI_FECHA_ADOPCION BETWEEN #01/01/2016# AND #06/01/2018 

La siguiente consulta muestra los nombres y apellidos de los registros de la tabla ENI_ADOPTANTE_ADO cuyo Nombre empieza por A.

SELECT ADO_NOMBRE, ADO_APELLIDO 
FROM ENI_ADOPTANTE_ADO 
WHERE ADO_NOMBRE LIKE 'A*' 

Los cálculos en las consultas

Es posible realizar cálculos sobre los datos a partir de las consultas SQL. Por ejemplo, determinar el número total de animales por caja, o incluso el precio total que debe pagar un adoptante por sus adopciones.

Existen varias funciones en SQL (total COUNT, suma SUM, mínimo MIN, máximo MAX, etc.), que se completan con otras funciones directamente de VBA (Left, Right, Mid, DateSerial, etc.).

Por ejemplo, la siguiente consulta permite visualizar los nombres y las iniciales del apellido de todos los adoptantes.

SELECT ADO_NOMBRE, Left(ADO_APELLIDO,1) As Iniciales 
FROM ENI_ADOPTANTE_ADO 

La cláusula GROUP BY

Cuando se hacen cálculos en una consulta, algunas veces es necesario agrupar los campos sobre los que no se hace ningún cálculo. El cálculo solo devolverá una única línea por grupo. Las agrupaciones se hacen con la cláusula GROUP BY

La siguiente consulta permite sumar los gastos totales de adopción para cada adopción.

SELECT ANI_ADO_ID, SUM(ANI_GASTOS_ADOPCION) AS Gastos_Totales 
FROM ENI_ANIMAL_ANI 
WHERE ANI_ADO_ID IS NOT NULL 
GROUP BY ANI_ADO_ID; 

De manera general, todos los campos sobre los que no se hace ningún cálculo deben aparecer en la agrupación. Si omite un campo en la agrupación, Access se lo indicará cuando se ejecute la consulta.

La cláusula HAVING

Así como es posible filtrar los valores en los registros, también es posible aplicar criterios de filtro a los cálculos de agrupación. Para esto se usa la cláusula HAVING.

Por ejemplo, si solo se desea visualizar las cajas cuyo número de animales ha sido estrictamente inferior a 5:

SELECT COUNT(ENI_CAJA_ANIMAL_BOA.BOA_CAJA_ID) AS CuentaDeBOA_CAJA_ID, 
ENI_CAJA_CAJA.CAJA_NOMBRE 
FROM ENI_CAJA_CAJA INNER JOIN ENI_CAJA_ANIMAL_BOA 
ON ENI_CAJA_CAJA.CAJA_ID = ENI_CAJA_ANIMAL_BOA.BOA_CAJA_ID 
GROUP BY ENI_CAJA_CAJA.CAJA_NOMBRE 
HAVING ((((Count(ENI_CAJA_ANIMAL_BOA.[BOA_CAJA_ID]))<5)); 

La cláusula ORDER BY

Durante la visualización de los datos resultantes de la consulta, es posible ordenarlos. La cláusula ORDER BY permite indicar en qué campos se desea realizar una ordenación. Es posible ordenar de dos maneras diferentes: creciente (ascendente), con la palabra clave ASC, y decrenciente (descendiente), con la palabra clave DESC. Si no se especifica ningún orden, el orden por defecto que se aplica es el creciente (ASC). Cada campo puede tener su propio orden.

La sintaxis SQL es la siguiente:

ORDER BY Campo_1 [ASC o DESC] [, Campo_2 [ASC o DESC]] 

Por ejemplo, la siguiente consulta hará que aparezcan los animales por orden de fecha de adopción y los nombres de animales por orden alfabético (creciente).

SELECT ANI_NOMBRE, ANI_FECHA_ADOPCION 
FROM ENI_ANIMAL_ANI 
ORDER BY ANI_FECHA_ADOPCION DESC, ANI_NOMBRE ASC 

Los alias, el operador AS

Es posible añadir tantas columnas como se quiera en una consulta (con el límite de 255 campos máximo). Para esto se usa la palabra clave AS. Este operador también permite asignar un nombre a cómo queremos ver un campo calculado.

Ejemplo de alias utilizado para el número de vacunas por fecha:

SELECT COUNT(*) AS Num_Vacunacion, ANV_FECHA VACUNACION As Fecha_Vacunacion 
FROM ENI_ANIMAL_VACUNACION_ANV 
GROUP BY ANV_FECHA_VACUNACION 

El comando INSERT INTO

Además de las consultas de selección de datos, es posible realizar consultas, llamadas acciones, que se mencionarán en las siguientes secciones. La primera consulta de tipo acción posible es la de inserción de nuevos registros en las tablas. Este modo corresponde al modo Añadir en la interfaz de Access. Hay varios métodos para insertar nuevos datos.

1. Añadir un registro

En primer lugar, es posible añadir un registro único con la siguiente sintaxis:

INSERT INTO Tabla_Destino (<Lista de los Campos>) 
VALUES (<Lista de los Valores>) 

La lista de los campos contiene los campos que se alimentarán, cada uno separado del resto, por una coma. A cada campo se le asignará un valor, que se corresponde con el valor de la lista de valores que aparece en el mismo orden.

Es necesario tener el mismo número de campos y valores asignados, y que los tipos de valores introducidos y su orden sea idéntico. En caso contrario, la consulta se interpretará incorrectamente, incluso Access la rechazará durante su ejecución.

Ejemplo de inserción de una nueva vacuna:

INSERT INTO ENI_VACUNA_VAC (VAC_NOMBRE, VAC_ANT_ID) 
VALUES ('Parvovirosis del perro', 1) 

2. Adición como resultado de una consulta

En caso de que quiera insertar registros a partir de una consulta, es posible hacerlo con la siguiente sintaxis:

INSERT INTO Tabla_Destino...

El comando SELECT INTO

De la misma manera que la consulta INSERT INTO va a añadir registros nuevos en una tabla existente, la consulta SELECT INTO va a crear una nueva tabla y añadir en ella los registros. La sintaxis general de este comando es la siguiente:

SELECT Campo_1 [, Campo_2] INTO TablaDestino  
FROM TablaOrigen  
[WHERE <lista de condiciones>] 

Se va a crear una tabla TablaDestino sobre la marcha (si la tabla TablaDestino ya existe, aparecerá un mensaje de alerta indicando que ya existe y se eliminará). Cada campo de la consulta se creará en la tabla TablaDestino, y después se añadirán los registros del resultado de la consulta SELECT.

Ejemplo de consulta de inserción de las vacunas anteriores a 2018 en una tabla T_VACUNACION_ARCHIVADA:

SELECT * INTO T_VACUNACION_ARCHIVADA FROM ENI_ANIMAL_VACUNACION_ANV 
WHERE ANV_FECHA_VACUNACION<=#01/01/2018# 

El comando UPDATE

El comando UPDATE se utiliza para actualizar los datos ya presentes en las tablas. Este comando corresponde al tipo de consulta Actualización en Access 2019. También se trata de una consulta de tipo Acción. La sintaxis general de este comando es la siguiente:

UPDATE Tabla_ACT 
SET Campo_1=valor_1 [, Campo_2=Valor_2] 
[WHERE <lista de condiciones de actualización>] 

Para cada registro que responde a las condiciones propuestas, se actualizará sus campos. Si no hay ninguna condición (no hay cláusula WHERE), se actualizan todos los registros.

Ejemplo de una consulta de actualización:

UPDATE ENI_ANIMAL_ANI 
SET ANI_LACTANTE=TRUE 
WHERE ANI_NOMBRE='Maki' 

Esta consulta actualiza el destete para el animal que se llama Maki.

El comando DELETE

El comando DELETE permite eliminar registros. Corresponde al tipo de consulta Eliminación de Access 2019. La sintaxis general es la siguiente:

DELETE * FROM Tabla_A_Vaciar 
[WHERE <lista de condiciones>] 

Se eliminarán todos los registros de la tabla Tabla_A_Vaciar que se corresponden con las condiciones propuestas.

Ejemplo de consulta de eliminación de las vacunas anteriores a 2015:

DELETE * FROM ENI_ANIMAL_VACUNACION_ANV 
WHERE ANV_FECHA_VACUNACION<=#01/01/2015# 

Los otros comandos

La lista de comandos no se limita a la selección, inserción, actualización y eliminación. A continuación, se muestra la lista del resto de los comandos SQL añadidos por Access 2019.

1. Consulta de análisis cruzado

La consulta TRANSFORM crea una consulta de análisis cruzado. Se utiliza en el asistente de creación de la consulta.TRANSFORM

2. Consulta de tipo Union

La sintaxis UNION permite fusionar el resultado de varias consultas cuyas estructuras y campos son idénticos

3. Creación/administración de una tabla

CREATE TABLE

Crea una nueva tabla.

ALTER TABLE

Modifica la estructura de una tabla.

DROP TABLE

Elimina una tabla.

CREATE INDEX

Crea un nuevo índice en una tabla existente.

DROP INDEX

Elimina un índice.

4. Creación/administración de los usuarios y los grupos

Usuarios

CREATE USER

Crea uno o varios usuarios nuevos.

ADD USER

Añade un usuario a un grupo de usuarios existente.

DROP USER

Elimina uno o varios usuarios.

Grupos

CREATE GROUP

Crea uno o varios grupos de usuarios nuevos.

DROP GROUP

Elimina uno o varios grupos existentes.

Permisos

GRANT

Da permisos concretos a un usuario o a un grupo de usuarios existente.

REVOKE

Retira permisos concretos a un usuario o a un grupo de usuarios existente.

Cada uno de estos comandos se explica en la ayuda de Access (tecla [F1]).