Instituto de Educación Superior “San Ignacio de Monterrico” DISEÑO DE BASES DE DATOS 1. CONCEPTOS - Base de Datos.- Cualquier conjunto de datos organizados para su respectivo almacenamiento en la memoria de un ordenador o computador, diseñado para facilitar su mantenimiento y acceso de forma estándar. Los datos suelen aparecer en forma de texto, números o gráficos. Hay cuatro modelos principales de bases de datos: el modelo jerárquico, el modelo en Red, el modelo relacional (el más extendido hoy en día). - Base de Datos Relacional.- Tipo de base de datos o sistema de administración de bases de datos, que almacena información estrictamente en tablas de valores (filas y columnas de datos) y realiza búsquedas utilizando los datos de columnas especificadas de una tabla para encontrar datos adicionales en otra tabla, en donde todas las operaciones de la base de datos operan sobre estas mismas tablas. Estas bases de datos, son percibidas por los usuarios como una colección de relaciones normalizadas de diversos grados que varían con el tiempo. 2. MODELO DE DATOS Es un conjunto de herramientas conceptuales para describir los datos, las relaciones entre ellos, su semántica y sus limitantes. Clases de Modelos de Datos: Modelos Lógicos Basados en Objetos.- Son aquellos que nos permiten una definición clara y concisa de los esquemas conceptuales y de visión. Su característica principal es que permiten definir en forma detallada las limitantes de los datos. Modelos Lógicos Basados en Registros.- Operan sobre niveles conceptuales y de visión. Se caracterizan principalmente porque permiten una descripción más Formando Emprendedores de Calidad para un Mundo Empresarial 1 Instituto de Educación Superior “San Ignacio de Monterrico” amplia de la implantación, pero no son capaces de especificar con claridad las limitantes de los datos. Modelos Físicos de Datos.- Describen los datos en el nivel más bajo y permiten identificar algunos detalles de implantación para el manejo del hardware de almacenamiento. 3. SISTEMAS DE GESTIÓN DE BASES DE DATOS Arquitectura de Red.- La infraestructura de comunicación por medio de redes. La red más sencilla es una conexión directa entre dos computadoras. Usando la terminología de redes, una relación es llamada conjunto, y cada conjunto está compuesto por al menos dos tipos de registros: - Un registro propietario, que es el equivalente al padre en el modelo jerárquico. - Un registro miembro, equivalente a un registro hijo en el modelo jerárquico. La diferencia entre el modelo jerárquico y el de red es que este último incluye una condición en la cual un miembro puede aparecer en más de un conjunto. Es decir, un miembro puede tener muchos propietarios. Lo que distingue a este modelo de los demás es que, en este todos los registros mantienen una interconexión entre si, y también pueden existir relaciones de muchos a muchos. Arquitectura Jerárquica.- La estructura de base de datos jerárquica puede ser representada como un árbol hacia abajo. El usuario percibe la base de datos como una jerarquía de segmentos. Un segmento, también llamado nodo, es el equivalente al tipo registro de un sistema de archivos, es decir que es una colección de registros que se perciben organizados para conformar la estructura de un árbol. Jerárquicamente, el nivel superior (la raíz) es percibido como el padre del segmento que directamente depende de él. En cambio, los segmentos Formando Emprendedores de Calidad para un Mundo Empresarial 2 Instituto de Educación Superior “San Ignacio de Monterrico” abajo de otros segmentos son hijos de los segmentos que se encuentran arriba de ellos. Una de sus características principales es que un segmento padre puede tener varios segmentos hijos. Y al mismo tiempo se dan problemas como la redundancia de información, que es superado por otros modelos. Arquitectura Relacional.- El gran salto en la administración de bases de datos se produce con el modelo relacional, basado en la proposición de Edgar Codd, en 1970. La proposición del diagrama Entidad-Relación hizo que los diseñadores y programadores prefirieran la implantación de este nuevo modelo. Entendemos al diagrama entidad-relación como una propuesta de ver los datos como objetos del mundo real, diferenciables unos de otros por sus características. Un objeto o entidad es describible por la colección de características que tienen y, a la vez, es diferenciable de otros objetos por las mismas características o atributos. Entonces, se tiene una serie de entidades que comparten elementos característicos comunes, o un conjunto de entidades. Estos conjuntos de entidades pueden ser ilimitados, pero los atributos que los diferencian son limitables. Actualmente este modelo es el más utilizado en la práctica, esto es debido a la facilidad de entendimiento y de manipulación por parte de diseñadores y administradores. Para entender este modelo de base de datos hay que tener claros ciertos conceptos sencillos que son importantes a la hora de diseñar la base de datos y sus relaciones. Entidad: es una persona, cosa o transacción de la cual se puede guardar información. Las entidades, en la fase de diseño (diagrama E-R), llegarán a convertirse posteriormente en las tablas de la base de datos. Atributos: son las características que se desean almacenar de las entidades. Relación: una relación es una asociación entre dos entidades. Conectividad: Se utiliza para clasificar el tipo de relación que une a las dos entidades (uno a uno, un a muchos ó muchos a muchos). Especifica el número específico de ocurrencias de la entidad asociadas con una ocurrencia de la entidad relacionada. Formando Emprendedores de Calidad para un Mundo Empresarial 3 Instituto de Educación Superior “San Ignacio de Monterrico” 4. ADMINISTRADOR DE LA BASE DE DATOS (DBA) El administrador de datos (DA) es la persona identificable que tendrá la responsabilidad central (de gestionar y controlar todas las actividades que tienen que ver con los datos de la empresa y con la base de datos). Ya que los datos son uno de los activos más valiosos de la empresa, es imperativo que exista una persona que los entienda junto con las necesidades de la empresa con respecto a esos datos, a un nivel de administración superior. Por lo tanto, es labor del administrador decidir en primer lugar qué datos deben ser almacenados en la base de datos y establecer políticas para mantener y manejar esos datos una vez almacenados. El administrador de base de datos (DBA) es el técnico responsable de implementar las decisiones del administrador de datos. Por lo tanto, debe ser un profesional en IT. El trabajo del DBA consiste en crear la base de datos real e implementar los controles técnicos necesarios para hacer cumplir las diversas decisiones de las políticas hechas por el DA. El DBA también es responsable de asegurar que el sistema opere con el rendimiento adecuado y de proporcionar una variedad de otros servicios técnicos. El administrador de datos juega un papel más importante que el administrador de la base de datos en las siguientes etapas del ciclo de vida: planificación de la base de datos, definición del sistema, recolección y análisis de los requisitos, diseño conceptual y diseño lógico de la base de datos. En el resto de las etapas es donde el administrador de la base de datos tiene el papel más importante: selección del SGBD, diseño de las aplicaciones, diseño físico, prototipo, implementación, conversión y carga de datos, prueba y mantenimiento. 5. DICCIONARIO DE DATOS El diccionario de datos guarda y organiza los detalles del Diagrama de Flujo de Datos (DFD). Es el segundo componente del análisis estructurado. También se conoce como "Data Repository". Incluye el contenido de los data flow (flujos de datos), los "data store", las entidades externas y los procesos. Formando Emprendedores de Calidad para un Mundo Empresarial 4 Instituto de Educación Superior “San Ignacio de Monterrico” Data elements (elementos de datos).- Es la parte más pequeña de los datos que tiene significado en el sistema de información. Se combinan varios elementos de datos para hacer los registros o "data structures". Ejemplo: Nombre, Dirección, Dni. Las características que se describen en el diccionario de datos son: Name.- Es el nombre del elemento de datos; debe ser significativo. Alias.- Cualquier otro nombre que se pueda usar para referirse al elemento de datos. Por ejemplo, el nombre de un elemento de datos puede ser Balance actual, y el alias puede ser Deuda. Solo se incluye el alias si realmente es necesario utilizarlo. Type y Size.- se refiere a si el elemento de datos contiene valor numérico, caracteres o alfabético. Size o tamaño se refiere al máximo de caracteres o de dígitos que puede tener el elemento de datos. Formato de salida o mascara de edición.- Indica cómo se presenta el dato al mostrarse en pantalla o al imprimirse en un reporte. Por ejemplo, el número de teléfono del cliente se puede guardar en el disco usando solo números 7878889999, pero presentarse editado en la pantalla o en el reporte (787) 8889999. Default value.- Es el valor que el elemento de datos tiene si no se cambia entrando otro valor. Prompt, column header or field caption.- Es el nombre que se presenta en la pantalla o el título del dato en el reporte. Source (fuente).- De dónde se origina el valor del elemento de datos. Puede ser una forma, un departamento, otro sistema, etc. Security.- Identifica los individuos o departamentos que pueden modificar el elemento de datos. Por ejemplo, la línea de crédito puede ser cambiada por el gerente de crédito. Responsible user(s).- Identifica el (los) usuarios responsables de entrar o cambiar los valores del elemento de datos. Acceptable Data and Data validation.- Se especifica el dominio o valores permitidos. Pueden ser valores específicos, una lista de valores, los valores que Formando Emprendedores de Calidad para un Mundo Empresarial 5 Instituto de Educación Superior “San Ignacio de Monterrico” se encuentren en otro archivo, etc. El valor puede tener reglas de validación; por ejemplo, el salario debe estar entre lo permitido para la posición que el empleado ocupa. Derivation formula.- Si el valor es el resultado de un cálculo, se muestra la fórmula que se utiliza. Description or comments.- Para proveer información adicional, notas o descripciones. Data Structure (Estructura de datos) También se conocen como record. Es la combinación de elementos de datos relacionados que se incluye en un flujo de datos o se retiene en un "data store". Data flows (Flujo de datos) - Las características que se describen en el flujo de datos son: Name – El nombre del flujo de datos tal y como aparece en el DFD. Alias – Otro nombre con que se conozca el flujo de datos. Abbreviation or ID – Código que provee acceso rápido al flujo de datos en un diccionario de datos automatizado. Description – Describe el flujo de datos y su propósito. Origin – De donde sale (la fuente) el flujo de datos. Puede ser un proceso, un “data store” o una entidad. Destination – El punto final del flujo de datos en el DFD. Puede ser un proceso, un “data store” o una entidad. Record – Cada flujo de datos representa un grupo de elementos de datos relacionados, o un record. Los records y los flujos de datos se definen por separado para que más de un flujo de datos o “data store” pueda hacer referencia al mismo record. Volume and frequency – Describe el número esperado de ocurrencias para el flujo de datos por unidad de tiempo. “Data store” – Las características que se describen en el “data store” son: Name – El nombre del “data store” según aparece en el DFD. Alias – Otro nombre con el que se pueda llamar al “data store”. Formando Emprendedores de Calidad para un Mundo Empresarial 6 Instituto de Educación Superior “San Ignacio de Monterrico” Abbreviation or ID – Código que provee un acceso rápido al “data store” en un diccionario de datos automatizado. Description – Describe el “data store” y su propósito. Input data flows – Los nombres de los flujos de datos que entran al “data store”. Output data flows – Los nombres de los flujos de datos que salen del “data store”. Record – El nombre del record en el diccionario de datos para el “data store”. Volume and Frequency – El número estimado de records guardados en el “data store”, al igual que el aumento o cambio esperado. Proceso – Se documenta cada función primitiva. Se incluye: Process name or label – El nombre del proceso como aparece en el DFD. Purpose or description – Un resumen del propósito general del proceso. Los detalles se documentan en el Process Description. Process number – Número de referencia que identifica el proceso y su relación con los niveles del sistema. Input data flows – Los nombres de los flujos de datos que entran al proceso. Output data flows – Los nombres de los flujos de datos que salen del proceso. Process Description – Se explican los detalles del proceso. Entidades Externas – Las características que se describen son: Name Alias Description – Describe a la entidad y su propósito. Input data flow Output data flow Record (Registro) – Se describe lo siguiente: Record name Alias Description Record content or composition – Una lista de todos los elementos de datos incluidos en el record. Se identifica cualquier “LLAVE” primaria, o sea un elemento de datos en el record que identifica en forma única al record. Formando Emprendedores de Calidad para un Mundo Empresarial 7 Instituto de Educación Superior “San Ignacio de Monterrico” DISEÑO LOGICO DE BASE DE DATOS El objetivo del diseño lógico es convertir los esquemas conceptuales locales en un esquema lógico global que se ajuste al modelo de SGBD sobre el que se va a implementar el sistema. Mientras que el objetivo fundamental del diseño conceptual es la compleción y expresividad de los esquemas conceptuales locales, el objetivo del diseño lógico es obtener una representación que use de modo más eficiente posible, los recursos que el modelo de SGBD posee para estructurar los datos y para modelar las restricciones. Los modelos de bases de datos más extendidos son el modelo relacional, el modelo de red y el modelo jerárquico. El modelo orientado a objetos es también muy popular, pero no existe un modelo estándar orientado a objetos. En un primer paso en la fase del diseño lógico consistirá en la conversión de esos mecanismos de representación de alto nivel en términos de las estructuras de bajo nivel disponibles en el modelo relacional. Metodología de diseño lógico en el modelo relacional La metodología que se va a seguir para el diseño lógico en el modelo relacional consta de dos fases, cada una de ellas compuesta por varios pasos que se detallan a continuación. 1. Convertir los esquemas conceptuales locales en esquemas lógicos locales En este paso, se eliminan de cada esquema conceptual las estructuras de datos que los sistemas relacionales no modelan directamente: (a) Eliminar las relaciones de muchos a muchos, sustituyendo cada una de ellas por una nueva entidad intermedia y dos relaciones de uno a muchos de esta nueva entidad con las entidades originales. La nueva entidad será débil, ya que sus ocurrencias dependen de la existencia de ocurrencias en las entidades originales. (b) Eliminar las relaciones entre tres o más entidades, sustituyendo cada una de ellas por una nueva entidad (débil) intermedia que se relaciona con cada una de Formando Emprendedores de Calidad para un Mundo Empresarial 8 Instituto de Educación Superior “San Ignacio de Monterrico” las entidades originales. La cardinalidad de estas nuevas relaciones binarias dependerá de su significado. (c) Eliminar las relaciones recursivas, sustituyendo cada una de ellas por una nueva entidad (débil) y dos relaciones binarias de esta nueva entidad con la entidad original. La cardinalidad de estas relaciones dependerá de su significado. (d) Eliminar las relaciones con atributos, sustituyendo cada una de ellas por una nueva entidad (débil) y las relaciones binarias correspondientes de esta nueva entidad con las entidades originales. La cardinalidad de estas relaciones dependerá del tipo de la relación original y de su significado. (e) Eliminar los atributos multievaluados, sustituyendo cada uno de ellos por una nueva entidad (débil) y una relación binaria de uno a muchos con la entidad original. (f) Revisar las relaciones de uno a uno, ya que es posible que se hayan identificado dos entidades que representen el mismo objeto (sinónimos). Si así fuera, ambas entidades deben integrarse en una sola. (g) Eliminar las relaciones redundantes. Una relación es redundante cuando se puede obtener la misma información que ella aporta mediante otras relaciones. El hecho de que haya dos caminos diferentes entre dos entidades no implica que uno de los caminos corresponda a una relación redundante, eso dependerá del significado de cada relación. Una vez finalizado este paso, es más correcto referirse a los esquemas conceptuales locales refinados como esquemas lógicos locales, ya que se adaptan al modelo de base de datos que soporta el SGBD escogido. 2. Derivar un conjunto de relaciones (tablas) para cada esquema lógico local En este paso, se obtiene un conjunto de relaciones (tablas) para cada uno de los esquemas lógicos locales en donde se representen las entidades y relaciones entre entidades, que se describen en cada una de las vistas que los usuarios tienen de la empresa. Cada relación de la base de datos tendrá un nombre, y el Formando Emprendedores de Calidad para un Mundo Empresarial 9 Instituto de Educación Superior “San Ignacio de Monterrico” nombre de sus atributos aparecerá, a continuación, entre paréntesis. El atributo o atributos que forman la clave primaria se subrayan. Las claves ajenas, mecanismo que se utiliza para representar las relaciones entre entidades en el modelo relacional, se especifican aparte indicando la relación (tabla) a la que hacen referencia. A continuación, se describe cómo las relaciones (tablas) del modelo relacional representan las entidades y relaciones que pueden aparecer en los esquemas lógicos. (a) Entidades fuertes. Crear una relación para cada entidad fuerte que incluya todos sus atributos simples. De los atributos compuestos incluir sólo sus componentes. Cada uno de los identificadores de la entidad será una clave candidata. De entre las claves candidatas hay que escoger la clave primaria; el resto serán claves alternativas. Para escoger la clave primaria entre las claves candidatas se pueden seguir estas indicaciones: - Escoger la clave candidata que tenga menos atributos. - Escoger la clave candidata cuyos valores no tengan probabilidad de cambiar en el futuro. - Escoger la clave candidata cuyos valores no tengan probabilidad de perder la unicidad en el futuro. - Escoger la clave candidata con el mínimo número de caracteres (si es de tipo texto). - Escoger la clave candidata más fácil de utilizar desde el punto de vista de los usuarios. (b) Entidades débiles. Crear una relación para cada entidad débil incluyendo todos sus atributos simples. De los atributos compuestos incluir sólo sus componentes. Añadir una clave ajena a la entidad de la que depende. Para ello, se incluye la clave primaria de la relación que representa a la entidad padre en la nueva relación creada para la entidad débil. A continuación, determinar la clave primaria de la nueva relación. Formando Emprendedores de Calidad para un Mundo Empresarial 10 Instituto de Educación Superior “San Ignacio de Monterrico” (c) Relaciones binarias de uno a uno. Para cada relación binaria se incluyen los atributos de la clave primaria de la entidad padre en la relación (tabla) que representa a la entidad hijo, para actuar como una clave ajena. La entidad hijo es la que participa de forma total (obligatoria) en la relación, mientras que la entidad padre es la que participa de forma parcial (opcional). Si las dos entidades participan de forma total o parcial en la relación, la elección de padre e hijo es arbitraria. Además, en caso de que ambas entidades participen de forma total en la relación, se tiene la opción de integrar las dos entidades en una sola relación (tabla). Esto se suele hacer si una de las entidades no participa en ninguna otra relación. (d) Relaciones binarias de uno a muchos. Como en las relaciones de uno a uno, se incluyen los atributos de la clave primaria de la entidad padre en la relación (tabla) que representa a la entidad hijo, para actuar como una clave ajena. Pero ahora, la entidad padre es la de "la parte del muchos" (cada padre tiene muchos hijos), mientras que la entidad hijo es la de "la parte del uno" (cada hijo tiene un solo padre). (e) Jerarquías de generalización. En las jerarquías, se denomina entidad padre a la entidad genérica y entidades hijo a las sub-entidades. Hay tres opciones distintas para representar las jerarquías. La elección de la más adecuada se hará en función de su tipo (total/parcial, exclusiva/superpuesta).q - Crear una relación por cada entidad. Las relaciones de las entidades hijo heredan como clave primaria la de la entidad padre. Por lo tanto, la clave primaria de las entidades hijo es también una clave ajena al padre. Esta opción sirve para cualquier tipo de jerarquía, total o parcial y exclusiva o superpuesta. - Crear una relación por cada entidad hijo, heredando los atributos de la entidad padre. Esta opción sólo sirve para jerarquías totales y exclusivas. - Integrar todas las entidades en una relación, incluyendo en ella los atributos de la entidad padre, los atributos de todos los hijos y un atributo discriminativo para indicar el caso al cual pertenece la entidad en consideración. Esta opción sirve para cualquier tipo de jerarquía. Si la jerarquía es superpuesta, el atributo discriminativo será multievaluado1. Formando Emprendedores de Calidad para un Mundo Empresarial 11 Instituto de Educación Superior “San Ignacio de Monterrico” Una vez obtenidas las relaciones con sus atributos, claves primarias y claves ajenas, sólo queda actualizar el diccionario de datos con los nuevos atributos que se hayan identificado en este paso. 3. Validar cada esquema mediante la normalización La normalización se utiliza para mejorar el esquema lógico, de modo que satisfaga ciertas restricciones que eviten la duplicidad de datos. La normalización garantiza que el esquema resultante se encuentra más próximo al modelo de la empresa, que es consistente y que tiene la mínima redundancia y la máxima estabilidad. La normalización es un proceso que permite decidir a qué entidad pertenece cada atributo. Uno de los conceptos básicos del modelo relacional es que los atributos se agrupan en relaciones (tablas) porque están relacionados a nivel lógico. En la mayoría de las ocasiones, una base de datos normalizada no proporciona la máxima eficiencia, sin embargo, el objetivo ahora es conseguir una base de datos normalizada por las siguientes razones: - Un esquema normalizado organiza los datos de acuerdo a sus dependencias funcionales, es decir, de acuerdo a sus relaciones lógicas. - El esquema lógico no tiene porqué ser el esquema final. Debe representar lo que el diseñador entiende sobre la naturaleza y el significado de los datos de la empresa. Si se establecen unos objetivos en cuanto a prestaciones, el diseño físico cambiará el esquema lógico de modo adecuado. Una posibilidad es que algunas relaciones normalizadas se des-normalicen. Pero la desnormalización no implica que se haya malgastado tiempo normalizando, ya que mediante este proceso el diseñador aprende más sobre el significado de los datos. De hecho, la normalización obliga a entender completamente cada uno de los atributos que se han de representar en la base de datos. - Un esquema normalizado es robusto y carece de redundancias, por lo que está libre de ciertas anomalías que éstas pueden provocar cuando se actualiza la base de datos. - Los equipos informáticos de hoy en día son mucho más potentes, por lo que en ocasiones es más razonable implementar bases de datos fáciles de manejar (las normalizadas), a costa de un tiempo adicional de proceso. Formando Emprendedores de Calidad para un Mundo Empresarial 12 Instituto de Educación Superior “San Ignacio de Monterrico” - La normalización produce bases de datos con esquemas flexibles que pueden extenderse con facilidad. El objetivo de este paso es obtener un conjunto de relaciones que se encuentren en la forma normal de Boyce-Codd. Para ello, hay que pasar por la primera, segunda y tercera formas normales. 4. Validar cada esquema frente a las transacciones del usuario El objetivo de este paso es validar cada esquema lógico local para garantizar que puede soportar las transacciones requeridas por los correspondientes usuarios. Estas transacciones se encontrarán en las especificaciones de requisitos de usuario. Lo que se debe hacer es tratar de realizar las transacciones de forma manual utilizando el diagrama entidad-relación, el diccionario de datos y las conexiones que establecen las claves ajenas de las relaciones (tablas). Si todas las transacciones se pueden realizar, el esquema queda validado. Pero si alguna transacción no se puede realizar, seguramente será porque alguna entidad, relación o atributo no se ha incluido en el esquema. 5. Dibujar el diagrama entidad-relación En este momento, se puede dibujar el diagrama entidad-relación final para cada vista de usuario que recoja la representación lógica de los datos desde su punto de vista. Este diagrama habrá sido validado mediante la normalización y frente a las transacciones de los usuarios. 6. Definir las restricciones de integridad Las restricciones de integridad son reglas que se quieren imponer para proteger la base de datos, de modo que no pueda llegar a un estado inconsistente. Hay cinco tipos de restricciones de integridad. (a) Datos requeridos. Algunos atributos deben contener valores en todo momento, es decir, no admiten nulos. (b) Restricciones de dominios. Todos los atributos tienen un dominio asociado, que es el conjunto los valores que cada atributo puede tomar. Formando Emprendedores de Calidad para un Mundo Empresarial 13 Instituto de Educación Superior “San Ignacio de Monterrico” (c) Integridad de entidades. El identificador de una entidad no puede ser nulo, por lo tanto, las claves primarias de las relaciones (tablas) no admiten nulos. (d) Integridad referencial. Una clave ajena enlaza cada tupla de la relación hijo con la tupla de la relación padre que tiene el mismo valor en su clave primaria. La integridad referencial dice que si una clave ajena tiene un valor (si es no nula), ese valor debe ser uno de los valores de la clave primaria a la que referencia. Hay varios aspectos a tener en cuenta sobre las claves ajenas para lograr que se cumpla la integridad referencial. - ¿Admite nulos la clave ajena? Cada clave ajena expresa una relación. Si la participación de la entidad hijo en la relación es total, entonces la clave ajena no admite nulos; si es parcial, la clave ajena debe aceptar nulos. - ¿Qué hacer cuando se quiere borrar una ocurrencia de la entidad padre que tiene algún hijo? O lo que es lo mismo, ¿qué hacer cuando se quiere borrar una tupla que está siendo referenciada por otra tupla a través de una clave ajena? Hay varias respuestas posibles: o Restringir: no se pueden borrar tuplas que están siendo referenciadas por otras tuplas. o Propagar: se borra la tupla deseada y se propaga el borrado a todas las tuplas que le hacen referencia. o Anular: se borra la tupla deseada y todas las referencias que tenía se ponen, automáticamente, a nulo (esta respuesta sólo es válida si la clave ajena acepta nulos). o Valor por defecto: se borra la tupla deseada y todas las referencias toman, automáticamente, el valor por defecto (esta respuesta sólo es válida si se ha especificado un valor por defecto para la clave ajena). o No comprobar: se borra la tupla deseada y no se hace nada para garantizar que se sigue cumpliendo la integridad referencial. - ¿Qué hacer cuando se quiere modificar la clave primaria de una tupla que está siendo referenciada por otra tupla a través de una clave ajena? Las respuestas posibles son las mismas que en el caso anterior. Cuando se escoge propagar, se actualiza la clave primaria en la tupla deseada y se propaga el cambio a los valores de clave ajena que le hacían referencia. Formando Emprendedores de Calidad para un Mundo Empresarial 14 Instituto de Educación Superior “San Ignacio de Monterrico” (e) Reglas de negocio. Cualquier operación que se realice sobre los datos debe cumplir las restricciones que impone el funcionamiento de la empresa. Todas las restricciones de integridad establecidas en este paso se deben reflejar en el diccionario de datos para que puedan ser tenidas en cuenta durante la fase del diseño físico. 7. Revisar cada esquema lógico local con el usuario correspondiente Para garantizar que cada esquema lógico local es una fiel representación de la vista del usuario lo que se debe hacer es comprobar con él que lo reflejado en el esquema y en la documentación es correcto y está completo. Relación entre el esquema lógico y los diagramas de flujo de datos El esquema lógico refleja la estructura de los datos a almacenar que maneja la empresa. Un diagrama de flujo de datos muestra cómo se mueven los datos en la empresa y los almacenes en donde se guardan. Si se han utilizado diagramas de flujo de datos para modelar las especificaciones de requisitos de usuario, se pueden utilizar para comprobar la consistencia y completitud del esquema lógico desarrollado. Para ello: - Cada almacén de datos debe corresponder con una o varias entidades completas. - Los atributos en los flujos de datos deben corresponder a alguna entidad. Los esquemas lógicos locales obtenidos hasta este momento se integrarán en un solo esquema lógico global en la siguiente fase para modelar los datos de toda la empresa. 8. Mezclar los esquemas lógicos locales en un esquema lógico global En este paso, se deben integrar todos los esquemas locales en un solo esquema global. En un sistema pequeño, con dos o tres vistas de usuario y unas pocas entidades y relaciones, es relativamente sencillo comparar los esquemas locales, mezclarlos y resolver cualquier tipo de diferencia que pueda existir. Pero en los Formando Emprendedores de Calidad para un Mundo Empresarial 15 Instituto de Educación Superior “San Ignacio de Monterrico” sistemas grandes, se debe seguir un proceso más sistemático para llevar a cabo este paso con éxito: - Revisar los nombres de las entidades y sus claves primarias. - Revisar los nombres de las relaciones. - Mezclar las entidades de las vistas locales. - Incluir (sin mezclar) las entidades que pertenecen a una sola vista de usuario. - Mezclar las relaciones de las vistas locales. - Incluir (sin mezclar) las relaciones que pertenecen a una sola vista de usuario. - Comprobar que no se ha omitido ninguna entidad ni relación. - Comprobar las claves ajenas. - Comprobar las restricciones de integridad. - Dibujar el esquema lógico global. 9. Actualizar la documentación. Validar el esquema lógico global Este proceso de validación se realiza, de nuevo, mediante la normalización y mediante la prueba frente a las transacciones de los usuarios. Pero ahora sólo hay que normalizar las relaciones que hayan cambiado al mezclar los esquemas lógicos locales y sólo hay que probar las transacciones que requieran acceso a áreas que hayan sufrido algún cambio. 10. Estudiar el crecimiento futuro En este paso, se trata de comprobar que el esquema obtenido puede acomodar los futuros cambios en los requisitos con un impacto mínimo. Si el esquema lógico se puede extender fácilmente, cualquiera de los cambios previstos se podrá incorporar al mismo con un efecto mínimo sobre los usuarios existentes. 11. Dibujar el diagrama entidad-relación final Una vez validado el esquema lógico global, ya se puede dibujar el diagrama entidad-relación que representa el modelo de los datos de la empresa que son de Formando Emprendedores de Calidad para un Mundo Empresarial 16 Instituto de Educación Superior “San Ignacio de Monterrico” interés. La documentación que describe este modelo (incluyendo el esquema relacional y el diccionario de datos) se debe actualizar y completar. 12. Revisar el esquema lógico global con los usuarios Una vez más, se debe revisar con los usuarios el esquema global y la documentación obtenida para asegurarse de que son una fiel representación de la empresa. Formando Emprendedores de Calidad para un Mundo Empresarial 17 Instituto de Educación Superior “San Ignacio de Monterrico” NORMALIZACION La normalización es una técnica para diseñar la estructura lógica de los datos de un sistema de información en el modelo relacional, desarrollada por E. F. Codd en 1972. Es una estrategia de diseño de abajo a arriba: se parte de los atributos y éstos se van agrupando en relaciones (tablas) según su afinidad. Aquí no se utilizará la normalización como una técnica de diseño de bases de datos, sino como una etapa posterior a la correspondencia entre el esquema conceptual y el esquema lógico, que elimine las dependencias entre atributos no deseadas. Las ventajas de la normalización son las siguientes: - Evita anomalías en inserciones, modificaciones y borrados. - Mejora la independencia de datos. - No establece restricciones artificiales en la estructura de los datos. Uno de los conceptos fundamentales en la normalización es el de dependencia funcional. Una dependencia funcional es una relación entre atributos de una misma relación (tabla). La dependencia funcional es una noción semántica. Si hay o no dependencias funcionales entre atributos no lo determina una serie abstracta de reglas, sino, más bien, los modelos mentales del usuario y las reglas de negocio de la organización o empresa para la que se desarrolla el sistema de información. Cada dependencia funcional es una clase especial de regla de integridad y representa una relación de uno a muchos. En el proceso de normalización se debe ir comprobando que cada relación (tabla) cumple una serie de reglas que se basan en la clave primaria y las dependencias funcionales. Cada regla que se cumple aumenta el grado de normalización. Si una regla no se cumple, la relación se debe descomponer en varias relaciones que sí la cumplan. La normalización se lleva a cabo en una serie pasos. Cada paso corresponde a una forma normal que tiene unas propiedades. Conforme se va avanzando en la normalización, las relaciones tienen un formato más estricto (más fuerte) y, por lo tanto, son menos vulnerables a las anomalías de actualización. El modelo relacional sólo requiere un conjunto de relaciones en primera forma normal. Las restantes Formando Emprendedores de Calidad para un Mundo Empresarial 18 Instituto de Educación Superior “San Ignacio de Monterrico” formas normales son opcionales. Sin embargo, para evitar las anomalías de actualización, es recomendable llegar al menos a la tercera forma normal. Primera forma normal (1FN) Una relación está en primera forma normal si, y sólo si, todos los dominios de la misma contienen valores atómicos, es decir, no hay grupos repetitivos. Si se ve la relación gráficamente como una tabla, estará en 1FN si tiene un solo valor en la intersección de cada fila con cada columna. Si una relación no está en 1FN, hay que eliminar de ella los grupos repetitivos. Un grupo repetitivo será el atributo o grupo de atributos que tiene múltiples valores para cada tupla de la relación. Hay dos formas de eliminar los grupos repetitivos. En la primera, se repiten los atributos con un solo valor para cada valor del grupo repetitivo. De este modo, se introducen redundancias ya que se duplican valores, pero estas redundancias se eliminarán después mediante las restantes formas normales. La segunda forma de eliminar los grupos repetitivos consiste en poner cada uno de ellos en una relación aparte, heredando la clave primaria de la relación en la que se encontraban. Un conjunto de relaciones se encuentra en 1FN si ninguna de ellas tiene grupos repetitivos. Segunda forma normal (2FN) Una relación está en segunda forma normal si, y sólo si, está en 1FN y, además, cada atributo que no está en la clave primaria es completamente dependiente de la clave primaria. La 2FN se aplica a las relaciones que tienen claves primarias compuestas por dos o más atributos. Si una relación está en 1FN y su clave primaria es simple (tiene un solo atributo), entonces también está en 2FN. Las relaciones que no están en 2FN pueden sufrir anomalías cuando se realizan actualizaciones. Para pasar una relación en 1FN a 2FN hay que eliminar las dependencias parciales de la clave primaria. Para ello, se eliminan los atributos que son funcionalmente dependientes y se ponen en una nueva relación con una copia de su determinante (los atributos de la clave primaria de los que dependen). Formando Emprendedores de Calidad para un Mundo Empresarial 19 Instituto de Educación Superior “San Ignacio de Monterrico” Tercera forma normal (3FN) Una relación está en tercera forma normal si, y sólo si, está en 2FN y, además, cada atributo que no está en la clave primaria no depende transitivamente de la clave primaria. La dependencia es transitiva si existen las dependencias , , siendo , , atributos o conjuntos de atributos de una misma relación. Aunque las relaciones en 2FN tienen menos redundancias que las relaciones en 1FN, todavía pueden sufrir anomalías frente a las actualizaciones. Para pasar una relación de 2FN a 3FN hay que eliminar las dependencias transitivas. Para ello, se eliminan los atributos que dependen transitivamente y se ponen en una nueva relación con una copia de su determinante (el atributo o atributos no clave de los que dependen). Forma normal de Boyce-Codd (BCFN) Una relación está en la forma normal de Boyce-Codd si, y sólo si, todo determinante es una clave candidata. La 2FN y la 3FN eliminan las dependencias parciales y las dependencias transitivas de la clave primaria. Pero este tipo de dependencias todavía pueden existir sobre otras claves candidatas, si éstas existen. La BCFN es más fuerte que la 3FN, por lo tanto, toda relación en BCFN está en 3FN. La violación de la BCFN es poco frecuente ya que se da bajo ciertas condiciones que raramente se presentan. Se debe comprobar si una relación viola la BCFN si tiene dos o más claves candidatas compuestas que tienen al menos un atributo en común. Resumen El diseño de bases de datos consta de tres etapas: diseño conceptual, lógico y físico. El diseño lógico es el proceso mediante el que se construye un esquema que representa la información que maneja una empresa, basándose en un modelo lógico determinado, pero independientemente del SGBD concreto que se vaya a utilizar para implementar la base de datos e independientemente de cualquier otra consideración física. Formando Emprendedores de Calidad para un Mundo Empresarial 20 Instituto de Educación Superior “San Ignacio de Monterrico” Las dos fases de que consta el diseño lógico son la construcción y validación de los esquemas lógicos locales para cada vista de usuario, y la construcción y validación de un esquema lógico global. Cada una de estas fases consta de una serie de pasos. Un paso importante es la conversión del esquema conceptual a un esquema lógico adecuado al modelo relacional. Para ello, se deben hacer algunas transformaciones: eliminar las relaciones de muchos a muchos, eliminar las relaciones complejas, eliminar las relaciones recursivas, eliminar las relaciones con atributos, eliminar los atributos multievaluados, reconsiderar las relaciones de uno a uno y eliminar las relaciones redundantes. Los esquemas lógicos se pueden validar mediante la normalización y frente a las transacciones de los usuarios. La normalización se utiliza para mejorar el esquema, de modo que éste satisface ciertas restricciones que evitan la duplicidad de datos. La normalización garantiza que el esquema resultante está más próximo al modelo de la empresa, es consistente, tiene la mínima redundancia y la máxima estabilidad. Las restricciones de integridad son las restricciones que se imponen para que la base de datos nunca llegue a un estado inconsistente. Hay cinco tipos de restricciones de integridad: datos requeridos, restricciones de dominio, integridad de entidades, integridad referencial y reglas de negocio. Para garantizar la integridad referencial se debe especificar el comportamiento de las claves ajenas: si aceptan nulos y qué hacer cuando se borra la tupla a la que se hace referencia, o cuando se modifica el valor de su clave primaria. 6. SISTEMA DE GESTION DE BASE DE DATOS Para plasmar los niveles en el enfoque o modelo de datos seleccionado, es necesario disponer de una aplicación que actúe de interfaz entre el usuario, los modelos y el sistema físico. Esta es la función que desempeñan los SGBD (Sistemas de Gestión de Base de Datos), y que pueden definirse como un paquete generalizado de software, que se ejecuta en un sistema computacional anfitrión, centralizando los accesos a los datos y actuando de interfaz entre los datos físicos y el usuario. Las principales funciones que debe cumplir un SGBD Formando Emprendedores de Calidad para un Mundo Empresarial 21 Instituto de Educación Superior “San Ignacio de Monterrico” se relacionan con la creación y mantenimiento de la base de datos, el control de accesos, manipulación de datos de acuerdo a las necesidades del usuario, cumplimiento de las normas de tratamiento de datos, evitar redundancias e inconsistencias y mantener la integridad. Se han señalado como componentes básicos los siguientes: 1. Un lenguaje de definición de esquema conceptual. 2. Un sistema de diccionario de datos. 3. Un lenguaje de especificación de paquetes de entrada/salida. 4. Un lenguaje de definición de esquemas de base de datos. 5. Una estructura simétrica de almacenamiento de datos. 6. Un módulo de transformación lógica a física. 7. Un subsistema de privacidad de propósito general. 8. Un subsistema de integridad de propósito general 9. Un subsistema de reserva y recuperación de propósito general. 10. Un generador de programas de aplicación. 11. Un generador de programas de informes. 12. Un lenguaje de consulta de propósito general. El SGBD incorpora como herramienta fundamental 2 lenguajes: 1. El lenguaje de definición de datos (DDL, Data Definition Language) provee de medios necesarios para definir los datos con precisión, especificando las distintas estructuras. De acuerdo con el modelo de arquitectura de tres niveles, habrá un lenguaje de definición de la estructura lógica global, otro para la definición de la estructura interna, y un tercero para la definición de las estructuras externas. 2. El lenguaje de manipulación de datos (DML, Data Manipulation/ Management Language), es el encargado de facilitar a los usuarios el acceso y manipulación de los datos. Pueden diferenciarse en procedimentales (aquellos que requieren qué datos se necesitan y cómo obtenerlos) y no procedimentales (que datos se necesitan, sin especificar como obtenerlos), y Formando Emprendedores de Calidad para un Mundo Empresarial 22 Instituto de Educación Superior “San Ignacio de Monterrico” se encargan de recuperar los datos almacenados, de la inserción y supresión de datos en la base de datos, y de la modificación de los existentes. Fig.1. Arquitectura de un Sistema de Bases de Datos. 7. VENTAJAS DE LAS BASES DE DATOS Todas las ventajas que se obtienen a causa de la implantación de una base de datos son enormemente importantes para una empresa u organización y vienen a contribuir en el desarrollo y la funcionalidad de estas mismas. A continuación se mencionan las más importantes y sobresalientes: • Se puede compartir toda la información necesaria. • La información puede ser globalizada dentro de una empresa. • Se mantiene la integridad en la información, es decir, que elimina la información redundante y la información inconsistente. • Existe independencia de datos (ventaja mas notable), no es necesario cambiar programas o aplicaciones a la hora de cambiar datos. Formando Emprendedores de Calidad para un Mundo Empresarial 23 Instituto de Educación Superior “San Ignacio de Monterrico” OPERACIÓN DE LAS SENTENCIAS DE SQL A continuación se indican las principales operaciones que se implementan a través de sentencias SQL. a. Creación de tablas La sentencia CREATE TABLE permite definir una nueva tabla y prepararla para aceptar datos. Su sintaxis es la siguiente: CREATE TABLE nombre de tabla <definición de columnas> Las columnas de la tabla recién creada se definen en el cuerpo de la sentencia CREATE TABLE. Las definiciones de columnas aparecen en una lista separada por comas y encerrada entre paréntesis. El orden de las definiciones de las columnas determina el orden de izquierda a derecha de las columnas en la tabla. Cada definición especifica el nombre de la columna y el tipo de datos que la columna almacena. b. Inserción de datos en una tabla Crea una nueva fila de datos se añade a una base de datos relacional cuando una nueva entidad representada por una fila aparece en el mundo exterior. Una fila es la unidad de datos más pequeña que puede añadirse a una tabla. La sentencia INSERT permite añadir una nueva fila a una tabla. Su sintaxis es: INSERT INTO nombre tabla <Lista de columnas> VALUES >Lista de valores> La cláusula INTO especifica la tabla que recibirá la nueva fila y las columnas que almacenarán los datos Insertados. La cláusula VALUES especifica los valores de los datos que la nueva fila contendrá. Los nombres de columna y los valores de los datos se separan utilizando comas. c. Modificación de datos de una tabla Formando Emprendedores de Calidad para un Mundo Empresarial 24 Instituto de Educación Superior “San Ignacio de Monterrico” Los valores de los datos almacenados en una base de datos se modifican cuando se producen cambios correspondientes, de tal forma que en todo momento la información almacenada en la base de datos sea un modelo exacto del mundo real. La unidad más pequeña que puede modificarse es una columna de una fila. La sentencia UPDATE permite modificar los valores de una o más columnas de las filas seleccionadas de una tabla. Debe respetarse la siguiente sintaxis: UPDATE nombre de tabla SET nombre de columna =expresión WHERE condición El nombre de tabla identifica la tabla en que se realizará la actualización. La condición que acompaña a la cláusula WHERE sirve para seleccionar las filas de la tabla que serán modificadas. La cláusula SET es una lista de asignaciones separadas por comas. Cada asignación identifica una columna destino a actualizar y especifica cómo calcular el nuevo valor para dicha columna. d. Eliminación de registros y datos Normalmente, una fila de datos se suprime de una tabla cuando la entidad representada por la fila desaparece del mundo exterior. La unidad más pequeña de datos que puede ser suprimida es una única fila. La sentencia DELETE permite eliminar filas seleccionadas de una sola tabla. La sintaxis de la sentencia DELETE es como sigue: DELETE FROM nombre de tabla WHERE condición La cláusula FROM especifica el nombre de la tabla de la que se eliminarán filas. La condición de la cláusula WHERE selecciona las filas que serán suprimidas. Obviamente si ninguna de las filas satisface dicha condición, ninguna de ellas será eliminada. e. Consultas de datos Formando Emprendedores de Calidad para un Mundo Empresarial 25 Instituto de Educación Superior “San Ignacio de Monterrico” Las consultas de selección se utilizan para obtener información de las bases de datos, esta información es devuelta en forma de conjunto de registros. La sintaxis básica de una consulta de selección es la siguiente: SELECT Lista de campos FROM Nombre de tabla WHERE Condicion En donde Lista de Campos es la relación de campos que se desean recuperar y Nombre de Tabla identifica a la tabla, origen de los mismos. El resultado de una consulta SQL es siempre una tabla de datos, semejante a las tablas almacenadas en la base de datos. Generalmente los resultados de la consulta generarán una tabla con varías columnas y varias filas. Las consultas más sencillas solicitan columnas de datos de una única tabla en la base de datos. f. Eliminación de tablas Cuando se quiere destruir una tabla existente que ya no es necesaria se debe utilizar la sentencia DROP TABLE cuya sintaxis es: DROPTABLE nombre de tabla El nombre de la tabla en la sentencia identifica la tabla a eliminar. Formando Emprendedores de Calidad para un Mundo Empresarial 26 Instituto de Educación Superior “San Ignacio de Monterrico” TIPOS DE DATOS El tipo de datos de integridad es la definición del tipo de datos que cada columna de la tabla (entidad) permite almacenar. Los siguientes tipos de datos son los que proporciona el MBD SQL Server Tipo de datos Tamaño de Intervalo almacenamiento Byte 1 byte 0 a 255 Boolean 2 bytes True o False Integer 2 bytes -32,768 a 32,767 Long 4 bytes -2,147,483,648 a 2,147,483,647 4 bytes -3,402823E38 (entero largo) Single (coma flotante/ (coma –1,401298E-45 para valores negativos; 1,401298E-45 a 3,402823E38 para valores precisión simple) Double a positivos 8 bytes -1.79769313486231E308 flotante/ -4,94065645841247E-324 precisión doble) a para valores negativos; 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos Currency 8 bytes -922.337.203.685.477,5808 (entero a escala) Decimal a 922.337.203.685.477,5807 14 bytes +/-79.228.162.514.264.337.593.543.950.335 sin punto decimal; +/-7,9228162514264337593543950335 con 28 posiciones a la derecha del signo decimal; el número más pequeño distinto de cero es +/-0,0000000000000000000000000001 Datetime 8 bytes 1 de enero de 100 a 31 de diciembre de 9999 Varchar 10 bytes + longitud Desde 0 a 2.000 millones (longitud de la cadena variable) Char Longitud (longitud fija) cadena Definido por el Número usuario de la Desde 1 a 65.400 aproximadamente requerido El intervalo de cada elemento es el mismo que el por los elementos intervalo de su tipo de datos. Formando Emprendedores de Calidad para un Mundo Empresarial 27 Instituto de Educación Superior “San Ignacio de Monterrico” (utilizando Type) binary Imágenes Formando Emprendedores de Calidad para un Mundo Empresarial 28 Instituto de Educación Superior “San Ignacio de Monterrico” OPERADORES EN SQL Operadores Lógicos Operador Uso AND Es el “y” lógico. Evalúa dos condiciones y devuelve un valor de verdad sólo si ambas son ciertas. OR Es el “o” lógico. Evalúa dos condiciones y devuelve un valor de verdad si alguna de las dos es cierta. NOT Negación lógica. Devuelve el valor contrario de la expresión. 1. Operadores de Comparación Operador Uso < Menor que > Mayor que <> Distinto de <= Menor ó Igual que >= Mayor ó Igual que BETWEEN Utilizado para especificar un intervalo de valores. LIKE Utilizado en la comparación de un modelo In Utilizado para especificar registros de una base de datos 2. Funciones de Agregado Las funciones de agregado se usan dentro de una cláusula SELECT en grupos de registros para devolver un único valor que se aplica a un grupo de registros. Comando Descripción AVG Utilizada para calcular el promedio de los valores de un campo determinado Utilizada para devolver el número de registros de la selección Utilizada para devolver la suma de todos los valores de un campo determinado Utilizada para devolver el valor más alto de un campo especificado Utilizada para devolver el valor más bajo de un campo especificado COUNT SUM MAX MIN EJEMPLOS Lógicos: Formando Emprendedores de Calidad para un Mundo Empresarial 29 Instituto de Educación Superior “San Ignacio de Monterrico” SELECT * FROM Empleados WHERE Edad > 25 AND Edad < 50 SELECT * FROM Empleados WHERE (Edad > 25 AND Edad < 50) OR Sueldo = 100 SELECT * FROM Empleados WHERE NOT Estado = 'Soltero' SELECT * FROM Empleados WHERE (Sueldo > 100 AND Sueldo < 500) OR (Provincia = 'Trujillo' AND Estado = 'Casado') Formando Emprendedores de Calidad para un Mundo Empresarial 30 Instituto de Educación Superior “San Ignacio de Monterrico” OTROS OPERADORES El operador Like Se utiliza para comparar una expresión de cadena con un modelo en una expresión SQL. Su sintaxis es: expresión Like modelo En donde expresión es una cadena modelo o campo contra el que se compara expresión. Se puede utilizar el operador Like para encontrar valores en los campos que coincidan con el modelo especificado. Por modelo puede especificar un valor completo (Ana María), o se puede utilizar una cadena de caracteres comodín como los reconocidos por el sistema operativo para encontrar un rango de valores (Like An %). El operador Like se puede utilizar en una expresión para comparar un valor de un campo con una expresión de cadena. Por ejemplo, si introduce Like C% en una consulta SQL, la consulta devuelve todos los valores de campo que comiencen por la letra C. Ejemplos: SELECT * FROM EMPLEADOS WHERE NOMBRES LIKE 'A%' Todo lo que comience por A Todo lo que comience por cualquier SELECT * FROM EMPLEADOS WHERE NOMBRES LIKE '%NG' carácter y luego siga NG SELECT * FROM EMPLEADOS WHERE NOMBRES LIKE '[AF]%' Todo lo que comience por A ó F Todo lo que comience por cualquier SELECT * FROM EMPLEADOS WHERE NOMBRES LIKE '[A-F]%' letra comprendida entre la A y la F Todo lo que comience por A y la SELECT * FROM EMPLEADOS WHERE NOMBRES LIKE '[A^B]%' segunda letra no sea una B El Operador In Este operador devuelve aquellos registros cuyo campo indicado coincide con alguno de los en una lista. Su sintaxis es: expresión [Not] In(valor1, valor2, . . .) SELECT * FROM Pedidos WHERE Provincia In (‘Trujillo’, 'Arequipa', 'Abancay’) Formando Emprendedores de Calidad para un Mundo Empresarial 31 Instituto de Educación Superior “San Ignacio de Monterrico” La cláusula WHERE La cláusula WHERE puede usarse para determinar qué registros de las tablas enumeradas en la cláusula FROM aparecerán en los resultados de la instrucción SELECT. Después de escribir esta cláusula se deben especificar las condiciones expuestas en los apartados anteriores. Si no se emplea esta cláusula, la consulta devolverá todas las filas de la tabla. WHERE es opcional, pero cuando aparece debe ir a continuación de FROM. SELECT Apellidos, Salario FROM Empleados WHERE Salario = 21000 SELECT IdProducto, Existencias FROM Productos WHERE Existencias <= NuevoPedido Formando Emprendedores de Calidad para un Mundo Empresarial 32 Instituto de Educación Superior “San Ignacio de Monterrico” FUNCIONES Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las consultas. Se utilizan dentro de las expresiones y actuan con los valores de las columnas, variables o constantes. Se pueden incluir en las clásulas SELECT, WHERE y ORDER BY. Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos: Funciones Aritméticas Función ABS(n) CEIL(n) FLOOR(n) MOD(m,n) Cometido Calcula el valor absoluto de n. Calcula el valor entero inmediatamente superior o igual a n. Calcula el valor entero SIGN(n) select ceil(15.7) from dual; select floor(15.7) from Calcula el resto resultante de dividir select mod(11,4) from m entre n. dual; decimales. Si n<0 el redondeo se efectua a por la izquierda del punto decimal. TRUNC(m,n) dual; dual; Calcula el redondeo de m a n SQRT(n) select abs(-15) from inmediatamante inferior o igual a n. POWER(m,n) Calcula la potencia n-esima de m. ROUND(m,n) Ejemplo Calcula la raíz cuadrada de n. Calcula m truncado a n decimales (n puede ser negativo). select power(3,2) from dual; 15 16 15 3 9 select round(123.456,1) 123.5 from dual; select sqrt(4) from dual; 2 select trunc(123.456,1) from 123.4 dual; Calcula el signo de n, devolviendo -1 select sign(-12) from si n<0, 0 si n=0 y 1 si n>0. Resultado dual; -1 Funciones de Cadenas de Caracteres Función Cometido Ejemplo Resultado Formando Emprendedores de Calidad para un Mundo Empresarial 33 Instituto de Educación Superior “San Ignacio de Monterrico” CHR(n) ASCII(cad) Devuelve el carácter cuyo select chr(65) from valor codificado es n. dual; Devuelve el valor ascii de select ascii('A') from cad. dual; Devuelve cad1 CONCAT(cad1,cad2) concatenada con cad2. Esta función es esquivalente al operador ||. LOWER(cad) select concat(concat(nombre,' es '),oficio) from emp; Devuelve la cadena cad select con todas sus letras lower('MinUsCulAs') A 65 Cano es Presidente, etc. minusculas convertidas a minúsculas. from dual; UPPER(cad) Devuelve la cadena cad select con todas sus letras upper('maYuSCulAs') MAYUSCULAS convertidas a mayúsculas. from dual; INITCAP(cad) Devuelve cad con el primer select initcap('isabel') caracter en mayúsculas. from dual; Isabel Devuelve cad1 con LPAD(cad1,n,cad2) longitud n, y ajustada a la select lpad('P',5,'*') from derecha, rellenando por la dual; ****P izquierda con cad2. Devuelve cad1 con RPAD(cad1,n,cad2) longitud n, y ajustada a la select rpad('P',5,'*') izquierda, rellenando por la from dual; P**** derecha con cad2. Devuelve cad en la que cada ocurrencia de la REPLACE(cad,ant,nue) cadena ant ha sido sustituida por la cadena select replace('digo','i','ie') diego from dual; nue. Devuelve la sudcadena de SUBSTR(cad,m,n) cad compuesta por n caracteres a partir de la posicion m. LENGTH(cad) select substr('ABCDEFG',3,2) CD from dual; Devuelve la longitud de select length('cadena') cad. from dual; 6 Funciones de Manejo de Fechas Formando Emprendedores de Calidad para un Mundo Empresarial 34 Instituto de Educación Superior “San Ignacio de Monterrico” Función SYSDATE Cometido Devuelve la fecha y hora actuales. Devuelve la fecha d ADD_MONTHS(d,n) incrementada en n meses. Devuelve la fecha LAST_DAY(d) del último día del mes de d. Devuelve la MONTHS_BETWEEN(d1, diferencia en meses d2) entre las fechas d1 y d2. Ejemplo select sysdate from dual; select add_months(sysdate,4) from dual; select last_day(sysdate) from dual; Resultado 14-MAR-97 14-JUL-97 31-MAR-97 select months_between(sysdate,'01- 2.43409424 JAN-97') from dual; Devuelve la fecha del primer día de la NEXT_DAY(d,cad) semana cad después de la fecha select next_day(sysdate, 'sunday') from dual; 16-MAR-97 d. Funciones de Conversión de Tipos Función Cometido Ejemplo Resultado Convierte la cadena cad a un select TO_NUMBER(cad,fmto) número, opcionalmente de to_number('12345') 124345 acuerdo con el formato fmto. from dual; Convierte la fecha d a una TO_CHAR(d, fmto) cadena de caracteres, opcionalmente de acuerdo con el formato fmto. select to_char(sysdate) from '14-MAR-97' dual; Convierte la cadena cad de TO_DATE(cad,fmto) tipo varchar2 a fecha, select to_date('1-JAN- opcionalmente de acuerdo 97') from dual; 01-JAN-97 con el formato fmto. Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentación de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan. Máscaras de Formato Numéricas Formando Emprendedores de Calidad para un Mundo Empresarial 35 Instituto de Educación Superior “San Ignacio de Monterrico” Formato Cometido cc ó scc Ejemplo select to_char(sysdate,'cc') from Valor del siglo. y,yyy ó sy,yyy Resultado dual; Año con coma, con o sin select to_char(sysdate,'y,yyy') signo. from dual; yyyy ó yyy ó yy ó Año sin signo con cuatro, select to_char(sysdate,'yyyy') y tres, dos o un dígitos. from dual; q Trimestre. ww ó w mm ddd ó dd ó d hh ó hh12 ó hh24 mi 1997 1 dual; Número de la semana del select to_char(sysdate,'ww') from año o del mes. dual; select to_char(sysdate,'mm') Número del día del año, del select to_char(sysdate,'ddd') mes o de la semana. from dual; La hora en formato 12h. o select to_char(sysdate,'hh') from 24h. dual; 073 select to_char(sysdate,'mi') from dual; Los segundos dentro del 11 03 from dual; Los minutos de la hora. ss ó sssss 1,997 select to_char(sysdate,'q') from Número del mes. 20 select to_char(sysdate,'sssss') 12 15 44159 minuto, o desde las 0 horas. from dual; Máscaras de Formato de Caracteres Formato Cometido syear ó year Año en Inglés Ejemplo select to_char(sysdate,'syear) nineteen ninety- from dual; seven month o Nombre del mes o su select to_char(sysdate,'month') mon abreviatura de tres letras. from dual; Nombre del día de la day ó dy semana o su abreviatura de tres letras. a.m. ó p.m. El espacio del día. b.c. ó a.d. select to_char(sysdate,'day') from dual; select to_char(sysdate,'a.m.') from dual; Indicador del año respecto al select to_char(sysdate,'b.c.') del nacimiento de Cristo. Resultado from dual; march friday p.m. a.d. Otras Funciones Formando Emprendedores de Calidad para un Mundo Empresarial 36 Instituto de Educación Superior “San Ignacio de Monterrico” Función Cometido Ejemplo DECODE(var, val1, Convierte el valor de select decode(oficio, cod1, val2, cod2, ..., var, de acuerdo con 'Presidente', 'P', 'Director', 'D', defecto) la codificación. GREATEST(exp1, exp2, Devuelve el mayor ...) valor de una lista. LEAST(cad,fmto) Devuelve el menor valor de una lista. Resultado P, D, X, ... 'X') from emp; sin ejemplo. sin ejemplo. sin ejemplo. sin ejemplo. Devuelve la NVL(val, exp) expresión exp si val select salario+nvl(comision,0) 450000, es NULL, y val si en from emp; 350000, ... otro caso. Formando Emprendedores de Calidad para un Mundo Empresarial 37 Instituto de Educación Superior “San Ignacio de Monterrico” CONSULTAS Y SUBCONSULTAS Definición de subconsultas. Una subconsulta es una sentencia SELECT que aparece dentro de otra sentencia SELECT. Normalmente se utilizan para filtrar una cláusula WHERE o HAVING con el conjunto de resultados de la subconsulta, aunque también pueden utilizarse en la lista de selección. Por ejemplo podríamos consultar el alquiler último de un cliente. SELECT COD_CLIENTE, NOMBRE, MARCA, MODELO FROM ALQUILERES WHERE COD_CLIENTE = 1 AND FECHA_ALQUILER = (SELECT MAX(FECHA_ALQUILER) FROM ALQUILERES WHERE COD_CLIENTE = 1) En este caso, la subconsulta se ejecuta en primer lugar, obteniendo el valor de la máxima fecha de alquiler, y posteriormente se obtienen los datos de la consulta principal. Una subconsulta tiene la misma sintaxis que una sentencia SELECT normal exceptuando que aparece encerrada entre paréntesis. La subconsulta se puede encontrar en la lista de selección, en la cláusula WHERE o en la cláusula HAVING de la consulta principal. Tiene las siguientes restricciones: • No puede contener la cláusula ORDER BY • No puede ser la UNION de varias sentencias SELECT • Si la subconsulta aparece en la lista de selección, o esta asociada a un operador igual "=" solo puede devolver un único registro. Referencias externas A menudo, es necesario, dentro del cuerpo de una subconsulta, hacer referencia al valor de una columna de la fila actual en la consulta principal, ese nombre de columna se denomina referencia externa. Una referencia externa es un campo que aparece en la subconsulta pero se refiere a la una de las tablas designadas en la consulta principal. Formando Emprendedores de Calidad para un Mundo Empresarial 38 Instituto de Educación Superior “San Ignacio de Monterrico” Cuando se ejecuta una consulta que contiene una subconsulta con referencias externas, la subconsulta se ejecuta por cada fila de la consulta principal. En este ejemplo la subconsulta aparece en la lista de selección, ejecutándose una vez por cada fila que devuelve la consulta principal. SELECT COD_EMPLEADO, NOMBRE, (SELECT MIN(FECHA_NOMINA) FROM NOMINAS WHERE COD_EMPLEADO = EMPLEADOS.COD_EMPLEADO) PRIMERA_NOMINA FROM EMPLEADOS; Anidar subconsultas Las subconsultas pueden anidarse de forma que una subconsulta aparezca en la cláusula WHERE (por ejemplo) de otra subconsulta que a su vez forma parte de otra consulta principal. SELECT COD_EMPLEADO, EMPLEADOS FROM EMPLEADOS WHERE COD_EMPLEADO IN (SELECT COD_EMPLEADO FROM NOMINAS WHERE ESTADO IN ( SELECT ESTADO FROM ESTADOS_NOMINAS WHERE EMITIDO = 'S' AND PAGADO = 'N') ) Los resultados que se obtienen con subconsultas normalmente pueden conseguirse a través de consultas combinadas ( JOIN ). SELECT COD_EMPLEADO, NOMBRE FROM EMPLEADOS WHERE ESTADO IN (SELECT ESTADO FROM ESTADOS WHERE ACTIVO = 'S') Podrá escribirse como: SELECT COD_EMPLEADO, Formando Emprendedores de Calidad para un Mundo Empresarial 39 Instituto de Educación Superior “San Ignacio de Monterrico” NOMBRE FROM EMPLEADOS, ESTADOS WHERE EMPLEADOS.ESTADO = ESTADOS.ESTADO AND ESTADOS.ACTIVO = 'S' Normalmente es más rápido utilizar un JOIN en lugar de una subconsulta, aunque esto depende sobre todo del diseño de la base de datos y del volumen de datos que tenga. Utilización de subconsultas con UPDATE Podemos utilizar subconsultas también en consultas de actualización conjuntamente con UPDATE. Normalmente se utilizan para "copiar" el valor de otra tabla. UPDATE EMPLEADOS SET SALARIO_BRUTO = (SELECT SUM(SALARIO_BRUTO) FROM NOMINAS WHERE NOMINAS.COD_EMPLEADO = EMPLEADOS.COD_EMPLEADO) WHERE SALARIO_BRUTO IS NULL La función EXISTS EXISTS es una función SQL que devuelve verdadero cuando una subconsulta retorna al menos una fila. SELECT COD_CLIENTE, NOMBRE FROM CLIENTES WHERE EXISTS ( SELECT * FROM MOROSOS WHERE COD_CLIENTE = CLIENTES.COD_CLIENTE AND PAGADO = 'N') La función EXISTS puede ser utilizada en cualquier sentencia SQL válida, SELECT, UPDATE, INSERT o DELETE. Formando Emprendedores de Calidad para un Mundo Empresarial 40 Instituto de Educación Superior “San Ignacio de Monterrico” CONSULTAS DE SELECCION Uso de Índices de las tablas Si deseamos que la sentecia SQL utilice un índice para mostrar los resultados se puede utilizar la palabra reservada INDEX de la siguiente forma: SELECT ... FROM Tabla (INDEX=Indice) ... Normalmente los motores de las bases de datos deciden que índice se debe utilizar para la consulta, para ello utilizan criterios de rendimiento y sobre todo los campos de búsqueda especificados en la cláusula WHERE. Si se desea forzar a no utilizar ningún índice utilizaremos la siguiente sintaxis: SELECT ... FROM Tabla (INDEX=0) ... Consultas con Predicado El predicado se incluye entre la cláusula y el primer nombre del campo a recuperar, los posibles predicados son: Predicado ALL TOP DISTINCT DISTINCTOW Descripción Devuelve todos los campos de la tabla Devuelve un determinado número de registros de la tabla Omite los registros cuyos campos seleccionados coincidan totalmente Omite los registros duplicados basándose en la totalidad del registro y no sólo en los campos seleccionados. ALL Si no se incluye ninguno de los predicados se asume ALL. El Motor de base de datos selecciona todos los registros que cumplen las condiciones de la instrucción SQL y devuelve todos y cada uno de sus campos. No es conveniente abusar de este predicado ya que obligamos al motor de la base de datos a analizar la estructura de la tabla para averiguar los campos que contiene, es mucho más rápido indicar el listado de campos deseados. Formando Emprendedores de Calidad para un Mundo Empresarial 41 Instituto de Educación Superior “San Ignacio de Monterrico” SELECT ALL FROM Empleados SELECT * FROM Empleados TOP Devuelve un cierto número de registros que entran entre al principio o al final de un rango especificado por una cláusula ORDER BY. Supongamos que queremos recuperar los nombres de los 25 primeros estudiantes del curso 1994: SELECT TOP 25 Nombre, Apellido FROM Estudiantes ORDER BY Nota DESC Si no se incluye la cláusula ORDER BY, la consulta devolverá un conjunto arbitrario de 25 registros de la tabla de Estudiantes. El predicado TOP no elige entre valores iguales. En el ejemplo anterior, si la nota media número 25 y la 26 son iguales, la consulta devolverá 26 registros. Se puede utilizar la palabra reservada PERCENT para devolver un cierto porcentaje de registros que caen al principio o al final de un rango especificado por la cláusula ORDER BY. Supongamos que en lugar de los 25 primeros estudiantes deseamos el 10 por ciento del curso: SELECT TOP 10 PERCENT Nombre, Apellido FROM Estudiantes ORDER BY Nota DESC El valor que va a continuación de TOP debe ser un entero sin signo. TOP no afecta a la posible actualización de la consulta. DISTINCT Omite los registros que contienen datos duplicados en los campos seleccionados. Para que los valores de cada campo listado en la instrucción SELECT se incluyan en la consulta deben ser únicos. Por ejemplo, varios empleados listados en la tabla Formando Emprendedores de Calidad para un Mundo Empresarial 42 Instituto de Educación Superior “San Ignacio de Monterrico” Empleados pueden tener el mismo apellido. Si dos registros contienen López en el campo Apellido, la siguiente instrucción SQL devuelve un único registro: SELECT DISTINCT Apellido FROM Empleados Con otras palabras el predicado DISTINCT devuelve aquellos registros cuyos campos indicados en la cláusula SELECT posean un contenido diferente. El resultado de una consulta que utiliza DISTINCT no es actualizable y no refleja los cambios subsiguientes realizados por otros usuarios. Insertar cambios en tablas USE BdEjemplo_02 GO /* Tabla CATEGORIA */ IF EXISTS (SELECT name FROM sysobjects WHERE name = 'cons_15') ALTER TABLE Categoria DROP CONSTRAINT cons_15 GO ALTER TABLE Categoria ADD IdCategoria Int IDENTITY(1,1) CONSTRAINT cons_15 PRIMARY KEY (IdCategoria) GO Uso del Inner Join USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategoría FROM Productos AS P INNER JOIN Categorías AS C Formando Emprendedores de Calidad para un Mundo Empresarial 43 Instituto de Educación Superior “San Ignacio de Monterrico” ON P.IdCategoría=C.IdCategoría USE Nwind GO SELECT P.IdPedido, P.FechaPedido, C.* FROM Pedidos AS P INNER JOIN Clientes AS C ON P.IdCliente = C.IdCliente ORDER BY P.IdCliente USE Nwind GO SELECT P.IdProducto,P. NombreProducto, C.NombreCategoría, PV.NombreCompañía FROM Productos AS P INNER JOIN Categorías AS C ON P.IdCategoría=C.IdCategoría INNER JOIN Proveedores AS PV ON P.IdProveedor= PV.IdProveedor WHERE P.IdProveedor= 1 USE Nwind GO SELECT C.IdCliente, C.NombreCompañía, P.IdPedido, P.FechaPedido FROM Clientes AS C LEFT OUTER JOIN Pedidos AS P ON P.IdCliente = C.IdCliente ORDER BY P.IdCliente Formando Emprendedores de Calidad para un Mundo Empresarial 44 Instituto de Educación Superior “San Ignacio de Monterrico” OBJETOS DE BASE DE DATOS VISTAS Consultas Las consultas sobre las vistas se tratan de igual modo que sobre las tablas. Actualizaciones La información puede ser actualizada en las vistas directamente o a través de las tablas sobre las que se definen. Existen algunas restricciones: Borrado de filas de una tabla a través de una vista La vista se debe crear con filas de una sola tabla; sin utilizar las cláusulas GROUP BY y DISTINCT; y sin utilizar funciones de grupo o referencias a pseudos-columnas (ROWNUM). Actualización de filas a través de una vista La vista ha de estar definida según las restricciones anteriores y además ninguna de las columnas a actualizar debe haber sido definida como una expresión. Inserción de filas en una tabla a través de una vista Todas las restricciones y además todas las columnas obligatorias de la tabla asociada deben estar presentes en la vista. 9.2 Vistas de más de una Tabla Se pueden definir vistas sobre más de una tabla. Por ejemplo, sobre la combinación de dos tablas. Podemos querer ver todos los datos de los empleados del departamento Administración. Formando Emprendedores de Calidad para un Mundo Empresarial 45 Instituto de Educación Superior “San Ignacio de Monterrico” SQL> create view depAdmin (cod_emp, nombre_emp, nombre_dep, dir) 2 as select e.cod_emp, e.nombre, d.nombre, d.loc 3 from emp e, dep d 4 where e.cod_dep=d.cod_dep and d.nombre='Administracion'; SQL> select * from depAdmin; COD_EMP NOMBRE_EMP NOMBRE_DEP DIR ---------- ---------- --------------- ---------101 Cano Administracion Valladolid 102 Roncal Administracion Valladolid 103 Rueda Administracion Valladolid 104 Martin Administracion Valladolid 105 Sanz Administracion Valladolid 106 Lopez Administracion Valladolid 6 rows selected. PROCEDIMIENTOS ALMACENADOS Un procedimiento es un programa dentro de la base de datos que ejecuta una acción o conjunto de acciones específicas. Un procedimiento tiene un nombre, un conjunto de parámetros (opcional) y un bloque de código. En Transact SQL los procedimientos almacenados pueden devolver valores (numérico entero) o conjuntos de resultados. Para crear un procedimiento almacenado debemos emplear la sentencia CREATE PROCEDURE. CREATE PROCEDURE <nombre_procedure> [@param1 <tipo>, ...] AS -- Sentencias del procedure Formando Emprendedores de Calidad para un Mundo Empresarial 46 Instituto de Educación Superior “San Ignacio de Monterrico” Para modificar un procedimiento almacenado debemos emplear la sentencia ALTER PROCEDURE. ALTER PROCEDURE <nombre_procedure> [@param1 <tipo>, ...] AS -- Sentencias del procedure El siguiente ejemplo muestra un procedimiento almacenado, denominado spu_addCliente que inserta un registro en la tabla "CLIENTES". CREATE PROCEDURE spu_addCliente @nombre varchar(100), @apellido1 varchar(100), @apellido2 varchar(100), @nifCif varchar(20), @fxNaciento datetime AS INSERT INTO CLIENTES (nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento) Para la ejecutar un procedimiento almacenado debemos utilizar la sentencia EXEC. Cuando la ejecución del procedimiento almacenado es la primera instrucción del lote, podemos omitir el uso de EXEC. El siguiente ejemplo muestra la ejecución del procedimiento almacenado anterior. Formando Emprendedores de Calidad para un Mundo Empresarial 47 Instituto de Educación Superior “San Ignacio de Monterrico” DECLARE @fecha_nacimiento datetime set @fecha_nacimiento = convert(datetime, '13/05/1975', 103) EXEC spu_addCliente'Pedro','Herrarte','Sanchez','00000002323', @fecha_nacimiento Siempre es deseable que las instrucciones del procedure esten dentro de un bloque TRY CATCH y controlados por una transacción. ALTER PROCEDURE spu_addCliente @ombre varchar(100), @apellido1 varchar(100), @apellido2 varchar(100), @nifCif varchar(20), @fxNaciento datetime AS BEGIN TRY BEGIN TRAN INSERT INTO CLIENTES (nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento) COMMIT END TRY BEGIN CATCH ROLLBACK PRINT ERROR_MESSAGE() END CATCH Formando Emprendedores de Calidad para un Mundo Empresarial 48 Instituto de Educación Superior “San Ignacio de Monterrico” Si queremos que los parámetros de un procedimiento almacenado sean de entradasalida debemos especificarlo a través de la palabra clave OUTPUT , tanto en la definición del procedure como en la ejecución. El siguiente ejemplo muestra la definición de un procedure con parámetros de salida. CREATE PROCEDURE spu_ObtenerSaldoCuenta @numCuenta varchar(20), @saldo decimal(10,2) output AS BEGIN SELECT @saldo = SALDO FROM CUENTAS WHERE NUMCUENTA = @numCuenta END Y para ejecutar este procedure: DECLARE @saldo decimal(10,2) EXEC spu_ObtenerSaldoCuenta '200700000001', @saldo output PRINT @saldo Un procedimiento almacenado puede devolver valores numéricos enteros a través de la instrucción RETURN. Normalmente debemos utilizar los valores de retorno para determinar si la ejecución del procedimiento ha sido correcta o no. Si queremos obtener valores se recomienda utilizar parámetros de salida o funciones escalares El siguiente ejemplo muestra un procedimiento almacenado que devuelve valores. Formando Emprendedores de Calidad para un Mundo Empresarial 49 Instituto de Educación Superior “San Ignacio de Monterrico” CREATE PROCEDURE spu_EstaEnNumerosRojos @numCuenta varchar(20) AS BEGIN IF (SELECT SALDO FROM CUENTAS WHERE NUMCUENTA = @numCuenta) < 0 BEGIN RETURN 1 END ELSE RETURN 0 END Formando Emprendedores de Calidad para un Mundo Empresarial 50