Universidade Veiga de Almeida Instituto de Ciência e Tecnologia Modelagem e Projeto de Banco de Dados e Sistemas de Gerenciamento de Banco de Dados
Carlos Augusto B. Ribeiro Marcos Vinícius Ramos Eduardo Corrêa Lima
Considerações Este conteúdo trabalho foi inicialmente elaborado pelo Coordenador e Professor Carlos Augusto B. Ribeiro. O professor Marcos Vinícius Ramos, DBA e especialista em ORACLE e SQL SERVER enriqueceu-a ainda mais e eu, inseri exercícios de modelagem conceitual, formas normais, engenharia reversa e diversos exemplos da linguagem SQL bem como modifiquei a forma de apresentação. Queremos aproveitar a oportunidade e dividir com vocês duas frases, que possivelmente permearão vários momentos das nossas vidas. "Nada mais difícil de manejar, mais perigoso de conduzir ou de mais incerto sucesso, do que liderar a introdução de uma nova ordem de coisas. Pois, o inovador tem contra si todos os que se beneficiarão com a nova ordem". NICOLAU MAQUIAVEL 1459 – 1527 “É muito melhor arriscar coisas grandiosas, alcançar triunfos e glórias, mesmo expondo-se à derrota, do que formar fila com os pobres de espírito que nem gozam muito nem sofrem muito, porque vivem nesta penumbra cinzenta que não conhece nem vitória nem derrota”. THEODORE ROOSEVELT
Esperamos que o material didático, que atualizado, seja útil para o seu aprendizado.
constantemente
mantemos
Muito obrigado,
Eduardo Corrêa Lima eduardocorrealima@hotmail.com
Carlos Augusto B. Ribeiro carlos@uerj.br
Apresentação Este curso tem como objetivo, oferecer uma noção geral sobre a construção de sistemas de banco de dados. Para isto, é necessário estudar modelos para a construção de projetos lógicos de bancos de dados, modelos para a construção de projetos físicos de banco de dados, técnicas de controle de dependência de dados e métodos de consultas. Para construção dos modelos lógicos, será estudado o modelo Entidade Relacionamento, utilizando a abordagem proposta em ELMAS89 que oferece uma notação rica em recursos, permitindo a modelagem de entidades normais, fracas, atributos simples, compostos, multivalorados, derivados e a modelagens de objetos mais complexos como classes e subclasses (modelo Entidade Relacionamento Estendido). Para construção dos modelos físicos, será estudado o modelo Relacional como originalmente proposto por CODD. Para eliminar dependência de dados, utilizaremos a normalização, abordando a Primeira, Segunda e Terceira Formas Normais, propostas originalmente por COOD bem como a BCNF (Boyce-Cood Normal Form). Para a elaboração de consultas, será estudado a Álgebra Relacional, que nada mais é do que uma forma canônica para as linguagens de consulta e a linguagem de consultas SQL, padrão mundial nos gerenciadores de Bancos de Dados mais utilizados no mercado.
Universidade Veiga de Almeida Instituto Superior PolitĂŠcnico Sistemas de Gerenciamento de Banco de Dados
4
Capítulo 1 Introdução e Conceitos Gerais
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Introdução e Conceitos Gerais A tecnologia aplicada aos métodos de armazenamento de informações vem crescendo e gerando um impacto cada vez maior no uso de computadores, em qualquer área em que os mesmos podem ser aplicados. Um banco de dados pode ser definido como um conjunto de dados devidamente relacionados. Por dados podemos compreender como fatos conhecidos que podem ser armazenados e que possuem um significado implícito. Porém, o significado do termo “banco de dados” é mais restrito que simplesmente a definição dada acima. Um banco de dados possui as seguintes propriedades: -
um banco de dados é uma coleção lógica coerente de dados com um significado inerente; uma disposição desordenada dos dados não pode ser referenciada como um banco de dados;
-
um banco de dados é projetado, construído e povoado com dados para um propósito específico; um banco de dados possui um conjunto pré definido de usuários e aplicações;
-
um banco de dados representa algum aspecto do mundo real, o qual é chamado de mini mundo; qualquer alteração efetuada no mini mundo é automaticamente refletida no banco de dados.
Um banco de dados pode ser criado e mantido por um conjunto de aplicações desenvolvidas especialmente para esta tarefa ou por um Sistema Gerenciador de Banco de Dados (SGBD). Um SGBD permite aos usuários criarem e manipularem bancos de dados de propósito geral. O conjunto formado por um banco de dados mais as aplicações que manipulam o mesmo é chamado de Sistema de Banco de Dados. Banco de Dados X Processamento Tradicional de Arquivos Auto Informação Uma característica importante da abordagem Banco de Dados é que o SGBD mantém não somente os dados, mas também a forma como os mesmos são armazenados, contendo uma descrição completa do banco de dados. Estas informações são armazenadas no catálogo do SGBD, o qual contém informações, como a estrutura de cada arquivo, o tipo e o formato de armazenamento de cada tipo de dado, restrições, etc. A informação armazenada no catálogo é chamada de Meta Dados. No processamento tradicional de arquivos, o programa que irá manipular os dados deve conter este tipo de informação, ficando limitado a manipular as informações que o mesmo conhece. Utilizando a abordagem banco de dados, a aplicação pode manipular diversas bases de dados diferentes.
6
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Separação entre Programas e Dados No processamento tradicional de arquivos, a estrutura dos dados está incorporada ao programa de acesso. Desta forma, qualquer alteração na estrutura de arquivos implica na alteração no código fonte de todos os programas. Já na abordagem banco de dados, a estrutura é alterada apenas no catálogo, não alterando os programas.
Programas de Aplicação/Consulta
Software para processar a manipulação
Software para acesso aos dados
Dados
Meta-Dados Sistema de Bancos de Dados
Figura 1 Abstração de Dados O SGBD deve fornecer ao usuário uma representação conceitual dos dados, sem fornecer muitos detalhes de como as informações são armazenadas. Um modelo de dados é uma abstração de dados que é utilizada para fornecer esta representação conceitual utilizando conceitos lógicos como objetos, suas propriedades e seus relacionamentos. A estrutura detalhada e a organização de cada arquivo são descritas no catálogo. Múltiplas Visões de Dados Como um conjunto de informações pode ser utilizado por um conjunto diferenciado de usuários, é importante que estes usuários possam ter visões diferentes da base de dados. Uma visão é definida como um subconjunto de uma base de dados, formando deste modo, um conjunto virtual de informações. Usuários Para um grande banco de dados, existe um grande número de pessoas envolvidas: os encarregados com o projeto, quem o utiliza e os responsáveis pela manutenção.
7
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Administrador de Banco de Dados (DBA) Em um ambiente de banco de dados, o SGBD é o recurso primário e os SOFTWARES de apoio são os recursos secundários. A administração destes recursos cabe ao Administrador de Banco de Dados, o qual é responsável pela autorização de acesso ao banco de dados e pela coordenação e monitoração de seu uso. Administrador de Dados (DA) O Administrador de Dados (DA ou AD) é responsável pela identificação dos dados que devem ser armazenados no banco de dados, escolhendo a estrutura correta para representar e armazenar dados. Muitas vezes, os administradores de dados atuam como STAFF do DBA, assumindo outras responsabilidades após a construção do banco de dados. É função do administrador de dados também avaliar as necessidades de cada grupo de usuários para definir as visões que serão necessárias, integrando-as, fazendo com que o banco de dados seja capaz de atender a todas as necessidades dos usuários. Usuários Finais Existem basicamente três categorias de usuários finais que são os usuários finais do banco de dados, fazendo consultas, atualizações e gerando documentos: -
Usuários casuais: acessam o banco de dados casualmente, mas que podem necessitar de diferentes informações a cada acesso; utilizam sofisticadas linguagens de consulta para especificar suas necessidades;
-
Usuários novatos ou paramétricos: utilizam porções pré definidas do banco de dados, utilizando consultas preestabelecidas que já foram exaustivamente testadas;
-
Usuários sofisticados: são usuários que estão familiarizados com o SGBD e realizam consultas complexas.
Analistas de Sistemas e Programadores de Aplicações Os analistas determinam os requisitos dos usuários finais e desenvolvem especificações para transações que atendam estes requisitos, e os programadores implementam estas especificações como programas, testando, depurando, documentando e dando manutenção no mesmo. É importante que, tanto analistas quanto programadores, estejam a par dos recursos oferecidos pelo SGBD. Vantagens e desvantagens do uso de um SGBD
8
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Controle de Redundância No processamento tradicional de arquivos, cada grupo de usuários deve manter seu próprio conjunto de arquivos e dados. Desta forma, acabam ocorrendo redundâncias que prejudicam o sistema com problemas como: Toda vez que for necessário atualizar um arquivo de um grupo, então todos os grupos devem ser atualizados para manter a integridade dos dados no ambiente como um todo; A redundância desnecessária de dados leva ao armazenamento excessivo de informações, ocupando espaço que poderia estar sendo utilizado com outras informações. Compartilhamento de Dados Um SGBD multiusuário deve permitir que múltiplos usuários acessem o banco de dados ao mesmo tempo. Este fator é essencial para que múltiplas aplicações integradas possam acessar o banco. O SGBD multiusuário deve manter o controle de concorrência para assegurar que os resultados de atualizações sejam corretos. Um banco de dados multiusuário deve fornecer recursos para a construção de múltiplas visões. Restrição a Acesso não Autorizado Um SGBD deve fornecer um subsistema de autorização e segurança, o qual é utilizado pelo DBA para criar contas de usuários e especificar as restrições destas contas; o controle de restrições se aplica tanto ao acesso aos dados (segurança lógica) quanto ao uso de software inerentes ao SGBD e acesso físico à instalação do servidor e/ou servidores de bancos de dados (segurança física). Representação de relacionamentos complexos entre dados Um banco de dados pode incluir uma variedade de dados que estão interrelacionados de várias formas. Um SGBD deve fornecer recursos para se representar uma grande variedade de relacionamentos entre os dados, bem como, recuperar e atualizar os dados de maneira prática e eficiente. Tolerância a falhas Um SGBD deve fornecer recursos para recuperação de falhas tanto de software quanto de hardware. Quando não utilizar um SGBD Em algumas situações, o uso de um SGBD pode representar uma carga desnecessária aos custos quando comparado à abordagem processamento tradicional de arquivos, por exemplo:
9
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Alto investimento inicial na compra de software e hardware adicionais;
-
Generalidade que um SGBD fornece na definição e processamento de dados;
-
Sobrecarga na provisão de controle de segurança, controle de concorrência, recuperação e integração de funções.
Problemas adicionais podem surgir caso os administradores de dados ou os administradores de banco de dados não elaborem os projetos corretamente ou se as aplicações não são implementadas de forma apropriada. Se o DBA não administrar o banco de dados de forma correta, tanto a segurança quanto a integridade dos sistemas podem ser comprometidas. A sobrecarga causada pelo uso de um SGBD e a má administração justificam a utilização da abordagem processamento tradicional de arquivos em casos como: -
O banco de dados e as aplicações são simples, bem definidas e não se esperam mudanças no projeto;
-
A necessidade de processamento em tempo real de certas aplicações, que são terrivelmente prejudicadas pela sobrecarga causada pelo uso de um SGBD;
-
Não haverá múltiplo acesso ao banco de dados.
Conceitos e Arquiteturas de um SGBD Modelos de Dados Definição: conjunto de conceitos que descrevem a estrutura lógica e física de um banco de dados. Uma das principais características da abordagem banco de dados, é que a mesma fornece alguns níveis de abstração de dados omitindo ao usuário final, detalhes de como estes dados são armazenados. Um modelo de dados é um conjunto de conceitos que podem ser utilizados para descrever a estrutura lógica e física de um banco de dados. Por estrutura podemos compreender o tipo dos dados, os relacionamentos e as restrições que podem recair sobre os dados. Os modelos são classificados basicamente em três tipos: -
Modelo de dados conceitual (alto nível), que fornece uma visão mais próxima do modo como os usuários visualizam os dados realmente (Entidades e relacionamentos);
-
Modelo de dados lógico (nível intermediário), que fornece uma visão lógica da derivação das estruturas conceituais (Tabelas e chaves);
10
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Modelo de dados físico (baixo nível), que fornece uma visão mais detalhada do modo como os dados estão realmente armazenados no computador (Tabelas, índices, chaves, arquivos físicos, memória, etc.).
Requisitos do modelo conceitual (ERA) - Entrevistas, questionários, observações diretas - Regras de Negócio - Requisitos de Informação
Modelo Descritivo
Expressividade: grau de detalhamento Legibilidade: todos devem entender Flexibilidade: permitir mudanças Minimalidade: evitar redundâncias Correção: utilizar a simbologia correta Completeza: atender às Regras de Negócio e aos Requisitos de Informação
Modelo Conceitual
Transformação do ERA em tabelas
Criação das tabelas
Modelo Lógico Modelo Físico
Esquemas e Instâncias Em qualquer modelo de dados utilizado, é importante distinguir a descrição do banco de dados do próprio SGBD. A descrição de um banco de dados é chamada de esquema de um banco de dados e é especificada durante o projeto do banco de dados. Geralmente, poucas mudanças ocorrem no esquema do banco de dados. Os dados armazenados em um banco de dados em um determinado instante do tempo formam um conjunto chamado de instância do banco de dados. A instância altera toda vez que uma alteração no banco de dados é feita. O SGBD é responsável por garantir que toda instância do banco de dados satisfaça ao esquema do banco de dados, respeitando sua estrutura e suas restrições. O esquema de um banco de dados também pode ser chamado de intenção de um banco de dados e a instância de extensão de um banco de dados. A Arquitetura Três Esquemas A principal meta da arquitetura três esquemas é separar as aplicações do usuário do banco de dados físico. Os esquemas podem ser definidos como: -
Nível interno: ou esquema interno, o qual descreve a estrutura de armazenamento físico do banco de dados; utiliza um modelo de dados e
11
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
-
descreve detalhadamente os dados armazenados e os caminhos de acesso ao banco de dados; Nível conceitual: ou esquema conceitual, o qual descreve a estrutura do banco de dados como um todo; é uma descrição global do banco de dados, que não fornece detalhes do modo como os dados estão fisicamente armazenados; Nível externo: ou esquema de visão, o qual descreve as visões do banco de dados para um grupo de usuários; cada visão descreve quais porções do banco de dados um grupo de usuários terá acesso.
Usuários Finais
Visão externa
Nível conceitual
Nível interno
Visão externa
Esquema Conceitual
Esquema Interno
Mapeamento conceitual externo
Mapeamento conceitual interno
Banco de dados armazenado
Figura 3 Independência de Dados A independência de dados pode ser definida como a capacidade de se alterar um esquema em um nível em um banco de dados sem ter que alterar um nível superior. Existem dois tipos de independência de dados: -
Independência de dados lógica: é a capacidade de alterar o esquema conceitual sem ter que alterar o esquema externo ou as aplicações do usuário.
-
Independência de dados física: é a capacidade de alterar o esquema interno sem ter que alterar o esquema conceitual, o esquema externo ou as aplicações do usuário.
As Linguagens para uso em bancos de Dados Para a definição dos esquemas conceitual e interno utiliza-se uma linguagem chamada DDL - DATA DEFINITION LANGUAGE - Linguagem
12
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
de Definição de Dados. O SGBD possui um compilador DDL que permite a execução das declarações para identificar as descrições dos esquemas e para armazená-las no catálogo do SGBD. A DDL é utilizada nos SGBD, onde a separação entre os níveis interno e conceitual não é muito clara. Em um SGBD em que a separação entre os níveis conceitual e interno é bem clara, é utilizada uma outra linguagem, a SDL (STORAGE DEFINITION LANGUAGE Linguagem de Definição de Armazenamento) para a especificação do esquema interno. A especificação do esquema conceitual fica por conta da DDL. Em um SGBD que utiliza a arquitetura três esquemas, é necessária a utilização de mais uma linguagem para a definição de visões, a VDL (VISION DEFINITION LANGUAGE - Linguagem de Definição de Visões). Uma vez que o esquema esteja compilado e o banco de dados esteja povoado, utiliza-se uma linguagem para fazer a manipulação dos dados, a DML (DATA MANIPULATION LANGUAGE - Linguagem de Manipulação de Dados). Os Módulos Componentes de um SGBD Um SGBD é um sistema complexo, formado por um conjunto muito grande de módulos. A figura 4 mostra um esquema da estrutura de funcionamento de um SGBD. Usuários Simples
Programadores de Aplicação
Usuários ocasionais
DBA
Programas de Aplicação
Chamadas de Rotina
Consultas
Esquemas de bancos de dados
Pré-compilador da linguagem de manipulação de dados
Processador da Consultas
Compilador da linguagem de Definição de Dados
Código objeto dos programas de aplicação
Gerenciador de Bancos de Dados SGBD
Gerenciador de Arquivos
Arquivos de dados
Dicionário de dados
Memória de disco
Figura 4
13
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Classificação dos SGBD O principal critério para se classificar um SGBD é o modelo de dados no qual é baseado. Existe o modelo hierárquico, e de rede e a grande maioria dos SGBD contemporâneos que são baseados no modelo relacional, alguns em modelos conceituais e alguns em modelos orientados a objetos. Modelo Hierárquico O modelo de dados Hierárquico está baseado na estrutura de dados: REGISTROS e relacionamentos PAI-FILHO, que consiste em uma coleção de registros conectados a outro através de ligações que representam o relacionamento PAI-FILHO. Cardiologia
Divisão do Hospital
Pacientes
Médicos
10 José
11 Maria
3 Carlos
1 Fred
12 João
1 Fred
2 Júlio
Figura 5 Cada registro é composto por uma coleção de atributos mono valorados. O relacionamento PAI-FILHO é do tipo 1:N entre dois tipos de registro: o tipo do registro do lado 1 é chamado de PAI enquanto que o registro do lado N é chamado de FILHO. Este modelo apresenta problemas para representar relacionamentos M:N. No exemplo de banco de dados da figura 5, seria mais fácil obter as informações das visitas dos médicos efetuadas ao paciente 10 – José e mais complicado saber quais pacientes foram visitados pelo médico 1 – Fred. Modelo de Rede É baseado na estrutura de dados de REGISTROS e CONJUNTOS DE DADOS. Diferentemente do modelo Hierárquico, suporta tipos de dados complexos: vetores e grupos (atributos compostos). Veja o atributo ENDEREÇO no exemplo a seguir.
14
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Também é capaz de representar relacionamentos M:N. Estes relacionamentos podem ser simulados no modelo hierárquico pela duplicação de registros. Suporta o tipo de manipulação (DML) que trata um registro por vez, com linguagens de propósito geral (COBOL) chamada de linguagem HOST. No exemplo da figura 6, estão representados, com o diagrama de BACHMAN, o registro do tipo PACIENTE (proprietário) e o registro do tipo MÉDICO (membro). Paciente CPF
Endereço
Nome
Rua
Cidade
CEP
Medicado por Médico Nome
Divisão
Figura 6 Outras classificações -
quanto aos Usuários: um SGBD pode ser mono-usuário, normalmente utilizado em computadores pessoais (também chamados DESKTOP) ou multiusuário, utilizado em estações de trabalho, minicomputadores e máquinas de grande porte;
-
quanto à Localização: um SGBD pode ser localizado (também chamado centralizado) ou distribuído; se ele for localizado, então todos os dados estarão em uma máquina (ou em um único disco) ou distribuído, onde os dados estarão distribuídos por diversas máquinas (ou diversos discos);
-
quanto ao Ambiente: homogêneo é o ambiente composto por um único SGBD e um ambiente heterogêneo é composto por diferentes SGBD.
Modelagem de Dados Conceitual de Alto Nível O Modelo Entidade e Relacionamento (MER) O modelo Entidade Relacionamento é um modelo de dados conceitual de alto nível, cujos conceitos foram projetados para estar o mais próximo possível da visão que o usuário tem dos dados, não se preocupando em representar como estes dados estarão realmente armazenados. O modelo ER é utilizado principalmente durante o processo de projeto de banco de dados. 15
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Entidades e Atributos O objeto básico tratado pelo modelo ER é a entidade, que pode ser definida como um objeto do mundo real, concreto ou abstrato e que possui existência independente. Cada entidade possui um conjunto particular de propriedades que a descreve chamado de atributos. Um atributo pode ser dividido em diversas partes com significado independente entre si, recebendo o nome de atributo composto. Um atributo que não pode ser subdividido é chamado de atributo simples ou atômico. O atributo que pode assumir apenas um determinado valor em uma determinada instância é denominado atributo simplesmente valorado, enquanto que um atributo que pode assumir diversos valores em uma mesma instância é denominado atributo multivalorado. Um atributo que é gerado a partir de outro atributo é chamado de atributo derivado. TIPOS ENTIDADE, Conjunto de Valores, Atributo Chave Um banco de dados costuma conter grupos de entidades que são similares, possuindo os mesmos atributos, porém, cada entidade com seus próprios valores para cada atributo. Este conjunto de entidades similar define um TIPO ENTIDADE. Cada TIPO ENTIDADE é identificado por seu nome e pelo conjunto de atributos que definem suas propriedades. A descrição do TIPO ENTIDADE é chamada de esquema do TIPO ENTIDADE, especificando o nome do TIPO ENTIDADE, o nome de cada um de seus atributos e qualquer restrição que incida sobre as entidades. Uma restrição muito importante em uma entidade de um determinado TIPO ENTIDADE é a chave. Um TIPO ENTIDADE possui um atributo cujos valores são distintos para cada entidade individual. Este atributo é chamado atributo chave ou atributo identificador e seus valores podem ser utilizados para identificar cada entidade de forma única. Muitas vezes, uma chave pode ser formada pela composição de dois ou mais atributos. Uma entidade pode também ter mais de um atributo chave. Cada atributo simples de um TIPO ENTIDADE está associado com um conjunto de valores denominado domínio, o qual especifica o conjunto de valores que podem ser designados para este determinado atributo para cada entidade. Chave Primária (matrícula) Atributo ou propriedade (nome)
Entidade
(0,n)
Atributo multi-valorado (telefone) Atributo composto (endereço)
Atributo derivado (dígito)
Figura 7 16
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Tipos e Instâncias de Relacionamento Além de conhecer detalhadamente os TIPOS ENTIDADE, é muito importante conhecer também os relacionamentos entre estes TIPOS ENTIDADE. Um TIPO RELACIONAMENTO entre entidades é um conjunto de associações entre TIPOS ENTIDADE. Informalmente falando, cada instância de relacionamento r1 em R é uma associação de entidades, onde a associação inclui exatamente uma entidade de cada TIPO ENTIDADE participante no TIPO RELACIONAMENTO. Isto significa que estes TIPOS ENTIDADE estão relacionadas de alguma forma no mini mundo. A figura 8 mostra um exemplo entre dois TIPOS ENTIDADE (Produto e Cliente) e o relacionamento entre eles (Venda). Repare que para cada relacionamento, participam apenas uma entidade de cada TIPO ENTIDADE, porém, uma entidade pode participar de mais do que um relacionamento. código
Produto
CPF (1,n)
Venda
(1,n)
Cliente
nome
descrição data da venda
Figura 8 Grau de um Relacionamento O grau de um TIPO RELACIONAMENTO significa o número de TIPOS ENTIDADE que participam do TIPO RELACIONAMENTO. No exemplo da figura 8, temos um relacionamento binário. O grau de um relacionamento é ilimitado, porém, a partir do grau 3 (ternário), a compreensão e a dificuldade de se desenvolver a relação corretamente se tornam extremamente complexas, conforme demonstrado nas figuras 9 e 10. Sempre que possível, modelar os relacionamentos ternários (ou superiores) em uma AGREGAÇÃO e relacioná-la com a terceira TIPO ENTIDADE, conforme demonstrado nas figuras 9 e 10.
Senha CPF
CRM (0,1)
Médico
nome
(1,n)
Consulta
data
(1,n)
Paciente nome
Figura 9
17
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Senha (1,1) Liberação (0,1) CPF
CRM
Médico
(1,n)
Consulta
(1,n)
data
nome
Paciente nome
Figura 10 Outras Características de um Relacionamento Relacionamentos como Atributos Algumas vezes é conveniente pensar em um relacionamento como um atributo. Considere o exemplo da figura anterior. Podemos pensar departamento como sendo um atributo da entidade empregado, ou empregado, como um atributo multivalorado da entidade departamento. Se uma entidade não possuir existência muito bem definida, talvez seja mais interessante que ela seja representada como um atributo, para a manter a coesão do modelo lógico. código
Depto
CPF (1,n)
(1,1)
Empregado
nome
descrição
Figura 11 Nomes de Papéis e Relacionamentos Recursivos Cada TIPO ENTIDADE que participa de um TIPO RELACIONAMENTO desempenha um papel particular no relacionamento. O nome do papel representa a atuação desempenhada pela TIPO ENTIDADE no relacionamento. No exemplo da figura abaixo, nós temos o papel supervisor ou supervisionado para o TIPO ENTIDADE FUNCIONÁRIO. Nomes de papéis não são necessariamente importantes quando todas as entidades participantes desempenham papéis diferentes. Algumas vezes, o papel torna-se essencial para distinguir o significado de cada participação. Isto é muito comum em relacionamentos recursivos.
18
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Um relacionamento recursivo é um relacionamento entre entidades do mesmo TIPO ENTIDADE. Veja o exemplo das figuras 12, 13, 14 e 15 a seguir. O relacionamento recursivo também é conhecido como auto relacionamento. supervisor (1,n)
Funcionário
Chefia (1,1)
supervisionado
Figura 12
(0,1)
Pessoa
Casada (0,1)
Figura 13 É necessária (1,n)
Disciplina
Pré-Req (1,n) Necessita
Figura 14
É componente (0,1)
Peça
Compõe (0,n) É composta
Figura 15 Cobertura Resumidamente, cobertura é o escopo da generalização, ou seja, quais entidades especializadas, estão em um determinado modelo conceitual, definidas (cobertas) pela generalização. As especializações podem ser: -
Totais (T) ou Parciais (P): define se o modelo contempla totalmente ou parcialmente, os tipos de entidades envolvidas na generalização; 19
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Exclusivas (E) ou Sobrepostas (S): determina se os elementos participam exclusivamente de uma especialização ou se sobrepõem à outra.
Observe as figuras 16, 17, 18 e 19 a seguir, alguns exemplos de cobertura. Pessoa (T,E)
Física
Jurídica
Figura 16
Funcionários (P,E)
RH
INFO
Figura 17 Profissional de Cinema (P,S)
Diretor
Ator
Figura 18
Cargo (T,S)
Empregado
Chefe
Figura 19 Restrições em Tipos Relacionamentos Geralmente, os tipos relacionamentos sofrem certas restrições que limitam as possíveis combinações das entidades participantes. Estas restrições são derivadas de restrições impostas pelo estado destas entidades no mini mundo.
20
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
A este tipo de restrição, nós chamamos cardinalidade. A cardinalidade indica o número de relacionamentos dos quais uma entidade pode participar. A cardinalidade pode ser: 0:1, 1:1, 1:N, M:N. Matrícula
código
Disciplina
(1,n)
Cursa
(1,n)
Aluno nome
descrição
Figura 20 Outra restrição muito importante é a participação. A participação define a existência de uma entidade através do relacionamento, podendo ser parcial ou total. Veja o a figura 21 abaixo, onde a participação do empregado é parcial, pois nem todo empregado gerencia um departamento, porém a participação do departamento neste relacionamento é total, pois todo departamento precisa ser gerenciado por um empregado. Desta forma, todas as entidades do TIPO ENTIDADE DEPTO precisam participar do relacionamento, mas nem todas as entidade do TIPO ENTIDADE EMPREGADO precisam participar do relacionamento. Já no exemplo da figura 22 ambas as participações são totais pois todo Empregado precisa trabalhar em um Projeto e todo Projeto tem que ter Empregado trabalhando nele. Estas restrições são chamadas de restrições estruturais.
Empregado
(0,1)
Gerencia
(1,1)
Depto
Figura 21
Empregado
(1,n)
Trabalha
(1,n)
Projeto
Figura 22 Algumas vezes, torna-se necessário armazenar um atributo no TIPO RELACIONAMENTO. Veja o exemplo, da figura 21. Poderíamos desejar saber em que dia o Empregado passou a gerenciar o Departamento. Pode se tornar difícil estabelecer a qual TIPO ENTIDADE pertence atributo, pois o mesmo é definido apenas pela existência do relacionamento. Quando temos relacionamentos com cardinalidade 1:1, podemos colocar o atributo em uma das entidades, de preferência, na entidade com participação total. 21
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
No caso, o atributo poderia ir para o TIPO ENTIDADE departamento. Isto porque nem todo empregado participará do relacionamento. Caso as cardinalidades máximas sejam 1:N, então podemos migrar o atributo no TIPO ENTIDADE com cardinalidade N para o de cardinalidade 1. Porém, se a cardinalidade for N:M, então o atributo deverá mesmo ficar no TIPO RELACIONAMENTO. Veja o exemplo da figura 22. Caso queiramos armazenar quantas horas cada empregado trabalhou em cada projeto, então este deverá ser um atributo do relacionamento. Tipos Entidade Fraca Alguns TIPOS ENTIDADE podem não ter um atributo chave por si só. Isto implica que não poderemos distinguir algumas entidades por que as combinações dos valores de seus atributos podem ser idênticas. Estes TIPOS ENTIDADE são chamados entidades fracas. As entidades deste tipo precisam estar relacionadas com uma entidade pertencente ao TIPO ENTIDADE proprietária. Este relacionamento é chamado de relacionamento identificador. O TIPO ENTIDADE DEPENDENTE é uma entidade fraca pois não possui um método de identificar uma entidade única. O EMPREGADO não é uma entidade fraca, pois possui um atributo para identificação (atributo chave). O número do RG de um empregado identifica um único empregado. Porém, um dependente de 5 anos de idade não possui necessariamente um documento. Desta forma, esta entidade é um TIPO ENTIDADE fraca. Um TIPO ENTIDADE fraca possui uma chave parcial, que juntamente com a chave primária da entidade proprietária, forma uma chave primária composta. Neste exemplo: a chave primária do EMPREGADO é o RG. A chave parcial do DEPENDENTE é o seu nome, pois dois irmãos não podem ter o mesmo nome. Desta forma, a chave primária desta entidade fica sendo o RG do pai ou mãe mais o nome do dependente. Matrícula
Nome (1,1)
(0,1)
Titular
Dependente
Venda
Nascimento
Nome
Figura 23 Código
Banco
Descrição
Código (1,n)
Possui
(1,1)
Agência
Descrição
Código (1,n)
Possui
(1,1)
Conta Nome
Figura 24
22
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Todos os exemplos vistos anteriormente foram para relacionamentos binários, ou seja, entre dois TIPOS ENTIDADE diferentes ou recursivos. Porém, o modelo entidade relacionamento não se restringe apenas à relacionamentos binários. O número de entidades que participam de um TIPO RELACIONAMENTO é irrestrito e armazenam muito mais informações do que diversos relacionamentos binários. Diagrama Entidade Relacionamento O diagrama Entidade Relacionamento é composto por um conjunto de elementos gráficos que visa representar todos os objetos do modelo Entidade Relacionamento tais como entidades, atributos, atributos chaves, relacionamentos, restrições estruturais, etc. O diagrama ER fornece uma visão lógica do banco de dados, fornecendo um conceito mais generalizado de como estão estruturados os dados de um sistema. Observe abaixo, os elementos gráficos que compõem o diagrama ER.
Atributo chave (RG) Tipo Entidade Tipo Entidade Fraca
Tipo Relacionamento
Atributo simples (nome)
(0,1)
Atributo multivalorado (telefone)
Atributo composto (endereço)
Tipo Relacionamento Identificador
Atributo derivado (dígito verificador)
Figura 25
23
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
O Modelo Relacional O modelo relacional foi criado por CODD em 1970 (Edgar Frank Cood, recentemente falecido – 18 de abril de 2003, mais informações podem ser obtidas no site IBM) com a finalidade de representar os dados como uma coleção de relações, onde cada relação é representada por uma tabela, ou falando de uma forma mais direta, um arquivo. Porém, um arquivo é mais restrito que uma tabela. Toda tabela pode ser considerada um arquivo, porém, nem todo arquivo pode ser considerado uma tabela. Quando uma relação é pensada como uma tabela de valores, cada linha nesta tabela representa uma coleção de dados relacionados. Estes valores podem ser interpretados como fatos descrevendo uma instância de uma entidade ou de um relacionamento. O nome da tabela e das colunas desta tabela são utilizados para facilitar a interpretação dos valores armazenados em cada linha da tabela. Todos os valores em uma coluna são necessariamente do mesmo tipo. Na terminologia do modelo relacional, cada tabela é chamada de relação; uma linha de uma tabela é chamada de TUPLA; o nome de cada coluna é chamado de ATRIBUTO; o tipo de dado que descreve cada coluna é chamado de DOMÍNIO. Verifique estes conceitos na figura 26.
SGBD DATABASE 1
Linha ou TUPLA
Tabela 1
DATABASE 2
Tabela 2
CATÁLOGO
Coluna, Atributo ou Propriedade
Figura 26 Domínios, Tuplas, Atributos e Relações Um domínio “D” é um conjunto de valores atômicos, sendo que por atômico, podemos compreender que cada valor do domínio é indivisível. Durante a especificação do domínio é importante destacar o tipo, o tamanho e a faixa do atributo que está sendo especificado.
24
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Por exemplo: COLUNA RG Nome Salário
TIPO Numérico Caracter Numérico
TAMANHO 10,0 30 5,2
FAIXA 03000000-25999999 a-z, A-Z 00100,00-12000,99
Um esquema de relação R, denotado por R(A1, A2,..., An), onde cada atributo Ai é o nome do papel desempenhado por um domínio D no esquema relação R, onde D é chamado domínio de Ai e é denotado por dom(Ai). O grau de uma relação R é o número de atributos presentes em seu esquema de relação. A instância r de um esquema relação denotado por r(R) é um conjunto de n-tuplas r = intt1, t2,..., tn onde os valores de intt1, t2,..., tn devem estar contidos no domínio D. O valor nulo também pode fazer parte do domínio de um atributo e representa um valor não conhecido para uma determinada tupla. Atributo Chave de uma Relação Uma relação pode ser definida como um conjunto de tuplas distintas. Isto implica que a combinação dos valores dos atributos em uma tupla não pode se repetir na mesma tabela. Existirá sempre um subconjunto de atributos em uma tabela que garantem que não haverá valores repetidos para as diversas tuplas da mesma, garantindo que t1intSC ≠ t2intSC. SC é chamada de super chave de um esquema de relação. Toda relação possui ao menos uma super chave - o conjunto de todos os seus atributos que identificam uma tupla única. Uma chave C de um esquema de relação R é uma super chave de R com a propriedade adicional que removendo qualquer atributo A de K, resta ainda um conjunto de atributos K’ que não é uma super chave de R. Uma chave é uma super chave da qual não se pode extrair atributos. Por exemplo, o conjunto: (RA, Nome, Endereço) é uma super chave para estudante, porém, não é uma chave, pois se tirarmos o campo Endereço continuaremos a ter uma super chave. Já o conjunto (Nome da Revista, Volume, No da Revista) é uma super chave e uma chave, pois qualquer um dos atributos que retirarmos, deixaremos de ter uma super chave, ou seja, (Nome da Revista, Volume) não identifica uma única tupla. Em outras palavras, uma super chave é uma chave composta formada por mais de um atributo. Quando uma relação possui mais que uma chave (não confundir com chave composta) - como, por exemplo, RG e CIC para empregados - cada uma destas chaves são chamadas de chaves candidatas. Uma destas chaves candidatas deve ser escolhida como chave primária.
25
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Uma chave estrangeira de uma tabela R1 em R2 ou vice-versa, especifica um relacionamento entre as tabelas R1 e R2. Atributo Chave de uma Relação (resumo) CHAVE PRIMÁRIA CANDIDATAS
NOME Primary Key Candidate Key
SUPERCHAVE
Super Key
ESTRANGEIRA
Foreign Key
DEFINIÇÂO Atributo que identifica uma única tupla Entidade que possui mais de um atributo para identificá-la unicamente, porém apenas um deles deve ser definido como chave primária Conjunto de atributos que identificam uma única tupla; chaves primárias das entidades envolvidas no relacionamento.
Derivação do modelo conceitual para o lógico O mapeamento do Modelo Entidade Relacionamento (conceitual) para o Modelo Relacional (lógico) segue sete passos básicos: a) Para cada entidade no modelo ER, é criada uma tabela no modelo relacional que inclua todos os atributos simples desta entidade. Para cada atributo composto são inseridos apenas os componentes simples de cada um. Um dos atributos chaves da entidade deve ser escolhida como chave primária da tabela; Matrícula Nome
Empregados
Telefone CPF
Figura 27 TB=EMPREGADOS (Matrícula, Nome, Telefone, CPF) b) Para cada entidade fraca com entidade proprietária é criada uma tabela no modelo Relacional, incluindo todos os atributos desta entidade fraca. Para cada atributo composto são inseridos apenas os componentes simples de cada um. A chave primária desta relação será composta pela chave parcial da entidade fraca mais a chave da entidade proprietária; Matrícula Nome Telefone
Empregados
Número (0,n)
(1,1)
Dependentes
CPF Nome
Figura 28
26
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
TB=EMPREGADOS (Matrícula, Nome, Telefone, CPF) TB=DEPENDENTES(Matrícula, Número, Nome) FK=EMPREGADOS(Matrícula) Æ DEPENDENTES (Matrícula) c) Para cada relacionamento regular com cardinalidades máximas 1:1 entre entidades E1 e E2 que geraram as tabelas T1 e T2 respectivamente, devemos escolher a chave primária de uma das relações (T1, T2)e inseri-la como chave estrangeira na outra relação; se um dos lados do relacionamento tiver participação total e outro parcial, então é interessante que a chave do lado com participação parcial seja inserido como chave estrangeira no lado que tem participação total; Apólice
Seguro de Saúde
Matrícula (1,1)
(0,1)
Nome
Empregados
Telefone CPF
Data opção
Figura 29 TB=EMPREGADOS(Matrícula, Nome, Telefone, CPF) TB=SEGUROS-SAUDE(Apólice, Matrícula, Data opção) FK=EMPREGADOS(Matrícula) Æ SEGUROS-SAUDE (Matrícula) d) Para cada relacionamento regular com cardinalidades máximas 1:N entre entidades E1 e E2 respectivamente e que geraram as tabelas T1 e T2 respectivamente, deve-se inserir a chave primária de T1 como chave estrangeira em T2; Número
Nívei Salariai
Matrícula (1,n)
(1,1)
Nome
Empregad
Telefone CPF
Valor
Figura 30 TB=EMPREGADOS(Matrícula, Nome, Telefone, CPF, Número) TB=NIVEIS-SALARIAIS(Número, Valor) FK=NIVEIS-SALARIAIS(Número) Æ EMPREGADOS(Número) e) Para cada relacionamento regular com cardinalidades máximas N:N entre entidades E1 e E2, cria-se uma nova tabela T1, contendo todos os atributos do relacionamento mais o atributo chave de E1 e o atributo chave de E2; a chave primária de T1 será composta pelos atributos chave de E1 e E2;
27
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
número
Matrícula (0,n)
Projetos
Alocação
Nome
(0,n)
Empregados CPF
descrição
Figura 31 TB=EMPREGADOS(Matrícula, Nome, Telefone, CPF) TB=PROJETOS(Número, Nome) TB=ALOCACAO(Número, Matrícula) FK=EMPREGADOS(Matrícula) Æ ALOCACAO(Matrícula) FK=PROJETOS(Número) Æ ALOCACAO(Número) f) Para cada atributo multivalorado A1, cria-se uma tabela T1, contendo o atributo multivalorado A1, mais o atributo chave C da tabela que representa a entidade ou relacionamento que contém A1; a chave primária de T1 será composta por A1 mais C; se A1 for composto, então a tabela T1 deverá conter todos os atributos de A1; Matrícula Nome
Empregados
telefone (0,n) CPF
Figura 32 TB=EMPREGADOS(Matrícula, Nome, CPF) TB=TELEFONES-EMPREGADO(Matrícula, Telefone) FK=TELEFONES-EMPREGADO(Matrícula) Æ EMPREGADOS (Matrícula) g) Para cada relacionamento n-ário, n > 2, cria-se uma tabela T1, contendo todos os atributos do relacionamento; a chave primária de T1 será composta pelos atributos chaves das entidades participantes do relacionamento; Placa
Caminhão
CPF (0,n)
Direções
(0,n)
Motorista
(0,n) Nome
Numero
Trajetos
Nome
Rodovia Sentido
Figura 33 TB=MOTORISTA(CPF, Nome) TB=CAMINHÃO(Placa, Nome) 28
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
TB=TRAJETOS(Numero, Rodovia, Sentido) TB=DIRECOES(CPF, Placa, Número) FK=DIRECOES(CPF) Æ MOTORISTAS(CPF) FK=DIRECOES(Placa) Æ CAMINHÕES(Placa) FK=DIRECOES(Número) Æ TRAJETOS(Número) Derivação do modelo conceitual para o modelo lógico (RESUMO) -
-
-
para cada entidade é criada uma tabela; para cada atributo composto será inserido cada componente individualmente; para cada entidade fraca é criada uma tabela cuja chave primária é composta do seu atributo identificador concatenado com o atributo identificador da entidade proprietária; para relacionamentos com participação parcial, a chave da entidade com participação parcial será chave estrangeira da participação total; para relacionamentos com cardinalidade (1,1 : 1,N) a chave primária de (1,N) será chave estrangeira de (1,1) para relacionamentos com cardinalidade (1,N : 1,N) será criada uma nova tabela, cuja chave primária será a composição dos atributos identificadores das entidades envolvidas e seus próprios atributos, caso existam; para cada atributo multivalorado, cria-se uma nova tabela cuja chave primária será composta pela chave primária da entidade mais o atributo; para cada relacionamento de grau superior a 2, cria-se uma nova tabela contendo todos os atributos deste relacionamento mais as chaves primárias das entidades participantes deste relacionamento; 1o Passo - Entidades Normais
2o Passo - Entidades Fracas
E
E
EF
c
3o Passo - Relacionamentos 1:1
1 E
E
5o Passo - Relacionamentos N:N
4o Passo - Relacionamentos 1:N N
E
N E
N
E
E
ou 6o Passo - Atrbs. Multi Valorados E
E E
mv
c E 7o Passo - Relacionamento n-ário E
E
ou
E
E
Figura 34
29
Universidade Veiga de Almeida Instituto Superior PolitĂŠcnico Sistemas de Gerenciamento de Banco de Dados
ExercĂcios Aula inicial
30
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Aula Inicial Objetos da vida real e seus relacionamentos I)
Imagine quatro “planilhas” que correspondam a figura abaixo e defina algumas de suas informações (características, propriedades ou atributos). Departamento DRH
Funcionário
Material Projeto
Dependente
Figura 35 II)
Abaixo, insira informações hipotéticas nestas “planilhas”, baseandose nas características citadas acima.
Por exemplo: se você disse que Funcionário possui as características: CPF, Nome e Sexo, terá que preencher estes dados para CADA Funcionário e da mesma forma para as outras “planilhas”.
31
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
III)
Problemas:
1) Como associar o Dependente ao Funcionário ? 2) Como e onde armazenar a informação “Horas Trabalhadas” de cada Funcionário ao(s) Projeto(s) que porventura estejam alocados ? 3) Como e onde armazenar a informação “Data do Pedido” e “Quantidade” para cada Material solicitado pelo Funcionário ? 4) Como determinar a qual Departamento o funcionário está alocado? Obs.: você pode criar novas “planilhas” se achar necessário.
32
Universidade Veiga de Almeida Instituto Superior PolitĂŠcnico Sistemas de Gerenciamento de Banco de Dados
ExercĂcios Mini Mundos
33
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 1 A administradora de imóveis "DoLar" é uma empresa que cuida principalmente, da compra e venda de imóveis residenciais e comerciais no Grande Rio, dentre outras atividades. O atendimento atualmente é demorado e muitas vezes incompleto devido a demora no manuseio de muitas fichas acarretando a perda de muitas oportunidades de negócio. Todos os imóveis são comprados pela imobiliária para então, serem colocados a venda. A direção da empresa definiu como prioridade automatizar o processo de comercialização (compra e venda) dos imóveis, envolvendo seus proprietários (novos e antigos). A imobiliária considera "proprietário" toda pessoa que participou de um processo de comercialização (compra ou venda) no papel de dono (antigo ou novo). Entre outras informações, o sistema deverá ser capaz de controlar os imóveis comprados, vendidos e os de se "interesse" (não foram comercializados) e emitir: -
-
-
relação de todos os imóveis disponíveis para venda, contendo para cada um: Endereço, Bairro, Área (m2), descrição, proprietário antigo (o atual é a administradora) e o preço mínimo para a venda; relação de todos os imóveis vendidos, por bairro, contendo para cada um: Bairro, proprietário antigo, proprietário novo, preço de venda (ao proprietário novo) e preço de compra (peal imobiliária); relação dos proprietários que compraram mais de um imóvel na imobiliária (nome , CPF, endereço e telefone);relação dos proprietários que venderam mais de um imóvel para a imobiliária (nome e telefone).
34
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 2 Uma loja de venda de Eletrodomésticos quer automatizar o seu controle de compra e troca de aparelhos por parte de seus clientes. Todo aparelho vendido possui garantia de 1 ano, a partir da data de venda. Isto significa que qualquer troca só poderá ser realizada dentro deste período, mesmo que já tenha havido trocas em função desta compra. No termo de garantia é anotado a data da compra, marca modelo e número de série do aparelho vendido, juntamente com o nome e endereço do cliente que o comprou. A cada troca de aparelho, relativo a primeira compra, é verificado se ainda está no prazo de garantia e é registrado o cliente que realizou a troca. Qualquer cliente pode realizar uma troca, mesmo que não tenha sido o comprador. Os aparelhos defeituosos são devolvidos para a fábrica e não mais retornam para a loja. A loja quer saber: a) relação de aparelhos disponíveis na loja; b) relação de aparelhos que apresentaram defeitos contendo, data e o defeito apresentado; c) relação de clientes cujas compras nunca apresentaram defeito.
35
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 3 Um dos restaurantes mais tradicionais do Rio de Janeiro, resolveu informatizar o seu controle de atendimento. O restaurante possui atualmente 30 garçons que servem diariamente mais de 500 refeições e o cardápio oferece mais de 40 pratos diferentes. O restaurante dispõe de mesas de 2, 4 e 6 lugares num total geral de 80 mesas. Cada garçom é responsável por atender no mínimo à 4 mesas e no máximo 10 e não podem atender mesas fora de sua responsabilidade. A remuneração dos mesmos é um percentual fixo sobre o consumo das mesas que cada um atendeu (TRIGGER). Ao encerrar a conta o cliente preenche uma avaliação sobre o atendimento prestado pelo garçom. Ao final do mês os garçons que obtiveram as 3 melhores avaliações recebem uma gratificação extra (STORED PROCEDURE). Não é permitido que pessoas ocupem mesas sem consumir. Requisitos de informação: -
relação de mesas que o garçom tem sob sua responsabilidade; número de assentos que o garçom tem sob sua responsabilidade; salário a pagar ao garçom no fim do mês; lista de pratos mais consumidos por dia da semana; mesas que estiveram mais tempo ocupadas; garçons que devem receber bonificação extra no fim do mês;
36
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 4 O Instituto “KPenga” de Seguridade Social, IKSS, está interessado em controlar os pacientes internados, e seus atendimentos, nos seus hospitais. Quando uma pessoa credenciado junto ao IKSS passa mal, ela se dirige a um dos hospitais e se consulta com algum médico. Dependendo da gravidade o(s) médico(s) pode(m) decidir pela internação. Os pacientes, pessoas credenciadas que foram internadas, podem receber atendimento de vários profissionais de saúde, particularmente de médicos e enfermeiras. Não há interesse em controlar as pessoas que não foram internadas, nem as consultas antes da internação. Cada médico ou enfermeira pode estar vinculado a, no máximo 3 hospitais. Não se admite um empregado com mais de um vínculo no mesmo hospital. Não há interesse em controlar as datas em que ocorreram os atendimentos. O Modelo deve prever as seguintes informações: -
-
relação dos pacientes (nome, código do seguro social, idade) internado em um hospital, juntamente com os nomes e números dos médicos responsáveis por cada internação e o período de internação; relação dos médicos (nome, matrícula, especialidade) e enfermeiras (nome, matrícula e cargo) que deram atendimento a um paciente durante a internação; relação dos hospitais (nome, código e endereço, que um médico ou enfermeira mantém vínculo
37
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 5 (1 ponto) A corretora “Boa Ação”, deseja um sistema automatizado que a auxilie na venda de ações dos seus clientes durante o pregão. O sistema será reinicializado diariamente para que os clientes sem saldo e as ações que nenhum cliente possui saldo não apareçam nunca. Saldo é a quantidade de ação. Somente a tabela corretoras será preservada. O cliente expressa a intenção de vender uma ação pela ordem de venda. Nela o cliente informa a ação e a quantidade que ele quer vender e, a partir dela, a corretora tenta fechar negócios pelo preço mais alto que o mercado pagar. Para avaliar um ordem de venda o sistema deverá conferir se o cliente tem disponível a quantidade que colocou à venda. Como as compras feitas em um dia só estarão disponíveis para a venda no dia seguinte, o saldo das ações de cada cliente é calculado de madrugada e permanece válido por todo o pregão, e a quantidade disponível para venda, a qualquer momento do pregão, é sempre o saldo menos as quantidades das ordens já emitidas daquela ação por aquele cliente, naquele dia. Uma mesma ação pode ser posta a venda por um mesmo cliente em diversas ordens durante o pregão, desde que o saldo permita. Da mesma forma que uma mesma ordem pode ser negociada em vários lotes que somados não ultrapassem a quantidade da ordem. Com isso a mesma ordem pode acabar sendo negociada aos poucos por várias corretoras e ou pela mesma várias vezes. O sistema deve ser capaz de, ao final do pregão: -
Listar matrícula cliente, código da ação, quantidade e momento (h/m) das ordens cadastradas que não foram negociadas, nem parcialmente; Listar matricula cliente, código ação, quantidade e momento (h/m) das ordens cadastradas que foram parcialmente negociadas, juntamente com o CGC e nome da corretora, quantidade, momento e preço de cada lote negociado dentro desta ordem. Ao final de cada ordem, informar a quantidade que sobrou sem ser negociada.
38
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 6 O Hospital “AkiCFicaBom” esta informatizando o controle de consultas médicas e o receituário que, eventualmente, o médico determina para o cliente. Cada médico cadastrado, possui mais de uma especialidade que segue o padrão da AMB: código com 8 dígitos e descrição com 100 caracteres e só podem estar vinculados a, no máximo, 4 Hospitais. Quando um médico começa ou deixa de clinicar uma determinada especialidade, é gravada a informação: especialidade ativa (A) ou inativa (I), para o médico. São gravadas também, informações para que o médico seja encontrado a qualquer momento: três telefones, um celular, um BIP e um eMail. Quando um médico perde o vínculo com um Hospital, a informação é eliminada do Banco de Dados. -
-
As especialidades são cadastradas com as seguintes informações: código da especialidade e sua descrição. Quando o cliente procura o Hospital pela primeira vez, é mantido o seu cadastro com as seguintes informações: código do cliente, nome do cliente, CPF e seu endereço. Ao final da consulta, que ocorreu em uma determinada data, o médico poderá emitir um receituário para o cliente, com um ou mais remédios. Os remédios são cadastrados com os seguintes dados: código do remédio, descrição do remédio, princípio ativo. Os hospitais cadastrados possuem as seguintes características: CGC, nome, endereço, 3 telefones, eMail.
São requisitos de informação: -
Médicos que mais consultaram em um determinado período de tempo Tempo de duração para cada consulta; Remédios que foram mais receitados; Clientes que mais se consultaram; Hospitais e seu corpo clínico Médicos que possuem a especialidade: CARDIOLOGIA.
39
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 7 A loja de revenda de peças automotivas, está informatizando a sua revenda. Quer identificar também, caso uma peça esteja danificada, quantas outras, no caso peças componentes, poderão também estar afetadas. Esta loja efetua a venda, cadastrando apenas a data da venda e quantidade desejada da peça solicitada. O faturamento da venda ocorre apenas no final do mês, quando é gerada toda a documentação para que o comprador possa efetuar o pagamento na rede bancária. Infelizmente, estamos em um país onde a inflação é alta e o preços aumentam constantemente, porém, é necessário respeitar o preço de quando ocorreu a venda. O dono da loja pode não aumentar a peça, mesmo com a inflação alta. São requisitos de informação: -
Relação de peças e seus componentes; Peças que estão com o saldo abaixo da quantidade mínima; Faturamento que deve ser emitido, baseado nas compras de um período; Relação de compradores contendo: CPF ou CGC, nome e eMail; Evolução dos valores de cada peça;
40
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 8 Uma empresa de contabilidade “KontaOK” tem a seguinte definição para parte do seu sistema contábil: -
Uma conta contábil, pode agregar diversas outras contas; Uma conta contábil, pode possuir movimentação; Cada movimentação está associada à um único Centro de Custo;
São requisitos de informação: -
Relação dos centros de custo contendo: código do centro, descrição e valor consumido em um período; Relação das contas contábeis (código e descrição) bem como das suas agregadas (código e descrição); Relação da movimentação contábil de um período de uma ou todas as contas; Centro de Custo que não movimentou em um determinado período;
41
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 9 Uma empresa que fabrica pesticidas, material altamente sistematizar três casos do seu sistema de pagamento.
tóxico,
resolve
A cada departamento da empresa estão alocados diversos funcionários. Cada departamento possui um funcionário no cargo de chefia. O departamento possui de 1 a 5 ramais para comunicação interna. A empresa possui diversos setores mas a ADMINISTRAÇÃO, FÁBRICA e o setor de INVESTIMENTOS possuem algumas características específicas. -
-
-
apenas os funcionários da ADMINISTRAÇÃO podem fazer horas extras que, ao final do mês, caso ocorram, devem ser calculadas para que o pagamento possa ser efetuado. Sabemos que as horas extras dependem do dia da semana, e da quantidade de horas trabalhadas; os trabalhadores da FÁBRICA, podem manipular diversos produtos tóxicos que possuem um índice de toxicidade, utilizado tanto para o cálculo da quantidade máxima de horas para a exposição diária quanto para o cálculo de adicional de insalubridade do funcionário daquele setor. O número de horas de trabalho destes funcionários depende da demanda de produção, podendo trabalhar o máximo de horas em um dia ou não trabalhar no outro. os analistas financeiros da área de INVESTIMENTOS, acumulam bônus a cada negociação bem sucedida no mercado de ações. A cada venda diária, imediatamente o sistema de investimentos calcula e acumula o bônus do funcionário. Ao final do mês a quantidade ali acumulada é imediatamente creditada em conta corrente, fora da folha de pagamento. A informação do bônus, volta a zero para o próximo período.
São requisitos de informação: -
-
Relação de ramais do departamento, ordenado por departamento, contendo também o nome do chefe; Relação de funcionários dos departamentos e seus telefones (3 no máximo) de contato; Relação de horas extras do período, de cada funcionário da administração; Relação de materiais tóxicos contendo seu código, descrição, índice de toxicidade (IT) e tempo máximo de exposição (TME); Relatório com a quantidade de horas que cada funcionário ficou exposto ao material tóxico e quanto isto custará, no período; Relatório com matrícula, nome e bonificação em ordem decrescente de bonificação dos funcionários da área de investimentos;
42
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 10 Uma empresa deseja fazer um “bolão de apostas“ centre seus funcionários, com base na Copa do Mundo de Futebol. As apostas serão feitas pela Internet e o valor depositado em uma conta corrente definida pelo funcionário que gerenciará o “bolão”. Para registrar corretamente as informações, se faz necessário observar as seguintes questões: -
-
-
-
Os apostadores podem fazer quantas cartelas de apostas desejar. Eles serão identificados pelo CPF, NOME e ainda é necessário o registro do EMAIL para futuras comunicações; Cada cartela de apostas é identificada por um NÚMERO e, a medida em que os jogos forem se realizando, a PONTUAÇÃO TOTAL será registrada para facilitar o processo de obtenção do RELATÓRIO DOS APOSTADORES COM MAIS PONTOS (RANKING) e a informação se é uma cartela válida (ou não) dependendo se o valor da aposta foi depositado ou não; Para cada jogo, que possui um NÚMERO, é registrado o placar. Em cada jogo, obviamente participam dois times; Como a Copa do Mundo está definida com 64 jogos, foi definido que cada cartela, conterá os palpites dos 64 jogos, onde o apostador registrará seus placares e a cada jogo realizado, um processamento registrará a pontuação obtida naquele jogo, que também refletirá na pontuação total da cartela, mencionada acima; Cada time é registrado no banco de dados com um NÚMERO, NOME e a IMAGEM da bandeira do país; A regras que regulamentam a pontuação sobre os placares, não são relevantes neste momento. O importante é registar os palpites dos apostadores e o placar oficial para que possam ser comparados e a pontuação atribuída.
Podemos dizer a seguinte frase para resumir o problema: “O apostador joga várias cartelas que contém palpites individuais sobre o placar dos jogos que se realizam entre dois times” Requisitos de informação: -
Relatório com o RANKING, (NÚMERO DA CARTELA, NOME DO APOSTADOR e TOTAL DE PONTOS OBTIDOS) ordenado de forma descendente pela pontuação; Time que fez mais gols Time que fez menos gols Times que mais participaram da COPA O nome do apostador com mais pontos O nome do apostador “lanterninha”
43
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Mini mundo 11 A Rádio “FM Istério”, deseja guardar as informações de todas as músicas transmitidas por ela. Para isso é necessário montar um banco de dados de acordo como seguinte: As gravadoras são identificadas pelo CGC, razão social, endereço, uma pessoa de contato e um web site e são responsáveis pela produção de vários CDs. As músicas, podem estar em CDs diferentes e em faixas diferentes. Cada música possui uma codificação própria, um nome e o tempo de duração e podem ter mais de um autor. Os CDs recebem uma classificação que determina sua categoria (ROCK, POP, MPB, CLÁSSICA, SERTANEJO, PAGODE etc....). Esta categoria define inclusive, o maior e o menor preço para comercialização. São registradas também, as seguintes informações para cada CD: nome, preço, data de lançamento e a quantidade de indicações. Os ouvintes ao solicitarem as músicas acabam fazendo referência a um determinado CD, que recebe uma indicação a mais (um contador de indicações). Dos autores, são registradas as seguintes informações: CPF e nome São requisitos de informações: -
Os CDs mais indicados As músicas que compõem mais de 3 CDs Os autores que possuem mais de 30 músicas As gravadoras e os CDs produzidos por elas A quantidade de CDs, por categoria
44
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Capítulo 2 Dependência Funcional e Normalização
45
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Dependência Funcional e Normalização Dependência Funcional Dados dois conjuntos de atributos (ou dois atributos) A e B de uma entidade, diz-se que B é funcionalmente dependente de A, ou que A determina B, ou que B depende de A, se a cada valor de A estiver associado um, e só um, valor de B. Se A determina B então B não é funcionalmente dependente de nenhum subconjunto de A. Uma dependência funcional é representada por : A Æ B (A determina B) Exemplo de identificação de dependências funcionais: #Funcionário 4022 4023 4024
Nome_próprio Renata Ari Maria
Apelido Reis Reis Cardoso
Departamento 501 203 203
Departamento Æ #Funcionário ? Não, pois o Departamento 203 Æ {4023, 4024} #Funcionário Æ Departamento ? Sim, pois conhecendo-se o #Funcionário (atributo unívoco) é possível determinar o Departamento (um funcionário só pode pertencer a um departamento). Nome_próprio Æ #Funcionário ? Não, pois podem existir funcionários com o mesmo nome. Podem haver múltiplos valores de #Funcionário para o mesmo Nome_próprio. #Funcionário Æ Apelido ? Apesar de dois funcionários terem o mesmo apelido, conhecendo-se o #Funcionário determina-se um só Apelido. #Funcionário Æ todos os outros atributos Observação Importante: A identificação de dependências funcionais não pode ser obtida apenas a partir da inspeção de algumas instâncias, mas sim através das próprias propriedades dos atributos.
46
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Outro exemplo de identificação de dependências funcionais: Papelaria Colmeia Central Aguarela Silva
Artigo Caneta BIC fina Fita cola Borracha Caneta BIC fina
Preço 150,00 300,00 215,00 175,00
O Preço é funcionalmente dependente de artigo (Artigo Æ Preço) ? Não, pois o mesmo artigo pode ter preços diferentes em diferentes papelarias. O preço é funcionalmente dependente de papelaria (Papelaria Æ Preço) ? Não, porque para cada papelaria há tantos valores para Preço quantos os artigos vendidos nessa papelaria. Preço depende funcionalmente de ambos {Papelaria, Artigo} Æ Preço
Normalização Os dados, no mundo real, não aparecem da forma que Codd preconizou. Assim, devem ser tratados, der forma a corrigir as anomalias resultantes do processo de derivação lógica das tabelas e atingir os objetivos propostos pelo modelo relacional. A este processo, chamamos normalização. Depois dos dados serem sujeitos a este tratamento, dizem-se normalizados. Para normalizar podemos seguir os 5 mandamentos de Codd: 1 2 3 4 5
No repeating (Sem repetições) The fields depend upon the key (Os atributos dependem da CHAVE) The whole key (Da chave inteira) And nothing but the key (De mais nada a não ser da chave) So help me Cood (Que Cood me ajude!)
A normalização converte cada entidade gradualmente para “Formas Normais”, através da aplicação sucessiva de regras que alteram o formato dos dados da 1ªForma Normal até à 5ª Forma normal.
Formas Normais 1a. Forma Normal Uma relação está na 1a. forma normal (1FN) quando os domínios de todos os atributos consistem apenas em valores atômicos e não existem subgrupos de atributos repetidos. 47
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Passagem de uma entidade à 1FN Eliminar subgrupos repetidos, decompondo a relação em duas (ou mais) relações.
Exemplo: Consideremos assim a seguinte relação, representada sob a forma de uma tabela: #Funcionário F23 F12 F43 F56 F23 F55 F54 F95 F54 F56 F36 F67 F95 F55
Nome Fernanda Amanda Ari Cassia Fernanda Paulo Lucio Angelo Lucio Cassia Cassia Domingos Angelo Paulo
Sexo F F M F F M M M M F F M M M
Salário 33000 33000 46000 33000 33000 56000 56000 46000 56000 33000 44000 44000 46000 56000
Ano 70 57 70 65 70 70 65 57 65 65 65 65 57 70
Mês 7 5 9 8 7 7 6 5 6 8 8 6 5 7
Dia 9 6 8 10 9 9 12 6 12 10 3 6 6 9
#Função FUN01 FUN02 FUN03 FUN01 FUN02 FUN04 FUN05 FUN01 FUN02 FUN02 FUN01 FUN06 FUN06 FUN01
Anos 3 3 1 1 1 1 5 3 5 2 1 2 3 1
Esta relação pode ser considerada como estando na 1a. Forma Normal ? De fato, podemos encontrar grupos repetidos, especialmente, se olharmos para os dados, segundo uma organização diferente: #Funcionário F23 F23 F12 F36 F43 F54 F54 F55 F55 F56 F56 F67 F95 F95
Nome Fernanda Fernanda Amanda Cassia Ari Lucio Lucio Paulo Paulo Cassia Cassia Domingos Angelo Angelo
Sexo F F F F M M M M M F F M M M
Salário 33000 33000 33000 44000 46000 56000 56000 56000 56000 33000 33000 44000 46000 46000
Ano 70 70 57 65 70 65 65 70 70 65 65 65 57 57
Mês 7 7 5 8 9 6 6 7 7 8 8 6 5 5
Dia 9 9 6 3 8 12 12 9 9 10 10 6 6 6
#Função FUN01 FUN02 FUN02 FUN01 FUN03 FUN05 FUN02 FUN04 FUN01 FUN01 FUN02 FUN06 FUN01 FUN06
Anos 3 1 3 1 1 5 5 1 1 1 2 2 3 3
Podemos olhar para o esquema de relação da seguinte forma: #Funcionário
Nome
Sexo
Salário
Ano
Mês
Dia
#Função #Função #Função
Anos Anos Anos
48
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Para passar para a 1FN, temos que dividir a tabela em duas, eliminando os grupos repetidos:
#Funcionário
Nome
Sexo
#Funcionário
#Função
Salário
Ano
Mês
Dia
Anos
A chave para o primeiro registro é facilmente identificável: #Funcionário
Nome
Sexo
Salário
Ano
Mês
Dia
O segundo registro tem a chave concatenada #Funcionário, #Função. Não se pode saber o número de anos de experiência sem se saber qual o código desse funcionário e qual a função desempenhada:
#Funcionário
#Função
Anos
A informação ficaria da seguinte forma, na 1ª Forma Normal: Funcionário #Funcionário F23 F12 F36 F43 F54 F55 F56 F67 F95
Nome Fernanda Amanda Cassia Ari Lucio Paulo Cassia Domingos Angelo
Sexo F F F M M M F M M
Salário 33000 33000 44000 46000 56000 56000 33000 44000 46000
Ano 70 57 65 70 65 70 65 65 57
Mês 7 5 8 9 6 7 8 6 5
Dia 9 6 3 8 12 9 10 6 6
Funcionário X Função #Funcionário F23 F12 F43 F56 F23 F55 F54 F95 F54 F56 F36 F67 F95 F55
#Função FUN01 FUN02 FUN03 FUN01 FUN02 FUN04 FUN05 FUN01 FUN02 FUN02 FUN01 FUN06 FUN06 FUN01
Anos 3 3 1 1 1 1 5 3 5 2 1 2 3 1
49
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
2a. Forma Normal Uma relação está na 2a. forma normal (2FN) quando estiver na 1FN e, todos os atributos que não pertencem à chave dependem de toda a chave (e não de um subconjunto da chave). Assim, uma tabela estará na 2a. FN se cada atributo da relação depende totalmente da chave. Quando a chave é constituída por mais do que um atributo, a relação pode não estar na 2a. forma Normal. Daqui resulta que se a chave de uma tabela é constituída apenas por um atributo, está automaticamente na 2a. forma normal.
Passagem de uma relação à 2FN Separar os atributos que dependem de um subconjunto da chave, decompondo a relação em duas (ou mais) relações. Exemplo: Consideremos a seguinte relação: #Peça 1 1 1 1 2 2 2 3 4 4 4 5 5
#Fornecedor FOR10 FOR11 FOR13 FOR19 FOR31 FOR10 FOR13 FOR13 FOR10 FOR31 FOR19 FOR11 FOR10
Nome Mauro Basílio Padreira Favos BBC Mauro Padreira Padreira Mauro BBC Favos Basílio Mauro
Local PAlegre Minas Ceará VRedonda Natal PAlegre Ceará Ceará PAlegre Natal VRedonda Minas PAlegre
Preço 20,00 20,00 20,00 22,00 825,00 723,00 589,00 213,00 852,00 752,00 952,00 1.236,00 1.258,00
Em que forma normal se encontra a relação? Encontra-se na 1FN, pois não contém grupos repetidos e a chave é composta pelos atributos #Peça + #Fornecedor. No entanto, não temos qualquer garantia de que se encontra na 2FN, pois a chave é composta por mais do que um atributo. Repare-se nos problemas que se podem levantar, pelo fato de não se encontrar na 2FN: Não se pode inserir a ficha de um fornecedor sem que tenha fornecido pelo menos uma peça. Este campo nunca poderia ficar em branco, uma vez que faz parte da chave.
50
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Existem problemas quando se pretende fazer a atualização dos dados de um fornecedor. Temos que procurar todas as ocorrências desse fornecedor e mudar tantas vezes quantas as necessárias. Estes tipos de irregularidades podem ser removidos se dividirmos o registro em dois, sendo necessário o conceito de dependências funcionais: Dependência Funcional: Um atributo ou um conjunto de atributos B, de um registro R, é funcionalmente dependente de um atributo, ou conjunto de atributos, A, do registro R se para cada instância de A em R é encontrada uma única instância de B. Consideremos ainda outro tipo de dependências Dependência Funcional Total Um atributo ou um conjunto de atributos, B, de uma relação, R, é totalmente funcionalmente dependente de um atributo, ou conjunto de atributos, A, da relação R se B é funcionalmente dependente de todo A e não de um subconjunto de A. Podemos, agora, identificar todas as dependências do exemplo dado anteriormente: #Peça
#Fornecedor
Nome
Local
Preço
Para o registro estar na 2FN, todas as dependências da chave têm que ser totais. Reparemos que apenas o atributo Preço é totalmente dependente de toda a chave. Sendo assim, há necessidade de dividir o registro em dois: #Fornecedor
#Peça
Nome
#Fornecedor
Local
Preço
A relação na 2FN tem a seguinte forma:
Fornecedor #Fornecedor FOR10 FOR11 FOR19 FOR13 FOR31
Nome Mauro Basílio Favos Padreira BBC
Local PAlegre Minas VRedonda Ceará Natal
51
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Peça/Fornecedor #Peça 1 1 1 1 2 2 2 3 4 4 4 5 5
#Fornecedor FOR10 FOR11 FOR13 FOR19 FOR31 FOR10 FOR13 FOR13 FOR10 FOR31 FOR19 FOR11 FOR10
Preço 20,00 20,00 20,00 22,00 825,00 723,00 589,00 213,00 852,00 752,00 952,00 1.236,00 1.258,00
3ª Forma Normal Uma relação está na 3a. forma normal (3FN) se estiver na 2FN e, os atributos que não pertencem à chave não dependem de nenhum atributo que também não pertence à chave. Assim, uma tabela que esteja na 2FN pode apresentar ainda um certo tipo de anomalia, de tal forma que possa existir um conjunto de atributos não chave, mas que são chave para um outro conjunto de atributos. Esta situação ocorre quando existem dependências transitivas. Uma tabela está na 3FN se não há dependências entre atributos não chave. Vamos supor que A, B e C são conjuntos de atributos de uma relação R. Se C é funcionalmente dependente de B e B é funcionalmente dependente de A, então C é transitivamente dependente de A: A
B
C
Para ser feita a conversão para a 3FN, o registro é dividido da seguinte forma: A
B
B
C
Passagem de uma relação à 3FN Separar os atributos que dependem de outro atributo não pertencente à chave, decompondo a relação em duas (ou mais) relações.
52
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Exemplo: Consideremos a seguinte relação: #Empregado EMP01 EMP02 EMP03 EMP04 EMP05 EMP06 EMP07 EMP08 EMP09 EMP10 EMP11 EMP12 EMP13 EMP14
Nome João Maria Josefina Maria Luís Jorge José Reinaldo Nuno Fernando Mariano Jeremias Esaú Pedro
Salário 120 452 23 614 123 842 120 452 65 52 52 52 52 52
#Projeto PROJ01 PROJ01 PROJ02 PROJ01 PROJ03 PROJ02 PROJ03 PROJ01 PROJ03 PROJ01 PROJ02 PROJ02 PROJ01 PROJ01
Data do fim 17.07.97 17.07.97 31.08.97 17.07.97 31.12.97 31.08.97 31.12.97 17.07.97 31.12.97 17.07.97 31.08.97 31.08.97 17.07.97 17.07.97
Identifiquemos as dependências funcionais que existem: #Empregado
Nome
Salário
#Projeto
Data do fim
Verifica-se que existem dependências transitivas. A conversão para a 3ªFN é feita através da remoção das dependências transitivas, dividindo as tabelas. A relação fica com a seguinte forma : Empregado #Empregado EMP01 EMP02 EMP03 EMP04 EMP05 EMP06 EMP07 EMP08 EMP09 EMP10 EMP11 EMP12 EMP13 EMP14
Nome João Maria Josefina Maria Luís Jorge José Reinaldo Nuno Fernando Mariano Jeremias Esaú Pedro
Salário #Projeto 120,00 PROJ01 452,00 PROJ01 23,00 PROJ02 614,00 PROJ01 123,00 PROJ03 842,00 PROJ02 120,00 PROJ03 452,00 PROJ01 65,00 PROJ03 52,00 PROJ01 52,00 PROJ02 52,00 PROJ02 52,00 PROJ01 52,00 PROJ01
Projeto #Projeto PROJ01 PROJ02 PROJ03
Data do Fim 17.07.97 31.08.97 31.12.97
53
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
As anomalias que podem ocorrer quando uma relação não está na 3FN são: • •
•
Não podem ser inseridos dados relativos ao projeto antes de se ter selecionado os empregados para o executarem. Se todos os empregados abandonarem um determinado projeto, antes de serem selecionados outros, pode ocorrer uma situação de inconsistência que pode ocorrer em remoção de informação importante. Se a data de fim de projeto for alterada, tem que se fazer alteração tantas vezes quantas as necessárias.
Vantagens/Desvantagens da Normalização -
Vantagens - Estruturas de dados mais estáveis - Elimina a redundância - Obtém-se um modelo de dados mais natural e mais simples - Evitam-se os efeitos laterais da alteração - Evitam-se os efeitos laterais da inserção - Evitam-se os efeitos laterais da remoção Conclusão: Facilita a exploração e manutenção de tabelas
-
Desvantagens - Favorece a proliferação do no. de tabelas - Favorece a fragmentação exagerada - Perigoso de seguir cegamente Conclusão: Normalizar? Sim, mas com bom senso ...
Forma Normal Boyce Codd Uma relação está na forma normal de Boyce Codd (FNBC) quando todo o determinante da relação for uma chave candidata. A FNBC corresponde a m grau de normalização mais elevado do que a 3FN e é necessária quando: -
uma entidade tem várias chaves candidatas; as chaves candidatas são compostas; as chaves candidatas sobrepõem-se porque possuem pelo menos um atributo em comum.
Exemplo de entidade que necessita da FNBC: Seminário S1 S1 S2 S2
Estudante 1022 3088 1022 4325
Instrutor Reis Couto Pires Guedes
Participações 12 12 14 14
54
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Cada seminário é dirigido por dois instrutores, mas um instrutor só pode dirigir um seminário; Um estudante pode participar em mais do que um seminário mas é orientado somente por um dos instrutores.
Chaves candidatas: Seminário, Estudante Estudante, Instrutor
Dependências funcionais Seminário, Estudante Participações Estudante, Instrutor Participações Instrutor → Seminário
Æ
Determinantes Instrutor, São chaves candidatas
Æ
Seminário, São chaves candidatas Não é chave candidata
Passagem de uma relação à FNBC Separar o(s) atributo(s) que depende(m) de atributo que não é chave candidata, decompondo a relação em duas (ou mais) relações. No exemplo ficaríamos com as seguintes entidades: Participante (Estudante, Instrutor, Participações) Orientador (Instrutor, Seminário) Considerações relativamente a normalização A essência do processo de normalização consiste na decomposição sucessiva de uma coleção de relações, sem perda de informação, com base num conjunto de regras (formas normais). Benefícios do processo de normalização: -
Estruturação da informação e melhoria da qualidade da representação relacional; Eliminação das possibilidades de ocorrência de anomalias na manipulação dos dados (que comprometem a sua integridade); Economia de espaço de armazenamento e de custos de manipulação. Exemplos de custos evitados: manipulação de um volume de dados maior do que o efetivamente, atualização de dados redundantes, etc.).
-
Potência a estabilidade do modelo lógico relacional, ao aumentar a capacidade de um modelo se manter inalterado face a mudanças que
55
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
venham a ser percebidas ou introduzidas no ambiente que tenha sido modelado; Observações importante Normalização NÃO é um processo com finalidade restritiva, mas sim de caráter organizacional. Fragmentação da informação e suas conseqüências é a principal limitação do processo de normalização
Estratégias de Normalização Alguns aspectos a serem considerados: -
O processo de normalização raramente percorre todas as formas normais (da 1FN à 5FN);
-
Freqüentemente, o analista reconhece, por experiência própria, que uma dada entidade não está normalizada e coloca-a diretamente na 3FN ou na FNBC;
-
Uma estratégia muito usada consiste em normalizar para a FNBC em iterações sucessivas, utilizando a análise de dependências funcionais.
Estratégia de decomposição usando a análise de dependências funcionais
Desenvolver Relação Universal
Determinar todas as Dependências Funcionais
A relação está na FNBC
SIM
Modelo Concluído
NÃO
Decompor a relação em duas
Figura 36
56
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Decomposição de uma relação com vista à obtenção de relações na FNBC -
Consideramos a relação R (A, B, C, D, E, ...), que não está na FNBC;
-
Procura-se uma DF C Æ D que seja responsável por a relação não estar na FNBC;
-
Criam-se duas relações: R1(A, B, C, E, ...) e R2(C, D);
-
Verifica-se se R1 está na FNBC;
-
O processo continua até todas as relações obtidas por decomposição estarem na FNBC.
Diagrama de dependências funcionais #Produto Preço #Fornecedor
Figura 37 #Produto, #Fornecedor Æ Preço Exemplo de normalização usando a análise de dependências funcionais Existências Q_Alerta Tipo #Produto Preço #Fornecedor Local
Telefone
Figura 38 Não está na FNBC porque existem determinantes que não são chave (Tipo) Chave candidata Determinantes
#Produto, #Fornecedor #Produto, #Fornecedor #Produto #Fornecedor
57
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Tipo Decompondo as relações para a FNBC
Relação_01 Q_Alerta Tipo
Figura 39 Chave candidata e determinante: TIPO Relação_02 Existências #Produto Tipo
Figura 40 Chave candidata e determinante: #PRODUTO
Relação_03 Local #Fornecedor Telefone
Figura 41 Chave candidata e determinante: #FORNECEDOR
Relação_04
#Produto Preço #Fornecedor
Figura 42 Chave candidata e determinante: #PRODUTO, #FORNECEDOR Modelo de dados final R2 R3 R4 R5
(Tipo, Q_Alerta) (#Produto, Existências, Tipo) (#Fornecedor, Morada, Telefone) (#Produto, #Fornecedor, Preço)
58
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Exercícios Normalização
59
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 1 Suponha que temos os seguintes requisitos para um banco de dados de Universidade, que é usado para manter o histórico escolar dos alunos: a) A Universidade mantém de cada aluno, o nome (ALUNOME), número do aluno (ALUNUM), número da identidade (ALURG), endereço atual (ALUENDER) e telefone (ALUFONE), data de nascimento (ALUDTNASC), sexo (SEXO), classe (CLASSE: calouro, veterano, ..., formando), centro universitário (CODCENTRO), departamento (CODDEPTO) e o tipo de graduação (TIPOGRAD: licenciatura, bacharelado, ..., doutorado). ALUNUM e ALURG são únicos para cada aluno. b) Cada departamento é descrito pelo nome (NOMEDEPTO), código do departamento (CODDEPTO), código da unidade (CODUNIDEPTO), telefone do departamento (FONEDEPTO) e centro universitário (CODCENTRO). Os nomes e códigos têm valores únicos para cada departamento. c) Cada curso tem um nome de curso (CURNOME), descrição (CURDESC), número de código (CURNUM), número de horas semestrais (CREDITOS), nível (NIVEL) e departamento que oferece (CODDEPTO). O número de código é único para cada curso. d) Cada turma de oferecimento tem um instrutor (NOMEINSTRUTOR), semestre (SEMESTRE), ano (ANO), curso (CURNUM) e número da turma (NUMTURMA). O número de turma distingue diferentes turmas de oferecimento de um mesmo curso que é oferecido durante o mesmo semestre / ano; seus valores são 1, 2, 3, ...., até o total de números de turmas oferecidas durante cada semestre. e) Uma transcrição no histórico corresponde a um aluno (ALURG), os dados do curso efetuado (NUMTURMA e CURNUM) e a média obtida no curso (NOTA). Desenvolva um esquema de banco de dados relacional para essa aplicação de banco de dados. Primeiro mostre todas as dependências funcionais que devem existir entre os atributos. Então, desenvolva esquemas relacionais para o banco de dados que estão em 3NF ou FNBC. Especifique os atributos chaves de cada relação. Note qualquer requisito não especificado e faça suposições apropriadas para tornar a especificação completa.
60
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 2 Normalize a relação até a 3NF: InfoIPTU = ( codinscIMV, nomepropIMV, ruapropIMV, bairropropIMV, cidpropIMV, estpropIMV, fonepropIMV, benfsIMV, ruaIMV, bairroIMV, vlrterreno, areaterreno, areaconstruida, padraoconstrucao, vlrIMV, codloteamento, quadraterr, loteterr, nomesmoradores, dtanivmoradores ) Legenda: - prop = proprietário - IMV = imóvel - cid = cidade - est = estado - benfs = conjunto de benefícios - vlr = valor -
Bairro determina os vários loteamentos que o compõem. As quadras são numeradas em ordem no loteamento e os lotes são numerados em ordem de quadra. CODLOTEAMENTO + QUADRA + LOTE são chave Os terrenos que têm construção, têm alíquota de imposto diferenciada dos que não tem construção. O número de benfeitorias é importante para determinar a alíquota dos terrenos em construção.
61
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 3 Considere o esquema de relação EmpDepto = ( numat, nomemp, datanasc, endereço, ndepto, nomedep, nchefe) e o seguinte conjunto G de dependências funcionais em EmpDepto: G = {numat Æ {nomemp, datanasc, endereço, ndepto}, ndepto Æ {nomedep, nchefe}}. Calcule {numat}+ e {ndepto}+ em respeito a G. Normalização 4 Por que as dependências transitivas e consideradas ruins no esquema relacional?
dependências
parciais
são
Normalização 5 Considere a relação universal R = { A, B, C, D, E, F, G, H, I, J } e o conjunto de dependências funcionais F={ {A, B} Æ C A Æ {D, E} BÆF F Æ {G, H} D Æ {I, J} } Qual é a chave para R? Decomponha R em relação a 2NF e, então, em relação a 3NF. Normalização 6 Repita o exercício Normalização dependências funcionais:
5
para
o
seguinte
conjunto
de
G={ {A, B} Æ C {B, D} Æ {E, F} {A, D} Æ {G, H} AÆI HÆJ }.
62
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 7 Seja F o conjunto de dependências funcionais abaixo: codend, prefixo, numfone Æ tipofone, numfone codend, numrua, cep Æ tipofone nomerua, numrua, cep Æ nomerua, cep codend, complemento Æ complemento cidade, estado Æ codcid codcid Æ ddd codcid Æ cepmin, cidade codcid Æ cepmax, estado codcid, estado Æ cepmin, cepmax, cidade cidade, codcid Æ cepmin, cepmax, ddd ddd Æ estado Aplique o algoritmo visto em sala de aula para produzir os fechos de cada dependência funcional acima. Então, analise os conjuntos resultantes e normalize o esquema até a 3NF.
63
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 8 Normalize a relação PEDIDO até a 3NF: PEDIDO = (NÚMERO_PED, PRAZO_PED, COD_CLI, END_CLI, CGC_CLI, IE_CLI, {COD_PROD}, {DESC_PROD}, {UNID_PROD}, {QTD_PROD}, {VU_PROD}, COD_VEND, NOME_VEND) 1a. Forma Normal: ausência de atributos multivalorados PEDIDO (NÚMERO_PED, PRAZO_PED, COD_CLI, END_CLI, CGC_CLI, IE_CLI, COD_VEND, NOME_VEND) ITEM PEDIDO (NÚMERO_PED, COD_PROD, DESC_PROD, UNID_PROD, QTD_PROD, VU_PROD) 2a. Forma Normal: ausência de dependências funcionais parciais PEDIDO (NÚMERO_PED, PRAZO_PED, COD_CLI, END_CLI, CGC_CLI, IE_CLI, COD_VEND, NOME_VEND) ITEM PEDIDO (NÚMERO_PED, COD_PROD, QTD_PROD) PRODUTO (COD_PROD, DESC_PROD, UNID_PROD, VU_PROD) 3a. Forma Normal: ausência de dependências funcionais transitivas PEDIDO (NÚMERO_PED, PRAZO_PED, COD_CLI, COD_VEND) ITEM PEDIDO (NÚMERO_PED, COD_PROD, QTD_PROD) PRODUTO (COD_PROD, DESC_PROD, UNID_PROD, VU_PROD) CLIENTE (COD_CLI, NOME_CLI, END_CLI, CGC_CLI, IE_CLI) VENDEDOR (COD_VEND, NOME_VEND)
64
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 9 Normalize a relação TURMA até a 3NF: TURMA = (COD_TURMA,DESC_TURMA,{COD_ALUNO}, NOME_ALUNO}, {NASC_ALUNO}, {TEL_ALUNO}, {COD_DISC}, {DESC_DISC}) 1a. Forma Normal: ausência de atributos multivalorados TURMA (COD_TURMA, DESC_TURMA) ALUNO (COD_ALUNO, NOME_ALUNO, NASC_ALUNO, COD_TURMA, COD_DISC, DESC_DISC) ALUNO_TELEFONE (COD_ALUNO, TEL_ALUNO) 2a. Forma Normal: ausência de dependências funcionais parciais Não existem dependências funcionais parciais 3a. Forma Normal: ausência de dependências funcionais transitivas TURMA (COD_TURMA, DESC_TURMA) ALUNO (COD_ALUNO, NOME_ALUNO, NASC_ALUNO, COD_TURMA) ALUNO_TELEFONE (COD_ALUNO, TEL_ALUNO) DISCIPLINA(COD_DISC, DESC_DISC) ALUNO_DISCIPLINA(COD_ALUNO, COD_DISC)
65
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 10 Normalizar a relação ASSOCIADO até a 3FN Associados - Os TITULARES são vinculados aos PLANOS de saúde. - Os DEPENDENTES são ligados aos TITULARES e possuem um GRAU de parentesco ASSOCIADOS = (MAT_TIT, NOM_TIT, {TEL_TIT}, {SEQ_DEP}, {NOM_DEP}, {COD_GRA}, {DES_GRA}, COD_PLA, DES_PLA) 1a. Forma Normal: ausência de atributos multivalorados TITULAR (MAT_TIT, NOM_TIT, COD_PLA, DES_PLA) TEL_TIT (MAT_TIT, TEL_TIT) DEPENDENTE (MAT_TIT, SEQ_DEP, NOM_DEP, COD_GRA, DES_GRA) 2a. Forma Normal: ausência de dependências funcionais parciais TITULAR (MAT_TIT, NOM_TIT, COD_PLA, DES_PLA) TEL_TIT (MAT_TIT, TEL_TIT) DEPENDENTE (MAT_TIT, SEQ_DEP, NOM_DEP, COD_GRA) GRAU (COD_GRA, DES_GRA) 3a. Forma Normal: ausência de dependências funcionais transitivas TITULAR (MAT_TIT, NOM_TIT, COD_PLA) TEL_TIT (MAT_TIT, TEL_TIT) DEPENDENTE (MAT_TIT, SEQ_DEP, NOM_DEP, COD_GRA) GRAU (COD_GRA, DES_GRA) PLANO (COD_PLA, DES_PLA)
66
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 11 Normalizar a relação CLIENTES até a 3FN Clientes - Os CLIENTES são associados a determinadas CLASSES. - As CONTAS correntes pertencem aos CLIENTES e existem em um determinado BANCO. CLIENTES = (COD_CLI, NOM_CLI, {TEL_CLI}, COD_CLA, DES_CLA, {NUM_CC}, {SALDO_CC}, {COD_BCO}, {DES_BCO}) 1a. Forma Normal: ausência de atributos multivalorados CLIENTE (COD_CLI, NOM_CLI, COD_CLA, DES_CLA) TEL_TIT (COD_CLI, TEL_CLI) CONTAS (COD_CLI, NUM_CC, SALDO_CC, COD_BCO, DES_BCO) 2a. Forma Normal: ausência de dependências funcionais parciais CLIENTE (COD_CLI, NOM_CLI, COD_CLA, DES_CLA) TEL_TIT (COD_CLI, TEL_CLI) CONTAS (COD_CLI, NUM_CC, SALDO_CC, COD_BCO) BANCO (COD_BCO, DES_BCO) 3a. Forma Normal : ausência de dependências funcionais transitivas CLIENTE (COD_CLI, NOM_CLI, COD_CLA) TEL_CLI (COD_CLI, TEL_CLI) CONTAS (COD_CLI, NUM_CC, SALDO_CC, COD_BCO) BANCO (COD_BCO, DES_BCO) CLASSE (COD_CLA, DES_CLA)
67
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 12 Normalizar a relação FOLHA até a 3FN Folha de Pagamento (FOLHA) - Nos DEPARTAMENTOS trabalham vários FUNCIONÁRIOS - Na folha de pagamento dos FUNCIONÁRIOS constam várias rubricas de PROVENTOS e DESCONTOS (PD). FOLHA = (MAT_FUN, NOM_FUN, {COD_PD}, {DES_PD}, {COMP_FOL}, {VALOR_FOL}, SIG_DEP, DES_DEP) 1a. Forma Normal: ausência de atributos multivalorados FUNCIONARIO (MAT_FUN, NOM_FUN, SIG_DEP, DES_DEP) FOLHA (MAT_FUN, COD_PD, DES_PD, COMP_FOL, VALOR_FOL) 2a. Forma Normal: ausência de dependências funcionais parciais FUNCIONARIO (MAT_FUN, NOM_FUN, SIG_DEP, DES_DEP) PD (COD_PD, DES_PD) FOLHA (MAT_FUN, COD_PD, COMP_FOL, VALOR_FOL) 3a. Forma Normal: ausência de dependências funcionais transitivas DEPARTAMENTO(SIG_DEP, DES_DEP) FUNCIONARIO (MAT_FUN, NOM_FUN, SIG_DEP) PD (COD_PD, DES_PD) FOLHA (MAT_FUN, COD_PD, COMP_FOL, VALOR_FOL)
68
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Exercício de Engenharia Reversa Nos exercícios anteriores, obtivemos o Modelo Lógico normalizado. Para cada um deles, elabore o Modelo Conceitual.
69
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Capítulo 3 Álgebra Relacional
70
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
A Álgebra Relacional A álgebra relacional é uma coleção de operações canônicas (do grego KÁNON - regra, regra geral onde se inferem regras especiais) utilizadas para manipular as relações. Estas operações são utilizadas para selecionar tuplas de relações individuais e para combinar tuplas relacionadas de relações diferentes para especificar uma consulta em um determinado banco de dados. O resultado de cada operação também pode ser manipulado pela álgebra relacional. É utilizada a letra grega σ (sigma) para demonstrar a condição de seleção e π (pi) para definir a lista de atributos. Portanto a “sintaxe” seria algo assim: CONSULTA = π atributos σ condição (relação ) Adotaremos o seguinte Banco de Dados para nossos primeiros exemplos: cod_d
desc_d
DEPTO (1,n)
POSSUI supervisionado
EMPREGADO
POSSUI (1,n) supervisor
(0,n)
cod_p des_p local
RG
(1,1)
(1,1)
(0,n)
Trabalha
(0,n)
Projeto
nome salario
POSSUI nome
(1,1)
nasc Dependente
relacao sexo
Figura 43 MODELO LÓGICO DEPTO( cod_d,
desc_d)
PROJETO( cod_p, EMPREGADO( rg,
desc_p, nome,
DEPENDENTES ( rg, TRABALHA ( rg,
local)
salário,
nome,
nasc,
rg_sup,
cod_d)
relacao, sexo)
cod_p)
71
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Conteúdo das bases de dados
RG 1 2 3 4 5 6 7 8 9 10 11
RG 1 1 3 4 5
NOME Rodrigo Renato Fernanda Roberta Flávia Vera Leonardo Carla Camilo Lúcio Cleôncio
NOME Bruna Júlia José João Verônica
COD_P 1 2 3 4
EMPREGADO SALARIO 1.000,00 1.500,00 2.500,00 1.000,00 500,00 3.000,00 1.000,00 500,00 1.200,00 1.200,00 5.000,00
COD_D 1 3 2 1 3 1 1 3 2 2 -
DEPENDENTES NASC SEXO 01/01/1987 F 04/10/1960 F 03/05/1991 M 10/10/1990 M 15/08/1980 F PROJETO DESC_P FINANC CONTAB SAUDE ESTOQUE
COD_D 1 2 3
RG 1 2 3 4 5 6 7 8 9 10 1 6 5 7
RG_SUP 6 2 3 6 2 6 6 2 3 3 11
RELAÇÃO Filho(a) Esposa(o) Filho(a) Filho(a) Filho(a)
LOCAL SP RJ MG ES
DEPTO DESC_D Análise Programação Operação TRABALHA COD_P 1 2 3 3 2 1 3 2 1 1 2 3 1 2
72
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
A Operação Select A operação select é utilizada para selecionar um subconjunto de tuplas de uma relação, sendo que estas tuplas devem satisfazer uma condição de seleção. A forma geral de uma operação select é: σ condição_de_seleção (nome_da_relação) condição_de_seleção é uma expressão booleana aplicada sobre os atributos da relação nome_da_relação é o nome da relação sobre a qual será aplicada a operação select. As operações relacionais que podem ser aplicadas na operação select são: < > <= >= = <> ou !=
Menor que Maior que Menor ou igual Maior ou igual Igual Diferente
além dos operadores booleanos: And Or Not
E Ou Negação
A operação select é unária, ou seja, só pode ser aplicada a uma única relação. Não é possível aplicar a operação sobre tuplas de relações distintas. Exemplos: CONSULTA01 = σ salário < 1.500,00 (EMPREGADO) RG 1 4 5 7 8 9 10
NOME Rodrigo Roberta Flávia Leonardo Carla Camilo Lúcio
EMPREGADO SALARIO 1.000,00 1.000,00 500,00 1.000,00 500,00 1.200,00 1.200,00
COD_D 1 1 3 1 3 2 2
RG_SUP 6 6 2 6 2 3 3
CONSULTA02 = σ relacao = “Filho(a)” e sexo = “F” (DEPENDENTES) RG 1 5
NOME Bruna Verônica
DEPENDENTES NASC SEXO 01/01/1987 F 15/08/1980 F
RELAÇÃO Filho(a) Filho(a)
73
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
A Operação Project A operação project seleciona um conjunto determinado de colunas de uma relação. A forma geral de uma operação project é: π lista_de_atributos (nome_da_relação) A letra grega π (pi) representa a operação project, lista_de_atributos representa a lista de atributos que o usuário deseja selecionar; nome_da_relação representa a relação sobre a qual a operação project será aplicada. CONSULTA03 = π nome, nasc
(DEPENDENTES)
DEPENDENTES NOME NASC Bruna 01/01/1987 Júlia 04/10/1960 José 03/05/1991 João 10/10/1990 Verônica 15/08/1980
Seqüencialidade de Operações As operações project e select podem ser utilizadas de forma combinada, permitindo que apenas determinadas colunas de determinadas tuplas possam ser selecionadas. A forma geral de uma operação seqüencializada é: π lista_de_atributos σ condição_de_seleção (nome_da_relação) CONSULTA04= (EMPREGADO) NOME Renato Fernanda Vera Cleôncio
π
nome,
EMPREGADO SALARIO 1.500,00 2.500,00 3.000,00 5.000,00
salário,
cod_d
σ
salário
>=
1.500,00
COD_D 3 2 1 -
Apesar de mais elegante, a consulta4 também pode ser escrita da seguinte forma: CONSULTA05 = σ salário >= 1.500,00 (EMPREGADO)
74
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
CONSULTA06 = π nome, salário, cod_d
(CONSULTA05)
Operações Matemáticas Levando em consideração que as relações podem ser tratadas como conjuntos, podemos então aplicar um conjunto de operações matemáticas sobre as mesmas. Estas operações são: união (∪) , interseção (∩) e diferença (−). Este conjunto de operações não é unário, ou seja, podem ser aplicadas sobre mais de uma tabela, porém, existe a necessidade das tabelas possuírem tuplas exatamente do mesmo tipo. Estas operações podem ser definidas da seguinte forma: união - o resultado desta operação representada por R ∪ S é uma relação T que inclui todas as tuplas que se encontram em R e todas as tuplas que se encontram em S; interseção - o resultado desta operação representada por R ∩ S é uma relação T que inclui as tuplas que se encontram em R e em S ao mesmo tempo; diferença - o resultado desta operação representada por R − S é uma relação T que inclui todas as tuplas que estão em R mas não estão em S. Selecione todos os empregados que trabalham no departamento número 2 ou que supervisionam empregados que trabalham no departamento número 2. Vamos primeiro selecionar todos os funcionários que trabalham no departamento número 2. CONSULTA07 = σ cod_d = 2 (EMPREGADOS)
RG 3 9 10
NOME Fernanda Camilo Lúcio
EMPREGADO SALARIO 2.500,00 1.200,00 1.200,00
COD_D 2 2 2
RG_SUP 3 3 3
Vamos agora selecionar o supervisor dos empregados que trabalham no departamento número 2. CONSULTA08 = π rg_sup
(CONSULTA07)
EMPREGADO RG_SUP 3
75
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Vamos projetar apenas o RG dos empregados selecionados: CONSULTA09 = π rg
(CONSULTA07)
EMPREGADO RG 3 9 10
E por fim vamos unir as duas tabelas, obtendo o resultado final CONSULTA10 = CONSULTA08 U CONSULTA09
EMPREGADO RG 3 3 9 10
Vamos selecionar todos os empregados que desenvolvem algum projeto e que trabalham no departamento número 2. Para isso, primeiro devemos selecionar todos os empregados que trabalham em algum projeto: CONSULTA11 = π rg
(TRABALHA)
TRABALHA RG 1 2 3 4 5 6 7 8 9 10
Agora, vamos selecionar empregados que trabalham no departamento 2: CONSULTA12 = π rg σ (depto=2) (EMPREGADO) EMPREGADO RG 3 9 10
76
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Com a consulta a seguir, obteremos todos os empregados que trabalham no departamento 2 e que desenvolvem algum projeto CONSULTA13 = CONSULTA11 ∩ CONSULTA12 EMPREGADO RG 3 9 10
Para selecionar todos os empregados que não desenvolvem projetos, devemos inicialmente selecionar os que trabalham em algum projeto CONSULTA14 = π rg
(TRABALHA)
TRABALHA RG 1 2 3 4 5 6 7 8 9 10
...e a seguir, quem é empregado CONSULTA15 = π rg (EMPREGADO) EMPREGADO RG 1 2 3 4 5 6 7 8 9 10 11
77
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
...finalmente, quem é empregado e não está trabalhando em nenhum projeto. CONSULTA16 = CONSULTA15 - COLSULTA14 CONSULTA16 RG 11
Produto Cartesiano O produto cartesiano é uma operação binária que combina todas as tuplas de duas tabelas. Diferentemente da operação união, o produto cartesiano não exige que as tuplas das tabelas possuam exatamente o mesmo tipo. O produto cartesiano permite então a consulta entre tabelas relacionadas utilizando uma condição de seleção apropriada. O resultado de um produto cartesiano é uma nova tabela formada pela combinação das tuplas das tabelas sobre as quais aplicou-se a operação. O formato geral do produto cartesiano entre duas tabelas R e S é:
R x S. Exemplo: CONSULTA17 =(PROJETO) x (DEPTO)
COD_D 1 1 1 1 2 2 2 2 3 3 3 3
CONSULTA17 DESC_D COD_P Análise 1 Análise 2 Análise 3 Análise 4 Programação 1 Programação 2 Programação 3 Programação 4 Operação 1 Operação 2 Operação 3 Operação 4
DESC_P Financ Contab Saude Estoque Financ Contab Saude Estoque Financ Contab Saude Estoque
Vamos agora selecionar as tuplas resultantes que estão devidamente relacionadas que são as que possuem o mesmo valor em número do projeto e número e cuja localização seja ‘SP’. CONSULTA18 = (TRABALHA x PROJETO)
78
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
CONSULTA19 = π t.rg, p.cod_p σ t.cod_p = p.cod_p e p.local = “SP” (CONSULTA18) A operação produto cartesiano não é muito utilizada por não oferecer um resultado otimizado. Veja o item seguinte. Operação Junção A operação junção atua de forma similar à operação produto cartesiano, porém, a tabela resultante conterá apenas as combinações das tuplas que se relacionam de acordo com uma determinada condição de junção. A forma geral da operação junção entre duas tabelas R e S é a seguinte:
R x [condição_de_ junção] S Vamos refazer as consultas 18 e 19. CONSULTA20 = π t.rg, p.cod_p σ t.cod_p = p.cod_p e p.local=“SP” (TRABALHA x PROJETO) CONSULTA19 T.RG P.COD_P 1 1 6 1 9 1 10 1 5 1
O resultado será o mesmo, porém com mais eficiência.
79
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Capítulo 4 Structured Query Language – SQL Data Definition Language - DDL Data Manipulation Language- DML
80
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL - Structured Query Language SQL é um conjunto de declarações que é utilizado para acessar os dados utilizando gerenciadores de banco de dados. Nem todos os gerenciadores utilizam SQL. SQL não é uma linguagem baseada em procedimentos, pois processa conjuntos de registros, ao invés de um por vez, provendo navegação automática através dos dados, permitindo ao usuário manipular tipos complexos de dados. SQL pode ser utilizada para todas as atividades relativas a um banco de dados podendo ser utilizada pelo administrador de sistemas, pelo DBA, por programadores, sistemas de suporte à tomada de decisões e outros usuários finais. Definição de Dados Utilizando SQL Comando CREATE TABLE O comando CREATE TABLE permite ao usuário criar uma nova tabela (ou relação). Para cada atributo da relação é definido um nome, um tipo, máscara e algumas restrições. Os tipos mais comuns de uma coluna são: char(n): caracteres e strings onde n é o número de caracteres; integer: inteiros float: ponto flutuante; decimal(m,n): onde m é o no. de casas inteiras e n o no. de casas decimais. A nomenclatura destes tipos varia de acordo com o banco de dados adotado. A restrição not null indica que o atributo deve ser obrigatoriamente preenchido; se não for especificado, então o default é que o atributo possa assumir o valor nulo. A forma geral do comando CREATE TABLE então é: CREATE TABLE <nome_tabela> ( <nome_coluna1><tipo_coluna1><NOT NULL>, <nome_colunan><tipo_colunan><NOT NULL>);
Para criar a tabela EMPREGADOS teríamos o seguinte comando: CREATE TABLE EMPREGADO ( rg integer NOT NULL, nome nvarchar(50) NOT NULL, salario money NOT NULL cod_d integer NOT NULL, rg_sup integer NOT NULL, );
81
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Comando DROP TABLE O comando DROP TABLE permite a exclusão de uma tabela (relação) em um banco de dados. A forma geral para o comando DROP TABLE é: DROP TABLE <nome_tabela>;
Por exemplo, para eliminar a tabela EMPREGADOS faríamos: DROP TABLE EMPREGADO;
Observe que neste caso, a chave da tabela EMPREGADO, (rg) é utilizada como chave estrangeira ou como chave primária composta em diversos tabelas que devem ser devidamente corrigidas. Este processo não é assim tão simples pois, como vemos neste caso, a exclusão da tabela EMPREGADO implica na alteração do projeto físico de diversas tabelas. Isto acaba implicando na construção de uma nova base de dados. Comando ALTER TABLE O comando ALTER TABLE permite que o usuário faça a inclusão de novos atributos em uma tabela. A forma geral para o comando ALTER TABLE é a seguinte: ALTER TABLE <nome_tabela> ADD <nome_coluna> <tipo_coluna>;
No caso do comando ALTER TABLE, a restrição NOT NULL não é permitida pois assim que se insere um novo atributo na tabela, o valor para o mesmo em todas as tuplas da tabela receberão o valor NULL. Manipulando dados utilizando a SQL Selecionando dados - SELECT O comando SELECT permite a seleção de tuplas e atributos em uma ou mais tabelas. A forma básica para o uso do comando SELECT é: SELECT <lista de atributos> FROM <lista de tabelas> [WHERE <condições>];
Por exemplo, para selecionar o nome e o rg dos funcionários que trabalham no departamento número 2 na tabela EMPREGADOS utilizamos o seguinte comando:
82
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados SELECT FROM WHERE
nome, rg EMPREGADO cod_d = 2;
CONSULTA21= π nome, rg σ intdepto=2 (EMPREGADO) EMPREGADO NOME RG Fernanda 3 Camilo 9 Lucio 10
Também é permitido o uso de condições múltiplas. Veja o exemplo a seguir: SELECT FROM WHERE
nome, rg, salario EMPREGADO depto = 2 AND salario >= 2.500.00;
CONSULTA22 = π nome, rg, salario σ depto=2 e salario >= 2.500,00 (EMPREGADO) EMPREGADO NOME RG Fernanda 3
A operação select-from-where em SQL pode envolver quantas tabelas forem necessárias. Exemplo: selecione o código e o nome do departamento que controla projetos localizados em “MG”; SELECT FROM WHERE AND AND AND
COD_D 1 2
DISTINCT d.cod_d, d.desc_d depto d, projeto p, trabalha t, empregado e p.local = “MG” p.cod_p = t.cod_p t.rg = e.rg e.cod_d = d.cod_d; DEPTO DESC_D Análise Programação
Na expressão SQL acima, d, p, t e e são chamados alias (apelidos) e representam a mesma tabela a qual estão referenciando. Um alias é muito importante quando há redundância nos nomes das colunas de duas ou mais tabelas que estão envolvidas em uma expressão. Ao invés de utilizar o alias, é possível utilizar o nome da tabela, mas isto pode ficar cansativo em consultas muito complexas além do que, impossibilitaria a utilização da mesma tabela mais que uma vez em uma expressão SQL. Considere a seguinte consulta: selecione o rg, nome e nome do supervisor.
83
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SELECT FROM WHERE
e1.rg, e1.nome, e2.nome empregado e1, empregado e2 e1.rg_sup = e2.rg;
em álgebra relacional: CONSULTA23 =π nome, rg σ e1.rg = e2.rg_sup(EMPREGADO e1 x EMPREGADO e2) RG 1 2 3 4 5 6 7 8 9 10 11
EMPREGADO NOME NOME_SUP Rodrigo Vera Renato Renato Fernanda Fernanda Roberta Vera Flávia Renato Vera Vera Leonardo Vera Carla Renato Camilo Fernanda Lúcio Fernanda Cleôncio Cleôncio
O operador (*) especificado na cláusula select seleciona todos os atributos de uma tabela, enquanto que a exclusão da cláusula where faz com que todas as tuplas de uma tabela sejam selecionadas. SELECT FROM
* empregado;
Diferente de álgebra relacional, a operação SELECT em SQL permite a geração de tuplas duplicadas como resultado de uma expressão. Para evitar isto, devemos utilizar o especificador DISTINCT. Veja a seguir os exemplos. Sem DISTINCT SELECT FROM
cod_d empregado;
EMPREGADO COD_D 1 3 2 1 3 1 1 3 2 2 -
84
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Com DISTINCT SELECT FROM
distinct cod_d empregado;
EMPREGADO COD_D 1 2 2
Podemos gerar consultas aninhadas em SQL utilizando o especificador IN, que faz uma comparação do especificador WHERE da consulta mais externa com o resultado da consulta mais interna. Considere a consulta a seguir: selecione o nome de todos os funcionários que trabalham em projetos localizados em Rio Claro; SELECT FROM WHERE AND
e.nome, e.rg, e.cod_d empregado e, trabalha t e.rg = t.rg t.cod_p in (SELECT cod_p FROM projeto WHERE local = “SP”);
EMPREGADO NOME RG COD_D Rodrigo 1 1 Flávia 5 3 Vera 6 1 Camilo 9 2 Lúcio 10 2
Para selecionar um conjunto de tuplas de forma ordenada devemos utilizar o comando ORDER BY. Leve em consideração a seguinte consulta: selecione todos os empregados por ordem alfabética: SELECT FROM ORDER BY
nome, rg, cod_d empregado nome;
EMPREGADO Nome RG COD_D Camilo 9 2 Carla 8 3 Cleôncio 11 Fernanda 3 2 Flávia 5 3 Leonardo 7 1 Lúcio 10 2 Renato 2 3 Roberta 4 1 Rodrigo 1 1 Vera 6 1
85
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Inserções, Atualizações e Exclusões Para elaborar inserções em SQL, utiliza-se o comando INSERT INTO. A forma geral para o comando INSERT INTO é: INSERT INTO <nome da tabela> <(lista de colunas)> VALUES <(lista de valores)>;
Insira na tabela empregados, os seguintes dados: RG NOME 21 Jorge G. 22 João da C.
SALARIO 150,00 200,00
COD_D 3 3
RG_SUP 2 -
INSERT INTO empregado VALUES (21,”Jorge G.”, 150,00, 3, 2); INSERT INTO empregado (rg, nome, cod_d, salario) VALUES (22, ”Joao de C.”, 3, 200,00);
Como no primeiro exemplo, todos os campos foram inseridos e não foi necessário especificar o nome das colunas. Na segunda inserção, o campo rg_sup não foi inserido, então especificou-se as colunas. Outra forma de se elaborar esta inserção seria: INSERT INTO empregado VALUES (22, “João de C.”, 200.00, 3, “”);
Neste caso, utilizou-se os caracteres “” (aspas) para informar que um valor nulo seria inserido nesta coluna. Para se efetuar uma alteração em uma tabela, é utilizado o comando UPDATE. A forma geral do comando UPDATE é: UPDATE <tabela> SET <coluna> = <expressão> WHERE <condição>
Considere a seguinte declaração: atualize o salário de todos os empregados que trabalham no departamento 2 para R$ 3.000,00; UPDATE empregado SET salario = 3.000,00 WHERE cod_d = 2;
Para se eliminar uma tupla de uma tabela, utiliza-se o comando DELETE. A forma geral do comando DELETE é: DELETE FROM <tabela> WHERE <condição>;
86
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Elimine os registros nos quais o empregado trabalhe no departamento 3 e possua salário <= R$ 200,00; DELETE FROM empregado WHERE salario <= 200,00 AND cod_d = 3;
(estas inserções foram feitas anteriormente) Nos casos de atualização que foram vistos, todas as <condições> podem ser uma consulta utilizando o comando SELECT, onde o comando será aplicado sobre todos os registros que satisfizerem as condições determinadas pelo comando de seleção.
87
Banco de Dados VENDAS
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL – Passo a passo ERA do Banco de dados Vendas
cod_d desc_d CGC
cod_v
IE
salário VENDEDOR
CLIENTE
end_c
cidade
UF CEP num_p
comissão
PE (0,n)
(0,n)
FAZ
nome_v
(1,1)
PEDIDO
(1,1)
PREENCHE
(0,n)
POSSUI cod_p
qtd
(1,1)
(1,1)
ITENS PEDIDO
(0,n)
REQUISITA
desc_p
unidade
PRODUTO
VU
Figura 44
CLIENTE COD_C
NOME_C
END_C
CIDADE
CEP
720
Ana
Rua Dez 19
Niteroi
25352-131 RJ
111111111111-11 54654
870
Flávio
São Paulo
15546-464 SP
222222222222-22 32132
Curitiba
30000-311 SP
333333333333-33 8979
Belo Horizonte São Paulo
54654-812 MG
444444444444-44
98610-132 SP
555555555555-55 5646
Salvador
12144-568 BA
666666666666-66 8987
Rio de Janeiro São Paulo
23546-876 RJ
777777777777-77 218
45665-455 SP
888888888888-88 21325
Londrina
12345-874 PR
999999999999-99 23121
110 222 830 130 410 20 157 180 260 290 390 234
Av P Vargas 10 Jorge Rua Caiapo 13 Lucia Rua Itabira 123 Pedro Av Paulista 1235 Edmar Rua da Prai s/n Rodolfo Largo da Lapa 27 Elisabeth Av Climério 45 Livio Tv Moraes c/3 Susana Av Baira Mar 200 Renato Rua Mendes 56 Sebastião Rua Meireles 98 Jose Rua da Igreja 14 Paulo Av Rio Branco 1
UF
CPF_CGC
IE
Florianópoli 98511-321 SC s Niteroi 12131-545 RJ
010101010101-01 020202020202-02 21544
São Paulo
32012-112 SP
030303030303-03 184879
Uberaba
54645-477 MG
040404040404-04 189410
Brasília
26448-253 DF
050505050505-05 21213
VENDEDOR COD_V NOME_V
SALARIO
COMISSAO
89
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados 209
Jose
1.800,00 C
111
Carlos
2.490,00 A
123
João Sinval 2.780,00 C
240
Antonio
900,00
720
Felipe
4.600,00 A
213
Jonas
2.300,00 A
101
João Silva
2.300,00 C
310
Josias
870,00
250
Bonifácio
2.930,00 B
C
C
PRODUTO COD_P DESC_P
UNIDADE
25 Queijo
Kg
VU 0,97
31 Chocolate Bar
0,87
78 Vinho
L
2,00
22 Linho
M
0,11
30 Açúcar
Sac
0,30
53 Linha
M
1,80
13 Ouro
G
0,18
45 Madeira
M
0,25
87 Cano
M
1,98
77 Papel
Res
1,05
PEDIDO NUM_P
PE COD_C COD_C
121
20
410
97
20
720
209 101
101
15
720
101
137
20
720
720
148
20
720
101
189
15
870
213
104
30
110
101
203
30
830
250
98
20
410
209
143
30
20
111
105
15
180
240
111
20
260
240
103
20
60
11
91
20
260
11
138
20
260
11
108
15
290
310
119
30
390
250
127
10
410
11
ITENS PEDIDO NUM_P
COD_P
QTD
90
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados 121
25
10
121
31
35
97
77
20
101
31
9
101
78
18
101
13
5
98
77
5
148
45
5
148
31
8
148
25
7
148
78
10
104
53
30
203
31
32
189
78
6
143
31
45
143
78
20
105
78
10
111
78
10
103
53
70
91
77
37
138
22
40
138
77
10
138
53
35
108
13
18
119
77
17
119
13
40
119
22
6
119
53
10
137
13
43
189
5
8
Selecionando informações de uma tabela - SELECT...FROM SELECT desc_p, unidade, VU FROM Produto SELECT nome_c, CGC FROM Cliente SELECT * FROM Vendedor Obs.: o caracter ‘*’ seleciona todas as colunas da tabela.
Impondo condições à seleção das informações - WHERE SELECT
* 91
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
FROM Produto WHERE desc_p = ‘PREGO’ Obs.: quando o tipo de <nome da coluna> for caracter, devemos colocar <valor> entre ‘ ‘ (aspas simples). Devemos lembrar também que, para o <valor>, letras MAIÚSCULAS diferem das minúsculas. Operadores Operadores Relacionais = <> ou != < > <= >=
Igual Diferente Menor que Maior que Menor ou igual Maior ou igual
SELECT FROM WHERE
num_p, cod_p, qtd item_pedido qtd >= 35
SELECT FROM WHERE
nome_c cliente cidade = ‘RIO DE JANEIRO’
Operadores Lógicos AND OR NOT
E Ou Negação SELECT FROM WHERE
desc_p produto unidade = ‘M’ and VU = 1.05
SELECT FROM WHERE AND OR
nome_c, endereco cliente CEP >= ‘30077000’ CEP <= ‘30079000’ cidade = ‘SÃO PAULO’
SELECT FROM WHERE
num_p pedido NOT pe = 15
Operadores EXISTS e NOT EXISTS
92
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Selecionar pedidos de vendedores que não mais trabalham na empresa e já foram eliminados da tabela vendedores. SELECT FROM WHERE
* pedido p NOT EXISTS (
SELECT FROM WHERE
v.cod_v vendedor v v.cod_v = p.cod_v
)
Operadores BETWEEN e NOT BETWEEN SELECT FROM WHERE
cod_p, desc_p produto VU BETWEEN 0.32 AND 2.00
Operadores IN e NOT IN SELECT FROM WHERE
nome_v vendedor comissao IN (‘A’, ‘B’)
Operadores LIKE e NOT LIKE Obs.: atuam apenas sobre os campos do tipo caracter e pode ser utilizado com os caracteres “%”, na substituição de palavras ou o “_”, substituindo um caracter. SELECT FROM WHERE
cod_p, desc_p produto desc_p LIKE ‘LAPIS%’
SELECT FROM WHERE
cod_p, desc_p produto desc_p LIKE ‘BROCA N_’
SELECT FROM WHERE
cod_p, desc_p produto unidade LIKE ‘K_’
SELECT FROM WHERE
cod_v, nome_v vendedor nome_v NOT LIKE ‘Jo%’
Operadores IS NULL e IS NOT NULL SELECT FROM WHERE
* cliente IE IS NULL
Ordenando as informações selecionados - ORDER BY
93
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SELECT FROM ORDER BY
nome_v, salario vendedor nome_v
SELECT FROM ORDER BY
nome_c, cidade, UF cliente UF DESC, cidade DESC
SELECT FROM WHERE ORDER BY
desc_p, VU produto unidade = ‘M’ 2 ASC
Obs.: o número 2 refere-se ao segundo atributo da cláusula SELECT Efetuando cálculos com a informação selecionada SELECT FROM WHERE ORDER BY
nome_v, salario * 1.75 + 120 vendedor comissao = ‘C’ nome_v
AS aumento
Utilizando funções sobre conjuntos de informações -
MAX e MIN (Máximo e mínimo) SELECT MIN(salario), MAX(salario) FROM vendedor
-
SUM (Somatório) SELECT SUM(qtd) FROM item_pedido WHERE cod_p = 78
-
AVG (Média) SELECT FROM
AVG(salario) vendedor
COUNT SELECT FROM WHERE
COUNT(*) vendedor salario > 2500.00
-
Eliminando as informações repetidas – DISTINCT SELECT FROM
DISTINCT unidade produto
Agrupando as informações selecionadas – GROUP BY SELECT num_p, COUNT(*) AS Total_Produtos FROM item_pedido GROUP BY num_p Agrupando de forma condicional – HAVING SELECT num_p, COUNT(*) AS Total_Produtos FROM item_pedido 94
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
GROUP BY HAVING
num_p COUNT(*) >= 3
Recuperando informações de várias tabelas – JOIN SELECT c.nome_c, p.cod_c, p.num_p FROM cliente c, pedido p WHERE c.cod_c = p.cod_c Clientes de SP ou RJ, com prazo de entrega superior a 15 dias. SELECT c.nom_c, c.UF, p.PE FROM cliente c, pedido p WHERE UF IN (‘SP’, ‘RJ’) AND p.PE > 15 AND c.cod_c = p.cod_c Utilizando apelidos – ALIAS Substitui o uso dos qualificadores, normalmente o nome da própria tabela, por apelidos. SELECT v.nome_v, p.PE FROM vendedor v, pedido p WHERE v.salario >= 1000 AND p.PE > 15 AND v.cod_v = p.cod_v Juntando várias SELECT FROM WHERE AND AND AND AND AND ORDER BY
tabelas c.nome_c cliente c, pedido p, item_pedido ip, produto pr c.cod_c – p.cod_c p.num_p = ip.num_p ip.cod_p = pr.cod_p p.PE > 15 p.desc_p = ‘QUEIJO’ c.UF = ‘RJ’ c.nome_c
Vendedores que venderam ‘CHOCOLATE’ com quantidade > 10 Kg. SELECT DISTINCT v.nome_v FROM vendedor v, pedido p, item_pedido ip, produto pr WHERE v.cod_v = p.cod_v AND p.num_p = ip.num_p AND ip.cod_p = pr.cod_p AND ip.qtd > 10 AND pr.desc_p = ‘CHOCOLATE’ Quantos clientes fizeram pedidos com o vendedor ‘JOAO’ SELECT COUNT(p.cod_c)
95
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
FROM WHERE AND AND
cliente c, pedido p, vendedor v c.cod_c = p.cod_c p.cod_v = v.cod_v v.nome_v = ‘JOAO’
Quantos clientes do RJ e ES tem pedidos com a vendedora ‘MARIA’ SELECT UF, COUNT(c.nome_c) FROM cliente c, pedido p, vendedor v WHERE v.nome_v = ‘MARIA’ AND UF IN (‘RJ’, ‘ES’) AND v.cod_v = p.cod_v AND p.cod_c = c.cod_c GROUP BY UF Utilizando consultas encadeadas (SubQueries) Produtos que foram pedidos com quantidade superior a 10 SELECT FROM WHERE
desc_p produto produto IN
(SELECT FROM WHERE
cod_p item_pedido qtd > 10)
Vendedores com salário abaixo da média SELECT v.nome_v FROM vendedor v WHERE v.salario < (SELECT FROM Produtos que NÃO SELECT FROM WHERE
AVG(v1.salario) vendedor v1 )
estão presentes em nenhum pedido p.cod_p, p.desc_p produto p NOT EXISTS (SELECT * FROM item_pedido ip WHERE p.cod_p = ip.cod_p
)
Vendedores que só venderam produtos cuja unidade = ‘Gr’ (grama) SELECT DISTINCT v.cod_v, v.nome_v FROM vendedor v WHERE ‘G’ = ALL (SELECT p.unidade FROM produto p, item_pedido ip produto pr WHERE p.num_p = ip.num_p AND ip.cod_p = pr.cod_p AND p.cod_v =v.cod_v )
96
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Produtos que não SELECT FROM WHERE
estão presentes em nenhum pedido p.cod_p, p.desc_p produto p NOT EXISTS (SELECT * FROM item_pedido ip WHERE ip.cod_p = p.cod_p
Clientes que estão SELECT FROM WHERE
presentes em mais de 3 c.nome_c cliente c EXISTS (SELECT FROM WHERE GROUP BY HAVING
)
pedidos COUNT(*) pedido p p.cod_c = c.cod_c p.cod_c COUNT(*) > 3 )
Adicionando registros INSERT INTO produto VALUES (108,’Kg’,’PARAFUSO’,1.25) Adicionando registros de outra tabela INSERT INTO (cod_v, nome_v, salario, comissao) SELECT * FROM vendedor_old Atualizando um UPDATE SET WHERE
registro produto VU = VU * 1.25 unidade = ‘Kg’
Excluindo um registro DELETE FROM vendedor WHERE comissao IS NULL DELETE FROM WHERE
pedido p NOT EXISTS (SELECT FROM WHERE
cod_v vendedor cod_v = p.cod_v
)
97
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Como funciona o Produto Cartesiano Tabelas envolvidas
COD_F F1 F2 F3
Funcionário F NOM_F NASC_F Jose 01/12/1980 Maria 15/06/1975 João 26/11/1972
Trabalha T COD_F COD_P F1 P1 F1 P2 F2 P1 F3 P3
Projeto P COD_P DESC_P P1 Projeto 1 P2 Projeto 2 P3 Projeto 3
Produto Cartesiano Produto Cartesiano entre F x T x P) COD_F NOM_F NASC_F
COD_F COD_P COD_P DESC_P
F1
Jose
01/12/1980 F1
P1
P1
Projeto 1
F1
Jose
01/12/1980 F1
P1
P2
Projeto 2
F1
Jose
01/12/1980 F1
P1
P3
Projeto 3
F1
Jose
01/12/1980 F1
P2
P1
Projeto 1
F1
Jose
01/12/1980 F1
P2
P2
Projeto 2
F1
Jose
01/12/1980 F1
P2
P3
Projeto 3
F1
Jose
01/12/1980 F2
P1
P1
Projeto 1
F1
Jose
01/12/1980 F2
P1
P2
Projeto 2
F1
Jose
01/12/1980 F2
P1
P3
Projeto 3
F1
Jose
01/12/1980 F3
P2
P1
Projeto 1
F1
Jose
01/12/1980 F3
P2
P2
Projeto 2
F1
Jose
01/12/1980 F3
P2
P3
Projeto 3
F2
Maria 15/06/1975 F1
P1
P1
Projeto 1
F2
Maria 15/06/1975 F1
P1
P2
Projeto 2
F2
Maria 15/06/1975 F1
P1
P3
Projeto 3
F2
Maria 15/06/1975 F1
P2
P1
Projeto 1
F2
Maria 15/06/1975 F1
P2
P2
Projeto 2
F2
Maria 15/06/1975 F1
P2
P3
Projeto 3
F2
Maria 15/06/1975 F2
P1
P1
Projeto 1
F2
Maria 15/06/1975 F2
P1
P2
Projeto 2
F2
Maria 15/06/1975 F2
P1
P3
Projeto 3
F2
Maria 15/06/1975 F3
P2
P1
Projeto 1
F2
Maria 15/06/1975 F3
P2
P2
Projeto 2
F2
Maria 15/06/1975 F3
P2
P3
Projeto 3
F3
João
26/11/1973 F1
P1
P1
Projeto 1
F3
João
26/11/1973 F1
P1
P2
Projeto 2
F3
João
26/11/1973 F1
P1
P3
Projeto 3
F3
João
26/11/1973 F1
P2
P1
Projeto 1
F3
João
26/11/1973 F1
P2
P2
Projeto 2
F3
João
26/11/1973 F1
P2
P3
Projeto 3
F3
João
26/11/1973 F2
P1
P1
Projeto 1
F3
João
26/11/1973 F2
P1
P2
Projeto 2
F3
João
26/11/1973 F2
P1
P3
Projeto 3
F3
João
26/11/1973 F3
P2
P1
Projeto 1
F3
João
26/11/1973 F3
P2
P2
Projeto 2
F3
João
26/11/1973 F3
P2
P3
Projeto 3
98
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Problema proposto Desejo saber o nome dos funcionários e a descrição dos projetos nos quais trabalham SELECT FROM WHERE AND NOM_F Jose Jose Maria João
f.nom_f, des_p funcionario f, trabalha t, projeto p f.cod_f = t.cod_f t.cod_p = p.cod_p DESC_P Projeto Projeto Projeto Projeto
1 2 1 2
Como funcionam as funções de agregação (agrupamento) Problema proposto Desejo saber a quantidade de Funcionários e o somatório dos seus salários, por Departamento, exibindo também seu código e descrição. COD_F F1 F2 F3 F4 F5 F6 F7 F9 F10
FUNCIONÁRIO NOM_F SAL_F Jose 5.000,00 Maria 2.500,00 João 1.500,00 Carla 2.700,00 Sergio 6.000,00 Antônio 1.500,00 Vera 2.500,00 Leo 600,00 Edu 1.200,00
COD_D D1 D3 D3 D3 D2 D1 D3 D1 D1
DEPARTAMENTO COD_D DES_D D1 DRH D2 ENG D3 INFO
Um código fonte orientado a procedimentos, geraria um relatório assim... (talvez sem as repetições de códigos e descrições) D1
DRH
1.500,00
D1
DRH
600,00
D1
DRH
1.200,00 3
D2
ENG
D2
ENG
3.300,00 5.000,00 6.000,00
2
11.000,00
D3
INFO
2.500,00
D3
INFO
1.500,00
D3
INFO
2.700,00
D3
INFO
2.500,00 4
9.200,00
99
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Observamos abaixo, a construção do comando SQL, com funções de agregação e o resultado obtido. SELECT
FROM WHERE GROUP BY ORDER BY COD_D D1 D2 D3
d.cod_d, d.des_d, count(d.doc_d) qtd, sum(f.sal_f) soma Funcionario F, Departamento D d.cod_d = f.cod_d d.cod_d, d.des_d d.cod_d
DES_D DRH ENG INFO
QTD 3 2 4
SOMA 3.300,00 11.000,00 9.200,00
100
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL 1 Com base no Diagrama de Entidade, Relacionamento e Atributos abaixo, responda às questões a seguir. COD_D
DES_D
DEPARTAMENTO
(1,n)
POSSUI (1,1)
COD_F
FUNCIONÁRIO
NOM_F
(1,1)
COD_P DES_P
QH
TRABALHA
(0,n)
PROJETO
SAL_F
Figura 45 1) Derive o modelo conceitual para o modelo lógico
2) Com base no ERA, resolva os SQL propostos abaixo. a) Funcionário (NOM_F) e os projetos nos quais Trabalha (COD_P), ordenado por NOM_F b) Departamento (COD_D) e seus Funcionários (NOM_F), ordenado por Código do Departamento (COD_D) c) Quantidade de projetos nos quais o Funcionário (NOM_F) Trabalha (QTD) d) Funcionário (COD_F, NOM_F) com somatório de QH >= a 50 HORAS e) Departamento (COD_D, DES_D) com custo salarial >= R$ 5.000 f) Funcionário (COD_F, NOM_F) com SAL_F entre R$200 e R$1.000 g) Departamento (COD_D, DES_D) com menos de 3 Funcionários h) Funcionário (COD_F, NOM_F) com o nome iniciado por JOAO i)
Funcionário (NOM_F, SAL_F) e o salário aumentado em 23%
j) Departamento (COD_D, DES_D) que não possui Funcionários
101
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL 1 – Área para respostas
102
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL 2 Com base no Diagrama de Entidade, Relacionamento e Atributos abaixo, responda às questões a seguir. CGC
ESCOLA
RAZÃO
(1,n)
POSSUI (1,1)
MAT NOME SAL
PROFESSOR (1,n)
Requer
LECIONA COD (1,n)
CURSA
É requerida
DISCIPLINAS
(1,n)
CURSA
(1,n)
ALUNO
MAT NOME EMAIL
DES
Figura 46 1) Derive o modelo conceitual para o modelo lógico
2) Com base no ERA, resolva os SQL propostos abaixo. a) ESCOLA (CGC, RAZÃO) e os PROFESSORES (NOME) que nela trabalham b) ALUNO (NOME) e as DISCIPLINAS (DES) que cursa c) ALUNO (NOME) que ainda não cadastrou seu email d) PROFESSOR (NOME) e a exibição de seu salário aumentado em 25% e) DISCIPLINAS (DES) e seus PRE-REQUISITOS (DES) f) Quantidade (QTD) de PROFESSORES na ESCOLA (RAZÃO) g) PROFESSOR (NOME, SAL) que ganham mais de R$ 1.000,00, ordenado, de forma descendente, pelo atributo SAL h) PROFESSOR (NOME) e as DISCIPLINAS (DES) que leciona i)
ALUNOS (NOME) que NÃO estão cursando nenhuma disciplina
j) PROFESSORES (NOME) que lecionam DISCIPLINAS (DES) que contenham na sua descrição, a palavra “DADOS” k) ALUNOS (NOME, NASC) nascidos entre “01/01/75” e “31/12/80”
103
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL - Exercícios de SQL 2 – Área para respostas
104
Universidade Veiga de Almeida Instituto Superior PolitĂŠcnico Sistemas de Gerenciamento de Banco de Dados
CapĂtulo 5 Stored Procedures Triggers e Views
105
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Views - Visões Uma visão (VIEW) é uma forma alternativa de acessar os dados contidos em uma ou mais tabelas. Para definir uma visão, usa-se o comando SELECT que faz uma consulta sobre as tabelas. A visão aparece depois como se fosse uma tabela. Visões têm as seguintes vantagens: -
-
Pode restringir quais as colunas da tabela que podem ser acessadas (para leitura ou para modificação), o que é útil no caso de controle de acesso, como veremos mais tarde. Uma consulta SELECT que é usada muito freqüentemente pode ser criada como visão. Com isso, a cada vez que ela é necessária, basta selecionar dados da visão. Podem conter valores calculados ou valores de resumo, o que simplifica a operação. Pode ser usada para exportar dados para outras aplicações.
Criando uma visão com o Enterprise Manager Para criar uma visão com o Enterprise Manager, expanda um grupo de servidores, então o servidor em que está o banco de dados onde será criada a visão. Clique com o botão direito em Views. Aparece uma tela quase idêntica a do Query Designer.
Figura ?? Na janela superior (logo abaixo dos ícones, chamada de seção do diagrama, clique com o botão direito, e selecione Add Table. Na guia Tables (ou Views, caso você já tenha criado alguma visão e queira que ela faça parte desta que está sendo criada), selecione a tabela (ou visão) a ser adicionada, e então clique Add. Caso você queira remover
106
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
alguma tabela adicionada ao diagrama, clique na mesma com o botão direito e selecione Remove. Repita tantas vezes quantas forem as tabelas (ou visões) a serem adicionadas à nova visão. Clique em Close quando tiver escolhido todas as tabelas (ou visões) desejadas. Na caixa Column da seção da grade (parte da janela logo abaixo de onde estão as tabelas adicionadas), selecione as colunas a serem referenciadas na visão. Note que caso haja mais de uma tabela na seção do diagrama, quando você for selecionar a coluna na seção da grade, aparecerá o nome completo da coluna (tabela. coluna). Marque a caixa Output se a coluna deve ser mostrada no resultado da visão. Note que você também pode escolher as colunas que farão parte da visão, selecionando-as na representação gráfica da tabela, mas as colunas selecionadas dessa maneira farão parte da saída por padrão. Para que não apareçam na saída, desmarque a caixa Output. Para agrupar por alguma coluna, clique com o botão direito na coluna (na seção da grade) e selecione Group By. Na coluna Criteria, digite o critério especificando quais linhas retornar; isso determina a cláusula WHERE. Se GROUP BY for especificado, isso determina a cláusula HAVING. Na coluna Or... entre com qualquer critério adicional para especificar quais linhas a serem retornadas. Clique com o botão direito em qualquer lugar da seção da grade, e então selecione Properties. -
"Output all columns" mostrará todas as linhas da visão no resultado;
-
"DISTINCT values" filtra os valores duplicados no resultado;
-
"Encrypt view" criptografa a definição da visão;
-
Opcionalmente, em "Top", entre com o número de linhas a serem retornadas no resultado. Digite a palavra PERCENT depois do número para mostrar uma porcentagem das linhas, no resultado.
Clique com o botão direito em qualquer lugar da seção do diagrama; clique então em Run (para ver o resultado) ou Save (para salvar a visão). Note que na seção SQL, aparece o código SQL do SELECT envolvido na criação da visão. Criando uma visão com comandos SQL Para criar uma visão através de SQL, use o comando CREATE VIEW. Esse comando tem a seguinte sintaxe:
107
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
CREATE VIEW nome_visão [(coluna [,...n])] [WITH ENCRYPTION] AS declaração_SELECT [WITH CHECK OPTION]
nome_visão é o nome a ser dados à visão coluna é o nome a ser usado para uma coluna em uma visão. Nomear uma coluna em CREATE VIEW só é necessário quando uma coluna é obtida por uma expressão aritmética, uma função, ou uma constante, ou quando duas ou mais colunas poderiam ter o mesmo nome (freqüentemente por causa de uma junção), ou quando a coluna em uma visão recebe um nome diferente do nome da coluna da qual se originou. Os nomes de colunas também podem ser atribuídos no comando SELECT. Caso você queira nomear mais de uma coluna, entre com o nome de cada uma separado por vírgulas. WITH ENCRYPTION: criptografa as entradas na tabela syscomments que contém o texto do comando CREATE VIEW. WITH CHECK OPTION: força todas as modificações de dados executadas na visão a aderirem aos critérios definidos na declaração_SELECT. Quando uma coluna é modificada através de uma visão, WITH CHECK OPTION garante que os dados permaneçam visíveis através da visão depois que as modificações forem efetivadas. Vamos criar uma visão no banco de dados Exemplo, usando as tabelas 'Produto', 'Fornecedor' e 'ProdutoFornecedor'. Essa visão vai mostrar o nome do fornecedor e o nome do produto. Crie-a digitando o texto abaixo no Query Analyzer: create view VisaoFornecProduto as select f.Nome NomeFornecedor, p.Nome NomeProduto from Fornecedor f inner join ProdutoFornecedor pf on f.CodFornecedor = pf.CodFornecedor inner join Produto p on pf.CodProduto = p.CodProduto
Para criar uma visão você deve estar posicionado no banco de dados onde a visão será criada ou então especificá-lo através da cláusula USES. Ao criar uma visão, o texto do comando acima é armazenado na tabela syscomments. Agora, para testar, digite: select * from VisaoFornecProduto
O resultado terá as colunas 'NomeFornecedor' e 'NomeProduto', mostrando os dados relacionados entre elas. Você pode também criar uma visão que calcula valores usando colunas das tabelas, ou usando GROUP BY e funções agregadas, na declaração SELECT.
108
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Alterando ou excluindo uma visão Para alterar uma visão, você pode usar tanto o Enterprise Manager quanto o comando SQL, ALTER VIEW. Para alterá-la com o Enterprise Manager, selecione a visão que se quer alterar, clique na mesma com o botão direito e selecione Design View. Aparecerá a mesma janela vista na criação da visão com o Enterprise Manager, e aí você pode fazer as alterações que julgar necessárias à visão, salvar as alterações, executar a visão, etc.. Tudo da mesma forma que se você estivesse criando uma nova visão. O comando SQL ALTER VIEW tem a seguinte sintaxe: ALTER VIEW nome_visão [(coluna [,...n])] [WITH ENCRYPTION] AS declaração_select [WITH CHECK OPTION]
Todas as considerações feitas a respeito do comando CREATE VIEW se aplicam aqui. Caso você não se lembre do comando usado na criação da visão (o comando CREATE VIEW) , você pode obtê-lo usando o procedimento sp_helptext, da forma: sp_helptext VisaoFornecProduto
Este texto é consultado na tabela syscomments. Algumas linhas podem aparecer quebradas no resultado. É importante considerar que a alteração de uma visão não afeta os procedimentos armazenados ou gatilhos dependentes da mesma e não altera as permissões atribuídas à mesma Modificando dados através de uma visão Você pode executar um comando UPDATE em uma visão. Se ela foi baseada em uma única tabela, isso não provoca grandes problemas. Se a opção WITH CHECK OPTION acima for usada, as atualizações devem satisfazer as condições da cláusula WHERE usada na criação da visão. Inserções com INSERT também podem ser feitas. Se a visão é baseada em duas ou mais tabelas, a atualização só é possível se o comando altera dados de apenas uma tabela. Colunas calculadas não podem ser alteradas. Se foram usadas funções de agregação, também não é possível modificar os dados através da visão. Na inserção, se uma coluna de uma tabela subjacente não permite nulos (NOT NULL), não é possível inserir linhas na visão, pois isso deixaria a coluna sem valor.
109
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Stored Procedure - Procedimentos Armazenados Um procedimento armazenado (STORED PROCEDURE) é um conjunto de comandos SQL que são compilados e armazenados no servidor que podem ser chamados a partir de um comando SQL qualquer. Em versões anteriores do SQL Server, os procedimentos armazenados eram uma maneira de pré-compilar parcialmente um plano de execução. Quando da criação do procedimento armazenado, um plano de execução parcialmente compilado era armazenado em uma tabela de sistema. A execução de um procedimento armazenado era mais eficiente do que a execução de um comando SQL, porque o SQL Server não precisava compilar um plano de execução completamente, apenas tinha que terminar a otimização do plano armazenado para o procedimento. Além disso, o plano de execução completamente compilado para o procedimento armazenado era mantido na cache de procedimentos do SQL Server, significando que execuções posteriores do procedimento armazenado poderiam usar o plano de execução pré compilado. A versão 7.0 do SQL Server apresenta várias mudanças no processamento de comandos que estendem muitos dos benefícios de desempenho dos procedimentos armazenados para todos os comandos SQL. O SQL Server 7.0 não salva um plano parcialmente compilado para os procedimentos quando os mesmos são criados. Um procedimento armazenado é compilado em tempo de execução como qualquer outro comando Transact-SQL. O SQL Server 7.0 mantém planos de execução para todos os comandos SQL na cache de procedimentos, não apenas planos de execução de procedimentos armazenados. Ele então usa um algoritmo eficiente para comparação de novos comandos Transact-SQL com os comandos TransactSQL de planos de execução existentes. Se o SQL Server 7.0 determinar que um novo comando Transact-SQL é o mesmo que um comando Transact-SQL de um plano de execução existente, ele reutiliza o plano. Isso reduz o ganho relativo de desempenho, na pré compilação de procedimentos armazenados, já que estende a reutilização de planos de execução para todos os comandos SQL. A vantagem de usar procedimentos armazenados encapsular rotinas de uso freqüente no próprio disponíveis para todas as aplicações. Parte da lógica armazenada no próprio banco de dados, em vez de vezes em cada aplicação.
é que eles podem servidor, e estarão do sistema pode ser ser codificada várias
Criando procedimentos armazenados Para criar um procedimento, use o comando CREATE PROCEDURE. Por exemplo, o procedimento abaixo recebe um parâmetro (@nome) e mostra todos os clientes cujo nome contenha o nome informado:
110
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
create procedure BuscaCliente @nomeBusca varchar(50) as select CodCliente, Nome from Cliente where Nome like '%' + @nomeBusca + '%'
Note que os parâmetros são sempre declarados com @, logo após o nome do procedimento. Um procedimento pode ter zero ou mais parâmetros. Declara-se o nome do procedimento, e a seguir o tipo de dados do parâmetro. Nota: ao invés de CREATE PROCEDURE, pode-se utilizar CREATE PROC, com o mesmo efeito. Dentro do procedimento pode haver vários comandos SELECT e o resultado desses comandos será o resultado do procedimento. O corpo do procedimento começa com a palavra AS e vai até o final do procedimento. Não se pode usar os comandos SET SHOWPLAN_TEXT, e SET SHOWPLAN_ALL dentro de um procedimento armazenado, pois os mesmos devem ser os únicos comandos de um lote (BATCH). Dentro de um procedimento, nomes de objetos usados em alguns comandos devem ser qualificados com o nome do proprietário do objeto, se outros usuários utilizarão o procedimento armazenado. Os comandos são: ALTER TABLE DROP TABLE TRUNCATE TABLE Todos os comandos
CREATE INDEX DROP INDEX UPDATE STATISTICS DBCC
Executando procedimentos armazenados Para executar um procedimento, utiliza-se o comando EXEC (ou EXECUTE). A palavra "EXEC" pode ser omitida se a chamada de procedimento for o primeiro comando em um script ou vier logo após um marcador de fim de lote (a palavra "GO"). Por exemplo, execute o procedimento anterior da seguinte forma: BuscaCliente 'an'
O resultado será as linhas da tabela Cliente onde o valor de Nome contém 'an' (se existirem tais linhas). Ao executar um procedimento, você pode informar explicitamente o nome de cada parâmetro, por exemplo: BuscaCliente @nomeBusca = 'an'
Isso permite passar os parâmetros (se mais de um) fora da ordem em que eles foram definidos no procedimento.
111
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
EXEC também pode executar um procedimento em outro servidor. Para isso, a sintaxe básica é: EXEC nome_servidor.nome_banco_de_dados..nome_procedimento
Comandos para uso em procedimentos armazenados Você pode declarar uma variável em um procedimento e usá-la para guardar valores. Por exemplo, exclua o procedimento anterior e crie-o novamente como abaixo: drop procedure BuscaCliente go create procedure BuscaCliente @nomeBusca varchar(50) as declare @contagem int, @mensagem char(100) select CodCliente, Nome from Cliente where Nome like '%' + @nomeBusca + '%'
conta quantas linhas foram encontradas select @contagem = count(*) from Cliente where Nome like '%' + @nomeBusca + '%' if @contagem = 0 begin select @mensagem = 'Nenhum cliente contém "'+@nomeBusca+'"' print @mensagem print "" end O comando DECLARE declara variáveis, que são sempre introduzidas pelo caractere @. No caso, @contagem é uma variável do tipo int e @mensagem do tipo char(100). Note que quando você usa um comando SELECT, o resultado pode ser colocado numa variável, como @contagem acima. Esse resultado não aparece no resultado do SELECT. Essa é também a única forma de alterar uma variável (você não pode escrever '@variável = valor' diretamente). O comando IF verifica uma condição e executa um comando caso a condição seja verdadeira. Se acompanhado da cláusula ELSE, executa um outro comando caso a condição seja falsa. O comando PRINT usado acima é geralmente usado para mostrar mensagens, que aparecem quando você chama o procedimento interativamente. Os comandos BEGIN e END são usados para delimitar uma lista de comandos, que passa a ser tratada como um comando único. No caso acima, eles são necessários para poder executar três comandos dentro do IF (o SELECT e os dois PRINT).
112
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Criando procedimentos armazenados com o Enterprise Manager
Também é possível a criação de procedimentos armazenados através do Enterprise Manger. Para isso, deve-se expandir um grupo de servidores, um servidor, e o banco de dados onde o procedimento armazenado será criado. Clique então com o botão direito em Stored Procedures, e selecione New Stored Procedure. Aparece uma tela como abaixo Nessa tela você deve dar o nome que desejar ao procedimento, substituindo o texto em preto [PROCEDURE NAME] pelo nome que você quer dar ao procedimento armazenado sendo criado. Logo depois do AS, você deve entrar com o código do procedimento armazenado, conforme descrito acima. Você pode após entrar com o código desejado, clicar no botão Check Syntax, que verificará se há erros de sintaxe nas declarações SQL. Quando tiver terminado de entrar com o código do procedimento, basta clicar em OK que o mesmo será criado. Triggers - Gatilhos Um gatilho (TRIGGER) é um tipo de procedimento armazenado, que é executado automaticamente quando ocorre algum tipo de alteração em uma tabela. Gatilhos "disparam" quando ocorre uma operação INSERT, UPDATE ou DELETE sobre um determinada tabela.
113
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Geralmente gatilhos são usados para reforçar restrições de integridade que não podem ser tratadas pelos recursos mais simples, como regras, DEFAULTS, restrições, a opção NOT NULL etc. Deve-se usar DEFAULTS e restrições quando eles fornecem toda a funcionalidade necessária. Um gatilho também pode ser usado para calcular e armazenar valores automaticamente em outra tabela, como veremos a seguir. Exemplo de gatilhos Para utilizar gatilhos, vamos criar antes algumas tabelas que serão usadas como exemplo. A tabela "NotaFiscal" conterá os cabeçalhos de notas fiscais. A tabela "ItemNotaFiscal" irá conter itens de nota fiscal relacionados com as notas fiscais. Execute o script abaixo para criar as tabelas: create table NotaFiscal (NumeroNota numeric(10) primary key, ValorTotal numeric(10,2) default (0) ) GO create table ItemNotaFiscal (NumeroNota numeric(10) foreign key references NotaFiscal, CodProduto int foreign key references Produto, Quantidade int not null check (Quantidade > 0), primary key (NumeroNota,CodProduto) )
Vamos usar gatilhos para duas finalidades: primeiro, quando for excluída uma nota fiscal, todos os seus itens serão excluídos automaticamente. Depois, quando for incluído um item, a coluna 'ValorTotal' será atualizada, na tabela 'NotaFiscal'. Criando gatilhos Gatilhos são sempre criados vinculados a uma determinada tabela. Se a tabela for excluída, todos os gatilhos dela são excluídos como conseqüência. Ao criar um gatilho, você pode especificar qual(is) a(s) operação(ões) em que ele será acionado: INSERT, UPDATE ou DELETE. Gatilhos para inserção Quando é feita a inclusão de uma ou mais linhas na tabela, o SQL Server cria uma tabela virtual chamada inserted, que contém as linhas que serão incluídas (mas ainda não foram). Essa tabela tem a mesma estrutura da tabela principal e pode-se consultar dados nessa tabela com o comando SELECT, da mesma forma que uma tabela normal.
114
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Vamos criar um gatilho, chamado InclusaoItemNota, que será ativado por uma operação INSERT na tabela ItemNotaFiscal. Primeiro ele vai verificar se os valores sendo inseridos possuem uma NotaFiscal relacionada ou não. Para isso, digite o seguinte comando: create trigger InclusaoItemNota on ItemNotaFiscal for insert as if not exists ( select * from inserted, NotaFiscal where inserted.NumeroNota = NotaFiscal.NumeroNota) raiserror('Esse item não contém um número de nota válido') update NotaFiscal set ValorTotal = ValorTotal + (select i.Quantidade * p.Preço from Produto p, inserted i where p.CodProduto = i.CodProduto) where NumeroNota = (select NumeroNota from inserted)
Primeiro o gatilho usa as tabelas inserted e NotaFiscal para consultar se existe o valor de NumeroNota na tabela. Caso não exista, o comando RAISERROR gera um erro de execução, com uma mensagem que será retornada para a aplicação. Esse comando efetivamente cancela o comando INSERT que estiver sendo executado. Depois verifica a quantidade que está sendo inserida (inserted.Quantidade) e multiplica pelo preço do produto (Produto.Preço). Esse preço é obtido na tabela de produtos, usando como valor de pesquisa o código do produto inserido (inserted.CodProduto). Ele atualiza a nota fiscal relacionada com o item que está sendo inserido (para isso verifica where NumeroNota=(select NumeroNota from inserted)). Gatilhos para exclusão Na exclusão, as linhas da tabela são removidas e colocadas na tabela virtual deleted, que tem a mesma estrutura da tabela principal. Um gatilho para exclusão pode consultar deleted para saber quais as linhas excluídas. Vamos criar um gatilho, na tabela NotaFiscal para, quando a nota fiscal for excluída, todos os seus itens de nota relacionados, na tabela ItemNotaFiscal, sejam excluídos em cascata. Execute o seguinte: create trigger ExclusaoNota on NotaFiscal for delete as -- excluir todos os itens relacionados -- (mesmo NumeroNota que deleted) delete from ItemNotaFiscal where NumeroNota in (select NumeroNota from deleted)
115
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Gatilhos para atualização As tabelas inserted e deleted, como já vimos, são tabelas virtuais que podem ser usadas dentro de um gatilho. A primeira contém os dados que estão sendo inseridos na tabela real e a segunda contém os dados antigos, que estão sendo incluídos. Num gatilho de atualização (FOR UPDATE), essas duas tabelas também estão disponíveis. No caso, deleted permite acessar os dados como eram antes da modificação e inserted permite acessar os dados depois da atualização. Podemos então considerar uma atualização como uma exclusão seguida de uma inserção (excluem-se valores antigos e inserem-se valores novos). Por exemplo, ao mudar a Quantidade em um ItemNotaFiscal, o total da nota deve ser recalculado. Para isso, é preciso levar em conta a diferença entre a quantidade antiga (deleted.Quantidade) e a nova (inserted.Quantidade). Vamos criar um gatilho em ItemNotaFiscal que faz isso: create trigger AlteracaoItemNota on ItemNotaFiscal for update as if update(Quantidade) or update(CodProduto) begin update NotaFiscal set ValorTotal = ValorTotal + (select p.Preço * (i.Quantidade - d.Quantidade) from Produto p inner join inserted i on p.CodProduto = i.CodProduto inner join deleted d on i.CodProduto = d.CodProduto and i.NumeroNota = d.NumeroNota) end
Note acima o uso de 'if update(nome_da_coluna)'. Dentro de um gatilho de atualização, isso permite descobrir se a coluna está sendo alterada ou não. Isso para evitar trabalho desnecessário se não estiver sendo modificada uma dessas colunas. Criando gatilhos para múltiplas ações Um gatilho pode ser criado para uma tabela para múltiplas operações nessa tabela. Por exemplo, para criar um gatilho usado em INSERT, UPDATE e DELETE, usa-se uma sintaxe, como: create trigger nome_do_gatilho on nome_da_tabela for INSERT, UPDATE, DELETE as texto_do_gatilho
Outros comandos
116
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Em gatilhos, assim como em procedimentos armazenados, é possível declarar variáveis e usar comandos como IF, BEGIN..END etc. Alguns comandos não são permitidos dentro de um gatilho. Estes são: ALTER DATABASE ALTER TRIGGER CREATE DEFAULT CREATE RULE CREATE TRIGGER DISK INIT DROP DEFAULT DROP RULE DROP VIEW LOAD LOG REVOKE UPDATE STATISTICS
ALTER PROCEDURE ALTER TABLE ALTER VIEW CREATE DATABASE CREATE INDEX CREATE PROCEDURE CREATE SCHEMA CREATE TABLE CREATE VIEW DENY DISK RESIZE DROP DATABASE DROP INDEX DROP PROCEDURE DROP TABLE DROP TRIGGER GRANT LOAD DATABASE RESTORE DATABASE RESTORE LOG RECONFIGURE TRUNCATE TABLE
117
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Capítulo 6 Criação de um Banco de Dados ORACLE SQL SERVER ACCESS
118
Universidade Veiga de Almeida Instituto Superior PolitĂŠcnico Sistemas de Gerenciamento de Banco de Dados
Oracle SQL SERVER Access
119
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Trabalhos
Trabalhos - Acompanhamento de Processos - Solicitação de Serviços - Sistema de Estoque
120
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados Mini-mundo do Sistema de Acompanhamento de Processos Elabore o ERA e a Derivação das tabelas O departamento jurídico da empresa DataVenia está sendo informatizado. Verificou-se então a necessidade de controlar e acompanhar o andamento dos processos sob responsabilidade deste departamento. As informações básicas de um PROCESSO, extraídas da ficha ACOMPANHAMENTO DE PROCESSOS, são as seguintes: número do processo, se a DataVenia é Ré ou Autora (R ou A), nome da comarca, nome da vara de execução, código do tipo da ação, uf da filial (onde o processo ocorre), número do processo de origem, status do andamento, valor estimado, data início e data fim. A empresa DataVenia pode ser acionada ou estar acionando uma pessoa física/jurídica, que são chamadas de PARTE. As PARTES possuem as seguintes informações: código, nome, endereço, telefone, física/jurídica (F ou J), email. Na parte de trás da ficha, reservada para anotações de acompanhamento do processo, constam as seguintes informações: data do acompanhamento, que é uma anotação do fato ocorrido ou compromisso futuro, uma breve observação e a data de alerta, quando for o caso, para que toda a documentação possa ser preparada para o dia agendado (compromisso futuro). Em cada filial da empresa, são registradas as seguintes informações: sigla da uf, nome do gerente, telefone e email. Cada Tipo de Ação possui as seguintes informações: código do tipo da ação e descrição. Observações: a) somente são cadastradas informações necessárias; b) um PROCESSO pode ter várias PARTES envolvidas e a PARTE pode se envolver em vários processos; c) os status possíveis de um PROCESSO são fixos e nunca mudarão cujos códigos previstos são os seguinte códigos: AP-Arquivado e Procedente, AI-Arquivado e Improcedente, AA-Arquivado com Acordo, EAEm andamento, AC-Ação cancelada d) os TIPOS DE AÇÃO serão determinados e cadastrados pelos usuários; São requisitos de informação: a) b) c) d) e)
Partes envolvidas em quais processos; Acompanhamentos de um processo; Valor total estimado por UF; processos por tipo de ação; filiais com mais processos AP onde somos autores (A/R igual a A);
121
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados Mini-mundo do Sistema de Solicitações de Serviços Elabore o ERA e a Derivação das tabelas A empresa de consultoria CPEDE EUFAÇO, é responsável pelo desenvolvimento e manutenção de sistemas e o controle de todo o hardware de vários clientes. Os clientes são vistos como “usuários emissor”. Com o crescimento da quantidade de solicitações para estes serviços, estava sendo necessária a criação de um sistema que controlasse tais pedidos. As informações básicas de uma SOLICITAÇÃO, extraídas do formulário que atualmente é utilizado, são as seguintes: número da solicitação, data e hora de emissão, código do serviço solicitado, especificação do serviço, sistema ao qual a solicitação está associada, data e hora da recepção da solicitação, usuário emissor, usuário receptor, usuário que executará o serviço, data e hora do inicio do serviço, data e hora do final do serviço, solução dada à solicitação, algum tipo de observação, tempo utilizado para a conclusão do serviço e os STATUS, situações nas quais a solicitação pode ser encontrada. Os possíveis STATUS (situações) que as solicitações podem se encontar são os seguintes: N – Não foi recepcionada pela empresa (como um eMail não lido); R – Recepcionada pela empresa (usuário receptor) ; A – Alocada a um profissional (usuário executor); E – Encerrada pelo profissional, o trabalho foi totalmente executado; P - Encerrada pelo profissional, o trabalho foi parcialmente executado; C – O usuário solicitante cancelou a solicitação; F – O usuário solicitante concordou que tudo o que foi solicitado foi executado. Periodicamente, são gerados relatórios ou consultas exibidas no terminal. Observações: a) somente são cadastradas informações necessárias; b) uma SOLICITAÇÃO está alocada a somente um SISTEMA; c) uma SOLICITAÇÃO normalmente é emitida, recebida e executada por usuários distintos e eventualmente recebida e executada pelos mesmos usuários ; d) os USUÁRIOS, os SISTEMAS, os TIPOS DE SERVIÇO e TIPOS DE STATUS, são criados e mantidos por funcionários da empresa CPEDE EUFAÇO e) Solicitações anteriores a três anos e com a situação F, podem ser copiadas para uma tabela de expurgo e devem ser eliminadas. São requisitos de informação: a) Nome do Executor e as solicitações em aberto, por executor; b) Nome do Sistema e a quantidade de solicitações em aberto, por Sistema; c) Nome do Executor e quantidade de solicitações em aberto, por Executor; d) Nome do Executor, a quantidade de solicitações encerradas e o tempo total consumido, por Executor; e) Expurgar solicitações Canceladas, Fechadas ou Pendentes com três anos, ou mais, de conclusão;
122
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados Mini-mundo do Sistema de Estoque Elabore o ERA e a Derivação das tabelas A empresa de CPRICIZA EUTIDÔ, deseja controlar as requisições de materiais feitas pelos seus diversos departamentos, por intermédio de um sistema informatizado permitindo aos usuários fazerem suas solicitação diretamente nas estações de trabalho. Foi elaborado um estudo, baseado em reuniões com o Departamento de Informática e deste trabalho, resultou a seguinte lista de premissas: -
-
-
Deverão ser criadas CATEGORIAS e SUBCATEGORIAS, ambas contendo código e descrição. É nas SUBCATEGORIAS que serão enquadrados os MATERIAIS; Foi criada uma padronização para os tipos de UNIDADE DE ARMAZENAGEM com código, descrição e sigla. Por exemplo: 001 - RESMA DE PAPEL XEROX – RES; Cada MATERIAL possui as seguintes características: código, descrição, estoque mínimo, ponto de compra, saldo atual e valor unitário; As REQUISIÇÕES serão vinculadas aos DEPARTAMENTOS, código e descrição; Uma REQUISIÇÃO, pertence a um DEPARTAMENTO, possui um número, data de emissão e data de atendimento; Cada REQUISIÇÃO pede no mínimo um ITEM, com a quantidade solicitada; Os item solicitados estão associados a MATERIAIS preexistentes no sistema, ou seja, o usuário não solicita materiais que NÃO estejam cadastrados; Para efetivar a baixa do estoque, cada item solicitado e atendido, gera uma MOVIMENTAÇÃO com a quantidade atendida, que pode ser diferente da quantidade solicitada e a data na qual foi efetivado o atendimento. Existem ITENS que podem não ser atendidos; Cada MOVIMENTO possui um TIPO DE MOVIMENTO, padronizado e cadastrado previamente com código e descrição. Por exemplo: 01-Entrada, 02-Saída, 03-Acerto a mais, 04-Acerto a menos etc... Cada MOVIMENTO, pode ter uma JUSTIFICATIVA, pois a quantidade atendida, pode estar completamente fora dos padrões e isto deve ser descrito e armazenado, para futuras auditorias.
Serão necessários, inicialmente, os seguintes relatórios: a) Lista de REQUISIÇÕES não atendidas e seus ITENS, para que o funcionário do setor possa efetuar o atendimento; b) Relatório contendo a quantidade de MATERIAIS movimentados, por DEPARTAMENTO; c) Relatório com os MATERIAS que precisam ser repostos. Este materiais são identificados quando o saldo atual fica menor ou igual ao ponto de compra; d) MATERIAIS que estão abaixo do estoque mínimo; e) DEPARTAMENTOS, a quantidade de itens consumidos e a soma de suas quantidades em um determinado período de atendimento
123
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Bibliografia recomendada
DATE, C. J., Introdução a Sistema de Bancos de Dados, Tradução da 7ª
edição americana, Editora Campus, 2000 ELMASRI, R. e NEVATHE S.B., Fundamentals of Database System, LTC 2000
SILBERSCHATZ, A., KORTH, H. F. e SUDARSHAN, S., Sistemas de
Bancos de Dados, Editora Makron Books, 1999 HEUSER, C.A, Projeto de Banco de Dados, Sagra Luzatto, 1998 MELO, Rubens N., Bancos de Dados em Aplicações Cliente/Servidor, IBPI, Infobook, 1997 KROENKE, D.M, Bancos de Dados: Fundamentos, Projetos e Implementação, 6ª edição, Editora LTC – 1999 DATE, C. J., Guia para o padrão SQL, Editora Campus, 1999 RAMALHO, J.A., SQL: A Linguagem dos Bancos de Dados, Editora Berkeley, 1999 ERWin – Logic Works – Platinum Technology Microsoft SQL Server – Books On Line Bibliografia complementar
BARBIERI, Carlos – Modelagem e Administração de Dados – Ed. Infobook, 1994 COOD, E.F.; The Relational Model for Databases Systems,. AddisonWesley FURTADO, Antonio Luiz; Organização de Bases de Dados, Campus, 1993 HACKATHORN, Richard D.; Conectividade de Banco de Dados, Infobook, 1993 MACHADO, Felipe Nery Rodrigues, Projeto de Banco de Dados, Érica, 1998 SETZEK, Valdemar Waingort; Banco de Dados, E. Blücher, 1989 ORFALI, HARKEY, D. & Edwards J.;The Essential Client/Server Survival Guide, Wiley Computer Publishing, 1996 RAMAKRISHNAN, R.;Database Managemente Systems, McGraw-Hill, 1998 MELO, Rubens N.;Bancos de Dados em Aplicações Cliente/Servidor O’NEIL, P. e O’NEIL, E., Database: Principles, Programming and Performance, Editora Morgen Kaufmann Publishers, 2ª Edição, 2000 INMON, W.H.;Como Construir o Data Warehouse, Campus., 1997 System Architect, Data Architetch – Popkin Software & Systems Inc.
124
Universidade Veiga de Almeida Instituto Superior PolitĂŠcnico Sistemas de Gerenciamento de Banco de Dados
Respostas -
Mini mundos Engenharia Reversa ExercĂcios de SQL Trabalhos
125
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Resposta do Mini mundo 1 preço
data COMPRA
(0,n)
(0,n)
nome
endereço bairro
CPF IMÓVEL
(1,1)
PROPRIETÁRIO
endereço
descrição Preço mínimo (0,1)
(0,n)
(0,n)
VENDA
Telefone (0,1)
Data
Preço
Resposta do Mini mundo 2 (0,n)
DEFEITUOSO
série
(0,1)
data
nome endereço
modelo
TROCA
APARELHO
CLIENTE
marca (0,1) SUBSTITUTO
(0,1)
defeito
(0,n)
COMPRA
Data
126
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Resposta do Mini mundo 3
número
nome
assentos (4,10)
GRAÇOM
RESPONSABILIDADE
avaliação (1,n)
(1,1)
MESA
data (1,n)
ATENDIMENTO (1,n)
hora_ini
hora_fim número nome preço
PRATO
Resposta do Mini mundo 4 matricula EMPREGADO (T,S)
ENFERMEIRA
MÉDICO
(0,n)
(0,n)
ATENDIMENTO
especialidade
cargo
(1,3)
RESPONSABILIDADE VÍNCULO (1,n)
(0,n)
seguro social
nome PESSOA
nascimento
(1,n)
inicio INTERNAÇÃO
fim (1,1)
endereço
código
(1,n)
HOSPITAL
nome
127
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Resposta do Mini mundo 5 (vale um ponto)
código CLIENTE
nome (1,n)
dt/h saldo DETEM
código (1,n)
desc
AÇÃO
(0,n) EMITE (1,1)
ORDEM DE VENDA
preço
qtd
(1,n)
NEGOCIA
qtd
seq
lote
(1,n)
CORRETORA
CGC nome
128
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Resposta do Mini mundo 6 CGC nome endereço
codigo descrição
REMÉDIOS
HOSPITAL
(1,n)
(0,n)
telefone (1,3)
ATENDIMENTO
(0,n)
nome
codigo ESPECIALISTA
(1,n)
(1,n)
h_inicio
(1,n)
MÉDICO
CONSULTA
data
email telefone celular bip (1,3)
ESPECIALIDADE
codigo
RECEITUÁRIO
(1,4)
status
inicio
pa
h_fim (1,n)
endereço
codigo CLIENTE
CPF nome
descricao
Resposta do Mini mundo 7
cpf/cgc nome email
COMPRADOR
qtd
(1,n)
data
COMPRA É composta (1,n)
(0,n) COMPOSIÇÃO
codigo
PEÇA
saldo (0,n) É componente
(1,n)
status
minimo
POSSUI (1,1)
VALORES
data
preço
129
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Resposta do Mini mundo 8
agrupa
numero
(0,n)
CONTA CONTÁBIL
AGRUPAMENTO
descrição
(1,1) (1,n)
agrupada
POSUI
seq
(1,1)
codigo
data (1,1)
MOVIMENTO
(1,n)
VINCULADO
CENTRO DE CUSTO
valor
descrição
Resposta do Mini mundo 9 codigo descricao ramal (1,4)
DEPARTAMENTO (1,1)
(1,n)
matricula
CHEFIA
ALOCA
nome
(1,1)
(0,1) FUNCIONÁRIO
telefone
(P,E)
(1,3)
ADMINISTRAÇÃO
INVESTIMENTOS
(1,n)
bonus
FAZ
FÁBRICA (1,n)
data fim
MANIPULA
(1,1)
(1,n)
data HORA EXTRA
inicio
(0,n)
fim
ini
MATERIAL TÓXICO
IT
codigo descrição
TME
130
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Resposta do Mini mundo 10
codigo nome email
APOSTADOR
(1,n)
(1,1)
Aposta
numero pontos valida
CARTELA (1,64)
palpite2 palpite2 pontos
PALPITE mandante (1,n)
(3,7)
numero nome imagem
TIME
(2,2)
Participa
numero gols_1 gols_2
JOGO
(3,7)
mandatário
conferido
Resposta do Mini mundo 11 COD_GRA
URL_GRA
NOM_GRA
GRAVADORA
(1,n)
COD_CD NOM_CD
PRODUZ
(1,1)
PRE_CD END_GRA
CON_GRA
CD
IND_CD
COD_CAT
(1,1)
CATEGORIZA
LAN_CD
(1,n)
FAIXA
(0,n)
CATEGORIA
MAP_CAT
MEP_CAT
NUM_FAX
(1,n)
MUSICA
COD_MUS NOM_MUS DUR_MUS
(1,n)
CRIA (1,n)
AUTOR
COD_AUT NOM_AUT
131
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Respostas do exercício de Engenharia Reversa Normalização 8 cod_vend nome_vend
cod_cli nome_cli
(1,n)
Cliente cgc_cli
Pedido
(1,n)
Vendedor
ie_cli (1,n)
Possui
cod_prod
qtd_prod
desc_prod
(1,1) (1,1)
Item
Fi
(1,n)
Possui
Produto
unid prod
44
vu prod
Normalização 9 cod
nome
cod
desc
tel (1,n) (1,1)
Aluno
Compõe
(1,n)
Turma
(1,n)
nasc Aluno Disciplina (1,n)
Disciplina cod
desc
Normalização 10 mat
nom
Titular
cod
des
tel (1,n) (1,1)
Tem
(1,n)
Plano
(1,n)
cod
des
(1,1)
Dependente
seq
(1,1)
define
(1,n)
Grau
nom
132
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Normalização 11 mat nom
cod des
tel (1,n) (1,1)
Cliente
Pertence
(1,n)
Classe
(1,n)
cod des
(1,1) (1,1)
Contas num
(1,n)
Possui
Banco
saldo
Normalização 12 SIG_DEP
DES_DEP
DEPARTAMENTO (1,n)
(1,1)
FUNCIONÁRIO
MAT_FUN
COMP_FOL
(1,n)
VALOR_FOL
FOLHA
(1,n)
COD_PD
DES_PD
PD
NOM_FUN
133
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL - Respostas do Exercício 1 1)
DEPARTAMENTO ( COD_D, DES_D ) FUNCIONARIO ( COD_F, NOM_F, SAL_F, COD_D ) PROJETO ( COD_P, DES_P ) TRABALHA ( COD_F, COD_P, CH )
2) a) SELECT F.NOM_F, T.COD_P FROM Funcionario F, Trabalha T WHERE F.COD_F = P.COD_F ORDER BY F.COD_F b) SELECT D.COD_D, F.NOM_F FROM Departamento D, Funcionario F WHERE D.COD_D = F.COD_D ORDER BY D.COD_D c) SELECT F.NOM_F, COUNT(T.COD_P) AS QTD FROM Funcionario F, Trabalha T WHERE F.COD_F = T.COD_F GROUP BY F.NOM_F d) SELECT F.COD_F, F.NOM_F, SUM(T.CH) AS HORAS FROM Funcionario F, Trabalha T WHERE F.COD_F = T.COD_F GROUP BY F.COD_F, F.NOM_F HAVING SUM(T.CH) >= 50 e) SELECT D.COD_D, D.DES_D, SUM(F.SAL_F) AS CUSTO FROM Departamento D, Funcionario F WHERE D.COD_D = F.COD_D GROUP BY D.COD_D, D.DES_D HAVING SUM(F.SAL_F) >= 5000 f) SELECT F.COD_F, F.NOM_F, F.SAL_F FROM Funcionario F WHERE F.SAL_F BETWEEN 200 AND 1000 g) SELECT D.COD_D, D.DES_D FROM Departamento D WHERE EXISTS (SELECT COUNT(F.COD_F) FROM Funcionario F WHERE F.COD_D = D.COD_D GROUP BY F.COD_D HAVING COUNT(F.COD_F) >= 3) h) SELECT F.COD_F, F.NOM_F FROM Funcionario F WHERE F.NOM_F LIKE 'JOAO%' i) SELECT F.NOM_F, F.SAL_F, F.SAL_F * 1.23 AS AUMENTO FROM Funcionario F j) SELECT D.COD_D, D.DES_D FROM Departamento AS D WHERE NOT EXISTS (SELECT * FROM Funcionario F WHERE F.COD_D = D.COD_D) OU SELECT D.COD_D, D.DES_D FROM Departamento D WHERE D.COD_D NOT IN (SELECT DISTINCT F.COD_D FROM Funcionario F)
134
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
SQL - Respostas do Exercício 2 1)
ESCOLA ( CGC, RAZÃO ) PROFESSOR ( MAT, NOM, SAL, CGC ) DISCIPLINAS ( COD, DES ) ALUNO ( MAT, NOME, EMAIL, NASC ) CURSA ( MAT, COD ) LECIONA ( MAT, COD ) PRE-REQ ( COD, COD_R )
2) a) SELECT FROM WHERE b) SELECT FROM WHERE AND c) SELECT FROM WHERE d) SELECT FROM e) SELECT FROM WHERE AND f) SELECT FROM WHERE GROUP g) SELECT FROM WHERE ORDER h) SELECT FROM WHERE AND i) SELECT FROM WHERE j) SELECT FROM WHERE AND AND k) SELECT FROM WHERE
E.CGC, E.RAZAO, P.NOM Escola E, Professor P E.CGC = P.CGC A.NOME, D.DES Aluno A, Disciplinas D , Cursa C A.MAT = C.MAT C.COD = D.COD A.NOM Aluno A A.EMAIL IS NULL P.NOME, P.SAL * 1.25 Professor P D1.DES, D2.DES Disciplinas D1, Pre-Req P, Disciplinas D2 D1.COD = P.COD P.COD_R = D2.COD E.RAZÃO, COUNT(P.MAT) AS QTD_PROF Professor P, Escola E E.CGC = P.CGC BY E.RAZAO P.NOME Professor P SAL > 1000 BY SAL DESCENDING P.NOME, D.DES Professor P, Leciona L, Disciplina D P.MAT = L.MAT L.COD = D.COD A.NOME Aluno A, Cursa C NOT EXISTS (SELECT * FROM Cursa C WHERE A.MAT = C.MAT ) P.NOME, D.DES Professor P, Leciona L, Disciplina D P.MAT = L.MAT L.COD = D.COD D.DES LIKE “%DADOS%” A.NOME, A.NASC Aluno A A.NASC BETWEEN “01/01/75” AND “31/12/80”
135
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Trabalho – Acompanhamento de Processos Modelo Conceitual
codigo nome endereço telefone F/J eMail
PARTE
codigo
(1,n)
descricao
ACIONA originado
(1,1)
(1,1) MOTIVA
POSSUI
número comarca vara
PROCESSO
(1,n)
TIPO ACAO
(1,1)
A/R status
sigla (1,1)
(1,n) origina
POSSUI
POSSUI (1,1)
telefone gerente
(0,n) (1,n)
FILIAL
data_acomp data_alerta
ACOMPANHAMENTO
observação
Modelo Lógico PROCESSO ( número, comarca, vara, ar, status, tipoacao, siglauf, motivador ) FILIAL ( sigla, descricao, gerente, email ) TIPOACAO ( codigo, descricao ) PARTE ( codigo, nome, endereco, telefone, fj, email ) ACOMPANHAMENTO ( processo.numero, data_acomp, data_alerta, observação ) PARTE_PROCESSO ( processo.numero, parte.codigo )
136
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
- Criação do DATABASE CREATE DATABASE Processo ON PRIMARY (NAME=Processo_data, FILENAME='c:\mssql7\data\processo.mdf', SIZE=10MB, MAXSIZE=15MB, FILEGROUTH=25%) LOG ON (NAME=Teste_log, FILENAME='c:\mssql7\data\processo.ldf', SIZE=4MB, MAXSIZE=6MB, FILEGROUTH=2MB)
- Criação das TABELAS (juntamente com os CONSTRAINTS) CREATE TABLE Gerencia ( Uf nvarchar (2) not null CONSTRAINT PK_Gerencia PRIMARY KEY NONCLUSTERED, Gerente nvarchar (40) null, Telefone nvarchar (20) null, Email nvarchar (50) null) ON PRIMARY CREATE TABLE Parte ( Parte int not null CONSTRAINT PK_Parte PRIMARY KEY NONCLUSTERED, Nome nvarchar (60) null ) ON PRIMARY CREATE TABLE TipoAcao ( Tipo int not null CONSTRAINT PK_TipoAcao PRIMARY KEY NONCLUSTERED, Descricao nvarchar (80) null ) ON PRIMARY CREATE TABLE Processo ( Processo int not null CONSTRAINT PK_Processo PRIMARY KEY NONCLUSTERED, Comarca nvarchar (30) null, Telefone nvarchar (20) null, TipoAcao int not null CONSTRAINT FK_Processo_TipoAcao FOREIGN KEY REFERENCES TipoAcao (intTipo), Valor money null, Objeto nvarchar (100) null, Uf nvarchar (2) not null CONSTRAINT FK_Processo_Uf FOREIGN KEY REFERENCES Gerencia (intUf), Status nvarchar (2) null, ProcessOrigem int null, DataInicio smalldatetime null, DataFim smalldatetime null, Observacao nvarchar (100) null ) ON PRIMARY CREATE TABLE Acompanhamento ( Processo int not null CONSTRAINT FK_Acompanhamento_Processo FOREIGN KEY REFERENCES Processo (Processo), DataAgenda smalldatetime not null CONSTRAINT PK_Acompanhamento PRIMARY KEY NONCLUSTERED (Processo, DataAgenda), AlertarEm smalldatetime null, Observacao nvarchar (100) null ) ON PRIMARY CREATE TABLE ProcessoParte ( Processo int not null CONSTRAINT FK_ProcessoParte_Processo FOREIGN KEY REFERENCES Processo (Processo), Parte int not null CONSTRAINT FK_ProcessoParte_Parte FOREIGN KEY REFERENCES Parte (Parte) CONSTRAINT PK_ProcessoParte PRIMARY KEY NONCLUSTERED (Processo,Parte) ) ON PRIMARY
137
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
- Criação das TABELAS (separadas dos CONSTRAINTS) CREATE TABLE Gerencia ( Uf Gerente Telefone Email ON PRIMARY
nvarchar nvarchar nvarchar nvarchar
CREATE TABLE Parte ( Parte Nome ON PRIMARY
int not null, nvarchar (60) null )
CREATE TABLE TipoAcao ( Tipo Descricao ) ON PRIMARY CREATE TABLE Processo ( Processo comarca Telefone TipoAcao Valor Objeto Uf Status ProcessOrigem DataInicio DataFim Observacao ) ON PRIMARY
(2) not null, (40) null, (20) null, (50) null)
int not null, nvarchar (80) null
int not null, nvarchar (30) null, nvarchar (20) null, int not null, money null, nvarchar (100) null, nvarchar (2) not null, nvarchar (2) null, int null, smalldatetime null, smalldatetime null, nvarchar (100) null
CREATE TABLE Acompanhamento ( Processo int not null, DataAgenda smalldatetime not null, AlertarEm smalldatetime null, Observacao nvarchar (100) null ) ON PRIMARY CREATE TABLE ProcessoParte ( Processo int not null, Parte int not null ) ON PRIMARY
138
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
- Criação dos CONSTRAINTS ALTER TABLE Gerencia WITH NOCHECK ADD CONSTRAINT PK_Gerencia PRIMARY KEY (UF) ON PRIMARY ALTER TABLE Parte WITH NOCHECK ADD CONSTRAINT PK_Parte PRIMARY KEY (Parte) ON PRIMARY
NONCLUSTERED
NONCLUSTERED
ALTER TABLE TipoAcao WITH NOCHECK ADD CONSTRAINT PK_TipoAcao PRIMARY KEY (Tipo) ON PRIMARY
NONCLUSTERED
ALTER TABLE Processo WITH NOCHECK ADD CONSTRAINT PK_Processo PRIMARY KEY (Processo) ON PRIMARY
NONCLUSTERED
ALTER TABLE Acompanhamento WITH NOCHECK ADD CONSTRAINT PK_Acompanhamento PRIMARY KEY (Processo,DataAgenda) ON PRIMARY ALTER TABLE ProcessoParte WITH NOCHECK ADD CONSTRAINT PK_ProcessoParte PRIMARY KEY (Processo,Parte) ON PRIMARY
NONCLUSTERED
NONCLUSTERED
ALTER TABLE Processo ADD CONSTRAINT FK_Processo_Gerencia FOREIGN KEY (UF) REFERENCES Gerencia (UF), CONSTRAINT FK_Processo_TipoAcao FOREIGN KEY (TipoAcao) REFERENCES TipoAcao (Tipo) ALTER TABLE Acompanhamento ADD CONSTRAINT FK_Acompanhamento_Processo FOREIGN KEY (Processo) REFERENCES Processo (Processo) ALTER TABLE ProcessoParte ADD CONSTRAINT FK_ProcessoParte_Parte FOREIGN KEY (Parte) REFERENCES Parte (Parte), CONSTRAINT FK_ProcessoParte_Processo FOREIGN KEY (Processo) REFERENCES Processo (Processo)
- Eliminando as TABELAS (Primeiro elimina-se os CONSTRAINTS) ALTER ALTER ALTER ALTER ALTER
TABLE TABLE TABLE TABLE TABLE
Processo DROP CONSTRAINT FK_Processo_TipoAcao Processo DROP CONSTRAINT FK_Processo_Uf ProcessoParte DROP CONSTRAINT FK_ProcessoParte_Parte Acompanhamento DROP CONSTRAINT FK_Acompanhamento_Processo ProcessoParte DROP CONSTRAINT FK_ProcessoParte_Processo
if exists (select * from sysobjects where id = object_id(N'Processo') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Processo GO if exists (select * from sysobjects where id = object_id(N'Acompanhamento') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Acompanhamento GO if exists (select * from sysobjects where id = object_id(N'ProcessoParte') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table ProcessoParte GO if exists (select * from sysobjects where id = object_id(N'TipoAcao') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table TipoAcao GO if exists (select * from sysobjects where id = object_id(N'Gerencia') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Gerencia GO if exists (select * from sysobjects where id = object_id(N'Parte') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Parte GO
139
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
- Inserindo informações - Tabela : TIPOACAO INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO
TipoAcao TipoAcao TipoAcao TipoAcao TipoAcao TipoAcao TipoAcao
VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'Acoes (2,'Acoes (3,'Acoes (4,'Acoes (5,'Acoes (6,'Acoes (7,'Acoes
Trabalhistas') da Vara de Familia') contra o INSS') Criminais') contra a Tele X') contra o Ponto Quente') contra o Bando do Breziu')
- Inserindo informações - Tabela : GERENCIA INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia Gerencia
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
('AC','Almir','33333333','ac@site.com.br') ('AL','Alfredo','33333333','al@site.com.br') ('AM','Jair','33333333','am@site.com.br') ('AP','Raul','33333333','am@site.com.br') ('BA','Wander','44444444','ba@site.com.br') ('CE','Jose Carlos','55555555','ce@site.com.br') ('DF','Jaqueline','66666666','df@site.com.br') ('ES','Leia','77777777','es@site.com.br') ('GO','Maria da Graça','88888888','go@site.com.br') ('MA','Eva','999999999','ma@site.com.br') ('MT','Mauro','10101010','mt@site.com.br') ('MS','Tania Silene','12121212','ms@site.com.br') ('MG','Reginaldo','13131313','mg@site.com.br') ('PA','Roosevelt','14141414','pa@site.com.br') ('PB','Maria Ana','15151515','pb@site.com.br') ('PR','Mauro Pereira','16161616','pr@site.com.br') ('PE','Sergio','17171717','pe@site.com.br') ('PI','Raimundo','18181818','pi@site.com.br') ('RJ','Carlos H','19191919','rj@site.com.br') ('RN','Pedro Paulo','20202020','rn@site.com.br') ('RS','Roberto','21212121','rs@site.com.br') ('RO','Aluizio','23232323','ro@site.com.br') ('RR','Rosinaldo','24242424','rr@site.com.br') ('SC','Julio Cesar','25252525','sc@site.com.br') ('SE','Gildelia','26262626','se@site.com.br') ('TO','Ivan','27272727','to@site.com.br')
- Inserindo informações - Tabela : PARTE INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
Parte Parte Parte Parte Parte Parte Parte Parte Parte Parte Parte Parte Parte Parte Parte
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'Santos Rosendo') (2,'Jose Geraldo Junior') (3,'Jose Jorge da Silva') (4,'Alan Camargo Silva') (5,'Tatiana Mendonça Meneses') (6,'Sidnei Barbieri Math Jr') (7,'Misael Augusto Araujo') (8,'Leonardo Lima Oliveira') (9,'Carlos Roberto M Soares') (10,'Claudio Silva Soares') (11,'Katiucia Helena Rosa') (12,'Wallace da Silva') (13,'Roberto de Deus Leal') (14,'Milton Souza Santos') (15,'Michel Firmino Souza')
- Inserindo informações - Tabela : PROCESSO INSERT INTO Processo VALUES (1,'Comarca 1','11111111',1,10000.00,'Objeto do processo','RJ','EA','','09/26/2001','','Texto da observacao') INSERT INTO Processo VALUES (2,'Comarca 1','11111111',2,10200.88,'Objeto do processo','MA','EA','','09/25/2001','','Texto da observacao') INSERT INTO Processo VALUES (3,'Comarca 2','22222222',3,20000.00,'Objeto do processo','PI','EA','','09/25/2001','','Texto da observacao') INSERT INTO Processo VALUES (4,'Comarca 2','22222222',4,33000.00,'Objeto do processo','RJ','EA','','08/26/2001','','Texto da observacao') INSERT INTO Processo VALUES (5,'Comarca 3','33333333',5,15000.00,'Objeto do processo','ES','EA','','07/26/2001','','Texto da observacao') INSERT INTO Processo VALUES (6,'Comarca 4','44444444',6,17000.00,'Objeto do processo','MG','EA','','06/26/2001','','Texto da observacao') INSERT INTO Processo VALUES (7,'Comarca 5','55555555',7,23000.00,'Objeto do processo','PA','EA','','09/27/2001','','Texto da observacao')
140
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
- Inserindo informações - Tabela : PROCESSOPARTE INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte ProcessoParte
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,1) (2,2) (3,4) (3,5) (3,6) (4,6) (5,6) (5,9) (6,10) (7,10) (7,11) (7,11)
- Inserindo informações - Tabela : ACOMPANHAMENTO INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento Acompanhamento
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'09/26/2001','10/10/2001','Entrada no FORUM') (2,'09/26/2001','10/10/2001','Entrada no FORUM') (3,'09/26/2001','10/10/2001','Entrada no FORUM') (4,'09/26/2001','10/10/2001','Entrada no FORUM') (5,'09/26/2001','10/10/2001','Entrada no FORUM') (6,'09/26/2001','10/10/2001','Entrada no FORUM') (7,'09/26/2001','10/10/2001','Entrada no FORUM') (1,'10/10/2001','11/10/2001',’1o acompanhamento') (2,'10/10/2001','11/09/2001',’1o Acompanhamento') (3,'10/10/2001','10/20/2001',’1o Acompanhamento') (3,'10/20/2001','11/10/2001',’2o Acompanhamento') (3,'11/10/2001','12/10/2001',’3o Acompanhamento') (4,'10/10/2001','10/15/2001',’1o Acompanhamento') (4,'10/15/2001','',’2o Acompanhamento') (4,'10/20/2001','10/30/2001',’3o Acompanhamento')
141
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
- Extraindo Informações PARTES COM MAIS DE UM PROCESSO select pp.parte, pa.nome, count(pp.processo) #processos from processoparte pp, parte pa where pp.parte = pa.parte group by pp.parte, pa.nome having count(pp.processo) > 1
PARTES SEM PROCESSOS select pa.parte, pa.nome from parte pa where not exists ( select * from processoparte pp where pp.parte = pa.parte )
PROCESSOS E SUAS PARTES - Usando o INNER JOIN select pp.processo, pp.parte, pa.nome, pr.comarca from processoparte pp inner join processo pr on pp.processo = pr.processo inner join parte pa on pp.parte = pa.parte -- Usando a cláusula WHERE select pp.processo, pp.parte, pa.nome, pr.comarca from processoparte pp, parte pa, processo pr where pr.processo = pp.processo and pp.parte = pa.parte
PROCESSO COM MAIOR VALOR select TOP 1 uf, valor from processo order by valor desc
QUANTIDADE DE PROCESSOS POR UF (ORDENADO PELA QUANTIDADE) select uf, count(*) qtd from processo group by uf order by count(*) desc
ELIMINADO UMA INFORMAÇÃO delete from parte where parte = 1 (deverá ocorrer um erro. A parte tem processo) delete from parte where parte = 3 (não ocorrerá erro. Não existem processos para a parte)
142
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Trabalho – Solicitações de Serviços Modelo Conceitual usu_mat
Usuários
usu_nom
(T,S)
Receptor
Solicitante (1,n)
Emite (1,1)
(1,1)
(1,n)
(1,n)
Recebe
Executa
sol_dtemi sol_dtrec (1,1) (1,1) sol_dtini Solicitação sol_dtfim sol_hrfim sol_hrini sol_hrrec sol_tempo sol_hremi
sol_num
Possui sis_cod
Executor
Possui
Possui (1,n)
(1,n)
(1,n)
Tipos de Serviço
Sistema sis_des ts_cod
(1,1)
sta_cod
Status sta_des ts_des
Modelo Lógico -
SISTEMA (sis_cod, sis_des)
-
STATUS (sta_cod, sta_des)
-
TIPOS DE SERVICO (ts_cod, ts_des)
-
USUARIO (usu_mat, usu_nom)
-
SOLICITACAO (sol_num, sol_dtemi, sol_dtrec, sol_dtini, sol_dtfim, sol_hremi, sol_hrrec, sol_hrini, sol_hrfim, sol_tempo, sis_cod, sta_cod, sol_mat, rec_mat, exe_mat, ts_cod)
143
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Criação do DATABASE
CREATE DATABASE Solicitacao ON PRIMARY (NAME=Solicitacao_data, FILENAME='c:\mssql7\data\solicitacao.mdf', SIZE=10MB, MAXSIZE=15MB, FILEGROUTH=25%) LOG ON (NAME=Teste_log, FILENAME='c:\mssql7\data\solicitacao.ldf', SIZE=4MB, MAXSIZE=6MB, FILEGROUTH=2MB)
-
Criação das tabelas (juntamente com os CONSTRAINTS)
CREATE TABLE Sistema ( sis_cod int NOT NULL CONSTRAINT PK_Sistema PRIMARY KEY NONCLUSTERED, sis_des nvarchar (40) NULL ) ON PRIMARY CREATE TABLE Status ( sta_cod int NOT NULL CONSTRAINT PK_Status PRIMARY KEY NONCLUSTERED, sta_des nvarchar (40) NULL ) ON PRIMARY CREATE TABLE TipoServico ( ts_cod int NOT NULL CONSTRAINT PK_TipoServico PRIMARY KEY ts_des nvarchar (40) NULL ) ON PRIMARY
NONCLUSTERED,
CREATE TABLE Usuario ( usu_mat int NOT NULL CONSTRAINT PK_Usuario PRIMARY KEY NONCLUSTERED, usu_nom nvarchar (40) NULL ) ON PRIMARY CREATE TABLE Solicitacao ( sol_num int NOT NULL CONSTRAINT PK_Solicitacao PRIMARY KEY NONCLUSTERED, sol_dtemi smalldatetime NULL , sol_tempo int NULL , sis_cod int NOT NULL CONSTRAINT FK_Solicitacao_Sistema FOREIGN KEY REFERENCES Sistema (sis_cod), sta_cod int NOT NULL CONSTRAINT FK_Solicitacao_Status FOREIGN KEY REFERENCES Status (sta_cod), sol_mat int NOT NULL CONSTRAINT FK_Solicitacao_UsuarioS FOREIGN KEY REFERENCES Usuario (usu_mat) rec_mat int NOT NULL CONSTRAINT FK_Solicitacao_UsuarioR FOREIGN KEY REFERENCES Usuario (usu_mat), exe_mat int NOT NULL CONSTRAINT FK_Solicitacao_UsuarioE FOREIGN KEY REFERENCES Usuario (usu_mat), ts_cod int NOT NULL CONSTRAINT FK_Solicitacao_TipoServico FOREIGN KEY (ts_cod) REFERENCES TipoServico (ts_cod), ) ON PRIMARY
-
Criação das tabelas (separadas dos CONSTRAINTS)
CREATE TABLE Sistema ( sis_cod sis_des ) ON PRIMARY
int NOT NULL , nvarchar (40) NULL
CREATE TABLE Solicitacao sol_num sol_dtemi sol_tempo sis_cod sta_cod sol_mat rec_mat exe_mat ts_cod
( int NOT NULL , smalldatetime NULL , int NULL , int NOT NULL , int NOT NULL , int NOT NULL , int NOT NULL , int NOT NULL , int NOT NULL ) ON PRIMARY
144
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados CREATE TABLE Status ( sta_cod sta_des ) ON PRIMARY
int NOT NULL , nvarchar (40) NULL
CREATE TABLE TipoServico ( ts_cod int NOT NULL , ts_des nvarchar (40) NULL ) ON PRIMARY CREATE TABLE Usuario ( usu_mat usu_nom ) ON PRIMARY
-
int NOT NULL , nvarchar (40) NULL
Criação dos CONSTRAINTS
ALTER TABLE Sistema WITH NOCHECK ADD CONSTRAINT PK_Sistema PRIMARY KEY (sis_cod) ON PRIMARY
NONCLUSTERED
ALTER TABLE Solicitacao WITH NOCHECK ADD CONSTRAINT PK_Solicitacao PRIMARY KEY (sol_num) ON PRIMARY ALTER TABLE Status WITH NOCHECK ADD CONSTRAINT PK_Status PRIMARY KEY (sta_cod) ON PRIMARY
NONCLUSTERED
ALTER TABLE TipoServico WITH NOCHECK ADD CONSTRAINT PK_TipoServico PRIMARY KEY (ts_cod) ON PRIMARY ALTER TABLE Usuario WITH NOCHECK ADD CONSTRAINT PK_Usuario PRIMARY KEY (usu_mat) ON PRIMARY
NONCLUSTERED
NONCLUSTERED
NONCLUSTERED
ALTER TABLE Solicitacao ADD CONSTRAINT FK_Solicitacao_Sistema FOREIGN KEY (sis_cod) REFERENCES Sistema (sis_cod ), CONSTRAINT FK_Solicitacao_Status FOREIGN KEY (sta_cod) REFERENCES Status (sta_cod), CONSTRAINT FK_Solicitacao_TipoServico FOREIGN KEY (ts_cod) REFERENCES TipoServico (ts_cod), CONSTRAINT FK_Solicitacao_UsuarioE FOREIGN KEY (exe_mat) REFERENCES Usuario (usu_mat), CONSTRAINT FK_Solicitacao_UsuarioR FOREIGN KEY (rec_mat) REFERENCES Usuario ( usu_mat), CONSTRAINT FK_Solicitacao_UsuarioS FOREIGN KEY (sol_mat) REFERENCES Usuario (usu_mat)
-
Eliminando as TABELAS (Primeiro elimina-se os CONSTRAINTS)
ALTER ALTER ALTER ALTER ALTER ALTER
TABLE TABLE TABLE TABLE TABLE TABLE
Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao
DROP DROP DROP DROP DROP DROP
CONSTRAINT CONSTRAINT CONSTRAINT CONSTRAINT CONSTRAINT CONSTRAINT
FK_Solicitacao_Sistema FK_Solicitacao_Status FK_Solicitacao_TipoServico FK_Solicitacao_UsuarioE FK_Solicitacao_UsuarioR FK_Solicitacao_UsuarioS
if exists (select * from sysobjects where id = object_id(N'Sistema') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Sistema if exists (select * from sysobjects where id = object_id(N'Solicitacao') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Solicitacao if exists (select * from sysobjects where id = object_id(N'Status') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Status if exists (select * from sysobjects where id = object_id(N'TipoServico') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table TipoServico if exists (select * from sysobjects where id = object_id(N'Usuario') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table Usuario
145
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Inserindo informações - Tabela : SISTEMA
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
-
(1,'Faturamento') (2,'Estoque') (3,'Contabilidade') (4,'Folha de Pag') (5,'Lib. Senha') (6,'Tb Financeiras') (7,'Ativo') (8,'Cobranca') (9,'Emprestimo') (10,'Protocolo') (11,'Renda Fixa') (12,'Compas')
INTO INTO INTO INTO INTO INTO INTO
Status Status Status Status Status Status Status
VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'Nao recebida') (2,'Recebida') (3,'Alocada') (4,'Encerrada') (5,'Pendente') (6,'Cancelada') (7,'Fechada')
INTO INTO INTO INTO INTO INTO INTO INTO
TipoServico TipoServico TipoServico TipoServico TipoServico TipoServico TipoServico TipoServico
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'Desenv. Sistema') (2,'Alteracao Sistema') (3,'Desenv. Prog.') (4,'Alteracao Prog.') (5,'Manutencao Dados') (6,'Chamado Tecnico') (7,'Install') (8,'Executar Prog.')
Inserindo informações - Tabela : USUARIO
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
-
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
Inserindo informações - Tabela : TIPOS DE SERVICO
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
-
Sistema Sistema Sistema Sistema Sistema Sistema Sistema Sistema Sistema Sistema Sistema Sistema
Inserindo informações - Tabela : STATUS
INSERT INSERT INSERT INSERT INSERT INSERT INSERT
-
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario Usuario
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'Santos') (2,'Jose') (3,'Jose') (4,'Alan') (5,'Tatiana') (6,'Sidnei') (7,'Misael') (8,'Leonardo') (9,'Carlos') (10,'Claudio') (11,'Katiucia') (12,'Wallace') (13,'Roberto') (14,'Milton') (15,'Michel')
Inserindo informações - Tabela : SOLICITACAO
INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT INSERT
INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO INTO
Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao Solicitacao
VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES VALUES
(1,'09/26/2001',10,1,1,1,2,3,1) (2,'09/25/2001',11,1,2,2,2,4,2) (3,'09/24/2001',15,2,3,3,2,5,3) (4,'09/23/2001',16,3,1,4,2,6,4) (5,'09/22/2001',17,4,2,1,2,7,1) (6,'09/21/2001',12,5,3,2,2,8,2) (7,'09/20/2001',13,7,1,3,2,9,2) (8,'09/19/2001',11,1,2,4,2,10,3) (9,'09/18/2001',19,1,3,1,2,11,3) (10,'09/17/2001',20,3,1,2,2,12,3) (11,'09/16/2001',12,1,2,3,2,1,4) (12,'09/15/2001',13,2,3,4,2,5,2) (13,'09/14/2001',15,4,4,1,2,4,1) (14,'09/13/2001',10,5,1,2,2,6,1) (15,'09/12/2001',11,4,2,3,2,7,1) (16,'09/11/2001',13,1,3,4,2,4,1) (17,'09/10/2001',14,1,4,1,2,7,2) (18,'09/09/2001',22,1,5,3,2,4,2)
146
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
-
Extraindo informações
NOME DO SOLICITANTE E AS SOLICITAÇÕES EM ABERTO, POR SOLICITANTE select usu_nom, sol_num from usuario u, solicitacao s where u.usu_mat = s.sol_mat and sta_cod = 3 order by usu_nom
NOME DO SISTEMA E A QUANTIDADE DE SOLICITAÇÕES EM ABERTO, POR SISTEMA select si.sis_des, count(so.sol_num) qtd from sistema si, solicitacao so where si.sis_cod = so.sis_cod and so.sta_cod = 3 group by si.sis_des
NOME DO EXECUTOR E QUANTIDADE DE SOLICITAÇÕES EM ABERTO, POR EXECUTOR select u.usu_nom, count(s.sol_num) qtd from usuario u, solicitacao s where u.usu_mat = s.exe_mat and sta_cod = 3 group by u.usu_nom
NOME DO EXECUTOR, A QUANTIDADE DE SOLICITAÇÕES ENCERRADAS E O TEMPO TOTAL CONSUMIDO, POR EXECUTOR select u.usu_nom, count(*), sum(s.sol_tempo) tempo from usuario u, solicitacao s where u.usu_mat = s.exe_mat and s.sta_cod = 5 group by u.usu_nom
EXPURGAR SOLICITAÇÕES CANCELADAS, FECHADAS OU PENDENTES DO ANO DE 2001 delete from solicitacao where year(sol_dtemi) = 2001 and sta_cod in (5,6,7)
147
Universidade Veiga de Almeida Instituto Superior Politécnico Sistemas de Gerenciamento de Banco de Dados
Trabalho – Sistema de Estoque Modelo Conceitual CATEGORIA
cod_c des_c
(1,n)
Contém (1,1)
SUB CATEGORIAS cod_u
des_u
DEPTO
des_s
(1,n)
(1,n)
(1,n)
Faz
cod_m des_m
(1,1)
qtd_sol (1,1)
cod_d des_d
(1,n)
Contém
UNIDADE DE ARMAZENAMENTO
Possui
cod_s
MATERIAL
(1,n)
ITENS
num_rm
RM
(1,n)
emi_rm atend_rm
(0,1)
min pc atu vu
Movimenta data_mov Requer
(0,1)
(1,1)
qtd_mov
MOVIMENTO
(1,1)
Possui
(1,1)
JUSTIFICATIVA
(1,n)
des
TIPO DE MOVIMENTO
cod_t des_t
Modelo Lógico -
CATEGORIA (cod_c, des_c)
-
SUBCATEGORIA ( cod_c, des_s )
-
UNIDADE DE ARMAZENAMENTO ( cod_u, des_u )
-
MATERIAL ( cod_c, cod_s, cod_m, des_m, min, pc, atu, vu, cod_u )
-
DEPTO ( cod_d, des_d )
-
RM ( cod_d, num_rm, emi_rm, atend_rm )
-
ITENS ( cod_d, num_rm, cod_m, qtd_sol )
-
TIPO DE MOVIMENTO ( cod_t, des_t )
-
MOVIMENTO ( cod_d, num_rm, cod_m, qtd_ate, data_ate, cod_t )
-
JUSTIFICATIVA ( cod_d, num_rm, cod_m, des )
148