Gestion de Bases de Datos - Gerardo Jara Leal.pdf
Short Description
Download Gestion de Bases de Datos - Gerardo Jara Leal.pdf...
Description
2
Gestión de Bases de Datos
Gerardo Jara Leal
Edición ISBN:
4
Imposible sin el apoyo de mis hijas Noelia y Sandra. Sin “mis creadores” (José Luis y Josefineta) no hubiese sido factible. A mi compañía más cercana.
6
Índice TEMA 1. INTRODUCCIÓN A LA GESTIÓN DE BASES DE DATOS................................... 11 TEMA 2. MODELO ENTIDAD – RELACIÓN .................................................................... 17 TEMA 3. MODELO RELACIONAL .................................................................................. 49 TEMA 4. LENGUAJE DE DEFINICIÓN DE DATOS.......................................................... 75 TEMA 5. SQL – CONSULTAS SELECT ........................................................................... 101 TEMA 6. LENGUAJE DE MANIPULACIÓN DE DATOS ................................................. 141
8
Bloque I.- DISEÑO LÓGICO
Tema 1. INTRODUCCIÓN A LA GESTIÓN DE BASES DE DATOS
1.- ¿Qué es una Base de Datos? Podemos definir una Base de Datos como un conjunto de información que permanece en el tiempo. La Base de Datos va a estar gestionada y manipulada por un Sistema Gestor de Base de datos, de forma que los Usuarios de ese Sistema Gestor de Base de Datos van a poder: definir nuevas estructuras de esquemas de la Base de Datos, poder consultar o actualizar los datos.
Base de Datos SGBD Usuarios
Las Bases de Datos deben poder soportar el almacenamiento de grandes cantidades de información, pero también deben de tener medidas que garanticen su seguridad frente a accesos indeseados o accidentes.
T1. Introducción a la Gestión de Bases de Datos 11
2.- Sistemas Gestores de Bases de Datos (SGBD) 2.1.- Definición Podemos definir un Sistema Gestor de Base de Datos (SGBD), como un conjunto de datos inter-relacionados, estructurados y organizados; y una colección de programas que permiten gestionar y poder acceder a esos datos. El SGBD nos debe permitir realizar las siguientes operaciones o servicios: •
Crear la Base de Datos. Podremos especificar la estructura de nuestra Base de Datos, indicar los tipos de datos que la componen, indicar las restricciones de los mimos y poder indicar las distintas relaciones que existen entre los datos. Para estar operaciones usaremos el Lenguaje de Definición de Datos.
•
Manipulación de los datos. Ya sea realizando consultas, actualizaciones o inserciones de los mismos (utilizando el Lenguaje de Manipulación de Datos).
•
Controlar el acceso a los datos de los distintos usuarios mediante mecanismos de seguridad.
•
Mantener la integridad de los datos, evitando así que puedan ser transformados o borrados por cambios no autorizados.
•
Permitir la realización de copias de seguridad de nuestros datos, y también la restauración de los mismos.
2.2.- Componentes Este conjunto de programas (SGBD) debe proporcionar una serie de posibilidades que nos va a permitir guardar y explotar la información de una manera eficiente. Como componentes más importantes podemos destacar:
2.2.1.- Lenguajes Los lenguajes del SGBD van a permitir especificar los datos que van a formar parte de la Base de Datos, su estructura, las relaciones que habrá entre ellos, los controles de acceso a la misma, las reglas de integridad y las vistas de los usuarios.
Bloque I.- DISEÑO LÓGICO 12
Los principales lenguajes que nos vamos a encontrar son: •
Lenguaje de Definición de Datos (DDL), que utilizaremos para definir la estructura de la Base de datos, las vistas que tengan los usuarios de los datos y la forma en que se almacenan los mismos. En este lenguaje, se va a definir, lo que luego veremos que es el esquema conceptual y el esquema interno de la Base de Datos. Este lenguaje lo utilizarán los Administradores y los diseñadores de la Base de Datos.
•
Lenguaje de Manipulación de Datos (DML), se utiliza para leer y actualizar los datos de la Base de Datos, siendo utilizado para realizar consultas, modificaciones, eliminaciones e inserciones.
2.2.2.- Seguridad El SGBD debe proporcionar las siguientes herramientas necesarias para garantizar la seguridad e integridad de la información almacenada en nuestra Base de Datos. •
Garantizar la seguridad de los datos contra accesos no autorizados (ya sean fortuitos o malintencionados).
•
Mecanismos para implantar restricciones de integridad en la Base de Datos. Protegiendo la información contra daños accidentales.
•
Proporcionar mecanismos y herramientas para la realización de copias de seguridad y restauración de las mismas. Así mismo, debe permitir la planificación de las mismas en el tiempo.
•
Controlar el acceso concurrente a los datos, y tener mecanismos de consistencia de los mismos cuando varios usuarios actualicen los datos a la vez.
2.2.3.- Usuarios Distinguiremos entre los siguientes tipos de usuarios: 1.
Administrador: el papel más importante dentro de un SGBD, y por ese motivo lo tratamos en el siguiente punto del tema.
T1. Introducción a la Gestión de Bases de Datos
2.
Diseñador: encargado de definir el contenido y la estructura de nuestra Base de Datos, así como las restricciones a la que deben estar sometidos los datos. También tienen la función de interactuar con los usuarios para ver sus necesidades de información.
3.
Usuario final: realizaran básicamente las tareas de consulta y recuperación de datos, generación de los informes necesarios para su actividad y actualizar el contenido de la Base de Datos para mantener al día la misma.
Usuario final Diseñador Administrador
2.2.4.- Administrador Tiene una responsabilidad muy grande, ya que posee el máximo nivel de privilegios dentro de los usuarios. Una de sus tareas será la de crear los usuarios que tendrán acceso a la Base de Datos. Así las principales tareas de un Administrador de la Base de Datos (DBA) serán: •
Instalación del SGBD en el sistema informático de la empresa.
•
Creación de las distintas Bases de Datos que se vayan a gestionar.
•
Creación y mantenimiento de la estructura de las Bases de Datos.
•
Gestión de las cuentas de usuario.
•
Arrancar y parar cuando sea necesario el SGBD.
•
Establecer políticas de acceso y protocolos de trabajo para los usuarios de la Base de Datos.
•
Realizar tareas de explotación como: vigilancia del trabajo diario, comprobar cargas de acceso a los servidores, efectuar periódicamente copias de seguridad, realizar auditorías,…
Bloque I.- DISEÑO LÓGICO 14
3.- Arquitectura El objetivo de tener una arquitectura a tres niveles era el de separar los programas de aplicación de la Base de Datos física. Así tenemos tres niveles de abstracción: 1.
Nivel interno (físico). Es el más próximo al almacenamiento físico, es decir, como realmente se guardan los datos en el ordenador. Aquí se describe la estructura física de la base de datos mediante el esquema interno. Se detallará como se almacenan físicamente los datos: archivos, organización de los mismos, accesos,…
2.
Nivel externo (visión). El que tienen los usuarios, y donde se describen los esquemas externos o vistas de los usuarios de la base de datos. Aquí se tendrá una visión particular de un usuario o de un grupo.
3.
Nivel conceptual. En este nivel se describe toda la estructura de la base de datos para los usuarios mediante un esquema conceptual. Se tendrá las entidades, atributos, relaciones,...
Nivel Externo
Nivel Conceptual
Nivel Físico
4.- Modelado de Datos Uno de los aspectos más interesantes de un SGBD es proporcionar a los usuarios una visión abstracta de los datos, es decir, que el usuario va a utilizar esos datos pero no sabrá cómo están almacenados físicamente. Por eso los modelos de datos son el instrumento básico para entender esa abstracción. Son usados para la representación y resolución de problemas. Estos modelos de datos, se definen como el conjunto de herramientas conceptuales que se utilizan para describir la estructura de una base de datos: los datos, relaciones entre los mismos, restricciones,… Los podemos dividir en dos grupos: T1. Introducción a la Gestión de Bases de Datos
•
Modelos lógicos basados en objetos, que se utilizan para describir los datos a nivel conceptual y externo. El más utilizado es el Modelo Entidad – Relación.
•
Modelos lógicos basados en registros, que se usan para describir los datos en el nivel conceptual y físico. Se llaman así porque la base de datos está estructurada en registros, y cada registro define un número de campos o atributos. El modelo más aceptado de este tipo es el Modelo Relacional, que viene a representar los datos y las relaciones entre los datos mediante tablas, cuyas columnas tienen nombres únicos, donde las filas representan los registros y las columnas los campos de cada registro.
Bloque I.- DISEÑO LÓGICO 16
Tema 2. MODELO ENTIDAD – RELACIÓN 1.- Introducción El modelo Entidad / Relación (ME/R), propuesto por Peter P. Chen en sus artículos, se basa en entidades (cualquier objeto de interés para el universo descrito) que se relacionan o asocian entre sí. El ME/R es un modelo de alto nivel, que nos permitirá representar el mundo que queremos con un lenguaje, una estructura más cercana a nosotros. El ME/R lo utilizaremos dentro del proceso de creación de BD: 1.
A partir de la realidad, estudiarla (investigando, entrevistando los usuarios,...) haciendo el ANÁLISIS de requerimientos (¿Qué se quiere?). El resultado será un conjunto de requerimientos redactados de forma concisa.
2.
A partir del Análisis de requerimientos, diseñar el Esquema CONCEPTUAL de la BD con un modelo de alto nivel (ME/R).
3.
A partir del Esquema conceptual, implementar la BD en un SGBD comercial (Relacional), obteniendo el esquema lógico.
T2.Modelo Entidad - Relación 17
2.- Ejemplo de partida Se trata de una compañía, y el resultado del análisis de requerimientos es el siguiente:
•
La compañía está organizada en departamentos. Cada uno tiene nombre único, número único y un empleado que la dirige. Nos interesa la fecha que empezó a dirigirlo.
•
Cada departamento controla una serie de proyectos. Cada uno tiene nombre y número únicos.
•
De cada empleado nos interesa el nombre (nombre y apellidos), DNI, dirección, teléfono, sueldo y fecha de nacimiento. Todo empleado está asignado a un deptº y tendrá un supervisor. Puede trabajar en más de un Proyecto y trabajará un determinado número de horas a la semana en cada proyecto.
•
Queremos saber también los familiares de cada empleado, para administrar los temas de seguros. Queremos saber el nombre, fecha de nacimiento y parentesco con el empleado.
3.- Las Entidades del ME/R. 3.1.- ENTIDAD Def.: “Una persona, lugar, cosa, concepto o suceso, real o abstracto, de interés para la empresa” Por ejemplo, Los Empleados son Entidades. Llamaremos TIPO DE ENTIDAD a la estructura genérica (Empleado) y OCURRENCIA de entidad a cada una de las realizaciones concretas de ese tipo de entidad (Antonio Rico).
Bloque I.- DISEÑO LÓGICO 18
Representación gráfica Representaremos un tipo de entidad mediante un rectángulo etiquetado con el nombre del tipo de entidad:
Departamento
Proyecto
Empleado
Familiar
3.2.- Atributo Es cada una de las propiedades o características que tiene un tipo de entidad o de relación. Por ejemplo, en la entidad Empleado tendremos los atributos nombre, DNI, dirección, teléfono, sueldo y fecha de nacimiento.
Una Ocurrencia de la entidad tendrá un “valor” para cada atributo, por ejemplo, Antonio Rico, 19.999.335, 925-22.33.45, 1.500 € y 15-6-90. Para poder identificar cada ocurrencia de una entidad necesitamos que algún atributo (o conjunto de atributos) les represente unívocamente. De los atributos que cumplen la condición anterior, triaríamos uno que denominaríamos Clave Principal. Y el resto serían Claves candidatas. Imp.:”Todas la entidades han de tener una clave principal” (Es una de las restricciones del ME/R)
T2.Modelo Entidad - Relación 19
Representación de la clave principal Puede ser de dos formas:
Representaciones del Ejemplo
3.3.- Dominio Es el conjunto de posibles valores que puede tomar un atributo. P.e.: El dominio del atributo DNI seria los números enteros de 8 cifras. Más de un atributo puede compartir el mismo dominio. Por ejemplo, si incluimos el atributo fecha de incorporación a la compañía en la entidad EMPLEADO, tiene el mismo dominio que fecha_n.
Bloque I.- DISEÑO LÓGICO 20
4.- Las Relaciones del ME/R 4.1.- Relaciones Es una asociación o correspondencia entre entidades. El Tipo de Relación será la estructura genérica del conjunto de relaciones existente entre dos o más tipos de entidad. La Ocurrencia de Relación será la vinculación existente entre las ocurrencias concretas de cada uno de los tipos de entidad que intervienen en la Relación.
Representación de Relaciones La Relación se representa por un rombo, con el nombre de la relación en su interior. Uniremos el rombo con ambas Entidades por medio de líneas.
GRADO de una Relación
T2.Modelo Entidad - Relación 21
Relaciones REFLEXIVAS
2 Entidades + de 1 relación
Todas las Relaciones del ejemplo
Bloque I.- DISEÑO LÓGICO 22
4.2.- Atributos de una Relación Las relaciones también pueden tener atributos, igual que las entidades. Por ejemplo, el nº de horas que un empleado trabaja en un proyecto es un atributo de la relación trabaja (no puede ser ni de Empleado ni de Proyecto). (En el ejemplo anterior lo hemos marcado en azul)
4.3.- Tipo de Relación La CARDINALIDAD especifica el número de ocurrencias de una entidad que pueden intervenir en la relación por cada ocurrencia de la otra entidad.
Clases de Relaciones Las distintas clases de Relaciones que podemos distinguir serian: 1:1 Como máximo una ocurrencia de cada. 1:N En una entidad una ocurrencia y en la otra muchas. M:N Hay más de una ocurrencia en cada entidad
T2.Modelo Entidad - Relación 23
Ejemplo de Clases de Relaciones
5.- Modelo Extendido 5.1.- Cardinalidad máxima y mínima Cardinalidad máxima y mínima de una entidad que participa en una relación, son respectivamente el número máximo y mínimo de ocurrencias de esta entidad que están relacionadas con una ocurrencia de la otra entidad.
Bloque I.- DISEÑO LÓGICO 24
Ejemplo
5.2.- Entidades DÉBILES No todas las entidades son iguales, en las normales (REGULARES) las ocurrencias tienen existencia propia. En cambio, las entidades DEBILES, la existencia de ocurrencias dependen de la existencia de la ocurrencia de otra entidad. (Si desaparece esta última, también desaparecen las dependientes) Por ejemplo, los familiares de Antonio Rico podrían ser (Marta, mujer), (Isabel, hija) y (Pedro, hijo). Si desaparece el empleado Antonio Rico, también deberían de desaparecer sus familiares.
T2.Modelo Entidad - Relación 25
Representación Entidades Débiles Se representan mediante un doble rectángulo:
FAMILIAR La cardinalidad mínima y máxima de la entidad regular en la relación con la débil es siempre de (1,1)
Dependencia de EXISTENCIA En el ejemplo anterior diremos que la entidad débil tiene una DEPENDENCIA EN EXISTENCIA.
Dependencia de IDENTIFICACIÓN Si además de le dep. de existencia consideramos que para identificar una ocurrencia de la entidad Débil nos hace falta la clave de la entidad regular de la que depende, esta dependencia (todavía más restrictiva) la llamaremos DEPENDENCIA DE IDENTIFICACIÓN.
Bloque I.- DISEÑO LÓGICO 26
6.- Relaciones de grado mayor que 2 Las relaciones ternarias, debido a su complejidad, se pueden descomponer en tres binarias:
7.- Generalizaciones Las generalizaciones, nos proporcionan un mecanismo de abstracción que permite especializar una entidad (que se denominará supertipo) en subtipos, o lo que es igual, generalizar los subtipos en el supertipo. La abstracción correspondiente a este tipo de relación entre entidades se denomina es_un. Por ejemplo, una “Persona” es un “Animal” y un “Reptil” es un “Animal”; en este caso, “Animal” puede considerarse el supertipo y “Persona” y “Reptil” son subtipos de “Animal”. Podremos identificar generalizaciones si encontramos una serie de atributos comunes a un conjunto de entidades. Estos atributos comunes describirán el supertipo y los atributos particulares permanecerán en los subtipos. Puede ocurrir que los subtipos no tengan atributos propios; en ese caso, sólo existirán subtipos si éstos van a participar en relaciones. La representación de este tipo de relación, es un triángulo invertido, con la base paralela al rectángulo que representa el supertipo y conectado a este y a los subtipos. Las cardinalidades son siempre (1,1) en el supertipo y (0,1) en los subtipos.
T2.Modelo Entidad - Relación 27
Bloque I.- DISEÑO LÓGICO 28
EJERCICIOS
1.- Viviendas Diseñar un modelo E/R que recoja información sobre municipios, viviendas y personas. Cada persona solo puede habitar en una vivienda y residir en un municipio, pero puede ser propietaria de más de una vivienda (para este ejercicio, suponemos que una vivienda solo puede tener un propietario). Nos interesa también la relación de las personas con su cabeza de familia.
T2.Modelo Entidad - Relación 29
2.- Universidad Diseñar un modelo E/R que recoja información sobre una universidad. Se considera que: •
• • •
•
Los departamentos pueden estar en una única facultad o ser interfacultativos, agrupando en este caso, cátedras que pertenecen a facultades distintas. Una cátedra pertenece a un único departamento. Una cátedra está en una única facultad. Un profesor esta siempre asignado a un único departamento y adscrito a uno o más de una cátedra. Puede cambiar de cátedra pero no de departamento. Nos interesa la fecha en que un profesor se adscribe a una cátedra. Existen áreas de conocimiento, y todo departamento tendrá una única área de conocimiento.
Bloque I.- DISEÑO LÓGICO 30
3.- Red Bancaria El análisis de requerimientos de una determinada red bancaria es el siguiente: • • •
• • •
De cada banco nos interesa el nombre y la dirección de la sede social. Hay un código distinto para cada entidad bancaria. Cada banco tiene distintas sucursales, que se identifica internamente por un código. Cada sucursal tiene asignadas una serie de cuentas corrientes, que se identifican internamente por un código. Una cuenta puede pertenecer a uno o más de un cliente. Es posible que cada cliente pueda hacer operaciones diferentes con la cuentas. Por ejemplo, mientras que dos clientes pueden ser titulares de una misma cuenta, solo uno tiene el poder de cerrarla. Cada cliente, que se identifica por su dni, puede tener más de una cuenta, y evidentemente privilegios distintos para cada una de ellas. Cada cuenta puede tener distintas domiciliaciones asociadas a ella. Las sucursales pueden otorgar préstamos a los clientes, que no estarán asociados a las cuentas. Cada préstamo se otorga a nombre de un único cliente, y a un cliente se le puede otorgar más de un préstamo.
T2.Modelo Entidad - Relación 31
Bloque I.- DISEÑO LÓGICO 32
4.- Mundial de futbol La información que nos interesa de un campeonato mundial de futbol es la siguiente: • • • • •
Un jugador puede pertenecer a un único equipo, y no hay dos jugadores con el mismo nombre. En cada partido intervienen tres árbitros: el árbitro principal y los jueces de línea de las dos bandas. Un árbitro puede realizar una función en un partido y otra en otro. Cada partido involucra dos equipos. Un jugador siempre pertenece al mismo equipo, no puede cambiar de equipo a lo largo del mundial.
T2.Modelo Entidad - Relación 33
5.- Mariposas Realizar un modelo E/R que recoja información sobre las mariposas, los ejemplares son capturados bien para su observación, o bien para ser incluidos en una colección. •
•
•
•
•
•
Como cualquier orden natural, un ejemplar de mariposa pertenece a una especie única. Una especie pertenece a un único género, y un género a una familia natural única. Cada especie de mariposa tiene un único nombre científico, mientras que su nombre común, que depende de la zona donde se ha cogido, también nos interesa. Ya sea por la observación o para formar parte de una colección, primero se tiene que capturar el ejemplar de mariposa. Esta captura se realiza por una única persona. Una determinada persona solo puede ser propietaria de una colección, pero los ejemplares de esa colección pueden hacer sido capturadas por otras personas. Se quiere mantener información de las familias, géneros y especies de las mariposas independientemente de que no se hayan capturado ejemplares de los mismos. Una mariposa solo puede pertenecer a una colección, y una colección está formada al menos por un ejemplar.
Bloque I.- DISEÑO LÓGICO 34
6.- Biblioteca Se quiere mantener información sobre una biblioteca, donde de cada libro se puede tener más de un ejemplar, que se pueden prestar, y también nos interesa mantener un histórico de préstamos. El análisis de requerimientos sería el siguiente: •
•
•
Cada libro (con un determinado título, ISBN, idioma, número de edificio y fecha de edición) trata solamente de un tema, está editado por una única editorial, puede estar escrito por uno o más autores, y dispondremos de unos cuantos ejemplares. Un ejemplar se puede prestar a un único lector (del cual tendremos Dni, Nombre, Dirección y Teléfono), y nos interesa la fecha en la que ha sido prestado. Un lector puede tener más de un libro prestado. En el histórico de préstamos cada ejemplar se habrá prestado a muchos lectores, y para poder gestionar el seguimiento nos interesa la fecha del préstamo y la de devolución.
T2.Modelo Entidad - Relación 35
7.- Red informática Se desea mantener información sobre el material informático de una empresa. Del análisis de requerimientos se obtiene la siguiente información: • •
• • • • •
La empresa tiene unas cuantas redes interconectadas entre ellas. La mayor parte de los ordenadores están conectados en red, aunque hay algunos que no están. También existen ordenadores que están conectados a más de una red (son puentes). Cada ordenador puede ser utilizado por uno o más empleados. Un empleado puede tener permiso para utilizar uno o más ordenadores. Un único empleado es responsable de una red que la gestiona. Este empleado puede tener bajo su responsabilidad más de una red. Cada ordenador puede tener conectado a una impresora como máximo. Existen algunos ordenadores que pueden tener conectado unos cuantos módems (se encargan de las comunicaciones de la empresa). Las aplicaciones de la empresa están almacenadas en los ordenadores y no están duplicadas (una aplicación está en un único ordenador). Los empleados que tienen acceso a un ordenador tendrán, por tanto, acceso también a las aplicaciones que contiene el ordenador. Además tendrán acceso a otras aplicaciones a través de la red. Cada aplicación tiene asignados permisos para los usuarios que pueden acceder a través de la red.
Bloque I.- DISEÑO LÓGICO 36
T2.Modelo Entidad - Relación 37
8.- Viajantes Diseñar el modelo E/R correspondiente a un sistema de información de una empresa que vende gran variedad de productos. Para la venta de estos productos, dispone de un conjunto de viajantes que realizan visitas a los clientes ofreciéndoles sus productos. La zona geográfica de influencia de la empresa está dividida en sectores no solapados que comprenden unas cuantas ciudades. Un viajante tiene asignados algunos de estos sectores. Eso no significa que tenga asignado sectores en exclusividad; más de un viajante puede tener asignado el mismo sector. A un determinado cliente le pueden ofrecer productos distintos viajantes de la empresa, pero nunca el mismo producto. Un producto puede ser ofrecido por distintos viajantes, pero siempre a distintos clientes. Un viajante no puede ofrecer todos los productos (solo algunos). A un cliente siempre le ofrece un producto el mismo viajante. Un producto es ofrecido por un viajante a clientes distintos a precios distintos.
Bloque I.- DISEÑO LÓGICO 38
9.- Vuelta ciclista Se pretende modelizar un sistema de información para controlar una prueba ciclista. Los ciclistas se inscriben en la prueba, en cuyo momento se les asigna un dorsal único, se anota su edad, nombre y nombre del equipo al que pertenece, así como el nombre del director del equipo. La prueba se realiza por etapas, de cada una se anota el número, los kilómetros que la componen, la ciudad de salida, la ciudad de llegada (con unas breves reseñas históricas, económicas y geográficas) y los puertos por los que pasa la etapa (nombre, altura y categoría). Una etapa puede tener la misma ciudad como salida y como llegada. Se quiere conocer que ciclista ha ganado en cada puerto. Quién ha ganado en cada etapa, así como quién lleva, en cada etapa, cada uno de los maillots de la prueba. De cada maillot se quiere conocer el tipo, color y premio. Restricciones: • • • •
Un puerto sólo está en una etapa. De una ciudad pueden salir varias etapas (por ejemplo, una contra-reloj que sale y finaliza en la misma ciudad, y al día siguiente sale otra etapa). A una ciudad pueden llegar varias etapas. Toda etapa y todo puerto tiene un único ganador.
T2.Modelo Entidad - Relación 39
Bloque I.- DISEÑO LÓGICO 40
10.- Alquiler de vehículos Se desea diseñar una base de datos sobre la información de las reservas de una empresa dedicada al alquiler de automóviles teniendo en cuenta que: Un determinado cliente puede tener en un momento dado hechas varias reservas. De cada cliente se almacena su Dni, nombre, dirección y teléfono. Además dos clientes se diferencian por un código único. Cada cliente puede ser avalado por otro cliente de la empresa. Una reserva la realiza un único cliente pero puede involucrar a varios coches. Es importante registrar la fecha de inicio y final de la reserva, el precio del alquiler de cada uno de los coches, los litros de gasolina en el depósito en el momento de realizar la reserva, el precio total de la reserva y un indicador de si el coche o los coches han sido entregados. No se mantienen los datos de reservas anteriores. Todo coche tiene siempre asignado un determinado garaje que no puede cambiar. De cada coche se requiere la matrícula, el modelo, el color y la marca. Cada reserva se realiza en una determinada agencia.
T2.Modelo Entidad - Relación 41
11.- Olimpiadas Las sedes olímpicas se dividen en complejos deportivos. Los complejos deportivos se subdividen en aquellos en los que se desarrolla un único deporte y en los polideportivos. Los complejos deportivos tienen áreas designadas para cada deporte con un indicador de localización (ejemplo: centro, esquina-NE, etc.). Un complejo tiene una localización, un jefe de organización individual y un área total ocupada. Los dos tipos de complejos (deporte único y polideportivo) tendrán diferentes tipos de información. Para cada tipo de sede se conservará el número de complejos junto con su presupuesto aproximado. Cada complejo celebra una serie de eventos (ejemplo: la pista del estadio puede celebrar muchas carreras distintas). Para cada evento está prevista una fecha, duración, número de participantes, número de comisarios. Una lista de todos los comisarios se conservará junto con la lista de los eventos en los que esté involucrado cada comisario, ya sea cumpliendo la tarea de juez u observador. Tanto para cada evento como para el mantenimiento se necesitará cierto equipamiento (ejemplo: arcos, pértigas, barras paralelas, etc.).
Bloque I.- DISEÑO LÓGICO 42
EJERCICIOS PROPUESTOS
1.- Zoológico La sección de reproducción experimental de un Zoo mantiene un registro de los animales y de los experimentos que realiza. El registro manual de datos relativos a los animales presenta la siguiente estructura: Genero Primate
Especie Gorila
Chimpancé
Ungulado
Caballo Burro
Mula
Animal 001 002 003 001 002 003 004 001 002 001 002 003 001 002
Nombre Fred Goliat Rowna Larry Jody Kudo Tiny Imperioso Sofia Negro Platero Daisy Roberta Rayo
Sexo M M F M F M F M F M M F N N
Además cada especie se registra información del país de origen, para los nacidos en la sección de reproducción del zoo se desea conocer quiénes fueron sus padres y, finalmente, para cada animal se mantiene un registro de incidencias con una anotación por cada incidencia digna de mención (enfermedades, comportamientos anómalos, etc.…). Los experimentos de reproducción están organizados dentro de proyectos, de los cuales se conoce el investigador que los dirige, el departamento que los organiza, los objetivos, el presupuesto y el patrocinador del mismo. Los investigadores no dependen de los departamentos, pero se sabe que un investigador puede patrocinar un proyecto. De cada proyecto, se puede realizar uno o varios experimentos. Para los experimentos de reproducción pueden emplearse machos y hembras de la misma o diferentes especies, y, en este último caso la descendencia se registra como una nueva especie. Todos los animales nacidos en esta sección del zoo son el resultado de un experimento. Las fechas de inicio y fin de cada experimento son registradas junto con el resultado obtenido, independientemente de que se considere un fracaso o un éxito. T2.Modelo Entidad - Relación 43
2.- Tenis El objetivo de la base de datos es establece el diario de un equipo de participantes en el Torneo de Tenis Grand Slam. El sistema debe mecanizar todos los encuentros que se han desarrollado desde que existe el torneo. El Grand Slam se compone de cuatro torneos anuales que se celebran en Gran Bretaña, Estados Unidos, Francia y Australia. En cada país se pueden desarrollar en distintos lugares (p.e.: en EE.UU puede desarrollarse en Forest Hill o en Flashing Meadows). Cada partido tiene asociado un premio de consolación para el perdedor que dependerá de la fase en que se encuentre el torneo. (p.e.: el perdedor de octavos de final puede ganar 5.000 dólares). El ganador de la final recibirá el premio correspondiente al torneo. Cada torneo tiene cinco modalidades: individual masculino, individual femenino, dobles masculino, dobles femenino y dobles mixtos. También hay que tener en cuenta la nacionalidad de un jugador, de forma que este puede ser apátrida o tener varias nacionalidades. El sistema debe dar respuesta a las siguientes preguntas: • • • •
Dado un año y un torneo, composición y resultado de los partidos. Lista de árbitros que participan en el torneo. Ganancias recibidas en premios por un jugador a lo largo del torneo. Lista de entrenadores que han entrenado a un jugador a lo largo del torneo y fechas en las que lo hizo.
Bloque I.- DISEÑO LÓGICO 44
3.- Campeonato de Ajedrez El club de Ajedrez de Villatortas de Arriba, ha sido encargado de la organización de los próximos campeonatos mundiales que se celebrarán en la mencionada localidad. Por este motivo, desea llevar una base de datos toda la gestión relativa a participantes, alojamientos y partidas. Teniendo en cuenta que: En el campeonato participan jugadores y árbitros: de ambos se requiere conocer el número de asociado, nombre, dirección, teléfono de contacto y campeonatos en los que han participado (como jugador o como árbitro). De los jugadores se precisa además el nivel de juego en una escala de 1 a 10. • •
•
•
• •
•
•
Ningún árbitro puede participar como jugador. Los países envían al campeonato un conjunto de jugadores y árbitros, aunque no todos los países envían participantes. Todo jugador y árbitro es enviado por un único país. Un país puede ser representado por otro país. Cada país se identifica por un número correlativo según su orden alfabético e interesa conocer además de su nombre, el número de clubes de ajedrez existente en el mismo. Cada partida se identifica por un número correlativo (Cod_P), la juegan dos jugadores y la arbitra un árbitro. Interesa registrar las partidas que juegan cada jugador y el color (blancas o negras) con el que se juega. Ha de tenerse en cuanta que un árbitro no puede arbitrar a jugadores enviados por el mismo país que le ha enviado a él. Todo participante participa en al menos una partida. Tanto jugadores como árbitros se alojan en uno de los hoteles en lo que se desarrollan las partidas, se desea conocer en qué hotel y en que fechas se ha alojado cada uno de los participantes. Los participantes pueden no permanecer en Villatortas durante todo el campeonato, sino acudir cuando tienen que jugar alguna partida alojándose en el mismo o distinto hotel. De cada hotel, se desea conocer el nombre, la dirección y el número de teléfono. El campeonato se desarrolla a lo largo de una serie de jornadas (año, mes, día) y cada partida tiene lugar en una de las jornadas aunque no tengas lugar partidas todas las jornadas. Cada partida se celebra en una de las salas de las que pueden disponer los hoteles, se desea conocer el número de entradas vendidas en la sala para cada partida. De cada sala, se desea conocer la capacidad y medios de que
T2.Modelo Entidad - Relación 45
•
dispone (radio, televisión, vídeo,…) para facilitar la retransmisión de los encuentros. Una sala puede disponer de varios medios distintos. De cada partida se pretende registrar todos los movimientos que la componen, la identificación de movimiento se establece en base a un número de orden dentro de cada partida: para cada movimiento se guardan la jugada (5 posiciones) y un breve comentario realizado por un experto.
4.- Organizaciones no gubernamentales La coordinadora nacional de Organizaciones No Gubernamentales (ONG’s) desea mantener una base de datos de las asociaciones de este tipo que existen en nuestro país. Para ello necesita almacenar información sobre cada asociación, los socios que la componen, los proyectos que realizan y los trabajadores de las mismas. De las asociaciones se desea almacenar su CIF, denominación, dirección y provincia, su tipo (ecologista, integración, desarrollo,…), así como si está declarada de utilidad pública por el Ministerio del Interior. Cada asociación está formado por socios de los que se precisa conocer su DNI, nombre, dirección, provincia, fecha de alta en la asociación, la cuota mensual con que colabora y la aportación anual que realizan (que se obtendrá multiplicando la cuota mensual por los meses del año). Los trabajadores de estas organizaciones pueden ser de dos tipos: asalariados y voluntarios. Cada trabajador se identifica por su DNI, tiene un nombre y una fecha de ingreso. Un socio no puede ser trabajador de la asociación. Los asalariados son trabajadores que cobran un sueldo y ocupan cierto cargo en la asociación. Se desea almacenar la cantidad que éstos pagan a la seguridad social y el tanto por ciento de IRPF que se le descuenta. Los voluntarios trabajan en la organización desinteresadamente, siendo preciso conocer su edad, profesión y las horas que dedican a la asociación a efectos de cálculo de estadísticas. Las asociaciones llevas a cabo proyectos a los que están asignados sus trabajadores. Un trabajador puede trabajar en diferentes proyectos de un mismo país. De cada proyecto se desea almacenar su número de identificación dentro de la asociación, en qué país se lleva a cabo y en qué zona de éste, así como el objetivo que persigue y el número de beneficiarios a los que afecta. Un proyecto se compone a su vez de sub-proyectos (que tienen entidad de proyectos). Bloque I.- DISEÑO LÓGICO 46
T2.Modelo Entidad - Relación 47
Tema 3. MODELO RELACIONAL 1.- ORIGEN Y OBJETIVOS En 1970 Codd creó el Modelo RELACIONAL, con una base matemática muy sólido (la de las relaciones), donde los datos se estructuran en forma de relaciones (tablas). Fue a partir de los años 80, cuando la tecnología lo permitió, con la salida de mejores producto, como por ejemplo el Oracle (1979). Entonces su implantación ha sido aplastante. Objetivos del Modelo Relacional: • • • • • •
Fidelidad, para originar esquemas que representen fielmente la información que existe en el dominio del problema. Independencia física, para la manera de guardar los datos no influya en su manipulación lógica. Independencia lógica, para que las vistas externas no se vean afectadas por cambios en el esquema conceptual de la B.D. Flexibilidad, para poder ofrecer los datos a cada usuario de la forma más adecuada a su aplicación. Uniformidad, las estructuras lógicas de los datos presentan un aspecto simple y uniforme (tablas). Sencillez, las características anteriores, unidas a unos lenguajes de usuario sencillos, hacen que el Modelo Relacional sea fácil de entender y de utilizar por el usuario final.
2.- ESTRUCTURA DEL MODELO RELACIONAL El Elemento base del Modelo Relacional es la RELACIÓN, que será una tabla o matriz bidimensional con unas características o restricciones.
T3.Modelo Relacional 49
La Relación viene identificada por un NOMBRE (Empleado). Las Filas, donde tenemos la información de las ocurrencias, se denominan TUPLAS. Las columnas, que serán las características que nos interesan de los individuos, se llamarán ATRIBUTOS (Campos). El conjunto de posibles valores que puede coger un atributo lo llamaremos DOMINIO. CARDINALIDAD de una relación es el número de tuplas (en el ejemplo 3). GRADO de una relación es el número de atributos (ejemplo 4). Una Clave Candidata es un atributo o conjunto de atributos que identifican unívocamente cada tupla de la relación. De todas las Claves candidatas, elegiremos una que será la Clave Principal o clave primaria.
3.- RESTRICCIONES Igual que en otros modelos, existen restricciones, estructuras u ocurrencias no permitidas. Tipos de restricciones: • •
INHERENTES: impuestas por el propio modelo. DE USUARIO (semánticas): en las cuales es el usuario quien prohíbe, porque el modelo se lo permite en determinadas circunstancias.
Bloque I.- DISEÑO LÓGICO 50
3.1.- Restricciones INHERENTES Impuestas por el propio modelo. Consideramos las siguientes: • • •
Valores atómicos: cada valor de la tabla ha de ser simple. Tuplas distintas: no puede haber dos tuplas iguales. Clave Principal: ha de existir una clave principal o primaria que identifique de forma unívoca las tuplas. (por tanto, no podrá coger valores nulos y tampoco podrá repetirse).
3.2.- Restricciones de Usuario (SEMÁNTICAS) Condiciones que ponemos para que el esquema de la BD, refleje lo mejor posible la realidad.
(a) Restricción de Dominio: •
•
•
El valor de un atributo ha de ser un valor atómico. Definiendo claramente el dominio, no aseguramos que el atributo no puede coger valores incorrectos. El dominio será de un tipo determinado, eligiendo de una gama extensa: entero corto, entero, entero largo, real, cadena de caracteres,... EMPLEADO (DNI: entero(8); Nombre: carácter(30); Dirección: carácter(30);Teléfono: entero(9); Sueldo: entero(6); Fecha_n: fecha)
(b) Restricción de Clave: Permite declarar uno o varios atributos como clave Principal o Primaria (Primary Key). “La obligatoriedad de declarar una clave principal era una restricción inherente, pero lo que es una restricción de usuario es la elección de la clave principal, y la consecuencia de que no podrá coger valores nulos ni repetidos”. Aunque estas características también las puede tener otros atributos: • •
Unicidad (UNIQUE): no se puede repetir. Obligatoriedad (NOT NULL): no puede coger un valor nulo.
T3.Modelo Relacional 51
(c) Integridad Referencial: Veamos un ejemplo:
Si en la tabla Familiar, tenemos un atributo Dni_emp) que es clave (primaria o candidata) de otra tabla (Empleado ==> DNI), todo valor de aquel atributo ha de concordar con un valor de la clave de Empleado (no podremos poner en familiar un Dni que no tenga ningún empleado en la empresa). Por lo tanto, Dni_emp es una Clave Externa (clave ajena). Las relaciones no tienen por qué ser distintas, pueden ser la misma. Así, si consideramos el supervisor, este ha de ser de la empresa. • •
EMPLEADO ( Dni, Nombre, Dirección, Teléfono, Sueldo, Fecha_n, Supervisor) Supervisor es una clave externa, pero de la misma tabla.
Representación de claves externas: •
EMPLEADO (Dni, Nombre, Dirección, Teléfono, Sueldo, Fecha_n)
•
FAMILIAR (Dni_emp, Nombre, Parentesco)
Esto impedirá que introduzcamos valores no correctos o inexistentes. ¿Qué pasaría si borramos un empleado, o modificamos su Dni? ¿Qué hacemos con sus familiares? Podríamos hacer tres acciones: • • •
No dejar borrarlo o modificarlo (NO ACTION) Borrar también los familiares o cambiarlos en cascada (CASCADE) Cambiar el valor de la clave externa al valor nulo o un valor predeterminado.
Bloque I.- DISEÑO LÓGICO 52
(d) Otras restricciones: Otros SGBD, más potentes, permiten restricciones consistentes en comprobar una determinada condición después de una actualización: •
Verificación (CHECK): si la condición no se cumple después de la actualización, se deshace. Sirve muy bien para definir un dominio, entre otras cosas. Por ejemplo: CHECK Sueldo >0 CHECK (Año(Fecha_n)2))
S(R, (A>2)) A B C 4 2 0 3 5 7
2) Proyección Selecciona un subconjunto de atributos (columnas), lo representaremos como: P (tabla, (atributos)) o también π atributos (tabla) Ejemplo: P (EMPLEADO, (Nombre, Sueldo)) El grado será menor o igual. Pero el número de tuplas también puede ser menor o igual. Las operaciones de selección y proyección se pueden encadenar: P ( S (EMPLEADO, (Departamento = 5), (Nombre, Sueldo))
T3.Modelo Relacional 57
Ejemplo P (R, (B,C)) B 2 5 0
C 0 7 3
5.2.- Operaciones BINARIAS Afectaran a dos tablas. En las dos primeras operaciones, Unión y Diferencia, las dos tablas han de tener los mismos atributos. En la otra, el Producto Cartesiano, no.
1) Unión (R U T) En el resultado estarán las tuplas de R y las de T (si alguna estuviera en las dos, no se ha de repetir). Ejemplo: P ( S(EMPLEADO, (Departamento = 5)), (Dni)) U P ( S(EMPLEADO, (Departamento=5)), (Supervisor))
Mientras que los atributos no son iguales, sus dominios son compatibles, y por tanto se puede hacer la unión. Ejemplo A 0 4 3 2
T B 0 5 3 1
C 3 0 7 1
RUT
A 4 3 0 4 3 2
RUT B 2 5 0 5 3 1
C 0 7 3 0 7 1
Bloque I.- DISEÑO LÓGICO 58
2) Diferencia (R - T) El resultado contendrá las tuplas que pertenecen a R y no pertenecen a T. Ejemplo A 4 3
R-T B 2 5
C 0 7
3) Producto Cartesiano (R x T) Aquí no cabe que los atributos sean iguales. Tendremos los atributos de R y de T, y las tuplas serán todas las posibles combinaciones de las tuplas de las dos tablas. Es decir, la primera de R combinada con todas las de T, la segunda de R combinada con todas las de T, ... Si R tiene m filas y T tiene n, el producto cartesiano tendrá m* n. Ejemplo: S ( R x T , (Num-d = Departamento)) Entonces tendremos una cosa muy útil, que es la información de los familiares con la del empleado. Esto es una cosa habitual que definiremos una operación que realiza exactamente esto reunión o join. Ejemplo V A 1 3
RxV B 2 1
RxV
R.A
R.B
R.C
V.A
V.B
4 4 3 3 0 0
2 2 5 5 0 0
0 0 7 7 3 3
1 3 1 3 1 3
2 1 2 1 2 1
T3.Modelo Relacional 59
5.3.- OPERACIONES DERIVADAS. Las operaciones que veremos ahora se pueden deducir de las anteriores.
1) Intersección (R ∩ T) Entrarán en el resultado todas la tuplas presentes en las dos relaciones. R y T han de tener los mismos atributos (mejor dicho, atributos de dominios compatibles) Esta operación es equivalente a: R ∩ T = R - (R-T) Ejemplo
A 0
R∩T B C 0 3
2) División (R/T) R actúa como dividendo, y T como divisor. Se ha de cumplir que los atributos de T sean un subconjunto (estricto) de los de R. Llamaremos t a los atributos de T y ra los de R, y se cumple que t < r. Llamaremos q a los atributos de R que no pertenecen a T, es decir, q = r - t. El resultado de la división tendrá los atributos q, y aparecerá una tupla fq cuando, por cualquier tupla de T ft existe una tupla de R fr que es la combinación de la de T y la del resultado: fr = ft + fq La utilización de la división es muy ocasional, en consultas del estilo del ejemplo (trabajadores que trabajan en todos los proyectos,...) Ejemplo Z A 3
R/Z
R/Z
B 5
C 7
Bloque I.- DISEÑO LÓGICO 60
3) Reunión (R * T) La operación de REUNIÓN (JOIN), también llamada unión natural, es de las más importantes del álgebra relacional. Es el resultado de realizar el producto cartesiano entre las dos tablas, y después aplicar una selección preestablecida que se denomina selección o condición de la reunión. La condición puede ser cualquiera, pero habitualmente será una igualdad entre dos atributos del mismo nombre (o mismo dominio). La reunión más utilizada será una reunión entre dos tablas con la condición de igualdad entre la clave de una, y la clave externa de otra (que hace de referencia a la primera). En estos casos no cabe que estén presentes los dos atributos que se utilizan para la igualdad, con uno es suficiente. Esta reunión es la REUNIÓN NATURAL. Ejemplo Y A 5 4 2 6
B 7 5 0 5
RUT C 3 6 3 0
D 2 3 1 1
R * Y (R.B=Y.B)
R.A
R.B=Y.B
R.C
Y.A
Y.C
Y.D
3 3 0
5 5 0
7 7 3
4 6 2
6 0 3
3 1 1
T3.Modelo Relacional 61
EJERCICIOS
1.- Viviendas PERSONA (DNI, Nombre, CodVivienda,…, DNICabFamilia, CodMunicipio) VIVIENDA (CodVivienda, Descripcion,… DNIPropietario) MUNICIPIO (CodMunicipio, Descripcion)
2.- Universidad AREACONOCIMIENTO (CodArea, Descripcion) DEPARTAMENTO (Codigo, Nombre, CodArea) UBICACIÓN (CodDep, CodFac) FACULTAD (CodFac, Descripcion,…) CATEDRA (CodCatedra, Nombre,…, CodFac) ADSCRIPCION (CodProf, CodCatedra) PROFESION (CodProf, Nombre,…, CodDep)
Bloque I.- DISEÑO LÓGICO 62
3.- Red Bancaria BANCO (CodBanco, Nombre, Direccion,…) SUCURSAL (CodSuc, Descripcion, CodBanco) CTACTE (CodCta, Descripcion, CodSuc) POSESION (CodCta, CodPri, DNICli) CLIENTE (DNICli, Nombre,…) PRIVILEGIO (CodPri, Descripcion) PRESTAMO (CodPrestamo, Descripcion,…) CONCESION (CodPrestamo, CodSuc, DNICli)
4.- Mundial de futbol JUGADOR (Nombre,…, CodEquipo) EQUIPO (CodEquipo, Nombre,…) INVOLUCRA (CodPartido, Equipo1, Equipo2) PARTIDO (CodPartido, Descripcion,…) INTERVIENEN (CodPartido, CodFuncion, CodArb) FUNCION (CodFuncion, Descripcion) ARBITRO (CodArbitro, Nombre,…)
T3.Modelo Relacional 63
5.- Mariposas COLECCIÓN (CodColeccion, Nombre,…) PERSONA (DNI, Nombre,…) EJEMPLAR (CodEjemplar, Descripcion,…, CodEspecie) POSEE (CodColeccion, DNI, CodEjemplar) ESPECIE (CodEspecie, Descripcion,…, NombreCientifico, CodGenero) NOMBRE_CIENTIFICO (NombreCientifico) ZONA (CodZona, Nombre) NOMBRE_COMUN (CodNombreComun, Nombre) TIENE (CodEspecie, CodZona, CodNombreComun) GENERO (CodGenero, Descripcion,…, CodFamilia) FAMILIA (CodFamilia, Nombre)
6.- Biblioteca LIBRO (Titulo, ISBN, Idioma, NumEd, FechaEdicion, CodTema, CodEditiorial)
TEMA (CodTema, Descripcion) EDITORIAL (CodEditorial, Nombre) AUTOR (DNI, Nombre) ESCRITOR (DNI, ISBN) EJEMPLAR (NumEjemplar, ISBN, DNILector, FechaPrestamo) LECTOR (DNI, Nombre, Direccion, Telefono) HISTORICO (DNI, NumEjemplar, FechaPrestamo, FechaDevolucion) Bloque I.- DISEÑO LÓGICO 64
7.- Red informática RED (NumRed, Nombre, DNIResp) CONEXIÓN_RED (NumRed1, NumRed2) EMPLEADO (DNI, Nombre,…) ORDENADOR (NumEquipo, Descripcion, Caracterisitcas,…) CONEXIÓN_ORD (NumEquipo, NumRed) UTILIZA (DNIEmp, NumEquipo) MODEM (NumModem, Descripcion, NumEquipo) IMPRESORA (NumImpr, Descripcion, NumEquipo) APLICACIÓN (CodApli, Descripcion, NumEquipo) PERMISO (CodPermiso, Descripcion) ASIGNADO (CodPermiso, CodApli, DNIEmp)
8.- Viajantes CIUDAD (Codigo, Nombre,…, CodSector) SECTOR (CodSector, Nombre,…) VIAJANTE (DNIViajante, Nombre,…) ASIGNADO (CodSector, DNIViajante) PRODUCTO (CodProd, Descripcion,…) CLIENTE (CodCli, Nombre) OFRECE (CodCli, CodProd, DNIViajante, Precio)
T3.Modelo Relacional 65
9.- Vuelta ciclista EQUIPO (NomEquipo, Director) CICLISTAS (Dorsal, Nombre,…, NomEquipo) ETAPAS (Numero, Km, CiudadSal, CiudadLLeg, NumDorsalGanador) PUERTO (NombrePuerto, Categoria, Altura, EtapaNum, NDorsalGanador) CIUDAD (Nombre, ReseñaHistorica, Cultural, Economica) MAILLOTS (Tipo, Color, Premio) LLEVA (Dorsal, NumEtapa, CodigoMaillot)
10.- Alquiler de vehículos CLIENTES (CodCliente, DNI, Nombre, Direccion, Telefono, CodAvalista) RESERVA (NumReserva, FechaFin, FechaInicio, Precio, Litros, PrecioTotal, Entregados, CodCliente, CodAgencia)
AGENCIAS (CodAgencia, Descripcion) COCHES (CodCoche, Matricula, Descripcion, NumResersva, CodGaraje) GARAJES (CodGaraje, Descripcion)
Bloque I.- DISEÑO LÓGICO 66
11.- Olimpiadas SEDE (CodSede, Descripcion, Presupuesto, NumComplejos) COMPLEJO (CodComplejo, Nombre, Jefe, Localizacion, AreaTotal, CodSede)
UNIDEPORTIVO (CodComplejo, DatosUnideportivo,…) POLIDEPORTIVO (CodComplejo, DatosPolideportivo,…) AREA (CodArea, Nombre, Localizacion, CodComplejo) EVENTO (CodEvento, Descripcion, Fecha, Equipamiento, duración, NumParticipantes, NumComisarios)
PARTICIPA (CodEvento, CodComisario) COMISARIO (CodComisario, Nombre) JUEZ (CodComisario, DatosJuez,…) OBSERVADOR (CodComisario, DatosObservador,…)
12.- Ejercicios de Algebra Relacional Dado las relaciones R, T y V, realizar las siguientes operaciones de Álgebra Relacional: A 6 0 2 5
R B 4 0 5 0
C 2 6 1 3
A 0 4 5 2
T B 0 2 5 5
C 6 1 6 0
A 4 2 1 6 7
V B 6 0 3 0 5
C 4 5 7 2 3
D 3 2 0 3 1
(T - R) * V ((T - R).B = V.B) T3.Modelo Relacional 67
Solución.
A 4 5 2
T-R B 2 5 5
(T - R) * V ((T - R).B = V.B) C 1 6 0
(T-R).A
(T - R).B = V.B
(T-R).C
V.A
V.C
V.D
5 2
5 5
6 0
7 7
3 3
1 1
13.- Ejercicios de Algebra Relacional Con las mismas relaciones que en el ejercicio anterior R, T y V, realizar la siguiente operación:
P ( S( (R U T), (A > 3) ) x T, ( A, T.B ) )
A 6 0 2 5 4 5 2
RUT B 4 0 5 0 2 5 5
S( (R U T), (A > 3)
C 2 6 1 3 1 6 0
A
B
C
6 5 4 5
4 0 2 5
2 3 1 6
Bloque I.- DISEÑO LÓGICO 68
S( (R U T), (A > 3) ) x T A
B
C
T.A
T.B
T.C
6 5 4 5 6 5 4 5 6 5 4 5 6 5 4 5
4 0 2 5 4 0 2 5 4 0 2 5 4 0 2 5
2 3 1 6 2 3 1 6 2 3 1 6 2 3 1 6
0 0 0 0 4 4 4 4 5 5 5 5 2 2 2 2
0 0 0 0 2 2 2 2 5 5 5 5 5 5 5 5
6 6 6 6 1 1 1 1 6 6 6 6 0 0 0 0
P ( S( (R U T), (A > 3) ) x T, ( A, T.B ) ) A
T.B
6 5 4 6 5 4 6 5 4
0 0 0 2 2 2 5 5 5
14.- Ejercicios de Algebra Relacional Obtener las relaciones Y y Z, que aplicando las operaciones siguientes S ( P ( Y, (A, B, D)), (D 3))
T A 4 5 0 3
B 2 6 8 2
C 0 9 0 3
R D 7 5 0 1
V
A
B
C
C
5 7 5 1 8 5
3 8 3 2 6 2
3 4 0 4 2 4
4
5.- Algebra Relacional Inventarse los siguientes 3 ejercicios: a) Proponer un ejercicio de Álgebra Relacional con 3 operaciones con las relaciones que creas oportunas (una de esas operaciones tiene que ser una Reunión).
b) Lo mismo que el anterior, pero con 5 operaciones (una de ellas tiene que ser una resta, y otra un producto cartesiano).
c) Partiendo de la relación resultado final (la relación que obtenemos al final), que sea el resultado de 4 operaciones de álgebra relacional, obtener las tablas originales (una de esas operaciones relacionales tiene que ser una división).
Bloque I.- DISEÑO LÓGICO 72
Bloque II.- DISEÑO FÍSICO
73
Tema 4. LENGUAJE DE DEFINICIÓN DE DATOS 1.- Introducción Una vez que ya hemos diseñado nuestro diseño Lógico de la Base de Datos (Modelo Entidad / Relación y Modelo Relacional), pasamos a crear el diseño Físico. En primer lugar, tendremos que decidir qué Sistema Gestor de Bases de Datos utilizaremos. En nuestro caso, será el SQL Server de Microsoft. Para poder explicar el diseño Físico, utilizaremos el ejemplo de una Clínica, dónde se quiere obtener información de los Pacientes que van a realizar visitas a la clínica, y también de las Visitas que se hacen a la misma. El Modelo e-r de la Clínica sería el siguiente:
PACIENTES
1
Realizan
N
VISITAS
De dicho modelo podemos deducir que 1 paciente puede realizar MUCHAS visitas, pero que 1 visita sólo será realizada por 1 paciente, y de ahí la relación 1:N entre ambas entidades. Partiendo de este modelo e-r obtendríamos el siguiente Modelo Relacional: PACIENTES (DNI, Nombre, Dirección, CP, Ciudad, FechaNac) VISITAS (Nvisita, Fecha, DniPaciente, Concepto, Importe)
Pero para pasar al diseño Físico, todavía nos hace falta un poco más de información, como por ejemplo, el tipo de datos que corresponde a cada atributo, las restricciones que podemos encontrarnos, los valores predeterminados, … Por este motivo necesitamos la siguiente información adicional:
T5. SQL - Consultas 75
PACIENTES
Tipo de datos
Observaciones
DNI
Alfanumérico (9)
Nombre
Alfanumérico (40)
Dirección CP
Alfanumérico (50) Alfanumérico (5)
Ciudad
Alfanumérico (15)
FechaNac
Fecha
Se podrá guardar números (8) y texto (1) para la letra. Además, el campo será clave principal de la tabla. Dejaremos 40 caracteres para el nombre del paciente. Dicho nombre no podrá quedarse vacío, y se deberá rellenar obligatoriamente. Este campo sí que puede quedarse vacío Se guardará como alfanumérico y no como texto, porque algunos códigos postales empiezan por 0, y tampoco necesitamos realizar operaciones con dicho campo. Puede contener valores nulos Puede contener valores nulos, y por defecto, para los registros nuevos almacenará el valor de Alicante. Se puede dejar vacío.
VISITAS
Tipo de datos
Observaciones
Nvisita
Numérico
Fecha DniPaciente
Fecha Alfanumérico (9)
Concepto
Alfanumérico (200)
Importe
Moneda
Guardará un número correlativo, y cada visita tendrá un número distinto. Además, será clave principal de la tabla. No podrá dejarse vacío. Del mismo tipo que el campo con el que está relacionado de la tabla Pacientes. No podrá dejarse vacío. Contendrá el motivo por el cual se realiza la visita. Tampoco podrá dejarse vacío. Campo monetario, que recogerá el importe que el paciente debe de abonar. Dicho importe no puede ser inferior a 50 €, y tampoco podrá dejarse vacío.
Para poder empezar a crear el diseño Físico de nuestra base de datos, necesitamos conocer con más detalle los tipos de datos que dispone SQL Server para la definición de datos. Sólo veremos los que nos resulten más importantes para nuestro diseño y los que consideremos básicos para el diseño de bases de datos.
Bloque II.- DISEÑO FÍSICO 76
1.1.- Tipos de datos Los tipos de datos más utilizados son: a) NUMÉRICOS Dentro de los datos numéricos podemos distinguir varias categorías: ENTEROS Almacenan números sin decimales. Incluyendo los positivos (1, 2, 3,…), el 0 y los negativos (-1, -2, -3,…). Básicamente utilizaremos 4 tipos de datos: Tipo de datos Bit Tinyint Smallint Int
Almacenamiento 1/8 de byte 1 byte 2 bytes 4 bytes
Mínimo y máximo 0a1 0 a 255 -32.768 a 32767 -2.147.483.648 a 2.147.483.647
El tipo de datos BIT se utiliza para campos de tipo verdadero/falso, estado,…Hay que tener en cuenta que este tipo de datos puede tener el valor nulo, con lo que se puede encontrar en tres estados: 0, 1 y nulo. Hay que tener en cuenta también que el tipo de datos TINYINT no permite números negativos. DECIMALES y MONETARIOS Los números decimales servirán para almacenar valores con parte decimal. La información contable y financiera se expresará con los tipos de datos monetarios. Los más importantes son: Tipo de datos Decimal Numeric Money
Espacio 5 bytes 9 bytes 8 bytes
Precisión 9 19 Aprox. 18
Escala 0-5 0-9 4
Smallmoney
4 bytes
Aprox. 9
4
Mínimo y máximo -999.999.999 a 999.999.999 -1019 +1 a 1019 -1 -922.337.203.685.477,5808 a 922.337.203.685.477,5807 -2.147.483.648 a 2.147.483.647
La Precisión es el número máximo de dígitos que se almacenan en el tipo de datos. Por ejemplo, el número 21.543,98 tendrá siete dígitos. En la precisión se tendrá en cuenta todos los dígitos antes y después de la coma decimal. La Escala es el número de posiciones decimales. Así, en el ejemplo anterior, la escala sería de dos.
T4. Lenguaje de Definición de Datos 77
b) CADENAS o ALFANUMÉRICOS En este tipo de datos se guardara informaciones tales como direcciones, nombres, conceptos,… Este tipo de datos almacenará letras, números y símbolos. Los tipos de datos cadena son: Tipo de cadena Fijo Variable
Carácter Char Varchar
Unicode nChar nVarchar
Los tipos de datos Unicode están diseñados para el texto y símbolos de los diferentes idiomas (árabe, chino, japonés,…). Los tipos de datos Carácter se utilizan para cadenas empleadas en páginas de códigos específicas. Los tipos Carácter son más eficientes, ya que representan un byte por carácter, mientras que los Unicode utilizan dos por carácter. Los tipos de datos Fijo, utilizan una cantidad de espacio fija, independientemente del valor del dato. Por ejemplo, si tengo una campo definido como Char(12), y la palabra que voy a guardar es “Antonio”, aunque tenga 7 letras en el campo se guardarán los 12 definidos en el tipo de datos. Así, los tipos de datos de longitud Variable, ajustan su espacio de almacenamiento al valor que del campo, pero esto requiere dos bytes adicionales para controlar la longitud del valor. En el ejemplo anterior, para almacenar la palabra “Antonio”, emplearíamos 9 bytes, 2 para controlar la longitud y 7 para la palabra. Los tipos de datos Char y VarChar soportan hasta 8.000 caracteres por campo, y los Unicode la mitad (hasta 4.000 caracteres). Si queremos almacenar textos largos en estos tipos de datos cadena, utilizaremos VarChar (max), para cuando el tamaño supere los 8.000 bytes. Estos datos pueden almacenar hasta 2.147.483.647 caracteres (2 gigabytes). c) FECHA y HORA Muchas veces nos encontraremos con la necesidad de guardar atributos de fecha hora (fecha de la factura, fecha y hora de una visita,…). Para ello contamos con dos tipos de datos. Tipo DateTime SmallDateTime
Tamaño 8 bytes 4 bytes
Máximo y mínimo 1-ene-1753 a 31-dic-999 1-ene-1900 a 6-jun-2079
Bloque II.- DISEÑO FÍSICO 78
2.- Creación y Administración de tablas (modo gráfico) Una vez ya definido el modelo e-r y el modelo relacional, junto con los tipos de datos de cada atributo, estaremos en disposición de implementar en un sistema gestor de base de datos las distintas tablas. Para ver su funcionamiento, utilizaremos la herramienta SQL Management Studio, que pone a nuestra disposición SQL Server. Veremos cómo crear gráficamente las tablas Pacientes y Visitas, de nuestra base de datos Clínica. Para crear la Base de datos Pacientes, pulsaremos botón derecho sobre Base de Datos, y seleccionaremos Nueva Base de Datos…
Nos aparecerá el siguiente cuadro de texto, donde escribiremos el nombre de la base de datos: CLINICA.
T4. Lenguaje de Definición de Datos 79
2.1.- Creación de tablas y campos Para crear las tablas, desplegamos la base de datos CLINICA, y pulsar el botón derecho, y seleccionar NUEVA TABLA… Ahora pasaremos a crear los campos definidos en el modelo Relacional. Escribiremos el nombre del campo, y a continuación el tipo de datos que representa. En la tercera columna, indicaremos si el campo puede contener valores nulos o no se puede dejar vacío. A parte de esto, tendremos que definir cuál va a ser la clave principal de esta tabla (DNI), para ello seleccionaremos el campo DNI, y a continuación pulsamos sobre la llave de la barra de herramientas o botón derecho sobre el campo, y elegir Establecer clave Principal. Para el campo Ciudad, tendremos un valor por defecto para los registros nuevos, y así no tener que escribir su valor. Para colocar ese valor predeterminado, seleccionamos el campo y en las propiedades (parte inferior de donde se encuentra la definición de campos) elegimos Valor o enlace predeterminado, y colocamos el valor de “Alicante”.
Luego pulsaremos el icono de Guardar y le asignamos el nombre de PACIENTES.
Bloque II.- DISEÑO FÍSICO 80
Para la creación de la tabla VISITAS, seguimos los mismos pasos que con la tabla Pacientes. En esta tabla, definiremos el campo Nvisita como smallint y con la propiedad Identity, para que vaya renumerándose correlativa y automáticamente en cada nuevo registro.
Una vez creada las tablas, podemos ver su estructura desde el Explorador de objetos situado en la parte izquierda de la pantalla. Al hacer clic sobre el + que hay a la izquierda de tabla, nos aparece una carpeta que pone Columnas, donde podremos ver el nombre de los campos y el tipo de datos del mismo.
2.2.- Modificación de la estructura de una tabla Si queremos modificar cualquiera de las dos tablas creadas, sólo tenemos que pulsar botón derecho sobre la que queremos modificar y elegir la opción:
Y nos aparecerá la misma pantalla que nos apareció anteriormente de creación de tabla, y donde podemos añadir o modificar los campos que deseemos.
T4. Lenguaje de Definición de Datos 81
2.3.- Creación de índices y claves Los índices serán como una estructura interna que nos va a servir para encontrar registros en nuestra tabla de una forma más rápida. Si en nuestra tabla Pacientes se realizasen muchas búsquedas por el campo Ciudad, deberíamos crear un índice para esa columna. Para ello realizaríamos los siguientes pasos: •
Primero pulsar botón derecho sobre cualquier campo de la tabla.
•
En el cuadro de diálogo que aparece, pulsamos el botón agregar.
•
Donde elegiremos la-s columna-s que formarán parte del índice. Por defecto nos aparecerá un nombre asociado a ese índice llamado IX_PACIENTES (pero puede ser cambiado si lo deseamos)
Bloque II.- DISEÑO FÍSICO 82
De esta forma también podríamos definir la clave principal de una tabla sino lo hubiéramos hecho mediante el icono de la llave o se nos hubiera olvidado.
2.4.- Claves ajenas Para que los registros de Pacientes y Visitas estén relacionados correctamente debemos crear las claves ajenas. Estás serán las encargadas de mantener las relaciones entre ambas tablas. En nuestro ejemplo, tenemos una clave ajena para el campo DniPaciente en la tabla Visitas, y que nos va a servir para que en tabla Visitas sólo se den de alta Dni-s de Pacientes que existan, y también a mantener la integridad de los datos introducidos en ese campo. Para crear la clave ajena, iremos al diseño de la tabla, y pulsando botón derecho sobre cualquier campo, eligiendo a continuación la opción Relaciones. Llegaremos a este cuadro de dialogo:
Pulsaremos en el desplegable Especificación de tablas y columnas para elegir los campos y las tablas que forman parte de la relación. Y a continuación, sobre los tres puntos que hay a la derecha de Especificación de tablas y columnas, apareciéndonos la siguiente pantalla.
T4. Lenguaje de Definición de Datos 83
Desde donde seleccionaremos las tablas y campos que se relacionan. En nuestro ejemplo son: DNI de la tabla Pacientes con DniPaciente de la tabla Visitas. Una vez guardado, nos tiene que aparecen en el apartado de Claves de la tabla Visitas la nueva clave ajena (si no aparece, tendremos que pulsar el botón de Actualizar del explorador de objetos, el de las dos flechas verdes para que se actualice ).
2.5.- Restricciones Check Las restricciones Check nos van a ayudar a que ciertos campos cumplan unas normas o condiciones para todos los valores que introduzcamos. Así, en nuestro ejemplo hemos puesto una restricciones de que todos los Importes que introduzcamos en una visita tendrán que ser superiores a 50 €, sino no debe dejar dar de alta ese registro. Para poder dar de alta una restricción, vamos al diseño de la tabla y pulsamos botón derecho sobre la misma, y ahí elegimos la opción Restricciones Check. Apareciendo el siguiente cuadro de dialogo:
Bloque II.- DISEÑO FÍSICO 84
En la pantalla rellenaremos la Expresión que contendrá la restricción (Importe >50), y si queremos cambiar el nombre a la restricción Check también podremos hacerlo. Para que nos aparezca en el explorador de objetos, debemos guardar la tabla y pulsar actualizar para ver la restricción.
2.6.- Diagramas Si queremos tener una representación gráfica de las tablas y sus relaciones, tendremos que crearnos un diagrama. Para ello, desde el explorador de objetos, en la Base de datos CLINICA, pulsaremos el botón derecho en Diagrama de base de datos, seleccionando la opción Nuevo diagrama de base de datos. A continuación añadimos las tablas que deseamos que contenga el diagrama, obteniendo la siguiente pantalla que nos ayudará a ver la representación gráfica de nuestra estructura de tablas y campos.
T4. Lenguaje de Definición de Datos 85
Desde el panel del Diagrama también podremos realizar tareas de mantenimiento de las tablas o crearnos tablas nuevas, sin necesidad de irnos a la pantalla de diseño. Para ello pulsamos botón derecho sobre cualquier parte “blanca” del diagrama, y obtendremos el siguiente menú:
Las opciones aumentan si pulsamos el botón derecho sobre la tabla, donde incluso podremos tener varias opciones de visualización del diagrama.
Bloque II.- DISEÑO FÍSICO 86
3.- Administración de tablas (mediante SQL) 3.1.- Create table (creación de tablas) La sintaxis para la creación de tablas será la siguiente: CREATE TABLE (campo1 , campo2 , …, CONSTRAINT )
Veamos un ejemplo para ir entendiendo poco a poco la creación de tablas mediante SQL. Primero crearemos la tabla Pacientes, y luego la de Visitas que tiene la clave ajena. Pero como utilizamos el SQL Management Studio para ejecutar scripts con comandos sql. Para ello pulsaremos en Nueva Consulta de la barra de herramientas o desde la opción del menú Archivo Nuevo Consulta con conexión actual. A continuación se abre la ventana del editor de sql en blanco, pero antes debemos conectar con la Base de datos que contendrá las tablas. Esta operación se puede realizar de dos maneras: escribiendo una primera línea de código que ponga (USE Clinica) o con el desplegable de la segunda barra de herramientas, que normalmente pone Master, y tendremos que seleccionar Clínica. Una vez seleccionada la Base de datos, ya podemos escribir el siguiente código sql. CREATE TABLE Pacientes ( Dni CHAR(9) PRIMARY KEY, Nombre VARCHAR(40) NOT NULL, Direccion VARCHAR(50) NULL, CP CHAR(5) NULL, Ciudad VARCHAR(15) NULL DEFAULT (‘Alicante’), FechaNac SMALLDATETIME NULL)
Ahora, antes de ejecutar el script lo guardaremos con el icono del diskette de la barra de herramientas, y le daremos un nombre. El documento creado es un fichero de texto plano, pero que le da la extensión .sql, con lo que podríamos haberlo creado con el bloc de notas, pero no tendríamos el interfaz de corrección de errores que incorpora el Management Studio.
T4. Lenguaje de Definición de Datos 87
Una vez guardado, comprobaremos si la sintaxis escrita es correcta. Para ello, pulsaremos el icono de analizar o Ctrl+F5, y si esta todo correcto, en la parte inferior de la pantalla nos aparecerá el siguiente texto: Comandos completados correctamente. Y si hubiese algún fallo no indicaría que hay algún error en alguna línea. A continuación tenemos que ejecutar la sentencia SQL para que cree la tabla Pacientes, para ello pulsamos la tecla F5 o el botón de Ejecutar de la barra de herramientas. Y de esta forma se creará una tabla, que podremos ver en el Explorador de objetos. Pero hay que tener en cuenta, que en nuestro ejemplo, ya creamos en modo gráfico, una tabla llamada Pacientes, por lo cual, al ejecutar el script no dará un error, indicando que ya existe esa tabla Pacientes. Para solucionarlo tendremos que cambiar el nombre de la nueva tabla, por ejemplo Pacientes1. Hacemos lo mismo para la tabla Visitas. CREATE TABLE Visitas ( Nvisita SMALLINT IDENTITY(1,1) PRIMARY KEY, Fecha SMALLDATETIME NOT NULL, DniPaciente CHAR(9) NOT NULL, Concepto VARCHAR(200) NOT NULL, Importe SMALLMONEY NOT NULL CHECK (Importe>50), CONSTRAINT Fk_Visitas FOREIGN KEY (DniPaciente) REFERENCES Pacientes (Dni))
Aquí pasará lo mismo, como ya existe Visitas, nos dará un error, pero que solucionaremos al cambiar el nombre de la tabla por Visitas1.
3.1.1.- Definición de columnas Una vez visto los ejemplos, entenderemos mejor la sintaxis para la definición de las columnas de una tabla. Nombre_columna [Null | Not Null] [Default expresión] [Identity (valor inicial, incremento)]
En el argumento del tipo de datos, podremos seleccionar cualquiera de los que definimos en el apartado de Tipos de Datos (numéricos, alfanuméricos, fecha,...). Bloque II.- DISEÑO FÍSICO 88
Para cada tipo de datos, podemos colocar Null (o no poner nada en la definición) o Not Null. De esta última forma, el contenido del campo nunca podrá dejarse vacío. El valor DEFAULT recogerá el valor por defecto para el campo cuando no se halla especificado un valor durante la inserción de registros.
3.1.2.- Restricciones de integridad Nos servirán para exigir integridad de los datos del campo. Los mecanismos proporcionados por SQL son los siguientes: • • • •
Clave primaria (Primary key) Clave ajena (Foreign key) Unicidad (Unique) Limitación de valores (Check)
Clave Primaria - PRIMARY KEY Es el campo-s que suele identificar de forma única cada fila de una tabla. Así para indicar una clave principal en SQL podemos actuar de dos formas: a) A continuación del campo que será clave principal. DNI Char(9) PRIMARY KEY
b) O al final de la definición de campos mediante la cláusula CONSTRAINT. CREATE TABLE Pacientes ( …, CONSTRAINT Pk_Pacientes PRIMARY KEY(Dni))
Esta segunda forma es la única aplicable cuando la clave principal es compuesta. Por ejemplo, supongamos que tenemos una tabla de Alquiler para gestionar las películas que son alquiladas por los socios de un video club. La definición de la clave principal sería de esta segunda forma, ya que sólo puede existir un Primary Key definido por tabla. …, CONSTRAINT Pk_Alquiler PRIMARY KEY(Cod_Socio, Cod_Pelicula, Fecha_Salida)
T4. Lenguaje de Definición de Datos 89
Clave Ajena – FOREIGN KEY La clave ajena nos servirá para relacionar dos tablas y mantener la integridad referencial de las mismas. La forma de crearlas será al final de la definición de datos con la siguiente sintaxis. …, CONSTAINT FOREING KEY REFERENCES () [ON DELETE {CASCADE | NO ACTION}] [ON UPDATE {CASCADE | NO ACTION}]
En el ejemplo de la Clínica, la definición de la clave ajena sería de la siguiente forma. CONSTRAINT Fk_Visitas FOREIGN KEY (DniPaciente) REFERENCES Pacientes (Dni))
Si la tabla tuviese varias claves ajenas, tendríamos que definir tantos CONSTRAINT-s como claves ajenas tengamos. La opción ON DELETE (el NO ACTION está activo por defecto) significa que si se elimina un registro de Pacientes, por ejemplo el DNI 3, y ese paciente tiene visitas, no podrá realizarse la eliminación. Pero si esta activa la opción CASCADE, al eliminar el Dni 3, se eliminarán también todas las visitas cuyo Dni es el 3. Con la opción ON UPDATE, sucede algo parecido, si activamos CASCADE, cuando yo modifique el Dni 5 por el número 29, automáticamente todas las visitas donde aparecía el Dni 5 pasan a convertirse al Dni 29. Un ejemplo podría ser: CONSTRAINT Fk_Visitas FOREIGN KEY (DniPaciente) REFERENCES Pacientes (Dni) ON DELETE CASCADE)
Unicidad – UNIQUE Lo utilizaremos para asegurarnos que no se escriban valores duplicados en los campos que no forman parte de la clave principal. En las columnas con Unique pueden aceptar valores nulos. La sintaxis sería al final de la definición del campo: …, Direccion VarChar(50) NULL UNIQUE,
Bloque II.- DISEÑO FÍSICO 90
Limitación de valores - CHECK Se utilizan para exigir una limitación de los valores que puede aceptar un campo en concreto. Se pueden definir al final del campo donde va la restricción: Importe SMALLMONEY NOT NULL CHECK (Importe>50 AND Importe50 AND CP=’03001’),
3.2.- Alter table (modificación de tablas) Puede que después de crear una tabla, surjan modificaciones en el diseño de la misma, queriendo añadir campos, eliminar columnas,… en definitiva cambiar la estructura de la tabla original. Las operaciones que podemos realizar son: •
• •
Añadir, modificar o eliminar campos de una tabla. Por ejemplo, podemos añadir un campo como el Teléfono, o modificar el tamaño de uno ya existente (la Ciudad de 15 a 20 caracteres). Añadir o eliminar claves ajenas o primarias, por que se modifique la estructura de la tabla original, o que se relacione con una tabla nueva. Agregar o eliminar restricciones Check, Default o Unique.
La sintaxis SQL para realizar estas operaciones sería la siguiente: Si queremos modificar una columna de una tabla en concreto, tendremos que especificar el nombre de la tabla, así como las nuevas características del nuevo campo. ALTER TABLE ALTER COLUMN
Si lo que queremos es añadir un campo nuevo a una tabla, o añadir un índice (clave primaria, clave ajena,…). ALTER TABLE ADD
|
Pero si lo que queremos es borrar un índice o un campo, la sintaxis sería. ALTER TABLE DROP CONSTRAINT | COLUMN
T4. Lenguaje de Definición de Datos 91
Veamos algunos ejemplos. -
Si queremos borrar el CP de Pacientes, el código sql sería el siguiente: ALTER TABLE Pacientes DROP COLUMN CP
-
Si quiero modificar el tamaño del campo Ciudad a 60 caracteres: ALTER TABLE Pacientes ALTER COLUMN Ciudad VARCHAR(60)
-
Eliminar la clave ajena de Visitas: ALTER TABLE Visitas DROP CONSTRAINT Fk_Visitas
3.3.- Drop Table (borrado de tablas) La instrucción DROP TABLE borra tablas de la base de datos. También se suprimen los índices asociados a ella. La sintaxis es la siguiente: DROP TABLE
Si queremos borrar una tabla a la que se hace referencia a través de una clave ajena, primero debemos quitar la restricción FOREIGN KEY o la tabla a la que hace referencia.
4.- Introducción de registros en tablas Para meter datos en nuestras tablas tendremos que realizarlo desde el Management Studio, ya que la sentencia INSERT de SQL todavía no la hemos visto (se estudiará en el tema del Lenguaje de Manipulación de Datos). Para ello pulsaremos botón derecho sobre la tabla a la cual deseamos introducir registros, y seleccionamos la opción Editar las primeras 200 filas.
A continuación nos aparecerá como una hoja de cuadriculada donde iremos introduciendo los registros.
Bloque II.- DISEÑO FÍSICO 92
Para poder realizar los ejercicios del tema siguiente (consultas SQL) necesitaremos dar de alta algunos registros en nuestras tablas. DNI
NOMBRE
DIRECCION
CP
CIUDAD
1 2 3 4 5 6 7 8 9 10 11
ALBERTO VERDU SANCHIS IGNACIO FALCO VERDU MARIA JOSE RICO RICO ROBERTO PEREZ SOGORB ISABEL BLASCO BERNAL ANDRES VERDU VERDU LOLA FLORES ALBERT JOSE LUIS LEAL VERDU JULIO ALBERT SANCHEZ Mª CARMEN RICO LEAL YOLANDA BLASCO AGULLO
PASEO LUNA, 36 MAISSONAVE, 22 FERNANDO MADROÑAL, 2 SOL, 33 LUNA, 90 RAMBLAS, 22 GENERAL, 103 VELERO, 33 LATINO, 41 CINCO DIAS, 90 LA TORRE, 10
03002 03004 03200 03002 03620 03130 03008 03201 03201 03620 03200
ALICANTE ALICANTE ELCHE ALICANTE CAMPELLO SANTA POLA ALICANTE ELCHE ELCHE CAMPELLO ELCHE
TELEFONO 965223366 965161616 651112233 965334122 655001199 965451130 605262626 965122294 965656533
FECHANAC
TURNO
13/01/1965 20/02/1950 13/12/1970 15/11/1990 13/08/1991 01/01/1980 11/09/1964 07/07/1986 03/02/1995 10/10/1957 12/05/1986
1 3 2 2 1 1 3 1 3 2 1
Se puede comprobar que aparecen una serie de campos nuevos como son: • •
TELEFONO: que será alfanumérico y tendrá una longitud máxima de 9. TURNO: que contendrá valores del 1 al 3. Valdrá 1 cuando es Mañana, 2 para Tarde y 3 para Noche.
Estos campos los tendremos que dar de alta de alguna de las dos maneras que conocemos, mediante el Management Studio o mediante instrucciones SQL (Alter Table). Para trabajar con la tabla Visitas daremos de alta los siguientes datos: NVISITA
DNIPACIENTE
1 2 3 4 5 6 7 8 9 10 11 12 13
2 6 1 5 1 3 4 10 1 2 2 3 6
FECHA
CONCEPTO
25/06/2013 25/06/2013 05/07/2013 10/07/2013 19/07/2013 24/07/2013 25/07/2016 04/08/2013 07/08/2013 19/08/2013 27/08/2013 27/08/2013 07/09/2013
FRACTURA DE TIBIA RESFRIADO DOLOR DE CABEZA CATARRO EMPASTE DENTAL DOLOR DE ESTOMAGO DOLOR APENDICITIS MIOPIA FRACTURA PERONE ESGUINCE DE MUÑECA ULCERA ESCEMAS EN LA PIEL TORCEDURA DE TOBILLO
IMPORTE
PORCENTAJE PAGO
70 100 64 65 70 56 230 76 55 145 132 80 95
100 50 75 100 30 100 100 100 100 100 100 40 50
T4. Lenguaje de Definición de Datos 93
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
5 7 7 7 1 2 1 6 9 10 1 3 10 5 7 9 1
08/09/2013 13/09/2013 13/09/2013 16/09/2013 21/09/2013 23/09/2013 24/09/2013 24/09/2013 25/09/2013 27/09/2013 02/10/2013 02/10/2013 02/10/2013 08/10/2013 09/10/2013 17/10/2013 18/10/2013
ROTURA DE UN DEDO FRACTURA DE CADERA FRACTURA DE TIBIA DISLOCACION DE HOMBRO PULMONIA REFRIADO GRIPE GRIPE EXTRACCION DE MUELA LIMPIEZA DE BOCA GINECOLOGO REVISION MEDICA GRIPE HONGOS GRIPE ULCERA FRACTURA DE TOBILLO
77 71 161 140 200 58 52 79 80 60 170 95 123 51 100 185 163
80 100 100 50 100 100 70 60 100 100 100 100 25 10 100 25 100
Aquí comprobamos que aparece un campo nuevo: •
PORCENTAJE PAGO: será un número que nos indicará el porcentaje del importe que ha pagado cada paciente cuando ha realizado dicha visita, y el resto queda pendiente de pago.
Bloque II.- DISEÑO FÍSICO 94
Ejercicios Propuestos
Tras un estudio del vídeo club se ha obtenido la siguiente información:
Modelo ENTIDAD / RELACIÓN
Modelo RELACIONAL
T4. Lenguaje de Definición de Datos 95
1.- Crear una Base de Datos llamada VIDEO_CreacionTablas. 2.- Crear las siguientes tablas para el almacenamiento de la información desde el DISEÑADOR DE TABLAS: (a)
: Para guardar la siguiente información.
CODIGO: N° para distinguir a un socio de otro. Será un campo
•
numérico y que automáticamente se renumere cuando damos un socio de alta. APELLIDOS: Guardaremos los apellidos de los socios. Debe ser obligatorio. El tamaño máximo de los apellidos será de 20 caracteres. NOMBRE: Para almacenar el nombre; también será obligatorio. Un máximo de 15 caracteres. DIRECCION: Un máximo de 30 caracteres. CIUDAD: Un máximo de 20 caracteres. Por defecto debe colocar ALICANTE. CP: Para guardar el Código postal, por ejemplo: 03659. PROVINCIA: Un máximo de 15 caracteres. Por defecto: ALICANTE. TELEFONO: Con el siguiente formato 965281604. MOVIL: Con el mismo formato que el campo anterior. MAIL: para poder almacenar las direcciones de correo electrónico de nuestros socios. NIF: Con el siguiente formato 22136550N. FECHA NACIMIENTO: Fecha de nacimiento del socio, para felicitarlo por su cumpleaños. FECHA ALTA: Fecha de inscripción del socio en el vídeo club. FOTO: Campo que recogerá el nombre del archivo que contiene la foto del socio. OBSERVACIONES: Para guardar varias páginas de información acerca del socio.
• • • • • • • • • • • • • •
(b)
: •
CODIGO: N° que sirve para distinguir una película de otra (p. e.: si
• •
hemos comprado dos películas de “Torrente”, cada una tendrá un código de stock distinto). CODIGO PELICULA: Código de la película que alquila el socio. FORMATO: El formato de presentación de la película.
Bloque II.- DISEÑO FÍSICO 96
(c)
: • • • •
CODIGO SOCIO: N° del socio que alquila una película (sirve para enlazar con Socios). CODIGO STOCK: N° stock de la película que alquila el socio. FECHA SALIDA: El valor por defecto será la fecha del sistema. FECHA DEVOLUCIÓN: Formato igual que la anterior.
3.- Crear las siguientes tablas para el almacenamiento de la información desde el EDITOR DE SQL (mediante la instrucción Create Table):
(d)
: • • • •
• • • • •
CODIGO: Número que sirve para distinguir una película de otra. Deben numerarse automáticamente al darse de alta. TITULO: Un máximo de 40 caracteres. FOTO: Guardaremos el nombre del archivo jpg con la foto de la portada de la película. CODIGO CATEGORIA: Un número que indica la categoría a la que pertenece la película. (Sirve para relacionarse con la tabla CATEGORIAS). PRECIO COMPRA: Formato monetario, con 2 decimales. PRECIO ALQUILER: Formato monetario con 2 decimales. No puede ser menor que 1 €. MAXIMO DIAS: N° máximo de días que se puede tener la película sin penalizar. OFERTA: Porcentaje de descuento para cada película. P. e.: el 50 % se introducirá como 0,5. COMENTARIO: Información sobre el contenido de la película.
4.- Crear las siguientes tablas para el almacenamiento de la información desde el DIAGRAMA:
T4. Lenguaje de Definición de Datos 97
(e)
: •
CODIGO: Número para distinguir una de otra. Renumerarse
•
automáticamente. DESCRIPCION: Nombre de la categoría, p. e.: Comedia, Ciencia Ficción, Terror,...
5.- Crear las siguientes relaciones para mantener la integridad de los datos: •
• •
Desde el diseñador de tablas: SOCIOS - ALQUILER (1 a Muchos). STOCK - ALQUILER (1 a Muchos). Desde el Editor de SQL: CATEGORIAS - PELICULAS (1 a Muchos). Desde el Diagrama: PELICULAS - STOCK (1 a Muchos).
6.- Introducir los siguientes registros para las siguientes tablas: PELICULAS CODIGO TITULO 1 2 3 4 5 6 7 8 9 10
CANTANDO BAJO LA LLUVIA SÓLO ANTE EL PELIGRO UN DÍA EN LAS CARRERAS DRÁCULA EN BUSCA DEL TEMPLO MALDITO LA GUERRA DE LAS GALAXIAS EL BUENO, EL FEO Y EL MALO EL GUATEQUE PSICOSIS EL GOLPE
FOTO
CODIGO CATEGORIA 6 7 2 1 5 4 7 2 1 2
PRECIO COMPRA 25,00 30,00 20,00 36,00 42,00 29,00 32,00 32,00 36,00 28,00
PRECIO ALQUILER 1,50 2,00 1,50 2,50 2,00 1,50 2,00 1,50 2,00 2,00
MAXIMO DIAS 0,00 2,00 2,00 2,00 2,00 7,00 2,00 7,00 2,00 2,00
OFERTA COMENTARIO 50% 50% 45% 55% 0% 50% 5% 15% 0% 0%
Entretenida No hay que perdérsela Para pasar un buen rato Terror hasta el final Cine de Aventuras La mejor de la serie Una de vaqueros Lo mejor de Peter Selles Intriga y suspense La mejor trama que jamás existió
CATEGORIAS CODIGO 1 2 3 4 5 6 7
DESCRIPCION Terror Comedia Drama Ciencia Ficción Aventura Musical Oeste
Bloque II.- DISEÑO FÍSICO 98
7.- Reestructurar las siguientes tablas. •
•
En la tabla PELICULAS, añadir el siguiente campo desde el editor SQL: o COMPAÑIA: recogerá la productora de la Película (Warner, Disney, Paramount …) Aumentar en dos el número de caracteres para contener el Apellido de los Socios, desde el diseñador de tablas.
T4. Lenguaje de Definición de Datos 99
Tema 5. SQL – CONSULTAS SELECT 1.- Introducción a las consultas La gran mayoría de veces que interactuamos con las tablas de la base de datos es para hacerle preguntas del tipo: necesitamos una serie de columnas con unas condiciones que tienen que cumplir nuestros datos. Por ejemplo, si tenemos una base de datos de Facturación, básicamente tendríamos una tabla de Clientes y otra de Facturas. Ante esta colección de datos, podríamos plantearnos una serie de preguntas a realizar a nuestras tablas: • • •
¿Qué clientes son de Alicante? ¿Cuánto se han facturado nuestros clientes durante cada año? ¿Cuántos clientes han realizado menos facturas que la media de los clientes de Elche?
Para resolver todas estas dudas existe una sentencia esencial en el Sql que es el SELECT. La sintaxis básica sería: SELECT columna1, columna2,… FROM tabla-s [WHERE criterios] [GROUP BY grupos] [HAVING criterios para grupos] [ORDER BY ordenación]
Lo único obligatorio es la sentencia SELECT y el FROM, el resto de cláusulas son opcionales.
1.1.- Ejemplos Para empezar a entender la sentencia Select vamos a ver algunos ejemplos básicos, basados en nuestra base de datos Clínica.
T5. SQL - Consultas Select 101
•
Si queremos obtener todos los campos de la tabla Pacientes, tendríamos que escribir la siguiente orden: SELECT * FROM Pacientes
•
Queremos ver el Dni del paciente, y otra columna que muestre el Nombre del paciente, pero como título de la columna ponga “Nombre del Paciente”. Para ello utilizaremos un Alias, que vendrá representado por la palabra AS: SELECT DNI, Nombre AS [Nombre del Paciente] FROM Paciente
•
Obtener las visitas cuyo Importe está comprendido entre 100 y 200 €. SELECT * FROM Visitas WHERE Importe BETWEEN 100 AND 200
•
Deseamos conocer los pacientes que hay de cada Ciudad. SELECT Ciudad, COUNT(*) FROM Pacientes GROUP BY Ciudad
•
Queremos mostrar el Nombre del paciente y la Fecha de nacimiento ordenado de mayor a menor edad. SELECT Nombre, FechaNac FROM Pacientes ORDER BY FechaNac DESC
1.2.- El Diseñador de Consultas Si lo que queremos es no utilizar el Editor de SQL y escribir las sentencias, podemos utilizar el Diseñador gráfico de Consultas, que con un entorno visual hace más cómodo la creación de consultas. Pero para ello necesitaremos tener instalado el software Management Studio.
Bloque II.- DISEÑO FÍSICO 102
Para trabajar con Diseñador de consultas, pulsamos sobre el botón de la barra de herramientas Nueva consulta, y aparece la pantalla en blanco del Editor. Ahora pulsamos botón derecho sobre la página en blanco, y elegimos la opción Diseñar consulta con el editor. Apareciendo una pantalla donde podremos elegir entre las tablas de nuestra Base de datos Clínica. Si por ejemplo, queremos crear la última consulta del apartado anterior, donde mostraba la fecha de nacimiento y el nombre del paciente. Tendremos que seleccionar las siguientes opciones.
En la primera columna indicaremos el nombre de los campos que aparecerán en la consulta SELECT. En la columna que pone Tipo de orden, indicaremos si queremos ordenarlo ascendente o descendente por esa columna. La columna Filtro, serviría para indicar las condiciones que deben cumplir los registros que va a mostrar la consulta. A la vez que vamos diseñando la consulta, nos aparece en la parte inferior del diseñador, la estructura de la consulta Sql que estamos construyendo.
T5. SQL - Consultas Select 103
Cuando pulsemos Aceptar, ese texto se trasladará al Editor de consultas, y podremos ejecutar la consulta, con el botón de ejecutar o pulsando F5, y ver los resultados de la misma.
2.- Select Antes hemos visto una sintaxis más básica, pero una sintaxis más completa sería: SELECT [DISTINCT | ALL] [{TOP entero | TOP entero PERCENT}] [INTO ] FROM [WHERE ] [GROUP BY [ALL] ] [HAVING ] [ORDER BY { | [ASC | DESC]}]
ALL Cuando utilizamos ALL en una sentencia SELECT, el resultado mostrará todos las filas, incluyendo las filas duplicadas (si hay dos filas iguales aparecerán las dos). Si ejecutamos la siguiente sentencia. SELECT ALL Ciudad FROM Pacientes
Bloque II.- DISEÑO FÍSICO 104
Obtendríamos el siguiente resultado:
Podemos comprobar que la Ciudad Alicante aparece varias veces. Esto ocurre si utilizamos ALL, y también si no colocamos nada. Pero si lo que queremos evitar que aparezcan duplicados (que Alicante sólo apareciese una vez), tendríamos que utilizar DISTINCT después del Select. Por ejemplo, la siguiente sentencia: SELECT ALL Ciudad FROM Pacientes
El resultado sería el siguiente:
TOP Utilizaremos el TOP para mostrar las primeras filas o el porcentaje de las filas ordenadas bajo un criterio ORDER BY. SELECT TOP 10 DniPaciente, Fecha, Importe FROM Visitas ORDER BY Importe DESC
Esta sentencia mostraría las 10 visitas con un mayor Importe. T5. SQL - Consultas Select 105
Pero si lo que queremos es ver 50 % de las visitas con un Importe menor, la sentencia que tendríamos que escribir sería la siguiente: SELECT TOP 50 PERCENT DniPaciente, Fecha, Importe FROM Visitas ORDER BY Importe
Como resultado nos mostraría las 15 filas con importe más bajo. La cantidad de filas a mostrar dependerá del número total de registros que tenemos en la tabla. Así, en el ejemplo, como tenemos un total de 30 registros, la consulta nos mostrará un total de 15 filas como resultado.
INTO Sirve para crear una tabla e inserta en ella los registros de la consulta. Veamos un ejemplo, imaginemos que queremos crear una tabla llamada Historico con aquellas Visitas realizadas en 2012. SELECT * INTO Historico FROM Visitas
La consulta lo que realiza es crear una tabla con el nombre Historico, y que podremos ver en el desplegable de las tablas (puede ser necesario que pulsemos actualizar para poder verlas todas).
Bloque II.- DISEÑO FÍSICO 106
2.1.- Cláusulas (From, Where, Group By, Order By, Having) FROM Sirve para especificar las tablas de las que se van obtener los registros y los campos de la consulta. FROM Pacientes P
Podemos utilizar Alias para las tablas de la consulta colocando una letra a continuación de la tabla, y a partir de ahí se puede utilizar el la letra para hacer referencia a esa tabla en concreto. Si queremos consultar datos que aparecen en dos tablas, existe dos formas de realizarlo:
a) Utilizando el WHERE, y recordando el tema de Algebra Relacional, se realiza el Producto cartesiano de las dos tablas y luego realiza una Selección. FROM Paciente P, Visitas V WHERE P.Dni = V.DniPaciente
b) Utilizando el INNER JOIN, que es una forma más eficiente, ya que supone una Reunión (en operativa de Algebra Relacional). FROM Paciente V.DniPaciente
P
INNER
JOIN
Visitas
V
ON
P.Dni
=
WHERE En la cláusula WHERE incluiremos los criterios que deben tener los registros que queremos mostrar en nuestra consulta Select. Veamos varios ejemplos: WHERE Ciudad = ‘Alicante’ WHERE Ciudad =’Elche’ OR Turno=1 WHERE Importe BETWEEN 100 AND 250
T5. SQL - Consultas Select 107
GROUP BY Cuando queremos agrupar registros por uno o varios campos donde se repite la información, y para cada nivel de agrupamiento realizar una serie de operaciones (contar, sumar, media, máximo o mínimo) SELECT Turno, Ciudad, COUNT(*) FROM Pacientes GROUP BY Turno, Ciudad
ORDER BY Esta cláusula sirve como condición de ordenación para los registros que mostremos en la consulta SELECT. Se puede poner a continuación del ORDER BY las columnas que deseemos, pero separadas por comas, e indicando si lo queremos ASC (por defecto sino ponemos nada) o DESC –ascendente o descendente respectivamente-. Veamos un ejemplo: SELECT * FROM Pacientes ORDER BY Turno DESC, Ciudad, Nombre
La consulta mostraría todas las columnas de Pacientes, pero ordenadas por Turno descendentemente, y para los que son de un mismo Turno, el siguiente orden sería la Ciudad, y para los que son de la misma Ciudad y Turno, la última ordenación sería por el Nombre del paciente.
HAVING El HAVING viene a ser como el WHERE para los registros, pero para los grupos (GROUP BY) e indicar que grupos queremos que aparezcan. Por ejemplo: SELECT Turno, Ciudad, COUNT(*) FROM Pacientes GROUP BY Turno, Ciudad HAVING COUNT(*)>5
Solo mostraría aquellos grupos, de Turno y Ciudad, donde viviesen más de 5 pacientes.
Bloque II.- DISEÑO FÍSICO 108
3.- Operadores Estos operadores los utilizaremos para indicar las condiciones en las cláusulas WHERE y HAVING.
Aritméticos En las columnas que mostramos en el Select podremos realizar operaciones con distintos campos de nuestras tablas. Veamos un ejemplo: SELECT Nombre + ‘ – ‘ + Ciudad, Turno*15 FROM Pacientes
El resultado de la consulta será:
En el ejemplo anterior vemos cómo podemos combinar campos alfanuméricos utilizando el +, y como podemos hacer operaciones matemáticas con los operadores +, -, * y /.
De comparación (=, >, =, = 100
T5. SQL - Consultas Select 109
WHERE Ciudad = ‘Alicante’ WHERE FechaNac=’12/08/2013’ HAVING SUM(Importe)>200
BETWEEN El operador BETWEEN sirve para seleccionar solo los registros que están comprendidos entre dos valores (incluidos los dos). WHERE Importe BETWEEN 4 AND 38 WHERE Fecha BETWEEN ‘01/01/2013’ AND 31/01/2013’
IN Cuando en los criterios queremos que el campo se igual a una lista de valores que le proporcionamos. Veamos unos ejemplos: WHERE Importe IN (100, 205, 300)
El ejemplo anterior muestra aquellas visitas cuyo Importe son 100, 205 o 300 WHERE Ciudad IN (‘Alicante’, ‘Elche’, ‘Murcia’, ’Valencia’)
LIKE Cuando no queremos que la comparación sea exacta, sino que tendrá algunos caracteres en común. Utilizaremos dos símbolos como comodines: % (comodín que puede sustituir a varios caracteres) y _ (sólo permite la sustitución de un carácter). Para entenderlo mejor veamos algunos ejemplos: WHERE Nombre LIKE ‘An%’
Mostraría aquellos pacientes cuyo Nombre empieza por ‘An’, por ejemplo aparecerían Antonio, Andrés,… Si por ejemplo, queremos mostrar aquellos pacientes cuya Ciudad contiene una ‘e’, escribiríamos el siguiente código: WHERE Ciudad LIKE ‘%e%’
En este siguiente caso mostrará solo aquellos Nombres de pacientes que empiecen por ‘Antoni’ y terminen por cualquier letra (por ejemplo, Antonio o Antonia). Bloque II.- DISEÑO FÍSICO 110
WHERE Nombre LIKE ‘Antoni_’
IS NULL Para comprobar en una consulta si los valores de un campo contienen valores nulos tendremos que utilizar IS NULL en el WHERE. Por ejemplo, si quiero ver aquellos pacientes que no tienen ningún valor en el campo Ciudad, tendremos que escribir la siguiente sentencia SQL: SELECT * FROM Pacientes WHERE Ciudad IS NULL
AND, OR y NOT Utilizaremos AND cuando queramos que nuestros registros cumplan dos condiciones (más restrictivo), OR cuando deseemos que se cumpla cualquiera de las dos condiciones que indiquemos y NOT para negar la condición que coloquemos. Veamos varios ejemplos: Si queremos mostrar aquellos pacientes cuya Ciudad es Valencia y Turno es igual a 3. WHERE Ciudad=’Valencia’ AND Turno=3
Si lo que queremos es obtener aquellos pacientes cuyo Nombre empieza por una B o la Ciudad es Elche, la cláusula Where sería la siguiente: WHERE Nombre LIKE ‘B%’ OR Ciudad=’Elche’
Y para mostrar aquellos Pacientes que no pertenecen al turno 2, seria: WHERE NOT Turno=2
UNION Cuando tenemos dos consultas SQL que queremos mostrar todo en un mismo conjunto de resultados. Por ejemplo, si queremos tener en una misma consulta las T5. SQL - Consultas Select 111
direcciones y teléfonos de los Clientes y Proveedores (que se encuentran en dos tablas distintas). Veamos un ejemplo utilizando nuestra base de datos Clínica. SELECT Nombre, Direccion FROM Pacientes WHERE Ciudad=’Alicante’ UNION SELECT Nombre, Direccion FROM Pacientes P INNER P.Dni=V.DniPaciente
JOIN
Visitas
V
ON
En la tabla resultados nos mostrará conjuntamente el Nombre y la Dirección de los pacientes que son de Alicante y de los pacientes que han realizado alguna visita.
EXCEPT Sería el equivalente a la Diferencia (operación de algebre relacional), donde mostrará todos aquellos registros de la primera consulta y los que no están en la segunda. SELECT Nombre, Direccion FROM Pacientes
Bloque II.- DISEÑO FÍSICO 112
EXCEPT SELECT Nombre, Direccion FROM Pacientes P INNER P.Dni=V.DniPaciente
JOIN
Visitas
V
ON
El resultado de esta consulta mostrará aquellos pacientes que nunca han realizado una visita. En la primera parte tenemos TODOS los pacientes, y en la segunda SOLO los que han realizado alguna visita.
4.- Funciones Las Funciones la podremos utilizar principalmente en el SELECT, WHERE y GROUP BY. A continuación veremos las más importantes y algunos ejemplos de las mismas.
4.1.- Cadena LEFT(cadena, n) Obtendremos los n caracteres de la izquierda de la cadena especificada. Por ejemplo, si queremos realizar una consulta que muestre el Nombre, los 3 primeros caracteres del Nombre y la Ciudad, sería: T5. SQL - Consultas Select 113
SELECT Nombre, LEFT(Nombre, 3) AS Tres_Letras, Ciudad FROM Pacientes
El resultado sería el siguiente:
LEN(cadena) Nos da la longitud de la cadena especificada. Por ejemplo, si queremos mostrar aquellos pacientes cuyo Ciudad es de 5 caracteres, escribiremos el siguiente código:
SELECT * FROM Pacientes WHERE LEN(Ciudad)=5
Bloque II.- DISEÑO FÍSICO 114
LOWER(cadena) Convierte las letras de la cadena a minúsculas. Por ejemplo, si quisiera ver el Nombre de los Pacientes en minúsculas, pondría: SELECT LOWER(Nombre) FROM Pacientes
RIGHT(cadena, n) Aquí obtendríamos los n caracteres de la derecha de la cadena. Por ejemplo, para ver los 4 últimos caracteres del Nombre del paciente sería: SELECT RIGHT(Nombre, 4) FROM Pacientes
UPPER(cadena) Convierte a mayúsculas los caracteres de la cadena. Así, si deseamos convertir a mayúsculas el Concepto de las visitas, tendríamos que escribir: SELECT UPPER(Concepto) FROM Visitas
T5. SQL - Consultas Select 115
4.2.- Numéricas ABS(a) Obtendremos el valor absoluto de un número a. En nuestras tablas no tenemos valores negativos para poder obtener el valor absoluto, pero suponiendo que tuviésemos un campo llamado Numero, que incluyese números negativos, la sentencia ABS(Numero), nos daría siempre los valores absolutos del número, o sea, que si vale -3 daría 3.
RAND(semilla) Aquí lo que hace con el Rand es obtener un número aleatorio entre 0 y 1 con una semilla dada (la semilla puede ser cualquiera para que cambie los números aleatorios generados). Veamos varios ejemplos. Si quiero un número aleatorio, propongo una semilla cualquiera, por ejemplo 200. Escribimos la siguiente sentencia: SELECT RAND(200) FROM Pacientes
Y obtendríamos el mismo número aleatorio entre 0 y 1 para todos los registros, ya que la semilla es la misma:
Pero si lo que quiero es un número aleatorio distinto cada vez, puedo utilizar como semilla del Rand un campo Bloque II.- DISEÑO FÍSICO 116
numérico de mi tabla. Por ejemplo, puedo obtener un número distinto para cada visita, utilizando el Nvisita como semilla. SELECT Fecha, DniPaciente, Importe, RAND(Nvisita) FROM Visitas
Complicando más el uso del Rand, podría utilizarlo para crear números aleatorios entre 2 valores. Por ejemplo, si utilizo yo RAND(Numero)*40, lo que estoy obteniendo es un número aleatorio entre 0 y 40 (ya que al ser 1 el valor máximo del Rand al multiplicarlo por 40, el límite superior se establece en 40). Veamos que realiza el siguiente ejemplo: SELECT Nvisita, Fecha, Concepto, Importe, RAND(Importe)*100 AS Descuento,(RAND(Importe)*100)*Importe/100 AS Dcto FROM Visitas
El resultado sería el siguiente:
ROUND(a,b) Redondea el número a con precisión b, por ejemplo, si tenemos un número (423, 6239), y ponemos ROUND(423.6239, 2) obtendríamos 423.62, porque le hemos indicado que tenga dos decimales. Un ejemplo de Sql sería: SELECT Importe, ROUND(Importe,2) FROM Visitas
T5. SQL - Consultas Select 117
SQRT(a) Obtendríamos la raíz cuadrada del número seleccionado. Por ejemplo, SQRT(9) nos daría 3.
SQUARE(a) Nos daría el cuadrado de un número, con SQUARE(2) obtendríamos 4.
4.3.- Fecha y hora DATEADD(tipo, a, fecha) Esta función añade a unidades de fecha del tipo dado (DAY, MONTH o YEAR) a la fecha dada. Veamos varios ejemplos: •
Si quiero añadir 7 días a un campo fecha.
SELECT Fecha, DATEADD(DAY, 7, Fecha) FROM Visitas
Bloque II.- DISEÑO FÍSICO 118
•
Para añadir 2 años a la fecha para ver cómo quedaría. SELECT Fecha, DATEADD(YEAR, 2, Fecha) FROM Visitas
DATEDIFF(tipo, fecha1,fecha2) Indica el número de unidades de fecha del tipo dado entre dos fechas. Por ejemplo, para saber los días que quedan entre la Fecha de la visita y fin de año, escribiríamos lo siguiente: SELECT Fecha, DATEDIFF(DAY, Fecha, ‘31/12/2013’)
T5. SQL - Consultas Select 119
FROM Visitas
El resultado siguiente:
sería
el
DATENAME(tipo, fecha) Da el nombre, según el tipo dado, de la fecha especificada. Si pongo MONTH, me dará el nombre del mes (Enero, Febrero,…). Por ejemplo, la siguiente sentencia SQL, nos mostraría el nombre del mes de cada fecha: SELECT Fecha, Fecha) FROM Visitas
DATENAME(MONTH,
GETDATE() Devuelve la fecha y hora actuales del sistema. Por ejemplo, si quiero saber el número de años que hay desde cada paciente nació hasta el día de hoy, escribiremos lo siguiente: SELECT FechaNac, Edad FROM Pacientes
DATEDIFF(YEAR,
FechaNac,
GETDATE())
El resultado obtenido sería el siguiente:
Bloque II.- DISEÑO FÍSICO 120
AS
DAY(fecha) Nos devolvería el día de una fecha determinada.
MONTH(fecha) Nos devuelve el número del mes, por ejemplo la fecha ‘12/03/2012’ nos devolvería 3, pero como alfanumérico.
YEAR(fecha) Nos devolvería el año de la fecha.
Veamos un ejemplo dónde utilizamos las tres funciones: SELECT Fecha, DAY(Fecha) AS Dia, MONTH(Fecha) AS Mes, YEAR(Fecha) AS Año FROM Visitas
T5. SQL - Consultas Select 121
5.- Consultas multitabla Cuando trabajamos con datos de dos o más tablas necesitamos implementar relaciones lógicas entre ellas (JOINS). Una forma poco eficiente de realizar esos enlaces entre tablas, es unir la clave ajena con la clave principal en el WHERE de la consulta (lo que, como ya comentamos, realiza un Producto cartesiano y luego una selección, con lo que perdemos efectividad). Veamos un ejemplo: SELECT Dni, Nombre, Fecha, Importe FROM Pacientes, Visitas WHERE Dni=DniPaciente
Imaginemos que tenemos dados de alta 500 pacientes y 3000 visitas, entonces lo que haría el Sql es el producto cartesiano, obteniendo un total de 1.500.000 registros (500 x 3000), y luego pasaría hacer una selección –where- solo de los que cumplen la condición, que son los 3000 registros que mostraría. Cuando trabajamos con varias tablas puede que coincida el mismo nombre de campo, por lo que tenemos que indicar el nombre de la tabla delante del campo. Por ejemplo, si tengo dos tablas que contienen el campo Codigo, tendré que hacer referencia a el de la siguiente forma: WHERE Clientes.Codigo=3
Bloque II.- DISEÑO FÍSICO 122
Y si utilizásemos un alias para las tablas, haríamos referencia de la siguiente manera: FROM Clientes C, Pedidos P,… WHERE C.Codigo=3
JOINS de dos tablas Solo mostrará, de manera más eficiente, los registros dónde coinciden los campos por los cuales se relacionan las dos tablas. Sería el equivalente a la operación de Reunión en Algebra Relacional. El JOIN forma parejas de registros haciendo coincidir los campos de los contenidos relacionados. Veamos un ejemplo, donde solo mostrará los registros de Pacientes relacionados con los de Visitas: SELECT Dni, Nombre, Fecha, Importe FROM Pacientes P INNER JOIN P.Dni=V.DniPaciente
Visitas
V
ON
En el caso de que tuviéramos que relacionar 3 tablas, la forma de realizar el Inner Join sería el siguiente. FROM Tabla1 T1 INNER JOIN (Tabla2 T2 INNER JOIN Tabla3 T3 ON T2.Campo23 = T3.Campo3) ON T1.Campo1=T2.Campo21
JOIN EXTERNO izquierdo y derecho Este tipo de enlace nos serviría para responder a preguntas del tipo: 1. 2.
¿Qué pacientes no han realizado ninguna visita? ¿Qué visitas no se corresponden con ningún paciente relacionado?
Para resolver a estas preguntas necesitamos utilizar los JOINs izquierdo y derecho: LEFT JOIN y RIGHT JOIN. El LEFT JOIN muestra todos los registros relacionados en ambas tablas, y además los registros de la tabla de la izquierda que no están relacionados con los de la derecha. Con el siguiente código Sql y resultado lo entenderemos mejor: SELECT Dni, Nombre, Fecha, Importe FROM Pacientes P LEFT JOIN Visitas V ON P.Dni=V.DniPaciente
T5. SQL - Consultas Select 123
De los resultados de la consulta, vemos que en las columnas Fecha e Importe, hay dos NULL, que son los registros que no han realizado ninguna visita a la clínica. Entonces para resolver la primera pregunta escribiríamos el siguiente código Sql (tendremos que hacer que cualquier campo de la tabla de la derecha sea Null): SELECT Dni, Nombre FROM Pacientes P LEFT JOIN Visitas V ON P.Dni=V.DniPaciente WHERE Fecha IS NULL
Obtendríamos como resultado los dos pacientes que no han hecho visitas:
Bloque II.- DISEÑO FÍSICO 124
De la misma forma que hemos dado respuesta a la primera pregunta, la segunda se resolvería con la siguiente instrucción Sql:
SELECT Fecha, DniPaciente, Concepto, Importe FROM Pacientes P RIGHT JOIN Visitas P.Dni=V.DniPaciente WHERE Nombre IS NULL
V
ON
6.- Consultas de agrupar Cuando tenemos campos o columnas donde se repiten valores, podremos aplicar funciones de agregado que generan valores de datos resumidos. Las funciones agregadas que más utilizaremos serán las siguientes: • • • • •
SUM: suma los valores para un determinado grupo. AVG: calcula la media. COUNT: cuenta el número de registros. MAX: obtenemos el máximo de una serie de valores. MIN: nos dará el valor mínimo de un conjunto de datos.
Las funciones no se podrán utilizar en el WHERE, sólo en el SELECT y en el HAVING. Las funciones SUM y AVG sólo se podrán utilizar con campos numéricos. Con estas funciones se podrá contestar a preguntas del tipo: -
¿Número de Pacientes que hay por cada Ciudad? ¿Cuál es la cantidad media que se han gastado los pacientes por cada Turno? ¿Cuál es la cantidad máxima que se ha gastado cada paciente en todas sus visitas?
6.1.- Función COUNT La función COUNT nos devolverá el número de valores o elementos de un grupo determinado.
T5. SQL - Consultas Select 125
La sintaxis será la siguiente: COUNT ( { [ ALL | DISTINCT ] expresión
•
| * } )
ALL: aplica la función contar a todos los valores, pero no tiene en cuenta los NULL. Veamos un ejemplo: SELECT COUNT(ALL Telefono) AS Num_Pac_Telefono FROM Pacientes
•
DISTINCT: devuelve el número de valores distintos (únicos), no nulos que contiene el campo. Solo va a contar aquellos valores que son únicos, si resulta que son iguales solo los cuentea una vez. Un ejemplo sería SELECT COUNT(DISTINCT Ciudad) AS Num_Ciudades_distintas FROM Pacientes
Bloque II.- DISEÑO FÍSICO 126
•
* : cuenta todos los registros, pero teniendo en cuenta los nulos. En el siguiente ejemplo nos cuenta el número de Pacientes que hay en cada Ciudad. SELECT Ciudad, COUNT(*)AS Numero_Pacientes FROM Pacientes GROUP BY Ciudad
6.2.- GROUP BY Utilizaremos la cláusula GROUP BY para obtener valores de agregado para cada registro del conjunto de resultados. Ya hemos visto anteriormente algunos ejemplos donde agrupábamos por un campo para obtener algunos resultados, ahora veremos algunos ejemplos más avanzados. a) ¿Quiero ver que se ha gastado cada paciente en las visitas que ha realizado, y también la media gastado por cada paciente? SELECT Nombre, SUM(Importe) AS Total, AVG(Importe) AS Media FROM Pacientes P INNER JOIN Visitas V ON P.Dni=V.DniPaciente GROUP BY Nombre
T5. SQL - Consultas Select 127
b) ¿Cuáles han sido los ingresos mensuales de las visitas realizadas a la Clínica? SELECT DATENAME(Month, Fecha) AS Mes, SUM(Importe) AS Total FROM Pacientes P INNER JOIN Visitas V ON P.Dni=V.DniPaciente GROUP BY DATENAME(Month, Fecha)
c) Podemos utilizar dos niveles de agrupamiento. Veamos un ejemplo: ¿Queremos obtener por Año y por ciudad el total gastado por cada paciente haciendo visitas? SELECT DATENAME(Year, Fecha) AS Mes, Ciudad, SUM(Importe) AS Total FROM Pacientes P INNER JOIN Visitas V ON P.Dni=V.DniPaciente
Bloque II.- DISEÑO FÍSICO 128
GROUP BY DATENAME(Year, Fecha), Ciudad
d) También podemos aplicar restricciones a los grupos que deben mostrarse o no. Por ejemplo, si queremos ver aquellas ciudades en la que los pacientes han gastado más de 300 € haciendo visitas. SELECT Ciudad, SUM(Importe) AS Total FROM Pacientes P INNER JOIN P.Dni=V.DniPaciente GROUP BY Ciudad HAVING SUM(Importe)>300
Visitas
V
ON
e) Una consulta más completa, sería utilizando el WHERE, el GROUP BY y el HAVING. El enunciado de lo que queremos obtener sería: Mostrar para los pacientes de Alicante lo que se han gastado en cada turno y que el número de visitas realizadas por cada turno sea superior a 1.
T5. SQL - Consultas Select 129
SELECT Turno, COUNT(*) AS Numero_Visitas FROM Pacientes P INNER JOIN Visitas P.Dni=V.DniPaciente WHERE Ciudad=’Alicante’ GROUP BY Turno HAVING COUNT(*)>1
V
ON
En las consultas de agrupar hay que tener en cuenta dos aspectos fundamentales:
•
El orden de ejecución de una consulta de agrupar será el siguiente: (1) Primero entra en funcionamiento la cláusula WHERE, para seleccionar sólamente los registros de las tablas que nos interesan.
(2) Luego se hacen los grupos que indiquemos en la cláusula GROUP BY.
(3) Sólo se mostrarán los grupos que cumplan las condiciones que están escritas en la cláusula HAVING.
•
Los campos de la cláusula grupo by deben aparecer en el select. O sea, que lo que no sea una función agregada (Count, sum,…), los campos deben aparecer tanto en el Select como en el Group by, y en el mismo orden. Veamos un ejemplo: Bloque II.- DISEÑO FÍSICO
130
SELECT DATENAME(Year, Fecha) AS Mes, Ciudad, SUM(Importe) AS Total FROM Pacientes P INNER JOIN Visitas V ON P.Dni=V.DniPaciente GROUP BY DATENAME(Year, Fecha), Ciudad
7.- Subconsultas Las subconsultas son una consulta SELECT que devuelve un valor único o una lista de valores, y esta anidada en una instrucción del tipo SELECT, INSERT, UPDATE o DELETE. SELECT Nombre, Ciudad FROM Pacientes P INNER JOIN Visitas P.Dni=V.DniPaciente WHERE Importe = (SELECT MIN(Importe)FROM VISITAS)
V
ON
En esta consulta, obtendremos el Nombre y la Ciudad de aquellos pacientes cuyo Importe de la visita es igual al mínimo Importe de todas las visitas. Hay que tener en cuenta que la cláusula Select de la subconsulta siempre tiene que ir entre paréntesis. También hay que saber que si una tabla aparece sólo en la Subconsulta, y no en la consulta general (la externa), los campos que pongamos en la consulta principal no pueden venir de la tabla de la subconsulta.
Básicamente podemos distinguir tres tipos de consultas: 1. 2. 3.
Las que usan LISTAS incorporadas (IN, ANY o ALL). Las que aparecen junto con un OPERADOR DE COMPARACIÓN (>, =, = (SELECT AVG(Importe) FROM Visitas WHERE FECHA > ‘01/01/2013’)
P.Dni
=
La consulta nos devolvería las Ciudades distintas (no se podrá repetir una misma ciudad) de aquellos pacientes que han realizado visitas por un importe superior a la MEDIA del Importe de aquellas visitas realizadas en una fecha superior a ‘01/01/2013’).
7.3.- Exists Este tipo de subconsultas va a funcionar como una prueba de existencia (EXISTS). Así, si la subconsulta devuelve algún valor, tomará el valor de verdadero (TRUE) y falso (FALSE) en caso contrario, cuando no devuelva ningún dato la subconsulta. Veamos un ejemplo que muestre aquellos Turnos (sin repetir) cuyo visita se realizó en Julio, independientemente del año de la misma. SELECT DISTINCT Turno FROM Pacientes WHERE EXISTS (SELECT * FROM Visitas WHERE DniPaciente=Pacientes.Dni AND DATENAME(Month, Fecha)=’Julio’)
T5. SQL - Consultas Select 133
Hay que tener en cuenta, que en las subconsultas con EXISTS, esta no viene precedida de ningún campo o nombre de columna. Y también que en la lista de la subconsulta debe aparecer un *, ya que no importa las columnas que pongamos como resultado de la misma, sino si existe o no.
7.4.- Any, Some o All El ANY y SOME, vienen a significar lo mismo, y podemos utilizar indistintamente cualquiera de los dos. Por ejemplo: • •
> ALL: significaría mayor que cualquier valor de la subconsulta (o lo que es lo mismo, mayor que el máximo de todos los valores devueltos). > ANY: significaría que debe ser mayor de como mínimo un valor de los devueltos por la subconsulta.
Un ejemplo de una subconsulta sería el siguiente: SELECT Dni, Nombre, Ciudad FROM Pacientes P INNER JOIN Visitas V V.DniPaciente WHERE Importe < ANY ( SELECT Importe FROM Visitas WHERE YEAR(Fecha)=’2013’)
ON
P.Dni
Bloque II.- DISEÑO FÍSICO 134
=
La consulta mostraría aquellos pacientes (Dni, Nombre, Ciudad), que han realizado visitas con un Importe menor que algunos Importes de las visitas realizadas en 2012.
7.5.- En Expresiones (Select, Update, Insert, Delete) Algunas veces podremos utilizar las subconsultas en cualquier parte de la consulta principal, por ejemplo en una expresión. Un ejemplo sería: SELECT Dni, Nombre, AVG (Importe) AS Media, (SELECT AVG (Importe) FROM Visitas) AS Media_General FROM Pacientes P INNER JOIN Visitas V ON P.Dni = V.DniPaciente GROUP BY Dni, Nombre
En esta consulta, obtendríamos 4 columnas: el Dni de paciente, su Nombre, la Media de las visitas para ese paciente y la Media General de todos los pacientes de la clínica.
T5. SQL - Consultas Select 135
Bloque II.- DISEÑO FÍSICO 136
Ejercicios Propuestos
1.2.-
Queremos ver el Apellido, Nombre, Código Postal y Fecha de Alta de nuestros socios. Cuáles son las ciudades de mis Socios (sólo debe aparecer una vez esa ciudad).
3.-
Indica el Código Stock de las películas que han sido alquiladas.
4.-
Ver todos los campos de los socios que son de Alicante.
5.6.7.8.9.-
10.11.12.-
Ver el Título, Precio de compra y máximo n° de días de alquiler de las películas con un precio de compra superior o igual a 30 €. Mostrar el Apellido, Nombre, Ciudad y Teléfono con una fecha de alta superior a 31/12/94 (ordenado descendente por Ciudad y ascendente por Apellido). Indicar el Código de Socio, N° de Stock y Fecha Devolución de aquellos que han alquilado la película n° 3 o la fecha de devolución es menor que 1/9/01. Cuáles son los Títulos, ordenados descendentemente, de las películas cuyo precio de alquiler es menor que 2 € o el máximo n° de días es igual a 2. Mostrar todos los Socios cuya fecha de alta es superior al 1/8/95 y son de Alicante (deben aparecer todos los campos, pero en vez de que en la hoja de respuestas dinámica aparezca el Código debe aparecer N° de Orden y en lugar de CP aparecerá Código Postal). La consulta debe estar en orden ascendente por Teléfono. Ver cómo queda si aumentamos el precio de alquiler de las películas en un 10 % de aquellas películas con un máximo de días superior a 5. Título de las películas que han sido alquiladas; ordenadas ascendentemente por precio de compra (mostrar sólo el Título y el Precio de compra). Queremos saber el Apellido, Nombre, Título de la película, Formato, Precio de alquiler y Fecha de Salida de las películas alquiladas.
T5. SQL - Consultas Select 137
13.-Título de las películas pedidas por Socios de Alicante o el Código de la película está comprendido entre la 4 y la 7.
14.-Descripción de las categorías que han sido alquiladas. 15.-¿Qué Películas han sido alquiladas en el tercer trimestre del año 2001? 16.-¿Qué Socios tienen un apellido superior o igual a Rico? (mostrar todos los campos).
17.-Queremos ver los Socios cuyo nombre empiezan por la letra M (mostrar Apellido, Nombre y Teléfono).
18.-Mostrar aquellas películas que en su Título contengan una "g", sin importar donde está situada.
19.-Quiero
conocer aquellas películas cuyo título no empieza por una "El" (mostrar Título, Nombre de categoría v Precio de Compra).
20.-¿Qué Socios tienen valores en el teléfono? 21.-Ver
la siguiente información en una consulta (sólo para los Socios de Alicante): a.
SOCIO: Debe contener el Apellido, Nombre (p.e.: Rico Mira, Antonio).
b. CODIGO STOCK, de la película que ha sido alquilada. c.
PELÍCULA: Se compondrá del Título (categoría) - p.e.: Un día en las Carreras (Comedia).
d. MES DE SALIDA: Cambiar el formato de la fecha de salida. e.
PRECIO de Alquiler.
f.
DIFERENCIA: La diferencia entre la Fecha del Sistema y la Fecha de Salida.
g. COEFICIENTE de ANTIGÜEDAD, La diferencia anterior por 5.
Bloque II.- DISEÑO FÍSICO 138
22.-Queremos ver los tres primeros caracteres del Título de las películas que han sido alquiladas (mostrar una columna llamada TRES CARACTERES).
23.-Quiero obtener toda la información de TODOS los socios y si uno ha alquilado una película, mostrar también el contenido del alquiler (Código Película, Código de Stock, Fecha de salida y Fecha Devolución).
24.-Calcular el importe gastado por el video-club en la compra de películas. 25.-Calcular el importe gastado por el video-club en la compra de películas que han sido alquiladas.
26.-Queremos obtener la categoría de la película y el importe total gastado en cada categoría por los socios (encabezado de campos: Categoría y Total gastado por Categoría).
27.-Media
del precio que se ha gastado una ciudad alquilando películas. (Encabezados: Ciudad y Media de gasto).
28.-Indicar el n° de veces que se ha pedido cada película. 29.-Ver el total de euros que se han gastado los socios en el alquiler de películas, pero con la condición de que la fecha de salida sea del segundo semestre del 2001.
30.-Mostrar aquellos socios que tengan alguna M en su nombre. 31.-Mostrar los socios cuya ciudad es Alicante, Valencia o Elche. 32.-Mostrar el importe que se ha gastado cada socio en el alquiler de películas (ver el PLAN DE EJECUCIÓN de esta consulta).
33.-Obtén en una consulta el nombre de los Socios que NO han alquilado ninguna película o han alquilado dos o más películas.
34.-Mostrar la ciudad de los socios haya alquilado alguna película en DVD. Utiliza una sub-consulta IN.
35.-Obtener el código y nombre de los socios que han alquilado alguna película después del 1/1/2001. Utilizar una sub-consulta con EXISTS.
T5. SQL - Consultas Select 139
36.-Mostrar aquellos Socios con la media del importe de las películas alquiladas, cuyo importe supere a alguno de los precios de alquiler del año 2001. (Subconsulta con SOME).
37.-Mostrar el Nombre, los tres primeros caracteres de la ciudad y la diferencia entre el máximo y el mínimo precio de alquiler de todas las películas alquiladas de un socio. La única condición que se pone, es que la longitud del nombre del socio sea mayor de 5 caracteres.
38.-Mostrar el nombre del socio, la ciudad y un descuento sobre el precio de alquiler. El descuento lo aplicaremos utilizando la función RAND. La columna del descuento, tiene que estar redondeada a dos decimales.
39.-Obtener el nombre del mes, y para cada mes, la suma del precio de alquiler de las películas que han sido alquiladas.
40.-Mostrar el nombre del socio y el tiempo que las películas que no han sido devueltas llevan fuera del video club.
Bloque II.- DISEÑO FÍSICO 140
Tema 6. LENGUAJE DATOS
DE
MANIPULACIÓN
DE
En el tema anterior hemos visto como las consultas SELECT mostraban conjuntos de resultados, según los criterios especificados. Pero en ningún caso producían modificaciones en los datos. Para poder realizar inserciones en las tablas, borrar registros o actualizar una serie de valores necesitamos lo que llamamos Lenguaje de Manipulación de Datos (DML). Las instrucciones que llevarán a cabo estas instrucciones son: INSERT, DELETE y UPDATE
1.- Añadir datos (INSERT) Si lo que queremos es añadir nuevos registros a nuestras tablas utilizaremos la sentencia INSERT. Con esta sentencia, se pueden añadir una o más filas a la tabla. La sintaxis básica sería: INSERT [INTO] [lista de campos] valores
Los valores los podremos especificar de dos formas: a) Si utilizamos VALUES para indicar los valores de un registro. INSERT [INTO] VALUES (valores)
b) Utilizando SELECT para especificar más de una fila: INSERT [INTO] SELECT campos FROM tabla-s
1.1.- Insertar una fila (INSERT INTO ... VALUES) Los valores especificados después de la palabra VALUES irán separados por comas (con la única condición que deben del mismo tipo de datos que el campo donde se van a añadir los datos). Si no indicamos nada en la lista de campos, los valores deben ir en el mismo orden que las columnas de la tabla.
T6. Lenguaje de Manipulación de Datos 141
Veamos un par de ejemplos: INSERT INTO Pacientes VALUES (‘22345999’, ‘Antonio Pérez Leal’, ‘C/ La Marina, 34’, ‘03002’, ‘12/09/1980’) INSERT INTO Pacientes (DNI, Nombre, FechaNac) VALUES (‘24159357’, ‘Pilar Rico Rico’, ‘11/12/1985’)
En el segundo ejemplo, los campos de Pacientes que no están en la lista se le asignarán automáticamente el valor NULL al campo. Si queremos realizar esta operaciones utilizando el Diseñador de Consultas gráfico, tenemos que cambiar el tipo de consulta que queremos realizar, y luego añadir los campos que deseamos modificar junto con los valores nuevos. También podremos observar que en la parte inferior del Diseñador de Consultas se muestra el código Sql asociado a dicha inserción.
1.2.- Insertar varias filas (INSERT INTO ... SELECT) Podemos utilizar la sentencia SELECT para añadir más de un registro en las tablas. La sentencia SELECT, podrá ser todo lo complicada que deseemos, pero las columnas que devuelva tiene que coincidir en el mismo número de columnas del INSERT INTO, y que además sean también del mismo tipo (evidentemente no puedo añadir un campo fecha a uno que sea de tipo numérico). Veamos un ejemplo. Supongamos que tenemos una tabla Histórico, donde vamos guardando el acumulado anual que se ha gastado cada paciente por año. La estructura de la tabla Histórico será la siguiente: Bloque II.- DISEÑO FÍSICO 142
• • •
Año: Año en que se han recogido las visitas. Será de tipo alfanumérico, porque la consulta lo devuelve como un texto. Nombre: Nombre del paciente que ha realizado visitas ese año. Total: recoge el importe que se ha gastado ese paciente en todas las visitas realizadas ese año.
La tabla tiene almacenado datos hasta el año 2011, y vamos a realizar una consulta que añada lo que se ha gastado cada paciente en las visitas del 2012. Para ello escribiremos el siguiente código Sql:
INSERT INTO Historico SELECT YEAR(Fecha), Nombre, SUM(Importe) FROM Pacientes P INNER JOIN Visitas P.Dni=V.DniPaciente WHERE YEAR(Fecha)=’2012’ GROUP BY YEAR(Fecha), Nombre
V
ON
Si queremos realizar esta consulta desde el Diseñador de Consultas, tendremos que pulsar el botón derecho al lado de la tabla seleccionada, y elegir la opción Cambiar tipo, y luego Insertar resultados…Pudiendo componer consultas de inserción a partir de un Select. Aquí tendremos que indicar en la Columna, el campo o expresión de da origen a los datos anexados. Luego en la columna Anexar, escoger los campos de las tablas donde queremos insertar los valores.
T6. Lenguaje de Manipulación de Datos 143
2. Eliminación de datos (DELETE) 2.1.- Eliminar filas La instrucción para cuando queremos eliminar registros de nuestras tablas es DELETE. La sintaxis será la siguiente: DELETE FROM WHERE
Si no indicamos ninguna condición (que no ponemos la cláusula WHERE), lo que ocurrirá es que se borraran todos los datos de la tabla, quedando solamente la estructura de campos. Pero si lo que queríamos era borrar la tabla, tendríamos que utilizar la sentencia DROP TABLE. Por ejemplo, si quiero borrar los Pacientes cuyo turno es 1, la sentencia sería la siguiente: DELETE FROM Pacientes WHERE Turno=1
Cuando eliminemos registros, pueden existir restricciones de Integridad Referencial que nos impidan el borrado de esas filas. Por ejemplo, si el paciente 5 perteneciese al turno 1, hubiese realizado visitas, no dejará que se borre por la clave ajena que definimos en visitas. Para que se pueda dar de baja, primero tendremos que eliminar todas las visitas de ese paciente, y luego ya podremos dar de baja el paciente. Si queremos hacer la misma consulta desde el Diseñador de consultas, tendremos que seleccionar la opción Cambiar tipo Eliminar. Seleccionar a continuación la columna que queremos utilizar como criterio (Turno) y en filtro indicar la condición (=1).
Bloque II.- DISEÑO FÍSICO 144
2.2.- Eliminación de todas las filas (Truncate) Pero si lo que queremos es eliminar todos los registros de una tabla, en vez de utilizar el DELETE sin el where, utilizaríamos la sentencia TRUNCATE que es mucho más rápido para eliminar todas las filas. La sintaxis sería: TRUNCATE TABLE
Por ejemplo, si quiero borrar toda la tabla Visitas: TRUNCATE TABLE Visitas
Una restricción del TRUNCATE, es que no se puede realizar sobre una tabla a la cual exista una referencia con la restricción FOREIGN KEY.
3. Actualización de datos (UPDATE) 3.1.- Cambiar datos En el caso que lo que se desee es modificar o cambiar algún valor de los registros que tenemos, la sentencia a utilizar es el UPDATE. Por ejemplo, si queremos cambiar la Ciudad de todos aquellos pacientes de Alicante por Alacant. O por ejemplo, si queremos aumentar el Importe de nuestras visitas en un 20% para incluir el IVA. La sintaxis del UPDATE será la siguiente: UPDATE SET WHERE
La sentencia UPDATE, se puede utilizar para cambiar todos los registros de una tabla, si no ponemos ninguna condición Where en la instrucción. O podemos cambiar 1 o varios valores a la vez colocando la cláusula Where en el Update.
Veamos las sentencias de los dos ejemplos que hemos visto en los párrafos anteriores. T6. Lenguaje de Manipulación de Datos 145
a) Actualizar a Alacant todos los pacientes de Alicante. UPDATE Pacientes SET Ciudad=’Alacant’ WHERE Ciudad=’Alicante’
b) Aumentar en un 20 % el Importe de las Visitas. UPDATE Visitas SET Importe=Importe*1.20
En estas dos actualizaciones hay que tener en cuenta una cosa. Si ejecutamos dos veces cada sentencia Update, la primera vez cambiará las ciudades de Alicante a Alacant, pero la segunda vez no realizará ningún cambio, ya que en la tabla Pacientes no existirá ya ningún paciente de Alicante (serán todos de Alacant). Pero en la segunda sentencia Update, al ejecutarla la segunda vez, volverá a incrementar en otro 20 % los Importes de las visitas. Así que, hay que llevar cuidado cuando ejecutemos una consulta no realizarlo dos veces, porque puede afectar a los datos reales de las tablas. Para realizar estas consultas desde el Diseñador de consultas tendríamos que seleccionar la opción Actualizar, y a continuación indicar la columna a modificar y el nuevo valor.
3.2.- Uso de Update con subconsultas Las subconsultas dentro del Update nos permitirán seleccionar los registros que vamos a actualizar. Por ejemplo, si queremos disminuir el Importe en un 10% de aquellas Visitas cuyo Importe es superior a la media de los Importes de loa Pacientes de Elche, la sentencia Sql sería: UPDATE Visitas SET Importe=Importe * 0.9 WHERE Importe > (SELECT AVG(Importe) FROM Pacientes P INNER JOIN Visitas V ON P.Dni=V.DniPaciente WHERE Ciudad=’Elche’)
Bloque II.- DISEÑO FÍSICO 146
Ejercicios Propuestos Antes de realizar las prácticas debemos crear una copia de seguridad de Video Club, y restaurarla con otro nombre (por ejemplo, VideoDML), y trabajar con esta última, y así no borrar datos de la original. Hay que tener en cuenta, que habrá que crear todas las relaciones de las claves ajenas.
INSERT 1.- Utilizando el diseñador de consultas, añadir a la tabla Socios el siguiente socio con esta información: Apellidos Rico Rico
Nombre Antonio
Dirección C/ Sombra, 5
Código Postal 03001
2.- Desde el editor de SQL, añadir a la tabla Alquiler los siguientes datos: Código Socio 35
Código Stock 15
Fecha Salida 1/3/2009
Como no deja, cambiar el Código de Socio 35 por el 3, y realizar de nuevo la inserción.
3.- Crear una copia de seguridad de la tabla Categorías utilizando el Create Table y el Insert Into … Value.
4.- Crear mediante una consulta Select una tabla llamada Historico_Socios que con-tenga los siguientes datos, pero para aquellos socios que han alquilado alguna película: Código 1 …
Nombre y Apellidos Antonio Rico Rico …
Ciudad Alicante …
Fecha Alta 1/02/09 …
T6. Lenguaje de Manipulación de Datos 147
5.- Crear una tabla llamada Resumen (con Create table) que tenga la siguiente estructura, y luego añadirle los registros con una consulta select. Un ejemplo de contenido de la tabla podría ser los valores de la siguiente tabla, donde tenemos para cada Socio, tendremos las películas que ha alquilado y el importe que se ha gastado alquilando películas. Código 23
Socio Rico Rico, Antonio
Películas alquiladas 4
Importe gastado 12,00
DELETE 6.- Dar de baja la Película cuyo código es el 9 (Psicosis). 7.- Siguiendo con el ejercicio anterior, y para que nos deje eliminar la película, debemos modificar las claves ajenas necesarias, de forma que permita la eliminación en cascada de los registros asociados a la película 9 que queremos dar de baja.
TRUNCATE TABLE
8.-
Dar de baja toda la tabla CopiaCATEGORIAS (si tenemos problemas de integridad, crearnos una copia, y dar de baja todos los registros de la copia). Comprobar si ha sido vaciada la tabla.
UPDATE 9.- Modificar la ciudad de aquellos socios de Alicante por Alacant. Ejecutar un par de veces la consulta.
10.- Aumentar el Precio de Alquiler de todas las películas en un 15 %.
Bloque II.- DISEÑO FÍSICO 148
View more...
Comments