Anuncio

Microsoft Access es posiblemente la herramienta más poderosa en toda la suite 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 Veremos 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 contienen una columna común con un código de producto numérico y un nombre de producto asociado.

Quiero saber qué productos de la Tabla A se pueden encontrar en la Tabla B. Quiero agregar una columna llamada Resultados que contiene el nombre del producto de la Tabla A si existe, y el nombre del producto de la Tabla B cuando no existe 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 usuarios que casi elimina la necesidad de comprender el Lenguaje de consulta estructurado (SQL).

instagram viewer

SQL es el lenguaje de comando utilizado para agregar, eliminar, actualizar y devolver información almacenada en el base de datos, así como modificar los componentes principales de la base de datos, como agregar, eliminar o modificar tablas o índices.

Punto de partida

Si aún 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 explica]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 sentado. Sin embargo, para muchas personas, el concepto de una base de datos en sí es un poco extraño ... Lee mas 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 Lee mas que es una descripción general de alto nivel de Access y los componentes que comprenden una base de datos de Access.
  • Un tutorial rápido sobre tablas en Microsoft Access 2007 Un tutorial rápido sobre tablas en Microsoft Access 2007 Lee mas 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 Lee mas examina 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 de base de datos y normalización

Imagine que dirige una compañía 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 rastrear todas estas ventas, efectivamente una sola tabla de base de datos. Y cada año agrega miles de filas a su hoja de cálculo.

mesa-plana-1mesa-plana-2

Las imágenes anteriores son parte de la hoja de cálculo de seguimiento de pedidos que está utilizando. Ahora, digamos que ambos clientes le compran widgets varias veces al año para que tenga muchas más filas para ambos.

Si Joan Smith se casa con Ted Baines y toma su apellido, cada fila que contiene su nombre ahora debe cambiarse. El problema se agrava si tiene dos clientes diferentes con el nombre "Joan Smith". Se ha vuelto mucho más difícil mantener consistentes sus datos de ventas debido a un evento bastante común.

Al usar una base de datos y normalizar los datos, podemos separar los artículos en varias tablas, como inventario, clientes y pedidos.

normalización

Simplemente mirando la parte del cliente de nuestro ejemplo, eliminaríamos las columnas para Nombre del cliente y Dirección del cliente y las pondríamos en una nueva tabla. En la imagen de arriba, también he desglosado mejor para un acceso más granular a los datos. La nueva tabla también contiene una columna para una Clave primaria (ClientID), un número que se utilizará para acceder a cada fila de esta tabla.

En la tabla original donde eliminamos estos datos, agregaríamos una columna para una Clave externa (ClientID) que es lo que enlaza con la fila adecuada 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. Cualquier otra referencia de tablas unidas obtendrá el nombre del cliente adecuado y un informe que analiza lo que Joan ha comprado para los últimos 5 años recibirán todas las órdenes bajo sus nombres de soltera y casada sin tener que cambiar la forma en que se presenta el informe generado.

Como beneficio adicional, esto también reduce la cantidad total de almacenamiento consumido.

Unir tipos

SQL define cinco tipos diferentes de combinaciones: INTERIOR, EXTERIOR IZQUIERDA, EXTERIOR DERECHA, EXTERIOR COMPLETA y CRUZ. La palabra clave OUTER es opcional en la instrucción SQL.

Microsoft Access permite el uso de INNER (predeterminado), LEFT OUTER, RIGHT OUTER y CROSS. FULL OUTER no es compatible como tal, pero al usar LEFT OUTER, UNION ALL y RIGHT OUTER, se puede falsificar a costa de más ciclos de CPU y operaciones de E / S.

La salida de una unión CROSS contiene cada fila de la tabla izquierda emparejada con cada fila de la tabla derecha. La única vez que he visto una unió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.

acceso-tabla-defs

El AutoNumber es un entero largo de incremento automático asignado 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 de longitud.

Ahora, complételos con algunos datos.

