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. Si no se utiliza ninguna de las dos palabras clave, se mostrarán datos repetidos.
Cuando se desea extraer datos de las tablas, es necesario simplemente listar los campos que se han de extraer.
SELECT Nombre, Apellido, Fecha_Nacimiento
FROM T_Becarios
Los campos Nombre, Apellido y Fecha_Nacimiento, de la tabla T_Becarios, 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 Nombre, Apellido, Empresa
FROM T_Becarios, T_Empresas
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 Nombre, Apellido, Empresa
FROM T_Becarios INNER JOIN T_Empresas
ON T_Becarios.ID_Empresa = T_Empresas.ID_Empresa
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 T_Becarios), incluso si no hay correspondencia en la tabla de la derecha (más abajo T_Empresas). De esta manera, se muestran todos los nombres y apellidos de becarios, incluso si no trabajan para ninguna empresa (caso de los jubilados, estudiantes y parados, por ejemplo).
SELECT Nombre, Apellido, Empresa
FROM T_Becarios LEFT JOIN T_Empresas
ON T_Becarios.ID_Empresa = T_Empresas.ID_Empresa
c. Join externo RIGHT JOIN...
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 Nombre, Apellido
FROM T_Becarios
WHERE Titulo = 'M.'
Esta consulta permite encontrar los nombres y los apellidos de los becarios, cuyo título es ’Sr.’ (señor).
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 For_Tipo y For_Fecha de los registros de la tabla T_Formaciones, cuyas fechas For_Fecha están entre el 1 de enero de 2016 y el 1 de junio de 2016.
SELECT For_Tipo, For_Fecha
FROM T_Formaciones
WHERE For_Fecha BETWEEN #01/01/2016# AND #06/01/2016#
La siguiente consulta muestra los nombres y apellidos de los registros de la tabla T_Becarios cuyo Nombre empieza por A.
SELECT Nombre, Apellido
FROM T_Becarios
WHERE Nombre LIKE 'A*'
La siguiente consulta muestra los tipos y fecha de las formaciones, para los que el número máximo...
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 becarios por formación, o incluso el precio total que debe pagar una empresa por sus becarios.
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 becarios.
SELECT Nombre, Left(Apellido,1) As Iniciales
FROM T_Becarios
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 contar el número de formaciones por tipo de formación.
SELECT For_Tipo, COUNT(For_Tipo) AS Nb_Formacion
FROM T_Formaciones
GROUP BY For_Tipo
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 formaciones cuyo número de participantes ha sido estrictamente superior a 5:
SELECT COUNT(ID_Becario), For_Tipo, For_Fecha
FROM T_Becarios_Formaciones INNER JOIN T_Formaciones
ON T_Becarios_Formaciones.ID_Formacion = T_Formaciones.FOR_ID
GROUP BY For_Tipo, For_Fecha
HAVING COUNT(ID_Becario) > 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 las formaciones por orden de fechas decrecientes y los tipos por orden alfabético (creciente).
SELECT For_Tipo, For_Fecha
FROM T_Formaciones
ORDER BY For_Fecha DESC, For_Tipo 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 formaciones por fecha:
SELECT COUNT(For_Fecha) AS Num_Formacion, For_Fecha As Fecha_Formacion
FROM T_Formaciones
GROUP BY For_Fecha
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 formación:
INSERT INTO T_Formaciones (For_Tipo, For_Fecha, For_Lugar, For_Duracion)
VALUES ('VBA para Access 2016', #10/01/2016#, 'Sevilla' , 2)
2. Adición como resultado de una consulta
En caso de que quiera insertar registros a partir...
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 peticiones anteriores a 2010 en una tabla T_Peticiones_Archivadas:
SELECT * INTO T_Peticiones_Archivadas FROM T_Peticiones
WHERE Pet_Fecha<=#01/01/2010#
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 2016. También se trata de una consulta de tipo Acción. La sintaxis general de este comando es la siguiente:
UPDATE Tabla_MAY
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 T_Formaciones
SET For_Lugar='Madrid'
WHERE For_Tipo ='VBA para Access 2016' AND For_Fecha=#10/01/2016#
Esta consulta actualiza el lugar de la formación VBA para Access 2016, del día 1 de octubre del 2016 (antiguo lugar Sevilla, nuevo lugar Madrid).
El comando DELETE
El comando DELETE permite eliminar registros. Corresponde al tipo de consulta Eliminación de Access 2016. 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 peticiones anteriores a 2010:
DELETE * FROM T_Peticiones
WHERE Pet_Fecha<=#01/01/2010#
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 2016.
1. Consulta de análisis cruzado
La consulta TRANSFORM crear una consulta de análisis cruzado. Se utiliza en el asistente de creación de la consulta.
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]).