🎃 Grandes descuentos en libros en línea, eformaciones y vídeos*. Código CALABAZA30. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

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 DISTINCTROW O ALL] [TOP N [PERCENT]]<* 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 de la lista de campos seleccionados, al contrario que los resultados duplicados que se mostrarán con la palabra clave ALL. Por otro lado, la palabra clave DISTINCTROW permite omitir registros completos (todos los campos) que estén duplicados. Si no se utiliza ninguna de las tres palabras clave, se utilizará ALL por defecto.

La palabra clave TOP se utiliza para devolver un cierto número de resultados. También se puede completar con la palabra clave PERCENT, para devolver un determinado porcentaje de resultados. De esta manera, de un total de 500 registros posibles, TOP 10 devolverá 10 registros, mientras que TOP 10 PERCENT devolverá 50. No se respeta el porcentaje cuando no es posible. Por ejemplo, con 4 registros, si indicamos TOP 10 PERCENT, se devolverá 1 registro.

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

SELECT EMP_NOMBRE, EMP_APELLIDO, EMP_FECHA_NACIMIENTO 
FROM ENI_EMPLEADOS_EMP 

Los campos EMP_NOMBRE, EMP_APELLIDO...

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 EMP_NOMBRE, EMP_TITULO, OFI_CIUDAD 
FROM ENI_EMPLEADOS_EMP, ENI_OFICINA_OFICINA_OFI 

Cuando hay varias tablas que contienen el mismo nombre de campos, se hace necesario especificar la tabla original indicando el nombre en la consulta.

SELECT ENI_EMPLEADOS_EMP.NOMBRE, CIUDAD FROM ENI_EMPLEADOS_EMP, 
ENI_OFICINA_OFI 

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 EMP_NOMBRE, EMP_TITULO, OFI_CIUDAD 
FROM ENI_EMPLEADOS_EMP INNER JOIN ENI_OFICINA_OFI 
ON ENI_EMPLEADOS_EMP.EMP_OFI_ID = ENI_OFICINA_OFI.OFI_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_EMPLEADOS_EMP), incluso si no hay correspondencia en la tabla de la derecha (más abajo ENI_OFICINA_OFI). De esta manera, se muestran todos...

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 EMP_NOMBRE, EMP_APELLIDO 
FROM ENI_EMPLEADOS_EMP 
WHERE EMP_TITULO = 'Administrador de RH' 

Esta consulta permite encontrar los nombres y el apellido de los empleados para los que el título es "Administrador de RH".

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 EMP_NOMBRE y EMP_TITULO de los registros de la tabla ENI_EMPLEADOS_EMP, cuyas fechas EMP_INICIO_TRABAJO están entre el 15 de marzo de 2020 y el 1 de junio de 2022.

SELECT EMP_NOMBRE, EMP_TITULO 
FROM ENI_EMPLEADOS_EMP 
WHERE EMP_INICIO_TRABAJOINICIO_TRABAJO BETWEEN #01/15/2020# AND 
#06/01/2022 

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

SELECT EMP_NOMBRE, EMP_APELLIDO  
FROM ENI_EMPLEADOS_EMP  
WHERE EMP_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 empleados por cada ubicación, o incluso el salario de los empleados.

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 empleados.

SELECT EMP_NOMBRE, Left(EMP_APELLIDO,1) As Iniciales 
FROM ENI_EMPLEADOS_EMP 

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 salarios totales para cada identificador de oficina. Los empleados sin oficina se excluirán del cálculo.

SELECT EMP_OFI_ID, SUM(EMP_SALARIO) AS Salarios_Totales 
FROM ENI_EMPLEADOS_EMP 
WHERE EMP_OFI_ID IS NOT NULL 
GROUP BY EMP_OFI_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 ubicaciones cuyo número de empleados ha sido estrictamente inferior a 10:

SELECT Count(ENI_EMPLEADOS_EMP.EMP_ID) AS NumeroEmpleados, 
ENI_OFICINA_OFI.OFI_ID  
FROM ENI_OFICINA_OFI INNER JOIN ENI_EMPLEADOS_EMP ON 
ENI_OFICINA_OFI.OFI_ID = ENI_EMPLEADOS_EMP.EMP_OFI_ID  
GROUP BY ENI_OFICINA_OFI.OFI_ID 
HAVING (((Count(ENI_EMPLEADOS_EMP.EMP_ID))>10)); 

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 empleados por orden decreciente de fecha de inicio de empleo y los nombres por orden alfabético (creciente).

SELECT EMP_NOMBRE, EMP_INICIO_TRABAJO 
FROM ENI_EMPLEADOS_EMP 
ORDER BY EMP_INICIO_TRABAJO DESC, EMP_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 empleados por fecha de inicio de trabajo:

SELECT COUNT(EMP_ID) AS Num_Empleados, EMP_INICIO_TRABAJO As 
'Fecha de incio de Trabajo' 
FROM ENI_EMPLEADOS_EMP  
GROUP BY EMP_INICIO_TRABAJO 

Observe que es posible utilizar alias con espacios, encerrándolos entre apóstrofes - incluso comillas -, y que el alias en sí mismo debe tener un apóstrofo, por lo que tiene que duplicarlo en su consulta para que sea válida.

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 ubicación:

INSERT INTO ENI_OFICINA_OFI (OFI_NOMBRE, OFI_CIUDAD) 
VALUES ('Oficinas de Valencia', 'Valencia') 

2. Adición como resultado de una consulta

En caso de que quiera insertar registros a partir de una consulta, es posible hacerlo...

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 los controles de calidad anteriores a 2020 en una tabla CONTROLES_CALIDAD ARCHIVADOS:

SELECT * INTO T_CONTROLES_CALIDAD ARCHIVADOS FROM  
ENI_CONTROLES_CALDIAD_CTL 
WHERE CTL_FECHA_CONTROL<=#01/01/2020# 

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. 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_EMPLEADOS_EMP 
SET EMP_TITULO='Director Financiero' 
WHERE EMP_ID=3 

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. 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 los controles de calidad anteriores a 2012:

DELETE * FROM CONTROLES_CALIDAD_CTL 
WHERE CTL_FECHA_CONTROL<=#01/01/2012# 

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.

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]).