tablas de acceso

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, entonces Cerca.

nueva consulta

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.

vista de diseño

Haga clic derecho en la línea entre las tablas que representan la relación entre los elementos y seleccione Propiedades de unión.

unirse_propiedades

De forma predeterminada, se selecciona el tipo de unión 1 (INTERIOR). La opción 2 es una combinación EXTERIOR IZQUIERDA y 3 es una combinación EXTERIOR DERECHA.

Primero veremos la unión interna, así que haga clic en Aceptar para cerrar el cuadro de diálogo.

En el diseñador de consultas, seleccione los campos que queremos ver en las listas desplegables.

design-view-2

Cuando ejecutamos la consulta (el signo de exclamación rojo en la cinta), mostrará el campo ProductName de ambas tablas con el valor de la tabla ProdA en la primera columna y ProdB en la segunda.

unir internamente

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.

cinta de diseño

Al usar el botón Ver en la cinta de opciones y cambiar a Vista SQL, puede ver la consulta SQL generada por el diseñador utilizado para obtener estos resultados.

SELECCIONE ProdA.ProductName, ProdB.ProductName DESDE ProdA INNER ÚNASE ProdB EN ProdA.ProductID = ProdB.ProductID;

Volviendo a la Vista de diseño, cambie el tipo de unión a 2 (IZQUIERDA EXTERIOR). Ejecute la consulta para ver los resultados.

izquierda combinación externa

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 coincidente en la tabla ProdB se muestran 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 tarde.

SELECCIONE ProdA.ProductName, ProdB.ProductName DESDE ProdA IZQUIERDA ÚNASE ProdB EN ProdA.ProductID = ProdB.ProductID;

Pruebe lo mismo con el tercer tipo de unión (DERECHA EXTERIOR).

right_outer_join

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.

SELECCIONE ProdA.ProductName, ProdB.ProductName DESDE ProdA DERECHA ÚNASE ProdB EN 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 denominada "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) se puede utilizar para generar este resultado. La función toma tres parámetros. La primera es una condición que debe evaluar a un valor Verdadero o Falso. 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 la función completa para nuestra situación se ve así:

IIF (ProdA.ProductID es nulo, ProdB.ProductName, ProdA.ProductName)

Observe que el parámetro de condición no verifica la igualdad. Un valor nulo en una base de datos no tiene un valor que se pueda comparar con ningún otro valor, incluido otro nulo. En otras palabras, Nulo no es igual a Nulo. Siempre. Para superar esto, verificamos el valor utilizando la palabra clave "Es".

También podríamos haber usado "No es nulo" y haber cambiado el orden de los parámetros Verdadero y Falso para obtener el mismo resultado.

Al poner esto en el Diseñador de consultas, debe escribir toda la función en el campo: entrada. Para que cree la columna "Resultados", debe usar un alias. Para hacer esto, introduzca la función con "Resultados:" como se ve en la siguiente captura de pantalla.

diseño de resultados con alias externo derecho

El código SQL equivalente para hacer esto sería:

SELECCIONE ProdA.ProductName, ProdB.ProductName, IIF (ProdA.ProductID Is Null, ProdB.ProductName, ProdA.ProductName) COMO RESULTADOS DE ProdA RIGHT JOIN ProdB ON ProdA.ProductID = ProdB.ProductID;

Ahora, cuando ejecutamos esta consulta, producirá estos resultados.

right_outer_with_aliased_results

Aquí vemos 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 preguntó nuestro lector.

Para obtener más recursos para aprender Microsoft Access, echa un vistazo a Joel Lee 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ías buscar en Microsoft Access. Nuestros recursos de estudio gratuitos pueden ayudarlo a comenzar y aprender las habilidades para proyectos más complejos. Lee mas .

Bruce ha estado jugando con la electrónica desde los años 70, las computadoras desde principios de los 80 y respondiendo con precisión preguntas sobre tecnología que no ha usado ni visto en todo momento. También se molesta al intentar tocar la guitarra.