Story Transcript
CONTENIDO INTRODUCCIÓN A ACCESS INTRODUCCIÓN A ACCESS Access es un programa comercial de la empresa Microsoft Corporation. Se trata de un sistema gestor de bases de datos diseñado para ser utilizado en computadoras personales tipo PC. Aunque no está considerado como un sistema serio, lo cierto es que permite realizar las mismas tareas que los tradicionalmente considerados sistemas serios, como puede ser Oracle. A diferencia de éste, Access puede funcionar en sistemas de bajo coste, y es mucho más asequible. Además, dispone de un entorno muy amigable (al estilo Windows 95). Tanto es así que los fabricantes de los sistemas serios, incluido Oracle, tienden a hacer que sus productos se parezcan, en cuanto a interfaz de usuario se refiere, a lo que el usuario pide, que no es otra cosa que el entorno visual. La instalación completa de Access proporciona una serie de herramientas que facilitan la creación y administración de una base de datos. ¿Qué es una base de datos para Access? En Access una base de datos es un archivo que contiene datos (estructurados e interrelacionados) y los objetos que definen y manejan esos datos: tablas, consultas, formularios, informes, macros y módulos. Además, se pueden definir estrategias de seguridad y de integridad. Pueden coexistir en un disco varias bases de datos, en varios ficheros, absolutamente independientes entre sí (aunque es posible referenciar desde una base de datos objetos presentes en otras bases de datos, es decir, en otros ficheros). Los objetos que componen una base de datos son: • Tablas: son los almacenes de datos. Se trata de listas de registros. El diseño de tablas consiste en la definición de los campos necesarios para almacenar correctamente la información de la base de datos. • Consultas: operaciones que pueden realizase sobre los datos de las tablas: limitaciones de acceso, selección de datos, inserción, modificación y borrado, cálculos... • Formularios: pantallas que se presentan a los usuarios de una base de datos para que tengan un acceso amigable a los datos y operaciones. • Informes: formatos de presentación de los datos para generar copias impresas de la información registrada en la base de datos. • Macros y módulos: segmentos de código en lenguaje de alto nivel (Access Basic, Visual Basic, lenguaje de macros,...) que permiten realizar operaciones complejas con los datos y objetos de la base de datos. Los objetos en Access deben estar identificados mediante un nombre. Referencias posteriores a esos objetos se harán a través de su nombre identificativo. Creación de una base de datos Vamos a comenzar a trabajar con Access. El primer paso va a ser crear una base de datos vacía. No se trata de 1
un fichero vacío: al crear una base de datos vacía se almacenan en ella algunos datos administrativos y objetos del sistema, inicialmente ocultos al usuario y programador. Por tanto, antes de tener acceso a una base de datos vacía, debemos elegir un nombre de fichero para almacenarla en disco. Para crear una base de datos, abra Access, pulse Archivo, Nueva Base de Datos, y obtendrá el cuadro de diálogo que le pedirá el nombre del fichero donde se almacenará la base de datos.
Una vez introducido el nombre, pulsamos el botón Aceptar y se creará una base de datos vacía como la de la siguiente figura:
El fichero de una base de datos Access tiene extensión MDB (Microsoft Data Base). Además de este fichero, puede existir un fichero con extensión LDB. Este fichero permite el acceso seguro de múltiples usuarios de forma concurrente. El fichero de la base de datos permanece abierto mientras se trabaja con los datos, y únicamente se cierra cuando se cierra la base de datos de forma explícita, con la opción correspondiente. Si por cualquier problema, no se realiza un cierre ordenado, la base de datos puede dañarse. Cuando queramos volver a trabajar con una base de datos, lo único que hay que hacer es abrir de nuevo el fichero correspondiente, como si se tratara de un documento de un procesador de texto. TABLAS En este apartado vamos a estudiar la forma de definir tablas y trabajar con ellas. Las tablas son las estructuras que permiten almacenar los datos de la base de datos.
2
Una tabla es un conjunto de registros. En este sentido podemos considerarla como un fichero que contiene registros, tantos como se quiera. Cada registro estará compuesto por una colección de campos. Cada campo tendrá un tipo que indica la clase de datos que puede almacenar. Y cada tipo tendrá unos atributos de tipo que limitan los valores permitidos, así como una serie de restricciones y normas. Antes de crear la base de datos hemos de pensar detenidamente en la información que queremos guardar y en todas las características que tendrán. Por ejemplo, queremos almacenar información sobre los alumnos matriculados en una cierta asignatura. Podemos crear una tabla que puede denominarse Alumnos y deseamos que contenga la siguiente información: • Nombre y los apellidos del alumno • La edad del alumno. Normalmente comprendida entre 18 y 65 años • Las notas obtenidas en los dos parciales y en las prácticas • El DNI para comprobar que se trata del alumno cuando vayamos a examinarlo • La nota media del alumno en la asignatura El conjunto de esta información para cada alumno se denomina registro. La tabla estará compuesta de una serie de registros (tantos como alumnos tengamos en la asignatura). Llamamos campo a cada pieza particular de información que forma el registro (el nombre es un campo, también lo es el DNI, la edad, etc.). La tabla que queremos hacer estará, en definitiva compuesta por los siguientes campos: Campo NIF Nombre Apellido1 Apellido2 Edad Parcial1 Parcial2 Prácticas
Descripción NIF Nombre completo Primer apellido Segundo apellido Edad Nota obtenida en el primer parcial Nota obtenida en el segundo parcial Nota obtenida en las prácticas
Obsérvese que no se ha definido un campo NotaMedia para almacenar la nota final de la asignatura, quizá la más importante. Esto es debido a que es posible calcularla de alguna manera a través del resto de campos del registro. En una tabla no debe almacenarse información no necesaria. Además, si se almacenara, habría que recalcularla cada vez que se modificara alguno de los campos de los que depende, lo cual representa una fuente de inconsistencia. La forma adecuada de obtener la nota media es a través de consultas, que estudiaremos más adelante. Creación de tablas Una vez decididos los campos que necesitamos almacenar en la tabla, pasaremos a crear la tabla. Para ello pulsamos el botón Nuevo de la ventana de la base de datos. Se abrirá un cuadro de diálogo con varias opciones para crear la tabla. Debemos seleccionar Vista de diseño y pulsar Aceptar.
3
Access nos mostrará un formulario para la definición de los campos. Esta ventana se denomina de diseño de tabla frente a la de vista de tabla que permitirá más adelante introducir los datos.
Para cada campo que definamos debemos asignarle un nombre y un tipo. Además, para cada tipo existen una serie de atributos de tipo que permiten describir con precisión los valores aceptados por el campo. Los tipos disponibles son los siguientes: • Texto: Una cadena de caracteres (letras y números) de longitud limitada. La longitud máxima se define como uno de los atributos, y no puede ser mayor de 255 caracteres. Un atributo importante del tipo texto es si se permite la longitud cero (cadena vacía, existe pero no contiene nada). Por ejemplo: Nombres, Apellidos, Ciudades, NIF, etc. • Memo: Una cadena de caracteres de longitud ilimitada. Tiene como desventaja respecto al tipo Texto que no permite algunas operaciones, como la ordenación. Se utiliza para escribir resúmenes, descripciones, etc. • Numérico: Un número. Existen diversos tamaños y precisiones: Byte, Entero, Entero largo, real de precisión simple, real de precisión doble, identificador global. Dentro de cada uno de estos subtipos se pueden definir atributos de rango y precisión decimal (el número de caracteres decimales permitidos). 4
Por ejemplo: Nota primer parcial, nota media, número de la calle donde vivimos, etc. Podemos definir la nota media como un real con una precisión decimal de 1 (6,5). • Fecha/hora: Fecha, hora o ambos a la vez. Existen diversos formatos de fecha y hora que pueden ser definidos como atributo. Por ejemplo: Viernes, 5−Abril−1968, 5/4/1968; 05:35:00PM, 5:35. • Moneda: Un número con formato monetario. Se trata de un valor numérico real con formato especializado para la manipulación de valores monetarios: abreviatura de la moneda local, separación con puntos y comas al estilo local, ... Por ejemplo: pta, $. • Autonumérico: Un contador autoincrementado. Se trata de un valor numérico que el sistema genera automáticamente para cada registro de manera que nunca existirán dos registros en la misma tabla con el mismo valor en el campo autonumérico. Por ejemplo: en la tabla de alumnos, si no tuviéramos el NIF que nos identifica a cada alumno de forma única, pondríamos un autonumérico para identificarlos. • Si/no: Un valor lógico. Por ejemplo: un campo que se llame BECA podría contener valores Sí (tiene beca) o No (no tiene beca). • Objeto OLE: Un objeto de otra aplicación, incluido en la base de datos: sonido, imagen, vídeo, gráfico... • Hipervínculo: Una referencia a un documento de Internet. Cada uno de estos tipos dispone de atributos propios, por ejemplo, la precisión decimal y el rango de valores en los campos numéricos, frente a la longitud de cadena de los campos de tipo texto. Pero además existen una serie de atributos comunes, que se describen a continuación: • Formato: define mediante una expresión el formato de los datos almacenados. Por ejemplo en campos numéricos define si se utilizan separadores de miles (1000 ó 1.000), o si el valor de interpreta como un porcentaje (%), en campos de texto puede forzar a que los caracteres se almacenen en mayúsculas, en campos lógicos si se utiliza SI/NO o VERDADERO/FALSO, etc. En todos los casos existen varios formatos predefinidos de uso habitual, además, si el formato deseado no coincide con ninguno de los predefinidos, es posible especificar un formato personalizado mediante el uso de una serie de símbolos. Las siguientes tablas muestran los identificadores de formatos predefinidos y los símbolos empleados en campos de distintos tipos. A continuación se muestran algunos de estos formatos estándar y los símbolos para crear nuevos formatos: Campos de tipo fecha/hora: Valor Fecha general
Fecha larga Fecha mediana Fecha corta
Descripción (Predeterminado) Si el valor es sólo una fecha, no se muestra ninguna hora, si el valor es sólo una hora, no se muestra ninguna fecha. Este valor es una combinación de los valores de Fecha corta y Hora larga. Ejemplos: 3/4/93, 05:34:00 PM y 3/4/93 05:34:00 PM. Igual que el valor de Fecha larga del cuadro de diálogo Propiedades de Configuración regional del Panel de control de Windows. Ejemplo: Sábado, 3 de Abril de 1993. Ejemplo: 3−Abr−93. Igual que el valor de Fecha corta del cuadro de diálogo Propiedades de Configuración regional del Panel de control de Windows. Ejemplo: 3/4/93. Atención: El formato 5
Hora larga Hora mediana Hora corta Símbolo : (dos puntos) / c d dd ddd dddd ddddd dddddd s ss m mm mmm mmmm t a aa aaaa h hh n nn s ss ttttt AM/PM am/pm A/P a/p AMPM
Fecha corta asume que las fechas comprendidas entre el 1/1/00 y el 31/12/29 son fechas del siglo XXI (es decir, que los años están entre el 2000 y el 2029). Las fechas comprendidas entre el 1/1/30 y el 31/12/99 se asume que son fechas del siglo XX (es decir, que los años están entre 1930 y 1999). Igual que el valor de la ficha Hora del cuadro de diálogo Propiedades de Configuración regional del Panel de control de Windows. Ejemplo: 5:34:23 PM. Ejemplo: 5:34 PM. Ejemplo: 17:34. Descripción Separador de hora. Los separadores se establecen en el cuadro de diálogo Propiedades de Configuración regional del Panel de control de Windows. Separador de fecha. Igual que el formato predefinido Fecha general. Día del mes en uno o dos dígitos numéricos, según sea necesario (1 a 31). Día del mes en dos dígitos numéricos (01 a 31). Tres primeras letras del día de la semana (Lun a Dom) Nombre completo del día de la semana (Lunes a Domingo). Igual que el formato predefinido Hora corta. Igual que el formato predefinido Fecha larga. Día de la semana (1 a 7). Semana del año (1 a 53). Mes del año en uno o dos dígitos numéricos, según sea necesario (1 a 12). Mes del año en dos dígitos numéricos (01 a 12). Tres primeras letras del mes (Ene a Dic). Nombre completo del mes (Enero a Diciembre). Fecha mostrada como trimestre del año (1 a 4). Número de día del año (1 a 366). Dos últimos dígitos del año (01 a 99). Año completo (0100 a 9999). Hora en uno o dos dígitos, según sea necesario (0 a 23). Hora en dos dígitos (00 a 23). Minuto en uno o dos dígitos, según sea necesario (0 a 59). Minuto en dos dígitos (00 a 59). Segundo en uno o dos dígitos, según sea necesario (0 a 59). Segundo en dos dígitos (00 a 59). Igual que el formato predefinido Hora larga. Reloj de 12 horas con las letras mayúsculas "AM" o "PM", según sea apropiado. Reloj de doce horas con las letras minúsculas "am" o "pm", según sea apropiado. Reloj de doce horas con la letra mayúscula "A" o "P", según sea apropiado. Reloj de doce horas con la letra minúscula "a" o "p", según sea apropiado. Reloj de doce horas con el indicador de mañana/tarde apropiado establecido en el cuadro de diálogo Propiedades de Configuración regional del Panel de control de Windows.
6
Campos de tipo numérico y moneda: Valor Número general Moneda Fijo Estándar Porcentaje Científico
Descripción (Predeterminado) Muestra el número tal como se introduce. Utiliza el separador de miles, muestra los números negativos entre paréntesis, el valor predeterminado de la propiedad Lugares Decimales es 2. Muestra al menos un dígito, el valor predeterminado de la propiedad Lugares Decimales es 2. Utiliza el separador de miles, el valor predeterminado de la propiedad Lugares Decimales es 2. Multiplica el valor por 100 y anexa un signo de porcentaje, el valor predeterminado de la propiedad Lugares Decimales es 2. Utiliza la notación científica estándar.
Los formatos numéricos personalizados pueden tener entre una y cuatro secciones con signos de punto y coma (;) como separador de lista. Cada sección contiene la especificación de formato para un tipo de número diferente: • El formato para los números positivos. • El formato para los números negativos. • El formato para los valores cero. • El formato para los valores nulos. Por ejemplo, el siguiente formato Moneda personalizado contiene cuatro secciones separadas por signos de punto y coma y utiliza un formato diferente para cada sección: $#.##0,00[Verde];($#.##0,00)[Rojo];"Cero";"Null" Si se utilizan varias secciones pero no se especifica un formato para cada sección, las entradas para las que no hay ningún formato no mostrarán nada o tomarán como valor predeterminado el formato de la primera sección. Símbolo , (coma) . (punto) 0 # $ % E− o e−
E+ o e+
Descripción Separador decimal. Los separadores se establecen haciendo doble clic en Configuración regional en el Panel de control de Windows. Separador de miles. Marcador de posición de dígitos. Muestra un dígito ó 0. Marcador de posición de dígitos. Muestra un dígito o nada. Muestra el carácter literal "$". Porcentaje. El valor se multiplica por 100 y se le anexa un signo de porcentaje. Notación científica con un signo menos (−) junto a los exponentes negativos y nada junto a los exponentes positivos. Este símbolo debe utilizarse con otros símbolos, como en el ejemplo 0,00E−00 o 0,00E00. Notación científica con un signo menos junto a los exponentes negativos y un signo más (+) junto a los exponentes positivos. Este símbolo debe utilizarse con otros símbolos, como en el ejemplo 0,00E+00.
Campos de tipo texto y memo:
7
Símbolo @ & < >
Descripción Se necesita un carácter de texto (ya sea un carácter o un espacio). No se necesita un carácter de texto. Convertir todos los caracteres a minúsculas. Convertir todos los caracteres a mayúsculas.
Los formatos personalizados para los campos Texto y Memo pueden tener hasta dos secciones: la primera contiene el formato para los campos con texto y la segunda el formato para los campos con cadenas de longitud cero y valores nulos. Por ejemplo, para obtener que aparezca la palabra "Ninguno" cuando no exista ninguna cadena en el campo, puede utilizarse el formato personalizado @;"Ninguno". Campos de tipo sí/no: En las últimas versiones de Access, los campos lógicos se muestran al usuario de forma gráfica como una casilla de verificación, aunque también puede mostrarse como un texto. En el primer caso, cualquier formato especificado es ignorado. Los formatos predefinidos son Sí/No, Verdadero/Falso y Activado/Desactivado. Sí, Verdadero y Activado son equivalentes entre sí, al igual que lo son No, Falso y Desactivado. Si se especifica un formato predefinido y, al editar los datos, se introduce un valor equivalente, se mostrará el formato predefinido del valor equivalente. Para formatos personalizados se pueden utilizar expresiones que contengan hasta tres secciones: • Esta sección no tiene ningún efecto en el tipo de datos Sí/No. No obstante, se requiere un signo de punto y coma (;) como marcador de posición. • El texto para mostrar en lugar de los valores Sí, Verdadero o Activado. • El texto para mostrar en lugar de los valores No, Falso o Desactivado. • Máscara de entrada: Fuerza a que los datos se introduzcan en un formato adecuado. Por ejemplo para un teléfono se puede ser interesante mostrar algo como (__) ___−__−__, de manera que no pueda introducir caracteres extraños. La máscara de entrada es un conjunto de tres datos que definen los caracteres admitidos, el formato presentado y el formato almacenado. El atributo Formato prevalece sobre la máscara de entrada, de manera que, al editar los datos del campo, una vez introducidos siguiendo una determinada máscara, el contenido del campo se mostrará con el aspecto definido en el Formato y no con el de la máscara. La expresión para el formato de máscara de entrada puede contener hasta tres secciones separadas por signos de punto y coma (;): • Especifica la máscara de entrada propiamente dicha, por ejemplo, !(999) 999−9999. Los caracteres que se pueden utilizar para definir la máscara de entrada se muestran más adelante. • Especifica si Access almacena los caracteres de visualización literales en la tabla al introducir datos. Si se utiliza 0 para esta sección, todos los caracteres de visualización literales (por ejemplo, el paréntesis de una máscara de entrada de un número de teléfono) se almacenan con el valor; si se introduce 1 o se deja esta sección en blanco, sólo se almacenan los caracteres introducidos en el control. • Especifica el carácter que Access muestra para el espacio en el que el usuario debe escribir un carácter en la máscara de entrada. Para esta sección puede utilizar cualquier carácter. Por ejemplo para mostrar un 8
asterisco, se escribe entre comillas ("*"). Se pueden definir máscaras de entrada mediante los siguientes caracteres: Carácter Descripción 0 Dígito (0 a 9, entrada obligatoria, signos más [+] y menos [−] no permitidos). 9 Dígito o espacio (entrada no obligatoria, signos más y menos no permitidos). Dígito o espacio (entrada no obligatoria; los espacios se muestran en blanco en el modo # Edición, pero se eliminan cuando se guardan los datos, signos más y menos permitidos). L Letra (A a Z, entrada obligatoria). ? Letra (A a Z, entrada opcional). A Letra o dígito (entrada obligatoria). a Letra o dígito (entrada opcional). & Cualquier carácter o un espacio (entrada obligatoria). C Cualquier carácter o un espacio (entrada opcional). Marcador de posición decimal y separadores de miles, hora y fecha (el carácter depende del .,:;−/ valor del cuadro de diálogo Propiedades de Configuración regional en el Panel de control de Windows). < Hace que todos los caracteres se conviertan a minúsculas. > Hace que todos los caracteres se conviertan a mayúsculas. Hace que la máscara de entrada se muestre de derecha a izquierda, en lugar de mostrarse de izquierda a derecha. Los caracteres introducidos en la máscara siempre se rellenan de ! izquierda a derecha. Puede incluir el signo de exclamación en cualquier lugar de la máscara de entrada. Hace que el carácter siguiente se muestre como un carácter literal (por ejemplo, \A se \ muestra sólo como A). Existe una máscara predeterminada: "Contraseña". Crea un control de entrada de contraseña, de manera que cualquier carácter introducido se almacena como el carácter pero se muestra como un asterisco (*). • Título: Es el título de la columna que aparecerá en el modo de ver datos (al editar los datos almacenados) para el campo. • Valor predeterminado: Un valor que automáticamente introducirá Access en el campo si el usuario no indica otro. • Regla de validación: Una condición que debe cumplir el dato introducido para que sea aceptado. Por ejemplo, para un campo Edad se puede forzar a que el valor introducido esté comprendido entre 18 y 65 años con una expresión como >=18 AND <=65. • Texto de validación: Un mensaje que Access mostrará al usuario cuando intente introducir un valor no permitido por una regla de validación. Para el ejemplo anterior podría ser algo como La edad debe estar comprendida entre 18 y 65 años.. • Requerido: Indica si el campo debe tener algún valor o se permite dejarlo en blanco. Por defecto un campo no contiene ningún valor. No hay que confundir un campo vacío con un campo de texto de longitud cero. De ahí la importancia del atributo de permitir longitud cero de los campos de tipo texto.
9
• Indexado: Establece si sobre el campo debe construirse un índice. Un índice es una estructura manejada por Access que hace que determinadas operaciones con el campo sean más rápidas (ordenaciones y búsquedas), a costa de un mayor espacio en disco y memoria (para almacenar el índice) y de que otras operaciones sean más lentas y costosas (inserciones y borrados). Existen dos formas de hacer índices: con y sin duplicados; esto permite configurar la posibilidad o no de que se repitan valores a lo largo de la tabla para un campo. Clave principal En toda tabla suele existir una clave principal (también llamada clave primaria o clave maestra). Una clave principal es un campo o conjunto de campos cuyos valores no se repiten, y a través de los cuales se identifica de forma única al registro completo. Es decir, no hay dos registros en una tabla con la misma clave. En el ejemplo de los alumnos, el campo NIF puede ser una clave principal, ya que no habrá dos alumnos con el mismo NIF, y además es posible identificar a un alumno a través de su NIF. El campo apellido1 no puede ser clave principal porque puede haber más de un alumno con el primer apellido igual. El conjunto formado por (apellido1, apellido2, nombre) podría constituir una clave principal (suponiendo que no existen dos personas que se llamen exactamente igual), ya que a través del conjunto podemos identificar de forma única e inequívoca al registro (al alumno). Si no tenemos ningún campo o conjunto de campos candidato a clave principal, antes de terminar el diseño, Access nos permitirá añadir un campo nuevo que sirva como clave. Este campo se denominará id y será de tipo autonumérico. Por lo general, si en una tabla no podemos encontrar un campo o conjunto de campos para establecerlos como clave principal, lo más probable es que el diseño de la tabla no sea apropiado, y quizá deberíamos volver a plantearnos la estructura de tablas que necesita nuestra base de datos. Sobre un campo que se emplee como clave principal, forzosamente se genera un índice sin duplicados, y no se admitirán valores nulos para el campo. Para definir un campo/s como clave principal, seleccione el campo que desea que sea clave y pulse el botón . Vamos a ir introduciendo los campos de la tabla del ejemplo para ver estas definiciones. Para introducir los datos, pulse con el ratón en la hoja de diseño y vaya rellenando los campos según el siguiente cuadro: Campo NIF Nombre Apellido1 Apellido2
Tipo Texto (9) Texto (40) Texto (25) Texto (25)
Descripción NIF Nombre completo Primer apellido Segundo apellido
Edad
Numérico
Edad
Parcial1 Parcial2 Prácticas
Numérico Numérico Numérico
Nota primer parcial Nota segundo parcial Nota prácticas
Otros atributos Requerido; indexado sin repetición; clave principal. Requerido Requerido Requerido >=18 AND <65; Texto de validación: la edad debe estar comprendida entre 18 y 65 años 1 decimal; predeterminado 0; >=0 AND <=10; 1 decimal; predeterminado 0; >=0 AND <=10; 1 decimal; predeterminado 0; >=0 AND <=2;
Obteniendo la siguiente definición de tabla:
10
Después de introducir todos los campos y definir sus tipos y atributos, podremos pasar a utilizar la tabla, introduciendo, modificando y utilizando los datos que puede almacenar. Antes, debemos guardar la definición de la tabla. Para ello pulse en el menú principal, Archivo y Guardar, e introduzca el nombre de la tabla en el cuadro de diálogo que aparece. Podremos volver a modificar la estructura de la tabla siempre que queramos. Si ya hay datos introducidos en la tabla, Access no permitirá modificar la definición de la tabla, o impondrá restricciones, en el caso de que los cambios produzcan conflictos entre las nuevas definiciones y los datos ya almacenados (por ejemplo si intentamos cambiar el tipo de un campo de texto a tipo numérico y existen registros almacenando cadenas no numéricas). Introducción de datos Para introducir datos en una tabla la forma más cómoda es utilizar un formulario, pero por el momento lo haremos de una forma más directa, con el modo Ver Datos. Para entrar en este modo, seleccione en la ventana de tablas la tabla que hemos creado y pulse el botón Abrir. El modo de ver datos de una tabla presenta una tabla formada por filas y columnas. Una fila corresponde a un registro y cada columna a un campo. Inicialmente la tabla estará vacía. Al final de la tabla siempre aparece una fila en blanco, destinada a la inserción de nuevos registros. Parte de los campos de esta fila pueden aparecer rellenos con los valores por defecto programados en la definición de la tabla. En cualquier caso la modificación de cualquier campo de esta fila hará que automáticamente aparezca una nueva.
11
Los cambios en los registros se almacenan en disco automáticamente, sin que sea necesario guardarlos explícitamente. Los cambios que se realizan en los campos de un registro no se almacenan hasta que se abandona el registro, es decir, hasta que se comienza a editar otro registro o se cierra la tabla. Así, podemos cancelar los cambios hechos en un registro siempre y cuando no hayamos cambiado de registro. Basta con pulsar la tecla de escape. Una pulsación hará que se cancele la modificación en el campo actual (si la hay) al valor anterior. Entonces, una segunda pulsación recuperará el registro completo (si no se ha modificado el campo actual, bastará con una pulsación para recuperar el registro completo). Antes de abandonar un campo, se verifican las reglas de validación de ese campo, de manera que no se acepta el cambio hasta que todas las reglas asociadas al campo se cumplan. Además, antes de abandonar un registro se comprobarán las reglas asociadas al registro, y no se hará la escritura en disco mientras no se cumpla alguna. En nuestro ejemplo, tendríamos la siguiente tabla en vista de datos:
Para finalizar la edición en una tabla debemos cerrarla. No será necesario guardar los datos modificados, pues ya está almacenados en disco. Puede probar las diferentes condiciones y chequeos de datos que se han definido para la tabla creada introduciendo datos legales y datos con errores, para comprobar como son detectados por Access. Salga de la tabla y compruebe como Access no le pide confirmación para guardar los datos. Diseño de varias tablas Con frecuencia nos encontraremos con que la información que queremos almacenar puede dividirse en varios conjuntos lógicos. Por ejemplo, si queremos guardar información de los datos personales de un alumno (dirección, teléfono, número de hermanos, renta, etc.), observaremos que aunque la información es también de un alumno, no tiene nada que ver con los datos académicos de la tabla creada anteriormente. En estos casos es posible definir varias tablas en la misma base de datos. Una vez creadas las tablas de forma independiente debemos indicar a Access como combinar la información. Este proceso se conoce con el nombre de Relaciones entre tablas. En nuestro ejemplo crearíamos la tabla DatosPriv, y deberíamos decirle a Access que cuando obtengamos información académica de un alumno, también queremos información personal de ese mismo alumno mediante una relación La tabla DatosPriv tendría la siguiente información: Campo NIF Calle
Tipo Texto (9) Texto (40)
Descripción NIF Calle donde vive
Otros atributos requerido; indexado sin repetición; clave principal. requerido 12
Número Bloque Piso Puerta Ciudad Provincia Dfamiliar
Numérico Texto (2) Numérico Texto (2) Texto (30) Texto (30) Sí/No
Número de la casa Bloque donde vive Piso donde vive Puerta del piso Ciudad Provincia Domicilio familiar
requerido
Requerido Requerido
Para relacionar las dos tablas hemos de buscar un punto común entre las dos. Podríamos utilizar el nombre los apellidos, pero resulta más corto utilizar el NIF, por lo tanto incluimos este campo en la tabla DatosPriv. En una relación siempre se hacen coincidir los datos de algún campo (normalmente un campo con el mismo nombre en ambas tablas), con objeto de poder extraer la información relacionada. En la mayoría de los casos, este campo es el campo clave de alguna de las dos tablas. En nuestro ejemplo coinciden los campos claves en las dos tablas. A la hora de establecer una relación hemos de tener en cuenta que pueden darse tres situaciones: • Relación de uno a varios: Es el tipo de relación más común. Significa que un registro de la tabla A puede estar relacionado con más de un registro de la tabla B. Por ejemplo, un alumno que sea de Alcalá de Guadaira puede tener el domicilio familiar en Alcalá, y vivir en un piso de estudiantes en Sevilla, con lo cual este alumno tendría un registro en la tabla de datos académicos y dos en la tabla de DatosPriv. • Relación varios a varios: En este tipo de relación, un registro de la tabla A puede estar relacionado con muchos registros de la tabla B y viceversa. Por ejemplo, un alumno tiene varios hermanos que viven en el mismo piso de estudiantes y tienen la misma dirección familiar en Alcalá. La tabla alumnos se relacionaría con varios registros de la tabla DatosPriv y la tabla DatosPriv se relacionaría con varios alumnos de la tabla alumnos. Este tipo de relaciones es complicado y debe evitarse siempre que sea posible añadiendo en el diseño de las tablas otra tabla intermedia que sirva de relación entre las dos. • Relación uno a uno. Es una relación simple en la que a un registro de una tabla A le corresponde uno y solo un registro de la tabla B y viceversa. Este tipo de tablas no es habitual, ya que este tipo de información se pone en una misma tabla. Puede utilizarse para dividir una tabla de muchos campos. Definición de relaciones Aunque aparentemente hemos relacionado las tablas Alumno y DatosPriv a través del campo NIF, Access aún no lo sabe. Para definir una relación es necesario agregar la relación de forma explícita en una ventana de Access llamada Ventana de Relaciones. Para acceder a ellas, pulsamos la opción Herramientas del menú principal y seleccionamos Relaciones. Se abrirá una ventana con un cuadro de texto en el que aparecen todos los nombres de las tablas que tenemos para que añadamos las que queremos relacionar.
13
Seleccionamos cada tabla que queramos integrar en la relación y pulsamos el botón Agregar. Las tablas van apareciendo en la ventana posterior. Cuando ya no deseemos agregar más tablas pulsamos cerrar y obtendremos la ventana Relaciones con las tablas seleccionadas. Para crear una relación, seleccionamos el campo de relación de una tabla y lo arrastramos sobre el campo de relación de la otra, y Access automáticamente creará una de estos tipos de relación: • Creará una relación de uno a varios si uno de los campos es una clave principal o tiene un índice único. • Creará una relación de uno a uno si ambas tablas están relacionadas por un campo de clave principal o tienen índices únicos. En el momento de arrastrar el campo que queremos relacionar aparecerá un cuadro de diálogo de Relaciones, con los nombres de los campos sobre los que hemos definido la relación:
Si es necesario, los campos de relación pueden cambiarse aquí. Aparecen también opciones de la relación que podemos especificar: 14
• Tipo de Combinación: Pulsando este botón podemos determinar como queremos que aparezcan los datos cuando hagamos una consulta. Por defecto está seleccionada la relación Incluir sólo las filas donde los campos combinados sean iguales. Esto es una forma de presentación y no afecta al contenido de la tabla ni a la relación. • Botón Exigir integridad referencial. La integridad referencial es un concepto muy importante en la definición de una relación. Veámosla con más detalle. Integridad referencial. La integridad referencial define el tipo de dependencia que tiene una tabla sobre otra. Se utiliza para evitar situaciones de inconsistencia de datos cuando estos se tienen duplicados. En el ejemplo de los alumnos, la información duplicada que tenemos es el NIF. Se encuentra en dos tablas, de modo que si modifico un NIF en una tabla, he de modificarlo también en la otra, o de lo contrario perderemos la relación entre el alumno y el domicilio, o sea, perderemos la referencia. Si exigimos integridad referencial, los datos del campo de relación de la tabla dependiente no pueden existir si no existen antes en la tabla de la que dependen. En nuestro ejemplo, no podemos introducir un valor de NIF en la tabla de DatosPriv si este NIF no existía antes en la tabla Alum. Para definir una relación con integridad referencial debemos seleccionar la cuadrícula Exigir integridad referencial. Cuando la seleccionemos veremos como se activan otras dos cuadrículas, que definen distintas opciones de esta relación. Estas opciones nos indican: • Actualizar en cascada los campos relacionados: Si deseamos que al modificar el campo de referencia en una tabla se modifique también en la tabla que depende de ella mediante la integridad referencial. • Eliminar en cascada los registros relacionados: Si deseamos que al eliminar un registro en una tabla se eliminen también los registros de la tabla que depende de la primera mediante integridad referencial. De este modo nos aseguramos que no podemos tener datos `colgados' sin determinar con quien están relacionados. Como ejemplo, puede definir la relación entre las tablas Alum y DatosPriv con integridad referencial, actualización y eliminación de datos en cascada. Pruebe a cambiar datos en una y otra tabla y a introducir un NIF en la tabla DatosPriv que no exista en la tabla Alum. Creación de una relación de varios a varios Este tipo de relación es un tanto particular, y la estudiaremos mediante un ejemplo. Vamos a diseñar una base de datos con dos tablas en las que exista una relación de muchos a muchos, como Agencias de viajes y Hoteles. En esta base de datos, una agencia de viajes recomienda a muchos hoteles, y un hotel puede ser recomendado por muchas agencias. Las tablas las definimos como siguen: Hotel: Campo IdHotel
Descripción Identificador del Hotel, clave principal 15
Nhotel Ciudad Nplazas Ambiente Precio
Nombre del Hotel Ciudad donde se encuentra Numero de plazas Descripción del ambiente Alto, Medio, Bajo
Agencia: Campo IdAgencia Nagencia Dirección Ciudad
Descripción Identificador de la Agencia , clave principal Nombre de la Agencia Dirección postal Ciudad de la Agencia
Para definir la relación de muchos a muchos creamos otra tabla intermedia llamada Unión_Agencia_Hotel y añadimos los campos con las mismas definiciones que los campos de clave principal de cada una de las tablas anteriores. La clave principal de esta tabla estará formada por la combinación de los dos campos clave definidos. Unión_Agencia_Hotel: Campo IdHotel IdAgencia
Descripción Identificador del Hotel, clave principal Identificador de la Agencia , clave principal
La clave principal de esta tabla será la combinación de los dos campos. Podríamos añadir más campos como por ejemplo la fecha en la que comenzó la relación comercial entre una agencia y un hotel. Hemos transformado una relación de varios a varios en dos relaciones de uno a varios:
CONSULTAS En muchas ocasiones tendremos la necesidad de saber qué clientes viven en tal o cual ciudad, cuantas propiedades del tipo chalet existen, quién paga más de 100.000 pts de alquiler, o cualquier otra pregunta que se nos ocurra. Evidentemente, tenemos el listado completo en forma de tabla, pero según el tipo de preguntas que queramos realizar a la BD nos puede llevar bastante tiempo localizar algún dato en concreto. Para ello están las consultas. Las consultas son preguntas preparadas que podemos diseñar para utilizar cuando sea necesario. Casi todo el trabajo en Access se basa en las consultas. Si queremos hacer un informe 16
de unos datos determinados, podemos hacerlo a partir de una consulta. Si queremos un listado por pantalla o por impresora, lo haremos de una consulta. Las consultas son operaciones que se realizan sobre los datos de una base de datos. Estas operaciones pueden ser de diversos tipos: • Consultas de selección de datos: permiten recuperar los datos almacenados en las tablas en el formato y orden adecuados. Además permiten filtrar (seleccionar sólo los registros que cumplen unos criterios) y agrupar la información. El resultado de estas consultas consiste en una tabla virtual: una tabla que físicamente no ocupa espacio (porque trabaja sobre los datos originales de las tablas sobre las que se define), pero que permite ser manejada de la misma forma que una tabla real. Dentro de las consultas de selección podemos resaltar algunos grupos importantes: • Consultas de selección simple: permite filtrar registros y añadir o descartar campos de los registros. Se utilizan para crear vistas: consultas que muestran lo que nos interesa de una tabla. • Consultas de varias tablas: permiten relacionar los datos de distintas tablas a través de campos clave. • Consultas de agrupamiento: permiten obtener resultados estadísticos de conjuntos de registros, como sumas de un campo, totales, etc. • Consultas de inserción de datos o de datos anexados: permiten agregar registros a una tabla. • Consultas de modificación o de actualización: permiten modificar los valores de los campos de los registros de una tabla. • Consultas de borrado o eliminación: permiten eliminar registros de una tabla. • Consultas de creación de tabla: permiten crear nuevas tablas cuyos campos y registros se obtienen a partir de los almacenados en otras tablas. • Consulta de tabla de referencias cruzadas: Muestra valores resumidos (sumas, cuentas y promedios) de un campo de una tabla y los agrupa según un conjunto de hechos enumerados. Las consultas a los datos de las bases de datos se hacen a través de los denominados lenguajes de consulta. El más utilizado de este tipo de lenguajes es el SQL (Standard Query Language). Access permite realizar consultas en SQL. Pero, dada la filosofía visual seguida en Access, también se permite la definición de consultas a través de una interfaz visual. Ambos métodos son compatibles e intercambiables: se puede pasar de uno a otro sin problemas. Consultas de selección simple La consulta más simple posible consiste en la selección de campos y registros de una tabla. Una consulta de selección es el tipo de consulta más habitual. Este tipo de consulta obtiene los datos de una o más tablas y muestra los resultados en una hoja de datos en la que puede actualizar los registros (con algunas restricciones). Se identifican los campos que nos interesan y una condición que deben cumplir los registros seleccionados. El resultado es una tabla que es un subconjunto de la original. Para crear una consulta de selección: 17
• En la ventana Base de datos, haga clic en la ficha Consultas y, a continuación, haga clic en Nuevo.
• En el cuadro de diálogo Nueva consulta, haga clic en Vista Diseño y, a continuación, elija Aceptar.
• En el cuadro de diálogo Mostrar tabla, haga clic en la ficha que enumera los objetos con cuyos datos desea trabajar. • Haga doble clic en el nombre de la tabla sobre la que desea hacer la consulta o márquela y pulse Agregar. A continuación, haga clic en Cerrar.
• Agregue campos a la consulta arrastrando los nombres de los campos desde la lista de campos hasta la cuadrícula de diseño. Si nos interesan todos los campos podemos utilizar el símbolo * para identificar a la lista completa.
18
• Introduzca criterios y agregue un orden si fuera necesario Haga clic en la primera celda Criterios del campo para el cual desea establecer criterios. Escriba la expresión de los criterios directamente o mediante el Generador de expresiones. Los criterios son restricciones impuestas en una consulta o en un filtro avanzado para identificar los registros específicos con los que se desea trabajar. Por ejemplo, en lugar de ver todos los proveedores que utiliza su compañía, puede ver solamente los proveedores de Japón. Para ello, especifique criterios que limiten los resultados a los registros cuyo campo País contenga el valor "Japón". Para seleccionar los empleados que cobran más de 200.000 pesetas estableceríamos un criterio en el campo Salario con el valor >200000 Puede introducir criterios adicionales para el mismo campo o para campos diferentes. Al introducir expresiones en más de una celda Criterios, Microsoft Access las combina empleando el operador Y (And) o el operador O (Or). Si las expresiones están en celdas diferentes de la misma fila, Microsoft Access utiliza el operador Y (And), que indica que sólo se devolverán los registros que cumplan los criterios de todas las celdas. Si las expresiones están en filas diferentes de la cuadrícula de diseño, Microsoft Access utiliza el operador O (Or), que indica que se devolverán los registros que cumplan los criterios de cualquiera de las celdas. Si queremos aplicar un criterio a un campo pero no queremos que se visualice, desmarcamos la casilla Mostrar. Podemos usar las expresiones para mostrar datos obtenidos a partir de otros campos. Para ello en el apartado Campo de la cuadrícula de diseño escribimos el nombre que queramos darle seguido de dos puntos (:) y la expresión. Por ejemplo, si tenemos una tabla de salarios de empleado y en ella tenemos un campo para sueldo base y otro para sueldo extra, podemos mostrar en nuestra consulta un campo llamado Total en el que nos muestre la suma. Otra opción que nos proporciona Microsoft Access mediante el botón es la de mostrar un número determinado de registros. Podemos mostrar todos los registros, un número concreto o un tanto por ciento del total. Para ordenar por uno o más de un campo, coloque los campos en la cuadrícula de diseño en el orden en el que desee que se lleve a cabo la ordenación. Microsoft Access ordena primero por el campo situado más a la izquierda, luego por el siguiente campo a la derecha, y así sucesivamente. Por ejemplo, para ordenar primero por el campo Apellidos y a continuación por el campo Nombre, el campo Apellidos debe estar a la izquierda del campo Nombre en la cuadrícula.
19
En la celda Orden de cada uno de los campos por los que desea ordenar, haga clic en una opción. Puede ordenar de forma ascendente o descendente. • Para guardar la consulta, haga clic en el botón Guardar en la barra de herramientas. Escriba un nombre que siga las reglas para nombrar objetos de Microsoft Access y elija Aceptar. • Para ver el resultado de la consulta, haga clic en el botón Vista o Ejecutar de la barra de herramientas. • Para volver al modo diseño pulsar . Para la creación de criterios necesitamos de las expresiones. Las podemos generar de forma manual o mediante el generador de expresiones. Para mostrar el Generador de expresiones, se hace clic con el botón derecho del ratón en la celda Criterios y, a continuación, haga clic en Generar. Vamos a ver más detenidamente que son y como se crean expresiones. Las expresiones son un componente fundamental de numerosas operaciones en Microsoft Access. Se pueden crear de forma manual o mediante el generador de expresiones. Una expresión es una combinación de símbolos (identificadores, operadores y valores) que produce un resultado. Los identificadores hacen referencia a elementos de nuestra base de datos. Un identificador puede ser el nombre de una tabla, un campo, Los operadores son símbolos que identifican una operación. Tenemos los siguientes operadores: • Operadores aritméticos: Operadores utilizados para ejecutar cálculos matemáticos. Operador ^ Se utiliza para elevar un número a la potencia del exponente. Operador * Se utiliza para multiplicar dos números. Operador / Se utiliza para dividir dos números y obtener un resultado de signo flotante. Operador \ Se utiliza para dividir dos números y obtener un resultado entero. Operador Mod Divide dos números y devuelve sólo el resto. Operador + Se utiliza para sumar dos números. Operador − Se utiliza para hallar la diferencia entre dos números o indicar el valor negativo. • Operadores de comparación: Operadores utilizados para efectuar comparaciones. < (Menor que) <= (Menor o igual que) > (Mayor que) >= (Mayor o igual que)
20
= (Igual a) <> (Distinto de) • Operadores de concatenación: Operadores utilizados para combinar cadenas de caracteres. Operador & Se utiliza para forzar la concatenación de las cadenas de dos expresiones. • Operadores lógicos: Operadores usados para realizar operaciones lógicas. Operador And Se utiliza para efectuar una conjunción lógica de dos expresiones. Operador Not Se utiliza para ejecutar una negación lógica sobre una expresión. Operador Or Se utiliza para ejecutar una disyunción lógica sobre dos expresiones. Operador Xor Se utiliza para realizar una exclusión lógica entre dos expresiones. En las siguientes tablas se muestra como funcionan estos operadores lógicos: VALOR 1 VERDADERO VERDADERO FALSO FALSO
OPERADOR AND AND AND AND
VALOR 2 VERDADERO FALSO VERDADERO FALSO
VALOR 2 VERDADERO FALSO
RESULTADO FALSO VERDADERO
VALOR 1 VERDADERO VERDADERO FALSO FALSO
OPERADOR OR OR OR OR
VALOR 2 VERDADERO FALSO VERDADERO FALSO
RESULTADO VERDADERO VERDADERO VERDADERO FALSO
VALOR 1 VERDADERO VERDADERO FALSO FALSO
OPERADOR XOR XOR XOR XOR
VALOR 2 VERDADERO FALSO VERDADERO FALSO
RESULTADO FALSO VERDADERO VERDADERO FALSO
OPERADOR NOT NOT
RESULTADO VERDADERO FALSO FALSO FALSO
• Operadores comodín Se utilizan los caracteres comodín como sustitutos de otros caracteres cuando se especifica un valor que se desea buscar y sólo se conoce parte del valor y/o se buscan valores que empiezan con una cierta letra o que coinciden con un modelo.
21
Se pueden utilizar los siguientes caracteres en los cuadros de diálogo Buscar y Reemplazar o en consultas, comandos y expresiones para encontrar valores de campos, registros o nombres de archivos. * Hace coincidir cualquier número de caracteres. Puede ser utilizado como el primero o el último carácter de la cadena de caracteres. Ejemplo: qu* encuentra quién, queso y quieto ? Hace coincidir cualquier carácter alfabético individual. Ejemplo: B?la encuentra bala, bola y bula [ ] Hace coincidir cualquier carácter individual situado entre los corchetes. Ejemplo: B[ao]la encuentra bala y bola pero no bulo. ! Hace coincidir cualquier carácter que no se encuentre entre los corchetes. Ejemplo: b[!ao]la encuentra bulo pero no bala o bola. − Hace coincidir cualquier carácter de un intervalo de caracteres. Debe especificar el intervalo en orden ascendente (A a Z, no Z a A). Ejemplo: b[a−c]d encuentra bad, bbd y bcd # Hace coincidir cualquier carácter numérico individual. Ejemplo: 1#3 encuentra 103, 113 y 123 Otros operadores que podemos usar son: • Comparador de semejanza LIKE (Como): Permite realizar una comparación de cadenas utilizando caracteres comodines.
Ejemplo: Alumnos cuyo apellido comienza por A: Apellido1 LIKE "A*" • Comparador de pertenencia a rango BETWEEN (Entre)
Ejemplo: Alumnos cuya edad esté comprendida entre 18 y 20: Edad BETWEEN 18 AND 20 • Operador Is Null El valor Null (Nulo) en un campo indica que ese campo no tiene valor. No debemos confundir este valor con el valor 0 en los numéricos o la cadena vacía en los campos de tipo texto, ya que el valor 0 y la cadena vacía es un valor. Para saber si un campo tiene valor Nulo, se usan los operadores Is Null (Es Nulo) para ver si es nulo y el operador Is Not Null (Es No Nulo) para ver si no es nulo. El generador de expresiones es una herramienta de Access para crear expresiones. El Generador de expresiones consta de tres secciones:
22
• En la sección superior del generador se encuentra un cuadro en el que se genera la expresión. Utilice la sección inferior para crear los elementos de la expresión, y luego insértelos en el cuadro para formarla. También puede escribir componentes de la expresión directamente en este cuadro. • En la sección intermedia del generador hay botones que corresponden a los operadores más comunes. Al hacer clic en uno de ellos, el Generador de expresiones insertará el operador en el lugar del cuadro de expresiones donde se encuentre el punto de inserción. Si desea consultar una lista completa de los operadores que se pueden emplear en expresiones, haga clic en la carpeta Operadores situada en el cuadro inferior izquierdo, y en la categoría de operadores que corresponda en el cuadro intermedio. En el cuadro de la derecha aparecerán todos los operadores de la categoría seleccionada. • En la sección inferior del generador hay tres cuadros: • El cuadro situado a la izquierda contiene carpetas que muestran los objetos tabla, consulta, formulario e informe de la base de datos, las funciones incorporadas y las definidas por el usuario, las constantes, los operadores y las expresiones comunes. • El cuadro intermedio muestra los elementos específicos o las categorías de elementos que corresponden a la carpeta seleccionada en el cuadro de la izquierda. Por ejemplo, al hacer clic en Funciones incorporadas en el cuadro de la izquierda, en el cuadro intermedio aparecen las categorías de funciones de Microsoft Access. • En el cuadro de la derecha aparecen los valores que corresponden a los elementos seleccionados en los cuadros izquierdo e intermedio. Por ejemplo, al hacer clic en Funciones incorporadas en el cuadro de la izquierda y una categoría de funciones en el cuadro intermedio, en el cuadro de la derecha aparecerán todas las funciones incorporadas de la categoría seleccionada. Consultas de varias tablas Todas las consultas estudiadas hasta el momento se basan en seleccionar registros y campos sobre los datos almacenados en una única tabla. Microsoft Access también permite obtener resultados a través de la combinación de múltiples tablas. La forma de hacerlo es a través del enlace o unión (join) de varias tablas a través de claves externas (claves ajenas, foreign keys). Una clave externa es un campo o conjunto de campos 23
que hacen referencia a otro campo o conjunto de campos de otra tabla. Esta relación habitualmente se establece entre uno o varios campos de una tabla y la clave principal de otra tabla. Para una consulta de este tipo se comienza igual que con una consulta de una tabla, pero en el paso 4 se seleccionan todas las tablas/consultas que se desean agregar a la nueva consulta. Si tiene varias tablas o consultas en la consulta, hay que asegurarse de que están conectadas entre sí mediante una línea de combinación o clave ajena, de modo que Microsoft Access sepa cómo está relacionada la información. Si no están conectadas, hay que crear la línea de combinación. Para hacer esto, en la vista Diseño de la consulta, arrastre un campo desde la lista de campos de una tabla o consulta hasta el campo equivalente (un campo del mismo tipo de datos o de un tipo de datos compatible que contenga datos similares) de la lista de campos de la otra tabla o consulta.
En el gráfico podemos ver que relacionamos la tabla Clientes y la tabla pedidos a través del campo IdCliente. Con este tipo de combinación, Microsoft Access selecciona registros de ambas tablas o consultas sólo cuando los valores de los campos combinados son iguales. Supongamos las tablas siguientes: Almacenes registra los distintos almacenes de una empresa Existencias almacena el stock de cada tipo de pieza en cada almacén Piezas almacena información sobre cada tipo de pieza Almacenes
Existencias
24