Se puede decir que Microsoft Access es la herramienta más poderosa en todo el paquete de Microsoft Office, pero desconcierta (y a veces asusta) a los usuarios avanzados de Office. Con una curva de aprendizaje más pronunciada que Word o Excel, ¿cómo se supone que alguien debe entender el uso de esta herramienta? Esta semana, Bruce Epper analizará algunos de los problemas provocados por esta pregunta de uno de nuestros lectores.
Un lector pregunta:
Tengo problemas para escribir una consulta en Microsoft Access.
Tengo una base de datos con dos tablas de productos que contiene una columna común con un código de producto numérico y un nombre de producto asociado.
Quiero averiguar qué productos de la Tabla A se pueden encontrar en la Tabla B. Quiero agregar una columna llamada Resultados que contenga el nombre del producto de la Tabla A, si existe, y el nombre del producto de la Tabla B cuando no exista en la Tabla A.
¿Tienes algún consejo?
Respuesta de Bruce:
Microsoft Access es un Sistema de administración de bases de datos (DBMS) diseñado para su uso en máquinas Windows y Mac. Utiliza el motor de base de datos Jet de Microsoft para el procesamiento y almacenamiento de datos. También proporciona una interfaz gráfica para los usuarios que casi elimina la necesidad de comprender el lenguaje de consulta estructurado (SQL).
SQL es el lenguaje de comando utilizado para agregar, eliminar, actualizar y devolver información almacenada en la base de datos, así como también para modificar los componentes básicos de la base de datos, como agregar, eliminar o modificar tablas o índices.
Punto de partida
Si todavía no está familiarizado con Access u otro RDBMS, le sugiero que comience con estos recursos antes de continuar:
- Entonces, ¿qué es una base de datos? Entonces, ¿qué es una base de datos, de todos modos? [MakeUseOf Explains] Entonces, ¿qué es una base de datos? [MakeUseOf Explains] Para un programador o un entusiasta de la tecnología, el concepto de una base de datos es algo que realmente se puede dar por hecho. Sin embargo, para muchas personas el concepto de una base de datos en sí es un poco extraño .... Lea más donde Ryan Dube usa Excel para mostrar los conceptos básicos de las bases de datos relacionales.
- Una guía rápida para comenzar con Microsoft Access 2007 Una guía rápida para comenzar con Microsoft Access 2007 Una guía rápida para comenzar con Microsoft Access 2007 Lea más, que es una descripción general de alto nivel de Access y los componentes que componen una base de datos de Access.
- Un tutorial rápido para tablas en Microsoft Access 2007 Un tutorial rápido para tablas en Microsoft Access 2007 Un tutorial rápido para tablas en Microsoft Access 2007 Leer más echa un vistazo a la creación de su primera base de datos y tablas para almacenar sus datos estructurados.
- Un tutorial rápido sobre consultas en Microsoft Access 2007 Un tutorial rápido sobre consultas en Microsoft Access 2007 Un tutorial rápido sobre consultas en Microsoft Access 2007 Leer más analiza los medios para devolver partes específicas de los datos almacenados en las tablas de la base de datos.
Tener una comprensión básica de los conceptos proporcionados en estos artículos hará que lo siguiente sea un poco más fácil de digerir.
Relaciones con la base de datos y normalización
Imagine que tiene una empresa que vende 50 tipos diferentes de widgets en todo el mundo. Tiene una base de clientes de 1.250 y en un mes promedio vende 10.000 widgets a estos clientes. Actualmente está utilizando una sola hoja de cálculo para realizar un seguimiento de todas estas ventas, de hecho, una sola tabla de base de datos. Y cada año agrega miles de filas a su hoja de cálculo.
Las imágenes de arriba son parte de la hoja de cálculo de seguimiento de pedidos que está utilizando. Ahora diga que estos dos clientes compran widgets varias veces al año, por lo que tiene muchas más filas para los dos.
Si Joan Smith se casa con Ted Baines y toma su apellido, cada una de las filas que contiene su nombre ahora necesita ser cambiada. El problema se agrava si tiene dos clientes diferentes con el nombre 'Joan Smith'. Se ha vuelto mucho más difícil mantener la coherencia de los datos de ventas debido a un evento bastante común.
Al utilizar una base de datos y normalizar los datos, podemos separar los elementos en varias tablas, como inventario, clientes y pedidos.
Solo mirando la parte del cliente de nuestro ejemplo, eliminaríamos las columnas para el nombre del cliente y la dirección del cliente y los pondríamos en una nueva tabla. En la imagen de arriba, también he roto las cosas mejor para un acceso más granular a los datos. La nueva tabla también contiene una columna para una clave principal (ClientID), un número que se usará para acceder a cada fila en esta tabla.
En la tabla original donde eliminamos estos datos, agregamos una columna para una clave externa (ClientID) que es lo que vincula a la fila correcta que contiene la información para este cliente en particular.
Ahora, cuando Joan Smith cambia su nombre a Joan Baines, el cambio solo debe hacerse una vez en la tabla Cliente. Todas las demás referencias de tablas unidas extraerán el nombre correcto del cliente y un informe que analiza lo que Joan ha comprado durante los últimos 5 años obtendrá todas las órdenes bajo sus nombres de soltera y casada sin tener que cambiar la forma en que se genera el informe. .
Como beneficio adicional, esto también reduce la cantidad total de almacenamiento consumido.
Unir Tipos
SQL define cinco tipos diferentes de combinaciones: INTERIOR, IZQUIERDA EXTERIOR, DERECHA EXTERIOR, EXTERIOR COMPLETA y CRUZ. La palabra clave OUTER es opcional en la declaración de SQL.
Microsoft Access permite el uso de INTERNO (predeterminado), IZQUIERDO EXTERIOR, DERECHO EXTERIOR y CRUZ. FULL OUTER no es compatible como tal, pero al usar LEFT OUTER, UNION ALL y RIGHT OUTER, puede fingirse a costa de más ciclos de CPU y operaciones de E / S.
El resultado de una combinación CROSS contiene cada fila de la tabla izquierda emparejada con cada fila de la tabla correcta. La única vez que he visto una combinación CROSS utilizada es durante la prueba de carga de servidores de bases de datos.
Echemos un vistazo a cómo funcionan las uniones básicas, luego las modificaremos para satisfacer nuestras necesidades.
Comencemos creando dos tablas, ProdA y ProdB, con las siguientes propiedades de diseño.
El Autonumérico es un entero largo que se incrementa automáticamente y se asigna a las entradas a medida que se agregan a la tabla. La opción Texto no se modificó, por lo que aceptará una cadena de texto de hasta 255 caracteres.
Ahora, rellene con algunos datos.
Para mostrar las diferencias en cómo funcionan los 3 tipos de unión, he eliminado las entradas 1, 5 y 8 de ProdA.
A continuación, cree una nueva consulta yendo a Crear> Diseño de consulta . Seleccione ambas tablas del cuadro de diálogo Mostrar tabla y haga clic en Agregar, luego en Cerrar .
Haga clic en ProductID en la tabla ProdA, arrástrelo a ProductID en la tabla ProdB y suelte el botón del mouse para crear la relación entre las tablas.
Haga clic con el botón derecho en la línea entre las tablas que representa la relación entre los elementos y seleccione Unir propiedades .
Por defecto, se selecciona join type 1 (INNER). La opción 2 es una combinación EXTREMO IZQUIERDO y 3 es una unión DERECHA EXTERIOR.
Primero veremos la combinación INNER, por lo tanto, haga clic en Aceptar para cerrar el diálogo.
En el diseñador de consultas, seleccione los campos que queremos ver de las listas desplegables.
Cuando ejecutamos la consulta (el signo de exclamación rojo en la cinta), se mostrará el campo ProductName de ambas tablas con el valor de la tabla ProdA en la primera columna y ProdB en la segunda.
Observe que los resultados solo muestran valores donde ProductID es igual en ambas tablas. Aunque hay una entrada para ProductID = 1 en la tabla ProdB, no aparece en los resultados ya que ProductID = 1 no existe en la tabla ProdA. Lo mismo se aplica a ProductID = 11. Existe en la tabla ProdA pero no en la tabla ProdB.
Al utilizar el botón Ver en la cinta de opciones y al cambiar a Vista SQL, puede ver la consulta SQL generada por el diseñador utilizada para obtener estos resultados.
SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA INNER JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;
Volviendo a la Vista de diseño, cambie el tipo de unión a 2 (EXTERIOR IZQUIERDA). Ejecute la consulta para ver los resultados.
Como puede ver, cada entrada en la tabla ProdA está representada en los resultados, mientras que solo las de ProdB que tienen una entrada ProductID correspondiente en la tabla ProdB aparecen en los resultados.
El espacio en blanco en la columna ProdB.ProductName es un valor especial (NULL) ya que no hay un valor coincidente en la tabla ProdB. Esto será importante más adelante.
SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA LEFT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;
Pruebe lo mismo con el tercer tipo de unión (DERECHA EXTERIOR).
Los resultados muestran todo desde la tabla ProdB mientras muestra valores en blanco (conocidos como NULL) donde la tabla ProdA no tiene un valor coincidente. Hasta ahora, esto nos acerca más a los resultados deseados en la pregunta de nuestro lector.
SELECT ProdA.ProductName, ProdB.ProductName FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;
Usar funciones en una consulta
Los resultados de una función también pueden devolverse como parte de una consulta. Queremos que aparezca una nueva columna llamada 'Resultados' en nuestro conjunto de resultados. Su valor será el contenido de la columna ProductName de la tabla ProdA si ProdA tiene un valor (no es NULL); de lo contrario, debe tomarse de la tabla ProdB.
La función IF inmediata (IIF) puede usarse para generar este resultado. La función toma tres parámetros. La primera es una condición que debe evaluarse con un valor True o False. El segundo parámetro es el valor que se devolverá si la condición es True y el tercer parámetro es el valor que se devolverá si la condición es False.
La construcción de función completa para nuestra situación se ve así:
IIF(ProdA.ProductID Is Null, ProdB.ProductName, ProdA.ProductName)
Tenga en cuenta que el parámetro de condición no verifica la igualdad. Un valor nulo en una base de datos no tiene un valor que pueda compararse con ningún otro valor, incluido otro nulo. En otras palabras, Null no es igual a Null. Nunca. Para superar esto, en su lugar, verificamos el valor usando la palabra clave 'Es'.
También podríamos haber usado 'Is Not Null' y cambiar el orden de los parámetros True y False para obtener el mismo resultado.
Al poner esto en Query Designer, debe escribir toda la función en el campo: entrada. Para que cree la columna 'Resultados', debe usar un alias. Para hacerlo, inicie la función con 'Resultados:' como se ve en la siguiente captura de pantalla.
El código SQL equivalente para hacer esto sería:
SELECT ProdA.ProductName, ProdB.ProductName, IIF(ProdA.ProductID Is Null, ProdB.ProductName, ProdA.ProductName) AS Results FROM ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;
Ahora, cuando ejecutamos esta consulta, producirá estos resultados.
Aquí vemos que para cada entrada donde la tabla ProdA tiene un valor, ese valor se refleja en la columna Resultados. Si no hay una entrada en la tabla ProdA, la entrada de ProdB aparece en Resultados, que es exactamente lo que nuestro lector preguntó.
Para obtener más recursos para aprender Microsoft Access, eche un vistazo a Cómo aprender Microsoft Access de Joel Lee: 5 recursos gratuitos en línea Cómo aprender Microsoft Access: 5 recursos gratuitos en línea Cómo aprender Microsoft Access: 5 recursos gratuitos en línea ¿Tiene que administrar una gran cantidad ¿de datos? Debería mirar en Microsoft Access. Nuestros recursos de estudio gratuitos pueden ayudarlo a comenzar y aprender las habilidades para proyectos más complejos. Lee mas .