Escolar Documentos
Profissional Documentos
Cultura Documentos
Banco de Dados – Prof. Dr. Alexandre Leite Rangel, Profª Claudia Vicci Amadeu, Prof. Ms. Thiago Wellington Joazeiro de Almei-
da e Prof. Ms. Geraldo Henrique Neto
Meu nome é Alexandre Leite Rangel. Sou doutor e mestre pela Escola de Enfermagem de Ribeirão
Preto da Universidade de São Paulo (EERP/USP), na área de Informática na Saúde e na Enfermagem.
Minha formação é em Análise de Sistemas, com especialização na mesma área. Leciono a disciplina
Banco de Dados nos cursos de Sistemas de Informação e Licenciatura em Computação. Sou também
analista de sistemas do Hospital das Clínicas da Faculdade de Medicina de Ribeirão Preto da USP.
e-mail: alexandrerangel@claretiano.edu.br
Meu nome é Claudia Vicci Amadeu. Sou especialista em Análise de Sistemas com ênfase em Arquite-
tura Cliente-Servidor pela Pontifícia Universidade Católica de Campinas (PUC-Campinas) e graduada
em Análise de Sistemas. Atuo como docente no curso de Ciência da Computação da Universidade de
Franca (Unifran) e ministro as disciplinas de Modelagem de Sistemas, Banco de Dados e Engenharia de
Software.
e-mail: claudia_vicci@yahoo.com.br
Meu nome é Geraldo Henrique Neto. Sou mestre pela Faculdade de Medicina de Ribeirão Preto da
Universidade de São Paulo (FMRP/USP), na área de Informática Médica. Minha formação é em Ciência
da Computação, com especialização em Desenvolvimento Web pela Universidade Federal de São Car-
los (UFSCar). Leciono diversas disciplinas relacionadas a Banco de Dados em cursos de graduação da
FATEC Mococa, FAFRAM e UNIP de Ribeirão Preto. Sou também Consultor em Tecnologia da Informa-
ção em Ribeirão Preto e região.
e-mail: geraldohenrique@usp.br
Meu nome é Thiago Almeida. Sou mestre em Física Aplicada em Medicina e Biologia pela Universida-
de de São Paulo, especialista em Projetos de Circuitos Integrados Digitais pelo Instituto Eldorado e
graduado em Engenharia da Computação pela Universidade Federal de Itajubá-MG. Sou professor no
Claretiano – Centro Universitário nos cursos EaD de Computação.
e-mail: thiagoalmeida@claretiano.edu.br
BANCO DE DADOS
Batatais
Claretiano
2015
© Ação Educacional Claretiana, 2011 – Batatais (SP)
Versão: ago./2015
005.75 B161
Banco de dados / Alexandre Leite Rangel ... [et al.] – Batatais, SP : Claretiano, 2015.
278 p.
ISBN: 978-85-8377-386-3
CDD 005.75
Todos os direitos reservados. É proibida a reprodução, a transmissão total ou parcial por qualquer forma
e/ou qualquer meio (eletrônico ou mecânico, incluindo fotocópia, gravação e distribuição na web), ou o
arquivamento em qualquer sistema de banco de dados sem a permissão por escrito do autor e da Ação
Educacional Claretiana.
Ementa–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Introdução aos Sistemas de Banco de Dados. Modelo Entidade-Relacionamento. Modelo de Dados Relacional. SQL.
Álgebra Relacional. Noções básicas sobre Gerenciamento de Transação, Controle de Concorrência, Recuperação,
Segurança e Distribuição de Dados.
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
1. INTRODUÇÃO
Seja bem-vindo!
Você iniciará o estudo de Banco de Dados, a qual fornecerá a você conteúdos específicos
para a projeção de bancos de dados. Para facilitar sua compreensão, o conteúdo foi segmentado
em oito unidades.
Além disso, você terá a oportunidade de conhecer conceitos fundamentais para a elabora-
ção e a construção de bancos de dados, como o projeto conceitual, o projeto lógico e o projeto
físico, e a manipulação e a manutenção de bancos de dados por meio de linguagem SQL básica
e avançada.
Outro aspecto relevante para o desenvolvimento de banco de dados bem estruturados é a
aplicação da normalização, tema estritamente relacionado ao desempenho (acesso aos dados).
Com o conteúdo estudado, além de criar bancos de dados estruturados, você saberá aplicar as
fases de normalização até a 4ª forma normal.
Além disso, é imprescindível que você, como administrador de bancos de dados, acompa-
nhe a evolução dos Sistemas Gerenciadores de Bancos de Dados (SGBDs), não tomando apenas
esta obra como fonte de aprendizagem. É importante que você complemente sua formação
10 © Banco de Dados
consultando outras fontes, como livros, revistas e páginas web. Não se esqueça de compartilhar
suas experiências por meio dos Fóruns e da Lista na Sala de Aula Virtual, pois, assim, você não só
contribuirá para o aprendizado de outras pessoas, mas também solidificará seu conhecimento.
Após essa introdução aos conceitos principais, apresentaremos, a seguir, no Tópico Orien-
tações para estudo, algumas orientações de caráter motivacional, dicas e estratégias de apren-
dizagem que poderão facilitar seu estudo.
Abordagem Geral
Prof. Ms. Geraldo Henrique Neto
Neste tópico, apresenta-se uma visão geral do que será estudado. Aqui, você entrará em
contato com os assuntos principais deste conteúdo de forma breve e geral e terá a oportunidade
de aprofundar essas questões no estudo de cada unidade. Desse modo, essa Abordagem Geral
visa fornecer-lhe o conhecimento básico necessário a partir do qual você possa construir um
referencial teórico com base sólida – científica e cultural – para que, no futuro exercício de sua
profissão, você a exerça com competência cognitiva, ética e responsabilidade social.
Banco de Dados tem como objetivo principal sua iniciação na elaboração e na construção
de bancos de dados, no qual você conhecerá as fases constituintes de um projeto bem estrutu-
rado de banco de dados, como também terá contato com a linguagem SQL.
Antes de iniciar o estudo sobre banco de dados, é importante definir o que é um banco
de dados. Pois bem, o banco de dados se constitui em um sistema de armazenamento de da-
dos cujo objetivo é registrar e salvaguardar informações relevantes que poderão ser acessadas
quando necessário. Os bancos de dados são amplamente utilizados e constituem a parte essen-
cial de quase todas as empresas, independentemente do seu ramo de atividade. A importância
dos bancos de dados foi impulsionada nos últimos anos devido ao crescimento das aplicações
web, das implantações de ERP's (Enterprise Resourcing Process), de BI (Businnes Intelligence),
dentre outras. Todas essas tecnologias são dependentes do banco de dados por envolverem ar-
mazenamento de grandes volumes de dados, recuperação de dados no menor tempo possível,
segurança de acesso, backup de dados em tempo real, dentre outras funcionalidades.
Conforme comentado, o banco de dados é extremamente importante para o armaze-
namento de dados. Mas, afinal, qual a definição de dados? Existe diferença entre dados e in-
formações? Para o bom entendimento, é fundamental entender a diferença entre esses dois
conceitos. Os dados são considerados fatos brutos, o que indica que os fatos ainda não foram
processados para revelar seu significado. Como exemplo, imagine que você queira saber o que
os usuários de um laboratório de informática pensam a respeito do serviço prestado. Normal-
mente, você começaria entrevistando os usuários para avaliar o desempenho do laboratório.
Você poderia usar um formulário na web, o que permitiria que os usuários respondessem as
suas questões. Quando o formulário estiver preenchido, os dados, nesse exato momento, são
considerados como brutos, armazenados em um repositório de dados. Embora você já tenha os
fatos em mãos, eles não possuem nenhuma utilidade específica nesse formato. Portanto, é ne-
cessário transformar os dados brutos em dados lapidados, permitindo obter respostas rápidas e
objetivas das questões oriundas do formulário, como: "Qual é a composição da base de clientes
de nosso laboratório?".
© Caderno de Referência de Conteúdo 11
Para revelar seu significado, os dados brutos são processados de maneira apropriada, ge-
rando, assim, as informações. Esse processamento pode ser considerado simples (como exem-
plo podemos citar a organização dos dados para extrair padrões) ou complexo (como a realiza-
ção de estimativas, empregando variáveis estatísticas). As informações necessitam conhecer seu
contexto para revelar seu significado adequado.
As informações são consideradas fundamentais para a tomada de decisão nas empresas,
seja governamental, de serviços ou filantrópicas. Um resumo dos dados extraídos das questões
referentes a cada formulário de entrevista pode demonstrar os pontos fortes e fracos de um
serviço, por exemplo, e auxiliar na tomada de decisões para melhor atender às necessidades de
seus clientes.
Você já ouviu falar em FAT, FAT32, NTFS, SQL Server, Oracle e MySQL? Todas essas siglas
têm um objetivo em comum: organizar e armazenar dados em sistemas computacionais. Elas
fazem parte de dois sistemas para controle de informação: Sistema de Arquivos e Sistema Ge-
renciador de Banco de Dados (SGBD).
Sistema de arquivos é o método de organizar e armazenar informações seguindo uma es-
trutura lógica para alocação física dos arquivos em dispositivos de armazenamento, tais como:
disco rígido ou CD-ROM. Em outras palavras, o sistema de arquivos é a estrutura que indica
como os arquivos devem ser gravados e guardados em algum sistema de armazenamento.
Já, o SGBD é uma coleção de programas que permite ao usuário definir, construir e ma-
nipular bases de dados para as mais diversas finalidades. Os programas ou softwares SGBDs
mais conhecidos são Microsoft SQL Server, MySQL, Oracle, FireBird e PostgreSQL. No Sistema
Gerenciador de Banco de Dados, o acesso aos dados e o seu gerenciamento são realizados pelo
próprio SGBD, o qual funciona como uma interface entre o banco de dados e os programas apli-
cativos, isto é, o SGBD está localizado entre o banco de dados físico e os usuários.
Um modelo de banco de dados nada mais é do que uma descrição dos tipos de informa-
ções que serão armazenadas em um banco de dados. Para que possamos construir um modelo
de dados é necessário o uso de uma linguagem de modelagem de dados. Essas linguagens são
classificadas em linguagens textuais ou gráficas. Cada representação de um modelo de dados
por meio de uma linguagem de modelagem de dados recebe a denominação de esquema de
banco de dados.
Em um projeto de banco de dados, comumente são utilizados dois níveis de abstração,
sendo eles: o modelo conceitual e o modelo lógico. Um modelo conceitual é uma descrição do
banco de dados de forma independente de implementação em um SGBD. O modelo conceitual
registra quais dados podem aparecer no banco de dados, mas não registra como estes dados
serão armazenados em nível do SGBD.
A técnica de modelagem conceitual mais difundida é a abordagem entidade-relaciona-
mento (ER). Utilizando-se esta técnica, um modelo conceitual é usualmente representado por
meio de um diagrama, denominado diagrama entidade-relacionamento (DER).
Um modelo lógico é uma descrição de um banco de dados no nível de abstração visto pelo
usuário do SGBD, de forma que este modelo é dependente do SGBD que será usado. Em um
modelo lógico devem ser definidas quais as tabelas contidas pelo banco e, para cada tabela, os
nomes das colunas.
No decorrer das unidades, veremos que o minimundo representa o domínio relacionado
aos dados que o banco deve armazenar. Um levantamento dos requisitos desse minimundo é
Language), DCL (Data Control Language) e DQL (Data Query Language) – podendo, ainda, in-
cluir os subconjuntos SRC (Stored Routines Commands).
O subconjunto DDL (Data Definition Language) oferece recursos para definir objetos e con-
trolar os dados. São comandos responsáveis pela estruturação do banco de dados, por exemplo:
a criação do próprio banco de dados (database), a criação das tabelas, dos índices, entre outros
objetos. Você utilizará a maioria dos comandos que constituem a DDL, como: CREATE TABLE,
CREATE VIEW, CREATE DATABASE, entre outros, durante este estudo.
Já, o subconjunto DML (Data Manipulation Language) tem como objetivo promover me-
canismos para manipulação e gerenciamento dos bancos de dados, inserindo, alterando e re-
movendo os dados. Os comandos que formam esse subconjunto são: DELETE, INSERT, UNION e
UPDATE.
No que se refere ao controle de acesso aos dados, o DCL (Data Control Language) oferece
recursos de controle de acesso de usuários ao sistema e aos dados, promovendo regras para
realização de consultas, inserções, modificações e exclusões de dados do banco de dados. Essa
linguagem é formada por comandos como GRANT e REVOKE, entre outros.
O comando SELECT faz parte da DQL (Data Query Language), considerado por alguns auto-
res como um comando pertencente ao subconjunto DML (Data Manipulation Language).
Os SRC (Stored Routines Commands) são comandos que permitem a utilização de códigos
de sub-rotinas armazenados no SGBD formados por AFTER, AS, BEFORE, BEGIN, CALLED, CREA-
TE, DECLARE, entre outros.
E por fim, o DTC (Data Type Commands) é o grupo de comandos responsáveis por estabe-
lecer o tipo de dado que uma coluna armazenará em uma tabela específica. O DTC é formado
pelos comandos BIGINT, BIGSERIAL, CHAR, CHARACTER, DATE, DECIMAL, DOUBLE, INTEGER, INT,
MONEY, NUMERIC, entre outros.
Além dos comandos descritos anteriormente, existe um conjunto de funções predefini-
das, com uma série de operadores, que promovem facilitadores nas diversas ações realizadas
pelos aplicativos.
Antes mesmo de você explorar as fases de normalização de um banco de dados, você de-
verá conhecer as restrições de integridade conhecidas como dependências funcionais. A norma-
lização está relacionada intimamente com aspectos importantes como desempenho do banco
de dados.
Segundo Takai; Italiano e Ferreira (2005), a dependência funcional:
[...] é uma propriedade do significado ou semântica dos atributos em um esquema de relação R. Utiliza-
-se o entendimento da semântica de atributos de R, isto é, como eles se relacionam, para especificar as
dependências funcionais envolvidas em todas as instâncias da relação r (extensão) de R. As instâncias
r satisfazem as restrições legais, pois obedecem as restrições de dependência funcional. Assim, a prin-
cipal utilização das dependências funcionais é a de descrever um esquema de relação R especificando
restrições sobre seus atributos que devem ser validados todas às vezes.
Além disso, você pode ter uma conta com outra pessoa, isto é, duas pessoas podem fazer
as mesmas operações na mesma conta bancária. Se ambas, a partir de lugares diferentes, resol-
verem fazer um saque, no mesmo momento, da mesma conta corrente, quem sacará primeiro?
O usuário poderia receber uma informação incorreta e, muitas vezes, sem lógica.
Para que não ocorra esse caos no sistema, existe a transação, que é uma unidade de exe-
cução de programa que acessa e, possivelmente, atualiza vários itens de dados.
Analisando do ponto de vista do SGBD, uma transação é uma sequência de operações que
são tratadas como um bloco único e indivisível (atômico), quanto à sua recuperação, ou seja, a
execução parcial de transações não é permitida.
As responsabilidades do DBA variam a cada organização, mas, de modo geral, o DBA de-
verá planejar a estratégia de administração de dados. Sua função, de modo direto, consiste em
definir, implementar e aplicar as políticas, padrões e procedimentos pertinentes a uma melhor
conduta para o zelo das informações contidas em um banco de dados.
Sabe-se que um dos maiores ativos das organizações é o seu contingente informacional, e
quando uma organização necessita acessar determinada informação que não está prontamente
disponível, perdas podem ser geradas. Por isso, procedimentos de backup e restauração são im-
prescindíveis para assegurar a proteção e a constante disponibilidade das informações obtidas e
acumuladas ao longo do tempo.
Os procedimentos de backup e restauração são muito importantes em qualquer SGBD uti-
lizado. O DBA em questão deve garantir que os dados possam ser recuperados totalmente em
caso de perda física ou de integridade dos dados.
As atividades do DBA inclui o gerenciamento de desastres, de modo a garantir a disponi-
bilidade dos dados após um possível desastre, seja ele físico ou uma falha de integridade. Para
tanto, é necessário um planejamento sistêmico dentro da organização, o que deverá compreen-
der planos de testes e planejamento de ações, procedimentos necessários à recuperação.
A computação distribuída pode ser aplicada não somente a banco de dados, mas a quais-
quer componentes que se encontram em computadores ou em locais diferentes e que, de algu-
ma forma, se relacionam.
Um sistema de computação distribuída pode ser entendido como vários componentes
que estão ligados por uma rede de computadores e que se relacionam para executarem tarefas
em comum.
Segundo Elmasri e Navathe (2005, p. 579), banco de dados distribuídos pode ser definido
como "uma coleção de múltiplos bancos de dados logicamente inter-relacionados, distribuídos
por uma rede de computadores".
Um Sistema de Gerenciamento de Banco de Dados Distribuídos (SGBDD) tem por finalida-
de controlar o armazenamento e processamento de dados relacionados logicamente por meio
de sistemas computacionais interconectados. Neste contexto, tanto os dados como as funções
de processamento são distribuídos entre os diversos locais, também nomeados, eventualmen-
te, de nós.
Bem, chegamos ao final de nossa abordagem e esperamos que você tenha aproveitado
ao máximo os tópicos aqui apresentados, mesmo que de forma sucinta. É importante destacar
que apenas o estudo teórico da linguagem SQL não será suficiente para o seu aprendizado: é
fundamental que você pratique exaustivamente! Para tanto, crie o cenário instalando o SGBD
PostgreSQL, conforme orientações descritas no Apêndice 1.
© Caderno de Referência de Conteúdo 17
Glossário de Conceitos
O Glossário de Conceitos permite a você uma consulta rápida e precisa das definições con-
ceituais, possibilitando-lhe um bom domínio dos termos técnico-científicos utilizados na área de
conhecimento dos temas tratados em Banco de Dados. Veja, a seguir, a definição dos principais
conceitos:
1) Atributo: abstração de uma propriedade de uma entidade ou de um relacionamento.
2) Banco de Dados: sistema de armazenamento de dados cujo objetivo é registrar e
guardar informações importantes que poderão ser acessadas quando necessário.
3) Banco de Dados Espaciais: aquele que permite consultar objetos localizados em um
espaço multidimensional. É o caso dos bancos de dados geográficos, que armazenam
informações sobre mapas para localização de rios, cidades, estados, estradas, entre
outros.
4) Banco de Dados Especialistas: também conhecido como sistemas baseados em co-
nhecimento, é aquele que, por meio de técnicas aplicadas na área da Inteligência Ar-
tificial, incorpora raciocínio e inferência (capacidade de dedução).
5) Banco de Dados Meteorológicos: banco que armazena informações sobre o tempo.
6) Banco de Dados Multimídias: banco que armazena os dados sob a forma de imagem,
clipes de filmes, músicas, textos falados ou escritos, entre outros.
7) Banco de Dados Temporais: é aquele que permite ao usuário consultar estados atuais
e passados do banco de dados, pois armazena históricos das alterações.
8) Base de Dados: representado por um conjunto de banco de dados. Base de dados e
banco de dados não são sinônimos.
9) BI (Business Intelligence ou Inteligência de Negócios): utiliza conceitos em que as
informações são coletadas, armazenadas e analisadas, tendo como base fatos reais
e/ou hipóteses. Esses sistemas auxiliam na gestão organizacional e no processo de
tomada de decisões.
10) Dado atômico: tipo de dado considerado básico, ou seja, indivisível.
11) Dado não atômico: tipo de dado considerado complexo, divisíveis (fragmentados).
12) Entidade: abstração de um fato do mundo real para o qual se deseja manter seus da-
dos no banco de dados.
13) ERP’s: são sistemas de gestão empresarial que possibilitam a integração de todos os
dados e processos de uma empresa, melhorando o fluxo de informações.
14) Gerenciamento de Banco de Dados: utiliza Sistemas Gerenciadores de Banco de Da-
dos (SGBDs).
15) Gerenciamento de Base de Dados: utiliza ferramentas de apoio integradas à tomada
de decisão organizacional (ERP – Enterprise Resource Planning) ou Datawarehouse.
16) Integridade Semântica: garantia de dados sempre corretos com relação ao domínio
de aplicação.
17) Modelagem Conceitual: nível mais alto de abstração cujo objetivo é representar os
requisitos de dados do domínio da aplicação (independente do modelo de banco de
dados).
18) Modelagem Física: constitui um esquema SQL para a modelagem lógica (depende
exclusivamente do SGBD).
19) Modelagem Lógica: representação da modelagem conceitual em um modelo de ban-
co de dados.
20) Relacionamento: abstração de uma associação entre (ocorrências de) entidades.
21) Sistema Gerenciador de Banco de Dados (SGBD): coleção de programas responsáveis
pela criação e manutenção de banco de dados.
Banco
de
Dados
Normalização
Projeto
de 1ª FN 2ª FN 3ª FN
Banco de Dados
Modelo Modelo
Conceitual Modelo Físico
Lógico
Cardinalidade
Entidade
Modelo Hierárquico Esquema
e XML SQL
Modelo Orientado a
Objetos
DML
DCL
Questões Autoavaliativas
No final de cada unidade, você encontrará algumas questões autoavaliativas sobre os con-
teúdos ali tratados, as quais podem ser de múltipla escolha, abertas objetivas ou abertas dis-
sertativas.
Responder, discutir e comentar essas questões, bem como relacioná-las com a prática
do ensino de Banco de Dados pode ser uma forma de você avaliar o seu conhecimento. Assim,
mediante a resolução de questões pertinentes ao assunto tratado, você estará se preparando
para a avaliação final, que será dissertativa. Além disso, essa é uma maneira privilegiada de você
testar seus conhecimentos e adquirir uma formação sólida para a sua prática profissional.
Você encontrará, ainda, no final de cada unidade, um gabarito, que lhe permitirá conferir
as suas respostas sobre as questões autoavaliativas de múltipla escolha.
As questões de múltipla escolha são as que têm como resposta apenas uma alternativa correta. Por
sua vez, entendem-se por questões abertas objetivas as que se referem aos conteúdos matemáticos
ou àqueles que exigem uma resposta determinada, inalterada. Já as questões abertas dissertativas
obtêm por resposta uma interpretação pessoal sobre o tema tratado; por isso, normalmente, não há
nada relacionado a elas no item Gabarito. Você pode comentar suas respostas com o seu tutor ou com
seus colegas de turma.
Bibliografia Básica
É fundamental que você use a Bibliografia Básica em seus estudos, mas não se prenda só
a ela. Consulte, também, as bibliografias complementares.
Dicas (motivacionais)
Este estudo convida você a olhar, de forma mais apurada, a Educação como processo de
emancipação do ser humano. É importante que você se atente às explicações teóricas, práticas e
científicas que estão presentes nos meios de comunicação, bem como partilhe suas descobertas
com seus colegas, pois, ao compartilhar com outras pessoas aquilo que você observa, permite-
-se descobrir algo que ainda não se conhece, aprendendo a ver e a notar o que não havia sido
percebido antes. Observar é, portanto, uma capacidade que nos impele à maturidade.
Você, como aluno do curso de graduação na modalidade EaD, necessita de uma formação
conceitual sólida e consistente. Para isso, você contará com a ajuda do tutor a distância, do tutor
presencial e, sobretudo, da interação com seus colegas. Sugerimos, pois, que organize bem o
seu tempo e realize as atividades nas datas estipuladas.
É importante, ainda, que você anote as suas reflexões em seu caderno ou no Bloco de
Anotações, pois, no futuro, elas poderão ser utilizadas na elaboração de sua monografia ou de
produções científicas.
Leia os livros da bibliografia indicada, para que você amplie seus horizontes teóricos. Co-
teje-os com o material didático, discuta a unidade com seus colegas e com o tutor e assista às
videoaulas.
No final de cada unidade, você encontrará algumas questões autoavaliativas, que são im-
portantes para a sua análise sobre os conteúdos desenvolvidos e para saber se estes foram
significativos para sua formação. Indague, reflita, conteste e construa resenhas, pois esses pro-
cedimentos serão importantes para o seu amadurecimento intelectual.
Lembre-se de que o segredo do sucesso em um curso na modalidade a distância é parti-
cipar, ou seja, interagir, procurando sempre cooperar e colaborar com seus colegas e tutores.
Caso precise de auxílio sobre algum assunto, entre em contato com seu tutor. Ele estará
pronto para ajudar você.
3. E-REFERÊNCIA
TAKAI, O. K.; ITALIANO, I. C.; FERREIRA, J. E. Introdução a Banco de Dados. 2005. Disponível em: <http://pt.scribd.com/
doc/51228653/9/Arquiteturas>. Acesso em: 22 out. 2012.
4. REFERÊNCIA BIBLIOGRÁFICA
ELMASRI, R.; NAVATHE, S. B. Sistemas de bancos de dados. São Paulo: Pearson (Addison Wesley), 2005.
Introdução aos Sistemas de
Banco de Dados
1. OBJETIVOS
• Compreender o conceito básico de Sistemas Gerenciadores de Bancos de Dados (SGBD),
sua importância, utilização e aplicação.
• Conhecer os SGBDs mais utilizados no mercado, os problemas de armazenamento e
recuperação de dados (redundâncias, inconsistências, integridade, compartilhamento
e segurança) e os requisitos básicos que devem ser atendidos para um bom desempe-
nho.
2. CONTEÚDOS
• Perspectiva histórica.
• Sistemas de arquivos versus SGBDs.
• Dados em SGBDs: descrição e armazenamento.
• Arquitetura em um SGBD.
• Consultas em um SGBD.
1) Tenha sempre à mão o significado dos conceitos explicitados no Glossário e suas liga-
ções pelo Esquema de Conceitos-chave para o estudo de todas as unidades deste CRC.
Isso poderá facilitar sua aprendizagem e seu desempenho.
2) É importante que você fique sempre atento às informações contidas na unidade. Pro-
grame-se, organize seus estudos e participe ativamente na Sala de Aula Virtual. Ser
disciplinado para estudar pode ajudar você a tirar o máximo de proveito em seu curso
de Educação a Distância.
3) Antes de iniciar os estudos desta unidade, pode ser interessante conhecer um pouco
sobre a evolução das formas de armazenamento de dados. Para saber mais, acesse os
sites indicados nas E-referências.
4) O início do estudo desta unidade envolve alguns aspectos teóricos que serão funda-
mentais ao longo de todo o aprendizado. Dessa maneira, faça uso de um bloco de
anotações para destacar os principais conceitos, tais como: banco de dados, dados
e informações, sistemas de arquivos, Sistemas Gerenciadores de Bancos de Dados
(SGBD) etc.
5) Lembre-se que dado é o que está armazenado no banco de dados e informação é o
significado dos dados.
6) O best-seller O mundo é plano, de Thomas Friedman, mostra que, devido ao avanço
tecnológico, uma informação inédita é disponibilizada para o mundo todo em segun-
dos, colocando em igualdade de conhecimento populações de países desenvolvidos
e países em desenvolvimento. Reflita sobre a importância dos dados e seu armazena-
mento no mundo globalizado.
7) Os conceitos apresentados nesta unidade serão trabalhados na prática nas unidades
seguintes. Preocupe-se, a princípio, em compreender as diferenças entre os conceitos
apresentados. Se necessário, anote os termos e suas definições em um caderno para
retomá-los posteriormente.
Perspectiva Histórica–––––––––––––––––––––––––––––––––––––––––––––––––––––––––
Em algum momento da história, as empresas descobriram que estava muito caro empregar um número grande de
pessoas para fazer certos trabalhos, como armazenar e indexar (organizar) arquivos. Por este motivo, valia a pena
empregar esforços e investir em pesquisas em busca de um meio mais barato e uma solução mecânica eficiente.
Na década de 1970, Ted Codd, um pesquisador renomado da IBM, publicou o primeiro artigo
referente a bancos de dados relacionais. Este artigo discorria sobre o uso de cálculo e álgebra
relacional, recursos que possibilitavam que usuários não técnicos manipulassem grande
quantidade de informações. Codd projetava em sua mente um sistema computacional em que
fosse factível ao usuário acessar os dados armazenados em tabelas através de comandos
específicos. Na época, ninguém percebeu que as teorias obscuras de Codd desencadeariam
uma revolução tecnológica comparável ao desenvolvimento dos computadores pessoais e da
internet. Don Chamberlin, coinventor da SQL, a mais popular linguagem de computador utili-
zada pelos sistemas de bancos de dados de hoje, explica: "Havia aquele cara, Ted Codd, que
usava um tipo de notação matemática estranha, mas ninguém a levava muito a sério". Então,
Ted Codd organizou um simpósio e Chamberlin ouviu como ele conseguiu resumir cinco pági-
nas de programas complicados em uma única linha. "E eu disse: Uau!", relembra Chamberlin.
O simpósio convenceu a IBM (Internacional Business Machines) a fundar o System R (Sistema R), um projeto de
pesquisa que construiu um protótipo de banco de dados relacional e que levaria à criação da SQL (Strutured Query
Language) e do DB2. Esta linguagem tornou-se um padrão na indústria para bancos de dados relacionais e, hoje
em dia, é um padrão ISO (International Organization for Standardization). Os primeiros protótipos foram utilizados
por muitas organizações, como o MIT Sloan School of Management (escola norte-americana conhecida na área
de negócios). Novas versões do sistema foram testadas com empresas de aviação para rastreamento do manufa-
turamento de estoque. A IBM, no entanto, manteve o System R em segundo plano por vários e decisivos anos. O
interesse da empresa voltava-se para o IMS, um sistema de banco de dados confiável, de alta tecnologia, que havia
surgido em 1968. Sem perceber o potencial de mercado daquela pesquisa, a IBM permitiu que sua equipe publicasse
seus trabalhos.
Entre os leitores estava Larry Ellison, que havia acabado de fundar uma pequena empresa. Recrutando programadores
do System R e da Universidade da Califórnia, Ellison conseguiu colocar no mercado, bem antes da IBM, o primeiro ban-
co de dados relacional com base em SQL, em 1979. Em 1983, a empresa laçou uma versão portátil do banco de dados,
tendo um faturamento bruto anual de US$ 5.000.000 e alterou seu nome para Oracle. Impedida pela concorrência, a
IBM finalmente lançou o SQL/DS (Structured Query Language/Data System), seu primeiro banco de dados relacional,
em 1980 (imagem disponível em: <http://www.answers.com/topic/edgar-f-codd>. Acesso em: 18 maio 2012.).
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
© U1 – Introdução aos Sistemas de Banco de Dados 23
4. INTRODUÇÃO À UNIDADE
Nesta unidade, você terá a oportunidade de estudar alguns conceitos de banco de dados,
bem como aprender a importância dos Sistemas Gerenciadores de Banco de Dados em sistemas
de informações. Para tanto, veja a definição a seguir:
Essa forma organizada de armazenamento permite a fácil manipulação dos dados, incluin-
do alterações, inserções, remoções, além das consultas.
É comum empregar os termos banco de dados e base de dados como sinônimos. De certa
forma é um erro, pois o gerenciamento de uma base de dados utiliza, normalmente, ferramen-
tas de apoio integradas à tomada de decisão organizacional; como exemplo, podem ser citados
o ERP (Enterprise Resource Planning) e o Data warehouse. Entretanto, o gerenciamento de um
banco de dados é o obtido por meio de sistemas de gerenciamento de bancos de dados.
Em geral, o gerenciamento eficiente de dados necessita do uso de um banco de dados
computacional (digital), que pode ser considerado como uma estrutura compartilhada e inte-
grada, a qual armazena um conjunto de:
• Dados brutos oriundos do usuário.
• Metadados, os quais permitem integrar e gerenciar os dados.
Os metadados fornecem uma descrição detalhada das características dos dados e do seu
conjunto de relacionamentos, responsáveis por conectar os dados encontrados no banco de
dados. Por exemplo, o componente de metadados armazena informações como o nome de cada
elemento de dados, seu respectivo tipo (numérico, data ou texto) armazenado, a possibilidade
ou não de deixar esse elemento vazio, dentre outras possibilidades. Desse modo, os metadados
fornecem informações que complementam e expandem o valor e a utilização dos dados, ou
seja, trazem uma representação mais completa dos dados no banco de dados.
A importância do banco de dados no cenário da Tecnologia da Informação (TI) aumentou
consideravelmente nos últimos anos, impulsionada pelo crescimento das aplicações web, das
implantações de ERP’s (Enterprise Resourcing Process), de BI (Business Intelligence) etc. Todas
essas tecnologias são dependentes do banco de dados por envolverem o armazenamento de
grandes volumes de dados, a recuperação de dados no menor tempo possível (principalmente
no comércio eletrônico), a segurança de acesso, o backup de dados em tempo real, dentre ou-
tras funções.
exemplo, pode ser considerado um dado específico sem significado algum, a menos que saiba-
mos seu contexto: encontra-se em graus Fahrenheit ou Celsius? Está vinculada à temperatura de
um hardware ou de um corpo humano?
Na maioria das vezes, as informações são pilares fundamentais para a tomada de decisões
nas empresas, sejam elas governamentais, de serviços ou filantrópicas. No exemplo anterior,
o resumo dos dados extraídos das questões referentes a cada formulário de entrevista pode
demonstrar os pontos fortes e fracos do laboratório de informática, auxiliando, dessa forma, na
tomada de decisões confiáveis para melhor atender às necessidades de seus clientes.
De acordo com as características e a aplicabilidade dos dados armazenados, os bancos são
classificados de diferentes maneiras: podem se basear no número de usuários, na localização
(ou localizações) e no tipo e extensão do uso esperado.
Veja a classificação dos bancos de dados por número de usuários:
1) Banco de dados monousuário (de um único usuário): suporta apenas um usuário por
vez. Por exemplo, se o usuário Pedro estiver utilizando o banco de dados, os usuários
Regina e Douglas precisam esperar o usuário Pedro finalizar sua consulta.
2) Banco de dados multiusuário: dá suporte a diversos usuários simultaneamente. Por
exemplo, os usuários Pedro, Regina e Douglas poderão utilizar o banco de dados ao
mesmo tempo.
Outra característica importante dos bancos de dados pode ser estabelecida levando em
consideração sua localização. Observe:
1) Banco de dados centralizado: estabelece suporte a dados centralizados em um único
local.
2) Banco de dados distribuído: suporta dados distribuídos por vários locais, normalmen-
te, geograficamente distintos.
Atualmente, a maneira mais usual de classificar os bancos de dados baseia-se no modo
como estes serão utilizados e na sensibilidade ao tempo das informações nele coletadas. Pode-
mos detalhar essa classificação como:
1) Bancos de dados operacionais: projetados especialmente para suportar operações
diárias de uma empresa. Também podem ser referenciados como bancos de dados
transacionais ou de produção.
2) Data Warehouse (armazém de dados): tem a finalidade de armazenar os dados uti-
lizados para a geração de informações necessárias à tomada de decisões táticas e
estratégicas. Essas decisões exigem que os dados sejam "lapidados" (manipulação de
dados), a fim de extrair informações úteis para a formulação de decisões, previsões
de vendas, posicionamento no mercado, dentre outros. Sua estrutura difere-se muito
de um banco de dados operacional ou transacional, promovendo facilitadores para a
recuperação desses dados.
3) Bancos de dados temporais: são aqueles que permitem ao usuário a consulta dos
estados atuais e passados do banco de dados, pois armazenam históricos das altera-
ções. Veja alguns exemplos de aplicações, em que o controle e acesso a informações
temporais são fundamentais: área médica (evolução do paciente), área empresarial
(aplicações financeiras, controle de produção, gerenciamento de vendas, gestão de
pessoas), controle acadêmico, sistemas de informações geográficas, sistemas de re-
servas, entre outros.
4) Bancos de dados espaciais: são aqueles que permitem consultas a objetos localiza-
dos em um espaço multidimensional. É o caso dos bancos de dados geográficos, que
armazenam informações sobre mapas para localização de rios, cidades, estados, es-
tradas, entre outros.
uma falha: o sistema não foi capaz de bloquear a reserva de um dos estudantes e dizer que o
livro já havia sido reservado para o outro.
Você percebe a necessidade das informações serem atualizadas em tempo real? Caso con-
trário, o que aconteceria com os sistemas bancários, os sistemas que realizam vendas pela inter-
net ou reservas de voos aéreos?
Com as exigências e necessidades de novos conceitos e estruturas nos sistemas de arqui-
vos, percebeu-se um aumento significativo nos custos de equipamentos, manutenção e tempo
de trabalho para atender todas essas novas demandas. Dessa forma, os Sistemas de Geren-
ciamento de Banco de Dados (SGBD) surgiram como uma evolução dos Sistemas de Arquivos,
criando novas estruturas de dados com o objetivo de gerenciar todo o armazenamento de in-
formações.
O SGBD é uma coleção de programas que permite ao usuário definir, construir e manipular
bases de dados para as mais diversas finalidades. Os programas ou softwares SGBDs mais co-
nhecidos são Microsoft Access, MySQL, Oracle, FireBird, SQL Server e PostgreSQL.
No Sistema de Gerenciamento de Banco de Dados (SGBD), o acesso aos dados e seu geren-
ciamento são realizados pelo próprio sistema, o qual funciona como uma interface (ponto que
delimita e estabelece a relação entre dois sistemas independentes) entre o banco de dados e os
programas aplicativos, isto é, o SGDB está localizado entre o banco de dados físico e os usuários.
Um Sistema Gerenciador de Banco de Dados é responsável por receber as requisições
provenientes de diversas aplicações e realizar a tradução, quebrando a complexidade das solici-
tações e permitindo o atendimento a essas requisições adequadamente. O SGBD consegue ocul-
tar dos usuários e aplicativos grande parte da complexidade existente em um banco de dados.
Normalmente, os aplicativos computacionais que interagem com os bancos de dados por meio
de um Sistema Gerenciador de Banco de Dados podem ser implementados pelos programado-
res utilizando diversas linguagens de programação, como por exemplo, o Visual Basic, Dot Net,
Java, PHP ou C++. Além do uso de linguagens de programação específicas, existe a possibilidade
de desenvolver aplicativos baseando-se exclusivamente em ferramentas proprietárias dos Siste-
mas Gerenciadores de Banco de Dados, como por exemplo, o Forms e Reports da Oracle.
Como vimos anteriormente, os dados constituem um material bruto fundamental a partir
do qual as informações são obtidas, e requerem um excelente método para gerenciá-los. Você
descobrirá que o SGBD torna o gerenciamento de dados mais eficientes e eficazes. Como exem-
plo, mencionamos suas diversas vantagens na utilização em aplicações computacionais. O SGBD:
1) Permite o compartilhamento dos dados para diversas aplicações e usuários.
2) Integra as visões dos dados dos diferentes usuários em um único repositório de dados.
3) Fornece modelos adequados para melhor aplicar as políticas de privacidade e segu-
rança de dados.
4) Reduz a inconsistência dos dados, que ocorre quando diferentes versões dos mesmos
dados aparecem em locais distintos. Por exemplo, quando o departamento de ma-
rketing de uma determinada empresa armazena o nome de uma funcionária como
"Gisele Ap. da Silva" e o departamento de recursos humanos, por sua vez, armazena o
nome da mesma funcionária como "Gisele A. Silva".
5) Dados bem gerenciados e com acesso aprimorado permitem a geração de informa-
ções de melhor qualidade, que, por sua vez, auxiliam na tomada de decisões.
As vantagens da utilização de um SGBD não se limitam aos itens listados. Certamente,
você descobrirá inúmeras utilidades ao conhecer os detalhes dos bancos de dados e seu projeto
adequado.
Claretiano - Centro Universitário
30 © Banco de Dados
O SGBD apresenta uma visualização única e integrada ao usuário (ou aplicativos), confor-
me pode ser visualizado na Figura 3.
O SGBD solucionou problemas dos sistemas de arquivos, tais como: integração de dados
(mesmo local), dados duplicados, independência de dados e aplicativos e representação das
perspectivas do usuário.
Desenvolvedores, administradores e usuários que trabalham diretamente com SGBDs de-
vem ter conhecimento e domínio dos recursos para usufruir de todas as vantagens que o siste-
ma proporciona, como:
1) Rapidez no acesso às informações presentes no banco de dados.
2) Redução de problemas de integridade e redundância.
3) Diminuição do esforço humano no desenvolvimento.
4) Utilização dos dados e controle integrado de informações distribuídas fisicamente.
Desconhecer o funcionamento do SGBD pode acarretar o mau desenvolvimento e afetar a
segurança de acesso às informações.
Uma das comparações realizadas entre o sistema de arquivos e o SGBD está relacionada
ao desempenho. O sistema de arquivos é programado para uma aplicação específica, o que gera
um bom desempenho. Já o SGBD é programado para aplicações mais genéricas, podendo aten-
der a aplicações diferentes.
Em outras palavras, podemos dizer que os SGBDs vieram para eliminar todo o trabalho
realizado anteriormente por um programador de aplicação, responsável pelo controle do aces-
so, da integridade e da redundância dos dados; contudo, ainda há alguns itens que são melhor
atendidos pelos sistemas de arquivos.
© U1 – Introdução aos Sistemas de Banco de Dados 31
Modelo Externo
Esse modelo é considerado a perspectiva dos usuários finais do ambiente de dados. Usu-
ários finais é o termo dado às pessoas que fazem uso de aplicativos para manipular os dados,
gerando, assim, as informações necessárias para o cenário empresarial.
Normalmente, as empresas são segmentadas em diversas unidades comerciais, como:
vendas, finanças e marketing, em que cada unidade pode estar sujeita a restrições e exigências
específicas. Dessa maneira, os usuários finais podem visualizar apenas seus subconjuntos de
dados específicos, separados das outras unidades da empresa.
Registro de alunos
Modelo Conceitual
Após a identificação das visões externas, utilizamos o modelo conceitual, o qual é repre-
sentado graficamente pelo diagrama de entidade e relacionamento (DER) que, na prática, cons-
titui a planta básica do banco de dados. O modelo conceitual tem como objetivo realizar a inte-
gração de todas essas visões externas (entidades, relacionamentos e restrições) em uma visão
global de todos os dados da empresa.
O ER (entidade-relacionamento) é o modelo conceitual mais utilizado. Dentre as vanta-
gens apresentadas pelo modelo conceitual, podemos destacar:
• Fornecimento de uma visão macroscópica de fácil entendimento sobre o ambiente de
dados.
• Independência de software: o modelo não depende da tecnologia do Sistema de Ge-
renciamento de Banco de Dados (SGBD) utilizado em sua implementação, ou seja, as
alterações provenientes do software não refletirão sobre o projeto de banco de dados
no nível conceitual.
• Independência de hardware: o modelo não depende do hardware utilizado em sua
implementação, ou seja, as alterações provenientes do hardware não refletirão sobre
o projeto de banco de dados no nível conceitual.
Modelo Interno
Nessa fase, normalmente já definimos qual tecnologia de Sistema de Gerenciamento de
Banco de Dados (SGBD) será utilizada. O modelo interno realiza o mapeamento do modelo con-
ceitual para o SGBD específico.
Quando utilizamos o modelo relacional (o qual será detalhado adiante), escolhemos um
banco de dados que suporta esse tipo para implementar o modelo interno, o qual se resume no
mapeamento do modelo conceitual para as tabelas do modelo relacional. O esquema interno
é constituído pela SQL (linguagem padrão) quando selecionamos o banco de dados relacional.
Como exemplo, a Figura 5 apresenta o modelo interno implementado, criando-se as tabelas
PROFESSOR, DISCIPLINA, TURMA, ALUNO, MATRÍCULA e SALA.
Devido à dependência do modelo interno a um software de SGBD específico, dizemos que
ele é dependente de software. Qualquer alteração realizada na tecnologia do SGBD exigirá que
o modelo interno sofra algum tipo de alteração a fim de se adequar às novas características e
exigências de implementação do modelo de banco de dados. Em alguns casos, é possível alte-
rarmos o modelo interno sem interferir no modelo conceitual, obtendo, assim, a independência
lógica. Entretanto, o modelo interno possui independência de hardware, ou seja, esse modelo
não sofrerá nenhum tipo de alteração/modificação pela escolha do computador em que o sof-
tware (SGBD) será instalado.
Modelo Físico
Este modelo trabalha nos níveis mais baixos de abstração, ou seja, descreve a maneira
como os dados são gravados em meios de armazenamento, como discos e fitas magnéticas. O
modelo físico carece da definição dos dispositivos de armazenamento físico, como também seus
métodos de acesso a esse meio. Consequentemente, podemos dizer que esse modelo é depen-
dente tanto do software (SGBD) como do hardware.
Mesmo que no modelo relacional o projetista do banco de dados não precise se preocu-
par com as características inerentes ao armazenamento físico dos dados, a implementação de
um modelo relacional poderá exigir sintonização (tuning) refinada no nível físico para otimizar
o desempenho.
Sabemos que o modelo físico depende da tecnologia do SGBD, dos mecanismos de acesso
aos arquivos e dos tipos de dispositivos utilizados para efetuar o armazenamento. Eventual-
mente, quando é possível realizar qualquer tipo de alteração no modelo físico sem influenciar o
modelo interno, ocorre o que chamamos de independência física.
Modelo de Dados
Um modelo de dados é uma representação relativamente simples, em geral gráfica, de es-
truturas mais complexas de dados reais. Normalmente, o modelo é uma abstração de um objeto
ou até mesmo um evento real com um maior grau de complexidade. Tem como função principal
auxiliar na compreensão das regras de negócios complexos existentes em um ambiente real. Em
© U1 – Introdução aos Sistemas de Banco de Dados 35
Objetos Básicos
Os blocos básicos de construção de todos os modelos de dados são as entidades, os atri-
butos, os relacionamentos e as restrições.
Uma entidade é algo (pessoa, local, objeto ou evento) sobre o qual são coletados e arma-
zenados dados. Ela representa um tipo particular de objeto no mundo real. Por isso, as entidades
são distinguíveis, ou seja, cada ocorrência de entidade é única e distinta. Por exemplo, uma enti-
dade Cliente teria muitas ocorrências de clientes distinguíveis, como Manoel Ribeiro, Pedro José
da Silva, Dinorá Fernandes Junqueira etc. As entidades podem ser objetos físicos, como clientes
e produtos, mas também podem ser abstrações, como rotas de voo ou apresentações musicais.
Um atributo é considerado uma característica de uma entidade. Por exemplo, uma entida-
de Cliente seria caracterizada pelos atributos nome, sobrenome, telefone, endereço e limite de
crédito. Os atributos são equivalentes aos campos nos sistemas de arquivos.
Um relacionamento descreve uma associação (conectividade) entre entidades (uma ou
n). Por exemplo, um relacionamento entre clientes e corretores pode ser descrito da seguinte
maneira: um corretor pode atender muitos clientes, mas cada cliente pode ser atendido apenas
por um corretor. Os modelos de dados utilizam três tipos de relacionamentos: um para muitos
(1:M ou 1..*), muitos para muitos (M:N ou *..*) e um para um (1:1 ou 1..1).
Veja, a seguir, exemplos que ilustram as distinções entre os três tipos de relacionamentos
permitidos.
• Relacionamento um para muitos (1:M ou 1..*): um pintor faz várias pinturas, mas cada
uma é criada por apenas um artista; o pintor (uma entidade) relaciona-se com as pin-
turas (várias entidades). Portanto, podemos definir o relacionamento PINTOR pinta
PINTURA como sendo 1:M. De modo similar, um cliente (entidade) pode gerar muitas
faturas (várias entidades), mas cada fatura é gerada apenas por um cliente. O relacio-
namento CLIENTE gera FATURA também seria identificado como 1:M.
MySQL
PostgreSQL
DB/2 UDB
Próxima geração Do presente ao XML dbXML Promove organização e gerenciamento de
futuro dados não estruturados.
Tamino
Modelos relacionais e de objetos adicionam
DB2 UDB suporte a documentos em XML.
Oracle 10g
MS SQL Server
PostgreSQL
Modelo Hierárquico
Desenvolvido na década de 1960, o modelo hierárquico tinha por objetivo gerenciar gran-
des quantidades de dados provenientes de projetos complexos. Podemos mencionar como
exemplo o foguete Apollo, que aterrissou na Lua em 1969. Sua estrutura lógica é representada
por uma estrutura semelhante à de uma árvore, visualizada de cima para baixo, onde identifi-
camos seus níveis ou segmentos. Um segmento é semelhante ao tipo de registro em um siste-
ma de arquivos qualquer. Internamente, por hierarquia, a camada considerada superior (raiz) é
identificada como pai do segmento imediatamente abaixo dela. Na Figura 6 podemos visualizar
o segmento considerado Raiz como o pai dos segmentos do Nível 1 que, por sua vez, são pais
dos segmentos do Nível 2, e assim sucessivamente. Os segmentos encontrados abaixo de outros
segmentos são identificados como filhos. Resumidamente, podemos considerar que o modelo
hierárquico representa um conjunto de relacionamentos um para muitos (1:M) entre um pai e
seus filhos, ou seja, cada pai pode ter muitos filhos, entretanto, cada filho possui apenas um
pai.
Montagem
Segmento Raiz Final
Segmento de Nível 1
Componente A Componente B Componente C
(Filhos da Raiz)
Segmento de Nível 2
Montagem A Montagem B Montagem C
(Filhos da Nível 1)
Segmento de Nível 3
Parte A Parte B Parte C Parte D Parte E
(Filhos da Nível 2)
Modelo em Rede
O modelo em rede foi criado para representar, exclusivamente, relacionamentos de dados
complexos com maior eficiência (em comparação ao modelo hierárquico), otimizando o desem-
penho dos bancos de dados e determinando um padrão para os mesmos.
No modelo em rede, em geral, o usuário visualiza o banco de dados em rede como uma
coleção de registros em relacionamentos 1:M. Ao contrário do modelo hierárquico, esse modelo
permite que um registro tenha mais de um pai. Um exemplo desse relacionamento é apresen-
tado na Figura 7.
A Figura 7 ilustra um modelo de dados em rede de uma empresa de vendas qualquer. Nes-
se modelo podemos identificar os tipos de registros: CLIENTE, REPCOMERCIAL, FATURA, FAT_LI-
NHA, PRODUTO e PAGAMENTO. Observe que a FATURA é propriedade tanto do REPCOMERCIAL
como do CLIENTE. De maneira similar, FAT_LINHA possui dois proprietários, PRODUTO e FATURA.
A ausência de um recurso de consulta ad hoc não permitia aos desenvolvedores a geração
do código necessário para a produção de simples relatórios. Outra desvantagem considerável é
a independência de dados totalmente limitada: qualquer tipo de alteração estrutural, por mais
simples que fosse, poderia devastar todos os aplicativos que obtinham dados do banco. Devido
a essas restrições, os modelos hierárquicos e em rede foram, consequentemente, substituídos
pelo modelo de dados relacional na década de 1980.
Modelo Relacional
O modelo relacional foi apresentado, em 1970, por Codd (da IBM), em seu famoso artigo
A Relational Model Data for Large Shared Data Banks (Um modelo relacional de dados para
grandes bancos de dados compartilhados).
A base do modelo relacional é calcada no conceito matemático conhecido como relação.
Na tentativa de diminuir a complexidade da teoria matemática abstrata, podemos pensar uma
relação (também chamada de tabela) como sendo uma matriz composta por linhas e colunas.
Claretiano - Centro Universitário
40 © Banco de Dados
Modelo Entidade-Relacionamento
Embora o modelo relacional represente um aprimoramento em relação aos modelos hie-
rárquico e em rede, alguns recursos ainda eram escassos para que ele fosse avaliado como uma
ferramenta de projeto eficiente. Como é mais objetivo representar estruturas gráficas em vez de
descrevê-las em texto, os projetistas de bancos de dados preferem utilizar a ferramenta gráfica,
pois esta permite que as entidades e seus relacionamentos sejam visualizados de maneira sim-
plificada. Dessa forma, o modelo de entidade-relacionamento (ER) ou MER (ERM, sigla em inglês
para Entity Relationship Model) tornou-se um padrão aceito mundialmente para modelagem de
dados.
O famoso Peter Chen apresentou pela primeira vez, em 1976, o modelo de dados ER, o
qual tratava da representação gráfica clara e intuitiva de entidades e seus respectivos relaciona-
mentos em uma estrutura de banco de dados. Tal representação tornou-se popular, pois com-
plementava de forma satisfatória os conceitos do modelo relacional, o qual foi mesclado com o
MER para construir uma base sólida do projeto de bancos de dados fortemente estruturado. Os
modelos ER são, geralmente, simbolizados por um diagrama de entidade-relacionamento (DER),
que utiliza representações gráficas para modelar os componentes do banco de dados.
Veja, a seguir, os componentes que constituem o modelo ER:
• Entidade: representada no DER por um retângulo, e sua identificação é feita por um
substantivo, escrito de maneira centralizada. Normalmente, é escrito em letras maiús-
culas e no singular: PROFESSOR em vez de PROFESSORES e FUNCIONÁRIO em vez de
FUNCIONÁRIOS. Quando utilizamos o DER no modelo relacional, é frequente que uma
entidade seja mapeada para uma tabela relacional, onde cada linha é nomeada como
instância de entidade ou ocorrência de entidade no modelo ER.
Cada entidade é definida por um conjunto de atributos que descrevem suas caracte-
rísticas específicas. Por exemplo, a entidade FUNCIONÁRIO possuirá como atributos o
nome e data de nascimento.
• Relacionamento: tem como principal objetivo realizar a associação entre os dados.
A grande parte dos relacionamentos faz a conexão (relaciona) entre duas entidades.
Sua identificação, em geral, é realizada por um verbo. São exemplos: um PINTOR pinta
várias PINTURAS; um FUNCIONÁRIO aprende várias HABILIDADES; um FUNCIONÁRIO
gerencia uma LOJA.
Nas Figuras 9 e 10 podem ser visualizados os diferentes tipos de relacionamento. Os dois
casos fazem uso de notações de ER: a notação original de Peter Chen e a notação Crow’s Foot
(pé de galinha), considerada a notação mais atual.
A Figura 9 apresenta a notação de Peter Chen, em que as conectividades (relacionamen-
tos) são descritas próximas a cada entidade. Graficamente, os relacionamentos são represen-
tados por um losango, o qual é conectado às entidades relacionadas por meio de uma reta. A
identificação de um relacionamento é escrito no interior do losango.
Já a Figura 10 ilustra a notação pé de galinha. Esse nome é consequência da utilização do
símbolo de três pontas, o qual representa o lado muitos do relacionamento. Podemos observar
que as conectividades oriundas do DER básico que usa a notação pé de galinha são representa-
das por símbolos. No exemplo, o 1 é representado por um curto segmento de reta e o M, por
uma forca de três "pés de galinha". Também podemos notar que o nome do relacionamento é
escrito sobre a reta do relacionamento.
mas e símbolos utilizados para modelar graficamente um sistema computacional. Ele é usado,
também, para representar o diagrama de classe dos modelos de dados orientados a objetos.
A Figura 11 apresenta os objetos necessários para um cenário simples de faturamento,
bem como o diagrama de classes equivalente em UML e seu respectivo modelo de ER. Os ob-
jetos da FATURA incluem todos os objetos a ela relacionados. Observamos que seus relaciona-
mentos (1 e M) representam a conectividade dos objetos relacionados com a FATURA, em que
o número 1, próximo ao objeto CLIENTE, indica que cada FATURA se relaciona única e exclusiva-
mente com apenas um CLIENTE. Enquanto a letra M, localizada próxima ao objeto LINHA, indica
que cada FATURA contém muitas LINHAS.
O diagrama de classes em UML utiliza três classes distintas de objetos (CLIENTE, FATURA
e LINHA) e dois relacionamentos. É possível notar que as conexões dos relacionamentos são
representadas pelos símbolos 1..1, 0..* e 1..*, em que os relacionamentos são expostos na duas
extremidades permitindo a reprodução de diversos "papéis" que os objetos possam executar.
Já o modelo ER faz uso, também, de três entidades segmentadas e dois relacionamentos para
constituir o mesmo cenário.
8. ARQUITETURA EM UM SGBD
Vejamos o que Takai; Italiano e Ferreira (2005) dizem sobre a arquitetura em um Sistema
Gerenciador de Banco de Dados.
As primeiras arquiteturas utilizavam mainframes para executar o processamento principal e de todas as
funções do sistema, incluindo os programas aplicativos, os programas de interface com o usuário, bem
como a funcionalidade dos SGBDs. Esta é a razão pela qual a maioria dos usuários fazia acesso aos sis-
temas via terminais que não possuíam poder de processamento, apenas a capacidade de visualização.
Todos os processamentos eram feitos remotamente, apenas as informações a serem visualizadas e os
controles eram enviados do mainframe para os terminais de visualização, conectados a ele por redes
de comunicação.
Como os preços do hardware foram decrescendo, muitos usuários trocaram seus terminais por com-
putadores pessoais (PC) e estações de trabalho. No começo, os SGBDs usavam esses computadores da
mesma maneira que usavam os terminais, ou seja, o SGBD era centralizado e toda sua funcionalidade,
execução de programas aplicativos e processamento da interface do usuário eram executados em ape-
nas uma máquina.
Comumente o servidor SQL também é chamado de back-end machine e o cliente de front-end machine.
Como o SQL provê uma linguagem padrão para os SGBDRs, esta criou o ponto de divisão lógica entre o
cliente e o servidor.
Atualmente, existem várias tendências para arquitetura de Banco de Dados, nas mais diversas direções.
mantida por outro servidor ou servidores, o sistema encarrega-se de obter a informação necessária, de
maneira transparente para o aplicativo, que passa a atuar consultando a rede, independentemente de
conhecer seus servidores.
Exemplos típicos dessa configuração são as bases de dados corporativas, em que o volume de informa-
ção é muito grande e, por isso, deve ser distribuído em diversos servidores.
[...]A característica básica é a existência de diversos programas aplicativos consultando a rede para
acessar os dados necessários, porém, sem o conhecimento explícito de quais servidores dispõem des-
ses dados.
9. CONSULTAS EM UM SGBD
Os Sistemas de Gerenciamento de Bases de Dados foram criados com o objetivo de ma-
nusear corretamente os dados que gerenciam, e as funções mais executadas em um SGBD são:
preservar os dados que são guardados em memória e fornecer recursos que possibilitem a sua
recuperação.
A responsabilidade dos SGBDs no que diz respeito às informações é grande, pois nenhum
dado pode sofrer alterações em seu armazenamento ou em sua recuperação. É comum um
dado ter um caráter modificado devido ao mau funcionamento da memória ou do hardware,
por onde trafegam as informações.
A estrutura de consulta é o fator de maior influência no desempenho de um sistema e
representa grande parte dos problemas, uma vez que todas as funcionalidades que recuperam
dados o fazem por meio de consultas.
Como parte dos desenvolvedores não tem experiência para determinar qual a melhor
forma de se estruturar uma consulta, visto que isso, em geral, depende da plataforma em uso,
esta tarefa quase sempre fica a cargo dos DBAs (Database Administrator ou Administrador de
Banco de Dados).
Existem duas formas de realizar a consulta em uma base de dados:
• utilizando uma linguagem específica de trabalho com base de dados como, por exem-
plo a SQL (Structured Query Language);
• realizando a consulta por meio de exemplo – QBE (Query By Example).
© U1 – Introdução aos Sistemas de Banco de Dados 49
Mas o que seria realizar uma consulta, quando falamos em banco de dados?
Realizar uma consulta é fazer uma pergunta ao banco de dados, especificando alguns cri-
térios, como: "Quais os nomes dos professores cuja disciplina é Matemática?".
Observe como seria a pergunta em SQL:
2) Sabemos que banco de dados e base de dados não são sinônimos. Explique sua diferença.
4) Como os bancos de dados são classificados? Cite alguns tipos de bancos de dados.
11. CONSIDERAÇÕES
Nesta unidade, você teve a oportunidade de compreender a importância e a necessidade
indiscutível de um Sistema de Gerenciamento de Banco de Dados no mundo atual, o qual de-
pende da tecnologia para realizar o controle das informações.
Você tem ideia da quantidade de informações que é trocada, armazenada e buscada, dia-
riamente, em todos os setores da sociedade? Pode-se dizer que é algo imensurável. É funda-
mental, portanto, que existam regras, arquiteturas, estruturas com níveis bem definidos e mo-
delos de dados para organizar e controlar essa grande quantidade de informação.
Como futuro projetista de banco de dados, é necessário que você conheça e domine os
modelos conceituais de banco de dados. Na próxima unidade, você estudará o modelo entida-
de-relacionamento, um modelo conceitual amplamente difundido e utilizado pelos projetistas
de bancos de dados.
12. E-REFERÊNCIAS
Lista de figuras
Figura 1 Banco de Dados. Disponível em: <http://segundoepmedici.blogspot.com.br/2011/08/banco-de-dados-br-modelo.
html>. Acesso em: 01 out. 2012.
Figura 17 Banco de Dados Distribuídos. Disponível em: <http://www.devmedia.com.br/articles/viewcomp.asp?comp=5530>.
Acesso em: 01 out. 2012.
Sites pesquisados
MURALL. Banco de Dados. Disponível em: <http://murall.com.br/banco-de-dados/>. Acesso em: 23 out. 2012.
TAKAI, O. K.; ITALIANO, I. C.; FERREIRA, J. E. Introdução a Banco de Dados. 2005. Disponível em: <http://pt.scribd.com/
doc/51228653/9/Arquiteturas>. Acesso em: 22 out. 2012.
1. OBJETIVOS
• Conhecer e analisar as fases de um projeto de banco de dados.
• Desenvolver um projeto conceitual de banco de dados empregando o Modelo Entida-
de-Relacionamento.
• Compreender o Modelo Entidade-Relacionamento Estendido.
2. CONTEÚDOS
• Modelos de banco de dados.
• Definições de objetos do Modelo Entidade-Relacionamento (MER).
• Características adicionais do Modelo Entidade-Relacionamento.
• Projeto conceitual de banco de dados com o Modelo Entidade-Relacionamento.
• Diagrama Entidade-Relacionamento (DER).
• Exemplos de Diagramas Entidade-Relacionamento.
• Modelo Entidade-Relacionamento Estendido (EER).
Peter Chen
A notação original para o Modelo Entidade-Relacionamento foi proposta por Peter Chen e é
composta de entidades (retângulos), relacionamentos (losangos), atributos (círculos) e linhas
de conexão (linhas) que indicam a cardinalidade de uma entidade em um relacionamento.
Chen ainda propõe símbolos para entidades fracas e entidades associativas (imagem dispo-
nível em: <http://sankofa.loc.edu/savur/web/peterchen.jpg>. Acesso em: 02 out. 2012. Texto
adaptado do site disponível em: <http://erealityhome.wordpress.com/2008/08/23/modelo-enti-
dade-relacionamento-mer-peter-chen-1976-2/>. Acesso em: 02 out. 2012).
4. INTRODUÇÃO À UNIDADE
Na unidade anterior, você aprendeu que os Sistemas Gerenciadores de Bancos de Dados
foram criados para solucionar os problemas existentes nos sistemas de arquivos, tais como: re-
dundância, inconsistência, compartilhamento e segurança dos dados e das informações.
Nesta unidade, você terá a oportunidade de entender como se desenvolve um projeto
conceitual de um banco de dados por meio do modelo entidade-relacionamento.
Para facilitar a sua compreensão, antes de iniciarmos nossos estudos sobre o modelo en-
tidade-relacionamento, é fundamental que você conheça detalhadamente as fases que com-
põem um projeto de banco de dados e o que é um modelo de banco de dados.
Dessa maneira, um esquema de banco de dados pode ser denominado como sendo uma
representação de um modelo de dados utilizando-se uma linguagem de modelagem de dados
específica.
O objetivo de um modelo de dados é ser útil na explicação, a um usuário leigo em infor-
mática, sobre a organização utilizada em um determinado banco de dados, pois ele não conterá
informações detalhadas sobre a representação física das informações. É diferente do que ocorre
com um modelo de dados usado por um técnico, pois este deverá conter os detalhes sobre a
organização interna das informações e, portanto, será menos abstrato.
Em um projeto de banco de dados, comumente são utilizados dois níveis de abstração: o
modelo conceitual e o modelo lógico.
Modelo conceitual
Um modelo conceitual é uma descrição do banco de dados de forma independente de im-
plementação em um SGBD; trata-se um modelo de dados abstrato. O modelo conceitual regis-
tra quais dados podem aparecer no banco de dados, mas não registra como estes dados serão
armazenados em nível de SGBD; é uma generalização.
Uma das técnicas mais utilizadas mundialmente na modelagem conceitual é a abordagem
Entidade-Relacionamento (ER). Por meio dela, uma modelagem conceitual é normalmente re-
presentada por um diagrama, este denominado Diagrama Entidade e Relacionamento (DER). A
Figura 1 ilustra este modelo:
Entre outras coisas, este modelo nos faz entender que o banco de dados contém dados
sobre produtos e sobre tipos de produtos. Para cada produto, o banco de dados armazena o
código, a descrição e o preço, bem como o tipo de produto em que está associado.
Modelo lógico
Um modelo lógico é uma descrição de um banco de dados no nível de abstração visto pelo
usuário do SGBD, de forma que este modelo é dependente do SGBD que será usado.
Em um modelo lógico, devem ser definidas as tabelas contidas pelo banco e, para cada
tabela, os nomes das colunas, tais como:
TipoDeProduto(CodTipoProd, descTipo)
Produto(codProd, descProd, precoProd, codTipoProd)
O modelo lógico descreve a estrutura do banco de dados, conforme vista pelo usuário di-
reto do SGBD. São detalhes de armazenamento interno de informações, que não têm influencia
sobre a programação de aplicações no SGBD, mas podem afetar o desempenho da aplicação.
Nome
Idade
Código Professor
Código
(1, M) Telefone Rua
Nome
Nome
Disciplina Possui
Código
Sexo
(1, M) (1, M)
Nome
Nascimento
oferecida (1, M)
Turma (1, M)
matricula-se
(1, M)
Código Número Alunos
Entidade
Uma entidade é um objeto existente e distinto de qualquer outro objeto. Ela tem por fi-
nalidade representar um conjunto de objetos da realidade modelada. Por exemplo, uma pessoa
chamada João da Silva possui um número de RG único, RG nº. 12.345.678-SP; este número de
RG é uma entidade, uma vez que identifica a pessoa de uma forma única em relação às outras
pessoas. Uma entidade pode ser concreta, como uma pessoa ou uma empresa, ou abstrata,
como um conceito.
Dessa forma, podemos perceber que um conjunto de entidades é um grupo de entidades
do mesmo tipo. O conjunto de alunos de sua turma, por exemplo, pode ser definido como o
conjunto de entidades ALUNOS.
Em um DER, uma entidade é representada por um retângulo que contém seu nome, con-
forme demonstrado na Figura 3:
Relacionamento
Uma das propriedades sobre as quais pode ser desejável manter associações é a associa-
ção entre objetos. Na Figura 3, por exemplo, pode ser válido conhecer apenas as pessoas de um
dado departamento. Logo, uma pessoa tem de estar associada a um departamento para que
esta classificação obtenha êxito.
No modelo de representação DER, um relacionamento é apresentado por meio de um
losango, ligado por linhas aos retângulos.
A Figura 4 demonstra o relacionamento existente entre as entidades FUNCIONÁRIO e PESSOA:
A partir do relacionamento entre as entidades (Figura 4), é possível nos referirmos a asso-
ciações específicas dentro de um conjunto. No caso do relacionamento ASSOCIAÇÃO, uma ocor-
rência seria um par específico formado por uma determinada ocorrência da entidade PESSOA e
por outra da entidade DEPARTAMENTO.
Um relacionamento não ocorre, necessariamente, entre entidades diferentes. Também é
possível um relacionamento entre ocorrências de uma mesma entidade, ou seja, o autorrelacio-
namento (conforme demonstrado na Figura 5).
Cardinalidade de relacionamentos
Um diagrama entidade-relacionamento pode definir restrições com as quais o banco de
dados deve estar de acordo. Uma dessas restrições é a cardinalidade do mapeamento, que ex-
pressa o número de entidades relacionadas a outras entidades por meio de um conjunto de
relacionamentos.
Tomemos por referência o DER representado pela Figura 4. Considere as cardinalidades
máximas:
1) A entidade PESSOA tem cardinalidade máxima 1 no relacionamento ASSOCIAÇÃO. Isso
significa que uma ocorrência de PESSOA pode estar associada à, no máximo, uma
ocorrência de DEPARTAMENTO ou, em outras palavras, que um empregado pode estar
associado à, no máximo, um departamento.
© U2 – Modelagem dos Dados utilizando o Modelo Entidade-Relacionamento 57
(1, M) (1, M)
Código Disciplina leciona Professor Código
Nome
Nome
Título
1 1
N 1
N N
Relacionamento ternário
Até o momento, os exemplos demonstraram relacionamentos binários, ou seja, entre ape-
nas duas entidades. A abordagem ER permite maiores graus entre as relações, como pode ser
observado na Figura 10, na qual temos um exemplo de relacionamento ternário:
N 1
Generalização/especialização
Não nós limitamos apenas aos relacionamentos e seus atributos, podemos ainda abstrair-
mos propriedades à entidades por meio do uso do conceito de generalização/especialização.
Parece complicado? Não tanto! Isso nos permite atribuir propriedades específicas a um sub-
conjunto de ocorrências (especialização) de uma entidade considerada genérica. A simbologia
utilizada para representar generalização/especialização é um triângulo isósceles, conforme você
pode visualizar na Figura 12. Nessa mesma figura, o conceito de generalização/especialização
sinaliza que a entidade CLIENTE é segmentada em dois subconjuntos, esses representados pelas
entidades nomeadas respectivamente de PESSOA FÍSICA e PESSO JURÍDICA, em que cada uma
possui propriedades específicas.
É importante ressaltar que também não se verifica limitação quanto ao número de hie-
rarquias, ou níveis hierárquicos. Ou seja, uma entidade já especialista de uma genérica também
pode conter outras entidades que são especialistas desta. Por exemplo, a entidade MOTORISTA
é uma especialização da entidade FUNCIONÁRIO, todavia, nada impede que a entidade MOTO-
RISTA tenha outras entidades especialistas.
Nesse relacionamento, a generalização/especialização exclusiva, é aplicado quando da ne-
cessidade que uma ocorrência de uma entidade genérica, seja associada a uma e apenas uma
entidade especialista. A Figura 15 demonstra o emprego desta necessidade, tomando como re-
ferencial a entidade AUTOMOVEL, observamos que esta é uma entidade especialista de VEICULO
TERRESTRE, e esta é especialista da entidade VEICULO. Considerando os conceitos aprendidos
até o momento, podemos dizer que a entidade AUTOMOVEL possui além de suas propriedades
específicas, as propriedades de VEICULO TERRESTRE e VEICULO.
Entidade associativa
Até agora, você pôde compreender que um relacionamento nada mais é que associações
entre uma ou mais entidades; o DER que empregamos para a construção do modelo de dados
não previu situações em que fosse possível associar uma entidade diretamente a um relaciona-
mento. Outro contexto que também não se faz possível é a associação de dois relacionamentos,
um com o outro.
No uso cotidiano das ferramentas e técnicas de modelagem de dados, frequentemente
nos deparamos com situações em que se faz necessário os relacionamentos descritos. Nos apro-
fundaremos nessa assunto, para isso, observe a Figura 16.
Ao analisarmos a Figura 16 verificamos a relação N:N, por meio do relacionamento CON-
SULTA entre MEDICO e PACIENTE, ou seja, um médico pode consultar vários pacientes, e um
paciente pode ser consultado por vários médicos. Em cada uma das consultas, provavelmente,
medicamentos serão prescritos aos pacientes. Vamos supor que seja necessário catalogar cada
medicamento indicado nas consultas, no primeiro momento, você pode estar pensando em
constituir uma outra entidade, algo como MEDICAMENTO. Até então tudo bem, mas pense,
onde deve ser realizado o relacionamento com a nova entidade? Com a entidade MEDICO ou
PACIENTE? Se relacionarmos a nova entidade, MEDICAMENTO, com a entidade MEDICO, sa-
beríamos apenas os medicamentos prescritos por determinado médico, sem a indicação do
paciente. Caso associássemos com PACIENTE saberíamos quais medicamentos foram prescritos
para cada PACIENTE mais não saberíamos qual foi o médico. A solução para o problema seria re-
lacionarmos a entidade MEDICAMENTO com a CONSULTA, onde será possível obter informações
tanto do médico quanto do paciente.
Claretiano - Centro Universitário
62 © Banco de Dados
Observe que até então apenas relacionamento CONSULTA passou a ser considerado como
uma entidade associativa e, para identificarmos isto, existe a figura do losango no entorno do
relacionamento CONSULTA. Neste momento, o relacionamento passa a ser entendido em con-
formidade com o conceito de entidade, como uma entidade pode ser associada a outras, o
problema que descrevemos anteriormente está resolvido. Basta que a entidade MEDICAMENTO
seja associada à entidade associativa CONSULTA, por meio do relacionamento PRESCRICAO.
Tipos de atributos
Após conhecer a definição de atributos, veja, no Quadro 1, os vários tipos de atributos e
suas aplicações específicas.
número: 125;
ATENÇÃO!
O valor nulo é utilizado quando o atributo não tem um valor aplicável ou quando seu valor é
desconhecido. É importante frisar que NULO (Null) não é 0 (zero).
Toda entidade deve ter, ao menos, um atributo-chave que será utilizado para identificá-la de
forma única, não importando se este atributo é simples ou composto.
Atributo-Chave
Considere, como exemplo, uma entidade de Pessoas: pode ser um atributo-chave o RG, o CPF ou
um código.
Do mesmo modo que entidades podem possuir atributos, relações também podem apre-
sentá-los. A Figura 18 mostra um DER, no qual um relacionamento, ATUAÇÃO, possui um atribu-
to, a função que um engenheiro exerce dentro de um projeto:
Tipos de entidade
As entidades têm um ou mais atributos-chave que, juntos, a identificam de forma única.
Porém, alguns tipos de entidade não possuem atributos-chave e são chamados de entidades-
-fracas.
As entidades-fracas, em síntese, dependem de outras entidades. Sua identificação é possí-
vel por meio da associação dos atributos-chave da entidade proprietária e de sua chave parcial.
Em algumas situações, uma entidade-fraca pode ser substituída por atributos multivalorados.
Observe, na Figura 19, um exemplo de entidade-fraca. A entidade DEPENDENTE é uma
entidade-fraca, pois depende de um FUNCIONÁRIO.
(1, M) (1, 1)
Funcionário possui Dependente
Nome
Código
Sexo
Nome
Data Nascimento
Figura 19 Entidade-Fraca.
Telefone Rua
Endereço Número
(1, M) matricula-se (1, M)
Turma Aluno Código
Bairro
Nome
Código
Sexo
Período Letivo
Nascimento
Início
Número Alunos
Término
Data Matrícula
Data Cancelamento
Motivo Cancelamento
Nas regras definidas por Pressman, troque objeto por entidade e você perceberá que elas
se aplicam totalmente.
Após definir as entidades, é preciso compreender que os atributos são representados por
elipses. Lembre-se que o atributo é um substantivo no singular, assim como a definição de uma
entidade. Ele pode ser:
1) simples: linha contínua;
2) composto: quando têm mais atributos ligados a si;
3) chave: quando o nome do atributo está sublinhado;
4) multivalorado: quando as linhas são duplas;
5) derivado: quando as linhas são tracejadas.
© U2 – Modelagem dos Dados utilizando o Modelo Entidade-Relacionamento 67
Para definir quais atributos adicionar a uma entidade, o projetista de bancos de dados uti-
liza como critério as informações necessárias obtidas no levantamento realizado com o usuário
que solicitou o sistema de informações.
Lembre-se de que os relacionamentos são representados por losangos e podem ser utili-
zados para nomear verbos, advérbios ou preposições, de modo que a sequência das entidades
tenha sentido, quase como uma frase.
Veja o caso do relacionamento leciona entre as entidades PROFESSOR e DISCIPLINA. Len-
do-se como uma frase, temos: PROFESSOR-LECIONA-DISCIPLINA. Outro exemplo é o relacio-
namento matricula-se, entre ALUNO e TURMA. Lendo-se a partir da entidade ALUNO, temos:
ALUNO-MATRICULA-SE-TURMA.
Nome
Disciplina Possui
Código
Sexo
(1, M) (1, M)
Nome
Nascimento
oferecida (1, M)
Turma (1, M)
matricula-se
(1, M)
Código Número Alunos
b) Controle de Estoque:
possam depender legalmente do funcionário. Essa é uma entidade-fraca, uma vez que
não há a necessidade de registrar as informações dos dependentes se antes não fo-
rem registradas as informações do empregado.
Nesse diagrama há, também, um autorrelacionamento na entidade EMPREGADO,
que representa qual empregado é o supervisor dos demais. Fique atento, pois, nesse
exemplo, foram indicadas apenas as cardinalidades máximas.
d) Atendimento a Pacientes:
Subclasse
Estudamos, anteriormente, que um conjunto de entidades possui entidades do mesmo
tipo, caracterizando um tipo entidade. Ao pensar em um banco de dados de uma universidade,
Claretiano - Centro Universitário
70 © Banco de Dados
consideramos que ALUNO seja um tipo entidade. Se pudermos dividir os alunos em alunos de
graduação e alunos de pós-graduação, teríamos, então, duas subclasses de ALUNO, ou seja, as
subclasses ALUNOGRAD e ALUNOPOSGRAD.
Superclasse
De acordo com o exemplo anterior, podemos dizer que ALUNO é superclasse de ALUNO-
GRAD e ALUNOPOSGRAD.
Herança
Ao conceito de superclasse e subclasse está associado o conceito de herança. Isso significa
que uma entidade de uma subclasse representa a mesma entidade da superclasse, ou seja, os
membros de uma subclasse herdam todos os atributos e relacionamentos da sua superclasse.
No exemplo do banco de dados de uma universidade, isso indica que todo aluno de gra-
duação é um aluno, e que todo aluno de pós-graduação também é um aluno. Cada membro de
ALUNOGRAD e de ALUNOPOSGRAD herda todos os atributos definidos para ALUNO, assim como
seus relacionamentos. Vale lembrar, ainda, que os atributos das subclasses de uma mesma su-
perclasse são diferentes, e que uma subclasse pode se relacionar com uma classe que não se
relaciona com outra subclasse da mesma superclasse.
Especialização
Entende-se por especialização a definição de um conjunto de subclasses de um tipo de
entidade, a partir de uma superclasse.
Generalização
Generalização é a definição de um tipo entidade (superclasse) a partir de suas subclasses,
ou seja, com base nas características comuns a todas as subclasses cria-se uma superclasse, e
essas características são atribuídas apenas à superclasse.
Observe exemplos de generalização nas Figuras 25 e 26.
nome
posgrad
RA
ALUNOPOSGRAD
anodefesa
endereco
turno
curso
ALUNOGRAD
RA
turma
nome endereco
nome
RA
endereco
ALUNO
curso
ALUNOGRAD ALUNOPOSGRAD
turma
turno
posgrad
anodefesa
A Figura 26 também pode ser considerada uma Especialização, caso essa especialização
esteja sendo definida pelo atributo TIPOALUNO, por exemplo.
Uma especialização pode ser definida por predicado, quando há uma condição no valor
de algum atributo da superclasse. É o caso explicado no parágrafo anterior, ou seja, um aluno
pertencerá à subclasse ALUNOGRAD ou ALUNOPOSGRAD dependendo do valor contido no atri-
buto TIPOALUNO.
Quando não existe essa condição, dizemos que a subclasse é definida pelo usuário.
5) Quais são os principais tipos de atributos? Cite pelo menos um exemplo de cada.
6) Escolha a opção que representa corretamente, no Modelo Entidade-Relacionamento, a afirmação: Todo jogador
deve pertencer a um único clube.
a)
b)
c)
d)
e)
7) Considere o Modelo Entidade-Relacionamento (Figura 32), em que o relacionamento Ocupa indica o Cargo que
o Empregado ocupa atualmente, e o relacionamento Ocupado indica os cargos anteriormente ocupados pelo
empregado, se houver. Para cada afirmação a seguir, assinale V (verdadeira) ou F (falsa).
(0,N) (1,1)
Ocupa
Empregado Cargo
Ocupado
(0,N) (0,N)
Figura 32 Modelo Entidade-Relacionamento Empregado -
Cargo.
O modelo está incorreto porque não pode haver 2 relacionamentos entre as mesmas entidades;
Pode haver um Empregado que não ocupa um Cargo;
Para que o modelo contenha a data em que um Empregado deixou de ocupar um Cargo essa data deve ser
colocada como atributo do relacionamento Ocupado;
O relacionamento Ocupado permite identificar todos os cargos que um Empregado já ocupou, menos o cargo
que ocupa atualmente;
Todo Cargo tem pelo menos um Empregado que o ocupa;
8) Constitua a modelagem das especificações mencionadas a seguir utilizando o MER, juntamente às suas respec-
tivas cardinalidades. (Observação: defina os atributos que julgar necessário).
a) Administradora de Imóveis:
Uma entrevista com o gerente da administradora resultou nas seguintes informações:
I. A administradora administra condomínios formados por unidades condominiais (lotes).
II. Cada unidade condominial é de propriedade de uma ou mais pessoas. Uma pessoa pode possuir diversas
unidades.
III. Cada unidade pode estar alugada para, no máximo, uma pessoa. Uma pessoa pode alugar diversas uni-
dades.
b) Clínica:
I. Em uma clínica trabalham médicos e existem pacientes internados.
II. Cada médico é identificado pelo seu CRM, possui um nome e recebe um salário na clínica.
III. Um médico tem formação em diversas especialidades (ortopedia, traumatologia etc), entretanto, só
exerce uma delas na clínica.
IV. Para todo paciente internado na clínica são cadastrados alguns dados pessoais: nome, RG, CPF, endere-
ço, telefone(s) para contato e data de nascimento.
V. Um paciente tem sempre um determinado médico como responsável (com horário de visita diária pre-
determinado), porém, vários outros médicos podem participar do seu tratamento.
VI. Pacientes estão sempre internados em quartos individuais, que são identificados por um número e ficam
em um andar da clínica.
c) Biblioteca:
I. Uma biblioteca mantém um conjunto de livros, de diversas categorias.
II. Conforme as suas categorias, eles estão dispostos em estantes apropriadas.
III. Um livro tem vários exemplares na biblioteca.
IV. São mantidos dados detalhados sobre autores e editoras dos livros para fins de consulta.
V. Na biblioteca trabalham várias bibliotecárias.
VI. Cada bibliotecária é responsável por organizar periodicamente sempre o mesmo conjunto de estantes e
realizar empréstimos de exemplares para os clientes.
VII. Empréstimos cadastrados no banco de dados devem conter a data da devolução e o valor diário da mul-
ta, permanecendo no banco de dados até o cliente realizar a entrega do exemplar.
VIII. O nome da bibliotecária que realizou o empréstimo também deve ser mantido no banco de dados.
Gabarito
Confira, a seguir, as respostas corretas para as questões autoavaliativas propostas:
6) c.
7)
F.
F.
V.
V.
F.
13. CONSIDERAÇÕES
O modelo entidade-relacionamento apresentado nesta unidade é utilizado pelos projetis-
tas de bancos de dados na fase do projeto conceitual, pois é um modelo de dados de alto nível.
Os conceitos do modelo entidade-relacionamento foram apresentados e demonstrados
por meio de um exemplo de aplicação específica simplificada para uma escola, com o objetivo
de facilitar a sua explanação e demonstrar que o modelo conceitual depende das regras e restri-
ções definidas pelos analistas de negócios.
O projeto lógico necessita da adoção de um modelo de dados lógico específico, e o mo-
delo adotado neste estudo é o modelo relacional, devido a sua larga utilização no mercado. O
modelo relacional será o assunto estudado na próxima unidade.
1. OBJETIVO
• Construir o conhecimento básico necessário para o desenvolvimento de um projeto
lógico de Banco de Dados Relacional baseado no Modelo Conceitual.
2. CONTEÚDOS
• Modelo Relacional.
• Notação do Modelo Relacional.
• Atributos-chave de uma relação.
• Esquema de Banco de Dados Relacional.
• Restrições de integridade sobre relações.
• Projeto lógico de banco de dados: Entidade-Relacionamento para Relacional.
4. INTRODUÇÃO À UNIDADE
Na unidade anterior, você teve a oportunidade de estudar o modelo entidade-relaciona-
mento (MER) e conhecer o que é entidade, atributos e conjuntos de entidades. Também pôde
aprender como é a estrutura do diagrama entidade-relacionamento e como formular um proje-
to conceitual de banco de dados utilizando o MER.
Nesta unidade, você estudará o projeto lógico de um banco de dados relacional, cuja base
é o modelo conceitual.
5. MODELO RELACIONAL
O modelo relacional, baseado na lógica dos predicados e na teoria dos conjuntos, foi apre-
sentado por E. F. Codd em 1970 e representa os dados contidos em um banco de dados por meio
de relações (tabelas).
A lógica dos predicados, amplamente utilizada pela matemática, fornece um modelo em
que uma proposição (afirmação de um fato) pode ser verificada como verdadeira ou falsa. Por
exemplo, suponha que uma estudante com ID 12345678 se chame Melissa Mendes. Essa pro-
posição pode ser facilmente demonstrada como verdadeira ou falsa.
A teoria dos conjuntos é a parte da ciência matemática que lida com conjuntos (grupos
de coisas), sendo utilizada como base para a manipulação de dados no modelo relacional. Por
exemplo, suponha que o conjunto A contenha três números: 16, 24 e 77. Esse conjunto é repre-
sentado por A(16, 24, 77). O conjunto B, por sua vez, contém quatro números: 44, 77, 90 e 11,
sendo, portanto, representado por B(44, 77, 90, 11). Com base nessas informações, é possível
concluir que a intersecção de A e B dará origem a um terceiro conjunto, formado apenas pelo
número 77. Esse resultado pode ser expresso por A ∩ B = 77. Em outras palavras, A e B com-
partilham um valor comum, 77.
Segundo Alvarenga (2012):
O Modelo Relacional é claramente baseado no conceito de matrizes, onde as chamadas linhas (das
matrizes) seriam os registros e as colunas (das matrizes) os campos. Os nomes das tabelas e dos cam-
pos são de fundamental importância para sua compreensão entre o que estamos armazenando, onde
estamos armazenando e qual a relação existente entre os dados armazenados.
Para esclarecer melhor essa questão, observe os nomes na Tabela 1, na qual serão feitas
as comparações necessárias. Você pode notar que os nomes são diferentes para cada área de
atuação, mas têm o mesmo significado em cada uma delas.
© U3 – Modelo de Dados Relacional 77
Existem algumas convenções importantes para a utilização dos nomes, quer para as tabe-
las, quer para os atributos que as constituem. Uma convenção não tem sentido obrigatório, no
entanto deve ser respeitada para evitar incompatibilidades ou erros.
Determinados SGBD, como, por exemplo, o Microsoft Access, permitem alguma flexibili-
dade com os nomes das tabelas e os nomes dos atributos, ao contrário de outros. Essa flexibili-
dade pode trazer pequenos problemas quando pretendemos realizar a migração de um SGBD em
MySQL ou Access, por exemplo, para um SGBD em Oracle.
Os SGBDs que utilizam o modelo relacional são denominados SGBD Relacionais. Algumas
convenções devem ser seguidas em um modelo relacional. Por exemplo, os nomes das tabelas
deverão ter por base as entidades que representam. É necessário que o nome de cada tabela
seja único, ou seja, não deve haver duplicação de nomes de tabelas dentro da mesma base de
dados.
Existem diferentes convenções quanto à singularidade ou pluralidade dos nomes das ta-
belas. Não importa a convenção adotada, mas é importante manter a coerência do método ado-
tado em todas as tabelas; isto é, se a opção for um nome no singular, devem-se utilizar nomes
no singular em todas as tabelas e vice-versa.
Por convenção, para os nomes, devemos utilizar unicamente letras minúsculas e o unders-
core ( _ ) para separar palavras. Underscore também é conhecido como underline.
Devemos usar abreviaturas quando necessário, por exemplo, para diminuir os nomes que
atinjam o número máximo de caracteres permitidos pelo SGBD.
Os nomes dos campos devem basear-se no nome do atributo definido no desenho lógico,
os quais devem ser únicos dentro da tabela; é necessário atenção, pois alguns SGBDs podem ser
sensíveis ao fato de o nome do campo estar escrito em maiúsculas e/ou minúsculas.
Para que você entenda alguns nomes utilizados em uma relação, veja a Figura 1. Cada
linha da relação será chamada de tupla, e cada coluna da relação será chamada de atributo. O
conjunto de valores passíveis de serem assumidos por um atributo será intitulado de domínio.
nome da relação atributos
O esquema de uma relação nada mais são que as colunas existentes em uma tabela. Já
a instância da relação consiste no conjunto de valores que cada atributo assume em um de-
terminado instante. Portanto, os dados armazenados no banco de dados são formados pelas
instâncias das relações.
Uma relação esquema R, dada por R(A1, A2, A3, ..., An), é um conjunto de atributos de R: {A1,
A2, A3, ..., An }. Cada atributo Ai possui um domínio D(Ai). O grau de uma relação é definido como
o número de atributos que ele contém.
Observando a Figura 1, podemos dizer que:
1) ALUNO (NumMec, Nome, Curso) é a relação esquema.
2) ALUNO é o nome da relação.
3) O grau da relação é 3.
4) Os domínios dos atributos são:
a) D(NumMec): números que representam o código dos alunos.
b) D(Nome): caracteres compostos de letras que formam o nome dos alunos.
c) D(Curso): caracteres que representam a sigla da disciplina.
É necessário destacar que as relações não podem ser duplicadas (não podem existir dois
códigos idênticos de alunos no conjunto de Código de Alunos), e a ordem de entrada de dados
no banco de dados não deverá ter qualquer importância para as relações, no que concerne ao
seu tratamento. Os atributos deverão ser atômicos, isto é, indivisíveis.
Tabela
A perspectiva lógica do banco de dados relacional é facilitada pela criação de relaciona-
mento de dados com base em uma estrutura conhecida como relação. Como a relação é uma
estrutura matemática, os usuários finais consideram mais fácil pensar na relação como uma
tabela, vista como uma estrutura bidimensional composta de linhas e colunas. Ela é chamada
de relação, pois o criador do modelo relacional, E. F. Codd, utilizou esse termo como sinônimo
de tabela.
Uma tabela pode conter um grupo de ocorrências de entidades relacionadas, ou seja, um
conjunto de entidades. Por exemplo, uma tabela ALUNO contém um conjunto de ocorrências de
entidades, cada uma representando um aluno.
As tabelas possuem várias características que devem ser compreendidas. Veja algumas
destas características na Tabela 2:
A tabela representada pela Figura 2 apresenta uma exemplificação que aborda as caracte-
rísticas listadas na Tabela 2.
A Figura 2 demonstra um exemplo de tabela para cadastro de ALUNOS, em que cada co-
luna representa:
STU_NUM: Número do aluno.
STU_LNAME: Sobrenome do aluno.
STU_FNAME: Primeiro nome do aluno.
STU_CLASS: Classificação do aluno.
STU_DOB: Data de nascimento do aluno.
STU_GPA: Média das notas.
STU_HRS: Créditos-hora obtidos.
STU_INIT: Letra inicial do nome do meio do aluno.
STU_PHONE: Extensão de quatro dígitos do telefone do campus.
STU_TRANSFER: Aluno que foi transferido de outra instituição.
DEPT_CODE: Código do departamento.
PROF_NUM: Número do professor que é o orientador do aluno.
De acordo com os itens enumerados na Tabela 2, e utilizando a tabela ALUNO apresentada
na Figura 2, podemos concluir que:
1) A tabela ALUNO é vista como uma estrutura bidimensional composta de sete linhas
(tuplas) e doze colunas (atributos).
2) Cada linha da tabela ALUNO descreve uma única ocorrência de entidade no interior
do conjunto de entidades (esse conjunto é representado por toda a tabela ALUNO).
Observe que a linha (entidade ou registro) definida por STU_NUM = 324561 define as
características (atributos ou campos) de um aluno chamado João C. Silva. Já a Linha 4
da Figura 2, por exemplo, descreve um aluno chamado Walter H. Ortolani; de modo si-
milar, a Linha 3 descreve uma aluna chamada Juliana Bravo. Dado o conteúdo da tabe-
la, o conjunto de entidade ALUNO inclui sete entidades (linhas) ou alunos diferentes.
3) Cada coluna representa um atributo e possui um nome diferente. Conforme pode ser
observado, não se verifica nenhuma coluna cujo nome seja repetido.
4) Todos os valores de uma coluna atendem às características do atributo. Por exemplo,
a coluna média das notas (STU_GPA) contém apenas entradas de STU_GPA em todas
as linhas da tabela, ou seja, todas as entradas são relativas unicamente à média. Os
dados devem ser classificados de acordo com seu formato e função.
Embora diferentes SGBDs possam dar suporte a diferentes tipos de dados, a maioria
aceita, pelo menos, os seguintes dados:
a) Numéricos: são aqueles com os quais é possível executar procedimentos aritméti-
cos com significado. Por exemplo, as colunas STU_HRS e STU_GPA da Figura 2 são
atributos numéricos. Por outro lado, STU_PHONE não é um atributo numérico,
pois a adição ou subtração de números telefônicos não produz um resultado arit-
meticamente significativo.
b) Caracteres: conhecidos como dados de texto ou de string, podem conter quais-
quer caracteres ou símbolos não destinados à manipulação matemática. Na Figu-
ra 2, por exemplo, as colunas STU_LNAME, STU_FNAME, STU_INIT, STU_CLASS e
STU_PHONE são atributos de caracteres.
c) Data: contêm datas de calendário armazenadas em um formato especial. Embora
o armazenamento físico da data seja insignificante para o usuário ou o projetis-
ta, esse formato permite a execução de um tipo especial de aritmética conheci-
do como aritmética das datas. Utilizando-a, é possível determinar o número de
dias que se passaram entre duas datas, como 12 de maio de 1999 e 20 de março
de 2008, simplesmente subtraindo a primeira da segunda. Na Figura 2, a coluna
STU_DOB pode ser classificada adequadamente como um atributo do tipo data. A
maioria dos SGBDs relacionais permite a personalização do formato de apresen-
tação de dados. Por exemplo, os usuários de Oracle podem especificar o formato
"dd/mmm/aaaa" para mostrar o primeiro valor de STU_DOB na Figura 2 como 12/
Fev/1975 (ao examinar os valores dessa coluna, você pode ver que esse formato
foi selecionado para a apresentação da saída).
d) Lógicos: dados lógicos podem ser apenas uma condição verdadeira ou falsa (sim
ou não). Por exemplo, um aluno é terceiro anista transferido? Na Figura 2, o atri-
buto STU_TRANSFER utiliza o formato de dados lógico, que também é conhecido
como booleano. A maioria dos pacotes de software de bancos de dados relacio-
nais suporta esse formato.
5) A faixa de valores permitidos para a coluna é conhecida como domínio. Os valores de
STU_GPA estão limitados na faixa 0-4, inclusive o domínio [0,4].
6) A ordem das linhas e das colunas é insignificante para o usuário.
7) Cada tabela deve ter uma chave primária. Em termos gerais, a chave primária (PK, do
inglês Primary Key) é um atributo (ou uma combinação de atributos) que identifica
exclusivamente uma determinada linha. Nesse caso, STU_NUM (o número do aluno) é
a chave primária. Utilizando os dados representados na Figura 2, observe que o sobre-
nome de um aluno (STU_LNAME) não seria uma boa chave primária, pois é possível
encontrar vários alunos com o sobrenome Smith, por exemplo. Mesmo a combinação
de nome (STU_FNAME) e sobrenome não constituiria uma chave primária adequada,
pois também é possível encontrar mais de um aluno chamado João Silva.
© U3 – Modelo de Dados Relacional 81
Relação
1) Conjunto não ordenado de tuplas.
2) Corresponde a entidades-tipo ou relacionamentos da base de dados.
3) É definida por esquemas do tipo R(A1, A2, A3, ..., An), em que R é o nome da relação, e
A1, A2, A3, ..., An é a lista de atributos.
4) Corresponde a uma tabela de valores.
Atributo
1) Identifica uma característica/propriedade de uma relação.
Exemplo:
R.Ai representa o atributo Ai da relação R.
Domínio
1) Conjunto de valores atômicos que caracterizam um atributo.
Exemplo:
D(Ai) representa o domínio do atributo Ai.
Tuplas
1) Sequência ordenada de valores.
2) Todas as tuplas de uma relação são diferentes, pois representam entidades ou relacio-
namentos específicos da base de dados.
3) São definidas por sequência do tipo <v1, v2, v3, ..., vi>, em que cada vi corresponde ao
valor da tupla para o atributo Ai ou valor null.
a) vi Є D(Ai) ou vi = NULL. Lê-se: vi, 1<= i <= n, ou é nulo ou pertence ao domínio D(Ai).
Figura 3 Tuplas.
STU_NUMSTU_LNAME
Fica claro que uma vez conhecido o identificador de um registro de uma tabela, é possível
identificar, a partir dele, quaisquer atributos pertinentes a esse registro. Deste modo, conhecen-
do-se STU_NUM, podemos determinar qualquer atributo pertencente a um aluno; em contra-
partida, não é possível conhecer STU_NUM a partir de STU_LNAME, pois é possível que vários
alunos tenham o mesmo sobrenome (por exemplo, Silva).
© U3 – Modelo de Dados Relacional 83
STU_NUM
STU_NUM, STU_LNAME
STU_NUM, STU_LNAME, STU_INIT
De fato, STU_NUM, com ou sem valores adicionais, pode ser uma superchave, mesmo
quando os atributos adicionais são redundantes.
Tomando como exemplo a chave composta STU_NUM, STU_LNAME, pode-se dizer que
esta é uma superchave, mas não uma chave candidata. Para que esta chave pudesse ser uma
chave candidata, teríamos que nos assegurar que não haveria nenhum sobrenome de aluno em
duplicidade na tabela ALUNO.
Portanto, a chave primária é a chave candidata escolhida para construir o identificador
exclusivo da linha. Podemos afirmar que uma chave primária é tanto uma superchave como uma
chave candidata.
A chave primária possui algumas características, tais como:
• Ser unívoca: os atributos definidos para ser chave primária, por definição, devem ter
valor único para cada registro ou tupla na relação, de modo a garantir que todas as
linhas sejam identificadas exclusivamente por essa chave. Nesse caso, diz-se que a ta-
bela apresenta integridade de entidade.
• Não nula: nenhum dos atributos que formam uma chave primária poderá conter um
valor nulo em um registro.
• Não redundante: no caso de uma chave primária ser composta, não devem ser incluí-
dos mais atributos do que os mínimos necessários para identificar os registros de modo
unívoco.
Chave estrangeira (forasteira ou externa) é todo atributo ou conjunto de atributos que é a
chave primária em outra tabela, ou seja, quando um atributo surge em mais do que uma tabela,
estamos perante um relacionamento de tuplas.
A redundância controlada faz com que o banco de dados relacional funcione. As tabelas
no banco de dados compartilham atributos comuns que permitem sua ligação. Por exemplo, ob-
serve que as tabelas PRODUTO e FORNECEDOR na Figura 4 compartilham um atributo comum
chamado VEND_CODE. Note também que o VEND_CODE com valor 232 na tabela PRODUTO
ocorre mais de uma vez, assim como o 235.
Como a tabela PRODUTO está relacionada a FORNECEDOR por meio desses valores VEND_
CODE, sua ocorrência múltipla é necessária para fazer com que o relacionamento 1:M entre
FORNECEDOR e PRODUTO funcione. Cada valor VEND_CODE da tabela FORNECEDOR é exclu-
sivo, e o FORNECEDOR é o lado 1 do relacionamento FORNECEDOR-PRODUTO. Mas qualquer
valor VEND_CODE da tabela FORNECEDOR pode ocorrer mais de uma vez na tabela PRODUTO,
evidenciando que PRODUTO é o lado M desse relacionamento. Em termos de bancos de dados,
as múltiplas ocorrências dos valores VEND_CODE na tabela PRODUTO não são redundantes,
pois são necessárias para que o relacionamento funcione.
Na Figura 4, observe que o valor VEND_CODE em uma tabela pode ser utilizado para in-
dicar o valor correspondente em outra tabela. Desta forma, além de manter-se a integridade
dos dados, evitamos repetições desnecessárias. Por exemplo, o valor VEND_CODE 235 na ta-
bela PRODUTO indica o fornecedor Henry Ortozo da tabela FORNECEDOR. Consequentemente,
descobre-se que o produto Houselite chain saw, 16-in bar (motosserra Houselite com barra de
16 polegadas) é fornecido por Henry Ortozo, o qual pode ser contatado pelo número 615-123-
5529. A mesma relação pode ser feita para o produto Steel tape, 12-ft legth (fita de aço com 12
pés de comprimento) da tabela PRODUTO.
A ligação entre as tabelas PRODUTO e FORNECEDOR da Figura 4 também pode ser repre-
sentada pelo diagrama relacional exibido na Figura 5. Nesse caso, a ligação é indicada pela linha
que conecta as tabelas.
de uma tabela relacionada (PRODUTO). Uma chave estrangeira FK (do inglês Foreign Key) é um
atributo cujos valores correspondem aos da chave primária na tabela relacionada. Por exemplo,
na Figura 5, VEND_CODE é a chave primária da tabela FORNECEDOR e aparece como chave es-
trangeira da tabela PRODUTO.
Se a chave estrangeira contém valores correspondentes ou nulos, diz-se que a tabela que
contém essa chave apresenta integridade referencial. Em outras palavras, integridade referen-
cial significa que se a chave estrangeira contém um valor, esse valor se refere a uma tupla (linha)
válida existente em outra relação.
Outras regras de integridade que podem ser aplicadas no modelo relacional são as restri-
ções not null e unique. A restrição not null pode ser aplicada a uma coluna para garantir que
todas as linhas da tabela apresentem um valor para essa coluna, enquanto a restrição unique é
aplicada a uma coluna para garantir que não haja nenhum valor duplicado.
Union
Este operador combina todas as linhas de duas tabelas, excluindo as duplicadas. As tabelas
devem apresentar as mesmas características de atributos (as colunas e os domínios devem ser
idênticos) para serem utilizadas no operador union. Um exemplo da utilização do union é apre-
sentado na Figura 6:
Intersect
O operador intersect resulta apenas em linhas que aparecem em ambas as tabelas. Assim
como no union, só se produzirão resultados se as tabelas forem compatíveis para união. Por
exemplo, não é possível utilizar intersect se um dos atributos for numérico e o outro for baseado
em caracteres. Veja o efeito do intersect apresentado na Figura 7.
Difference
O resultado deste operador será todas as linhas de uma tabela que não se encontram na
outra tabela, ou seja, uma tabela é subtraída da outra. Como no caso do union, só se produ-
zirão resultados válidos se as tabelas forem compatíveis para união. O efeito do difference é
apresentado na Figura 8. No entanto, observe que subtrair a primeira tabela da segunda não
é igual a subtrair a segunda da primeira.
F-NAME F-NAME
George Jane F-NAME
resulta em
Jane William George
DIFFERENCE
Elaine Jorge Elaiine
Wilfred Dennis Wilfred
Jorge
Figura 8 Difference.
Product
Resultará em todos os pares de linhas possíveis a partir de duas tabelas. Essa operação
também é conhecida como produto cartesiano. Portanto, se uma tabela tiver seis linhas e a ou-
tra tiver três, o product resulta em uma lista composta de 6x3=18 linhas. O efeito do product é
apresentado na Figura 9.
© U3 – Modelo de Dados Relacional 89
Select
Este operador, também conhecido como restrict, resulta nos valores de todas as linhas
de uma tabela que satisfaçam uma dada condição. O select pode ser utilizado para listar todos
os valores de linha ou apenas aqueles que atenderem a um critério especificado. Em outras
palavras, select produz um subconjunto horizontal de uma tabela, e seu efeito é apresentado na
Figura 10.
Project
A resultante deste operador será todos os valores de atributos selecionados. Em outras
palavras, o project produz um subconjunto vertical de uma tabela. Seu efeito é apresentado na
Figura 11:
Join
O operador join possibilita a combinação de informações de duas ou mais tabelas. Trata-
-se da potência real por trás dos bancos de dados relacionais, e permite a utilização de tabelas
independentes ligadas por atributos comuns. As tabelas CLIENTE e CORRETOR, apresentadas na
Figura 12, ilustram vários tipos de utilização do operador join (junções).
A junção natural (natural join) liga tabelas selecionando apenas as linhas com valores co-
muns em seu(s) atributo(s) comum(ns). É o resultado de um processo em três estágios:
a) Aplica-se o operador product nas tabelas.
b) Executa-se uma operação select sobre o resultado da Etapa a para se obter apenas as
linhas para as quais os valores AGENT_CODE são iguais. As colunas comuns são cha-
madas de colunas de junção.
c) Executa-se uma operação project sobre os resultados da Etapa b para produzir uma
única cópia de cada atributo, eliminando-se, assim, as colunas duplicadas.
O resultado da operação join entre CLIENTE e CORRETOR é demonstrado na Figura 13:
O resultado de uma junção natural produz uma tabela que não inclui pares sem corres-
pondência. O resultado fornece apenas as cópias das correspondências.
Outra forma de junção, conhecida como junção por igualdade (equijoin), tem por fina-
lidade realizar a ligação entre tabelas com base em uma condição de igualdade que compara
colunas especificadas de cada tabela. O resultado da junção por igualdade não elimina colunas
duplicadas, e a condição ou critério utilizado para unir as tabelas deve ser definido explicitamen-
te. Esse tipo de junção recebe seu nome em função do operador de comparação de igualdade
(=) utilizado na condição.
Em uma junção externa (outer join), os pares com correspondência são mantidos e os va-
lores em correspondência na outra tabela são deixados nulos. De modo mais específico, se for
realizado uma junção externa para as tabelas CLIENTE e CORRETOR, há duas situações possíveis:
• Junção externa à esquerda (left outer join): resulta em todas as linhas da tabela CLIEN-
TE, inclusive aquelas que não apresentam um valor correspondente na tabela CORRE-
TOR. Um exemplo dessa junção é apresentado na Figura 14:
• Junção externa à direita (right outer join): resulta em todas as linhas da tabela CORRE-
TOR, inclusive aquelas que não apresentam um valor correspondente na tabela CLIEN-
TE. Veja o exemplo na Figura 15:
Junções externas são especialmente úteis quando se tenta determinar qual(is) valor(es)
de tabelas relacionadas causa(m) problemas de integridade referencial. Esses problemas são
criados quando valores de chave estrangeira não correspondem a valores de chave primária
da(s) tabela(s) relacionada(s).
Você deve estar se perguntando por que as junções externas são identificadas como à
esquerda e à direita. Esses nomes se referem à ordem em que as tabelas são relacionadas no
comando SQL.
Divide
A operação divide utiliza uma tabela com uma única coluna (por exemplo, a coluna A)
como o divisor e uma tabela de duas colunas (por exemplo, as colunas A e B) como o dividendo.
As tabelas devem ter uma coluna em comum (por exemplo, a coluna A). A saída da operação
divide é uma única coluna com os valores da coluna A e as linhas da tabela de dividendo, em que
o valor da coluna comum (por exemplo, a coluna A) coincide em ambas as tabelas. A Figura 16
apresenta a operação divide:
© U3 – Modelo de Dados Relacional 93
CODE LOC
A 5
CODE LOC
A 9 Resulta em
DIVIDE A A
A 4
B
B 5
B 3
C 6
D 7
D 8
E 8
Figura 16 Divide.
Relacionamento 1:M
O relacionamento 1:M é a norma do banco de dados relacional. Para ver como esse re-
lacionamento é modelado e implementado, considere o exemplo "o PINTOR cria a PINTURA".
Compare o modelo de dados na Figura 17 com sua implementação, na Figura 18:
Relacionamento 1:1
Como o próprio nome diz, no relacionamento 1:1 uma entidade pode ser relacionada à
apenas outra entidade e vice-versa. Por exemplo, um chefe de departamento – um professor
– pode chefiar apenas um departamento, e um departamento pode ter apenas um chefe. As
entidades PROFESSOR e DEPARTAMENTO apresentam, portanto, um relacionamento 1:1.
O relacionamento 1:1 básico é modelado na Figura 19 e sua implementação é apresentada
na Figura 20.
Relacionamento M:N
Para explorar o relacionamento muitos para muitos (M:N), considere um ambiente típico
de faculdade em que cada ALUNO possa estar em várias TURMAs e cada TURMA possa conter
vários ALUNOs. O modelo ER da Figura 21 mostra esse relacionamento M:N.
Índices
Suponha que se queira localizar um livro específico em uma biblioteca. Faria sentido olhar
todos os livros até encontrar o desejado? É claro que não: utiliza-se o catálogo da biblioteca,
que apresenta índices por título, assunto e autor. O índice (tanto em um sistema manual como
em computadores) aponta para o local do livro, transformando sua localização em uma solução
rápida e simples. Um índice é uma disposição ordenada utilizada para acessar logicamente as
linhas de uma tabela.
Suponha, ainda, que você queira encontrar um assunto como, por exemplo, o modelo ER
neste livro. Faria sentido ler todas as páginas até encontrar o tópico acidentalmente? Certamen-
te não. É muito mais simples recorrer ao índice do livro, procurar a expressão modelo ER e ler
as referências que apontam para a(s) página(s) adequada(s). Em cada caso, o índice é utilizado
para localizar rapidamente um item necessário.
De modo geral, um índice é uma disposição ordenada de chaves e ponteiros. Cada chave
aponta para a localização dos dados identificados por ela.
Imagine que você queira procurar as pinturas criadas por determinado pintor no banco de
dados da Figura 24. Sem um índice, é necessário ler todas as linhas da tabela PINTURA e ver se
o atributo PAINTER_NUM corresponde ao pintor solicitado. No entanto, indexando-se a tabela
PINTOR e utilizando-se a chave de índice PAINTER_NUM, basta procurar o valor adequado desse
atributo no índice e encontrar os ponteiros correspondentes. Em termos conceituais, o índice se
assemelha à apresentação ilustrada na Figura 24.
Ao examinar a Figura 24, observe que o primeiro valor da chave de índice PAINTER_NUM
(123) encontra-se nos registros 1, 2 e 4 da tabela PINTURA da Figura 18. O segundo valor PAIN-
TER_NUM (126) encontra-se nos registros 3 e 5 dessa mesma tabela.
Os SGBDs utilizam índices para finalidades muito diferentes. Você pôde aprender que os
índices podem ser utilizados para recuperar dados de modo mais eficiente, mas os SGBDs tam-
bém podem aplicá-los para recuperar dados ordenados por um ou vários atributos específicos.
A criação de um índice de sobrenome de clientes, por exemplo, permitirá a recuperação alfabé-
tica dos dados de clientes a partir de seus sobrenomes. Além disso, a chave de índice pode ser
composta por um ou mais atributos.
Os índices executam um papel importante nos SGBDs para a implantação das chaves pri-
márias. Ao se definir a chave primária de uma tabela, o SGBD cria automaticamente um índice
exclusivo para a(s) coluna(s) dessa chave.
que traduza os conceitos de um dos modelos (DER) nos conceitos do outro (relacional). Isso pode
ser realizado de acordo com os seguintes passos:
1) Para cada tipo de entidade-forte E no diagrama entidade-relacionamento (DER), crie
um esquema de relação R que inclua todos os atributos simples de E. Sobre os atribu-
tos compostos, inclua os atributos simples que os compõem. Escolha um dos atribu-
tos-chave de E como chave primária de R. Se a chave escolhida é composta, o conjunto
dos atributos simples dessa chave forma a chave primária de R. Através do diagrama
entidade-relacionamento representado pela Figura 25, você pode identificar que o
atributo código constitui a chave primária da entidade ora nomeada de aluno, e o
atributo endereço é composto pelos atributos simples rua, número e bairro.
Idade
Telefone Rua
Endereço Número
Nome
Sexo
Nascimento
Figura 25 ALUNO (Código, Nome, Sexo, Nascimento, Rua, Número, Bairro).
CE
Figura 26 DEPENDENTE (NSS, Nome, Data_nasc, Relação, Sexo).
CE
Figura 27 DEPARTAMENTO (Nome, Número, NSS).
© U3 – Modelo de Dados Relacional 101
Nesse caso, em que a cardinalidade é 1:1, escolhe-se o lado no qual se deve colocar a
chave estrangeira. Na prática, é melhor fazer essa "escolha" no momento do DER, que deixaria
o relacionamento conforme demonstrado na Figura 28:
4) Para cada tipo de relacionamento binário R 1:M, identifique o esquema S que repre-
senta o tipo de entidade do lado M de R. Inclua como chave estrangeira de S a chave
primária do esquema T que representa o outro tipo de entidade (do Lado 1). Inclua
todos os atributos simples de R como atributos de S. Você pode perceber que, ao
realizamos o mapeamento da entidade turma, representada pela Figura 29, foi neces-
sário incluir o atributo codigo_curso, que, devido à cardinalidade 1:M, é uma chave
estrangeira que referencia a chave primária da entidade curso.
Nome
Código
(1,M) (1,1)
Curso Turma
Possui
Código
Período Letivo
Início
Término
CE
Figura 29 TURMA (Codigo_Tur, Periodo_letivo, Dta_inicio, Dta_termino, Codigo_curso).
5) Para cada tipo de relacionamento binário R M:M, crie um novo esquema de relação
S para representá-lo. Inclua como chave estrangeira de S as chaves primárias dos es-
quemas de relação que representam os tipos de entidade participantes do relacio-
namento. A combinação dessas chaves forma a chave primária de S. Inclua todos os
atributos simples de R como atributos de S. Na Figura 30, que ilustra um exemplo
de um diagrama ER, você constatará a necessidade de criarmos um novo esquema,
este identificado de professor_leciona_disciplina, que é formado pelos atributos co-
digo_prof e codigo_disc. Ambos formam a chave primária composta dessa entidade
e também são chave estrangeira, ou seja, codigo_prof referencia a chave primária da
entidade professor e codigo_disc referencia a chave primária da entidade disciplina.
Código Professor
(1,M)
Nome
Título leciona
(1,M)
Código Disciplinas
(1,M)
Nome
oferecida
CE
Figura 30 PROFESSOR_LECIONA_DISCIPLINA (Codigo_prof, Codigo_disc).
6) Para cada atributo multivalorado A, crie um novo esquema de relação R. Esse esque-
ma incluirá dois atributos: um correspondente a A e outro correspondente à chave
primária K do esquema que representa o tipo de entidade que possui A como atribu-
to. A chave primária de R é a combinação de A e K. Perceba que, quando realizamos o
mapeamento da entidade aluno, ilustrada na Figura 31, torna-se necessário a criação
de um esquema, esse identificado de telefone_aluno, formado pelos atributos codi-
go_alu e telefone, onde codigo_alu é a chave estrangeira que referencia a chave pri-
mária da entidade aluno, pelo simples fato de o atributo telefone ser multivalorado.
Idade
Telefone Rua
Endereço Número
Nome
Sexo
Nascimento
CE
Figura 31 TELEFONE_ALUNO (Codigo_alu, Telefone).
7) Para cada tipo de relacionamento m-ário R, em que M>2, crie um novo esquema de
relação S para representar R. Inclua como chaves estrangeiras em S as chaves primá-
rias dos esquemas de relação relacionados aos tipos de entidades que participam do
relacionamento. Inclua todos os atributos simples de R como atributos de S. A chave
primária de S corresponde à combinação de todas as chaves estrangeiras que referen-
ciam os esquemas de relação das entidades participantes do relacionamento. A Figura
32 representa esse tipo de relacionamento, tornando-se necessário a realização do
mapeamento do relacionamento identificado de matricula-se, que, a partir de agora,
passa a ser uma entidade, a qual é nomeada de matrícula, formada pelos atributos
© U3 – Modelo de Dados Relacional 103
Turma
Nota_B
Desempenho
Media_Final
(1,M)
(1,M) (1,M)
Aluno matricula-se Professor
cod_aluno
(1,M) cod_prof
nom_aluno
nome_prof
dta_nascimento nom_disc
carga_horaria_disc
CE CE CE CE
Figura 32 MATRICULA (Codigo_tur, Codigo_Disc, Codigo_Prof, Codigo_alu).
Nome
Idade
Código Professor
Código
(1, M) Telefone Rua
Nome
Nome
Disciplina Possui
Código
Sexo
(1, M) (1, M)
Nome
Nascimento
oferecida (1, M)
Turma (1, M)
matricula-se
(1, M)
Código Número Alunos
Note que a relação MATRICULA não tem "número de alunos", que é um atributo derivado,
ou seja, ele pode ser consultado por meio de uma pesquisa contando-se o número de alunos.
Assim, ele só existe no DER, e o mesmo acontece com a IDADE do aluno, que pode ser calculada
subtraindo sua data de nascimento da data atual.
© U3 – Modelo de Dados Relacional 105
No Passo 6, é fundamental que você localize cada atributo multivalorado e crie uma nova
relação. Dessa forma, foi criada a relação TELEFONE_ALUNO. Para a relação MATRICULA, a "data
da matrícula" fará parte da chave primária, uma vez que a MATRICULA já é uma nova relação e,
por fazer parte da chave primária, será possível cadastrar várias datas de matrícula.
O banco de dados escolar terá a seguinte estrutura:
Gabarito
Confira, a seguir, as respostas corretas para as questões autoavaliativas propostas:
6) e.
7) c.
14. CONSIDERAÇÕES
Nesta unidade, você teve a oportunidade de conhecer o Modelo Relacional, ou seja, um
Modelo de Dados Lógico para o ambiente escolar.
© U3 – Modelo de Dados Relacional 107
15. E-REFERÊNCIAS
ALVARENGA, J. P. Informática: Banco de Dados I. Disponível em :<http://pt.scribd.com/doc/34137068/9/RELACIONAL>. Acesso
em: 23 out. 2012.
DFC-UFMS. Disponível em: <http://www.dct.ufms.br/~said/disciplinas/bd/bd.html>. Acesso em: 14 jan. 2008.
1. OBJETIVOS
• Compreender os conceitos da Linguagem SQL, seu funcionamento e aplicações práti-
cas.
• Construir aplicações utilizando a Linguagem SQL.
2. CONTEÚDOS
• Linguagem SQL.
• Principais operações para atualização dos dados.
• Estrutura da Linguagem SQL.
• Aplicação da Linguagem utilizando PostgreSQL.
• Introdução à Linguagem SQL avançada.
• Introdução às Visões.
2) Para executar os comandos SQL, apresentados nesta unidade, você deverá ter insta-
lado o SGBD PostgreSQL. Veja, no Apêndice 1, todos os passos para a sua instalação.
3) Conheça o site do American National Standards Institute (ANSI), disponível em:
<http://www.ansi.org>. Acesso em: 4 out. 2012.
4) Para que você possa dar continuidade aos estudos das demais unidades, é fundamen-
tal ter pleno conhecimento dos conceitos da linguagem SQL. Para isso, sugerimos que
você pratique os exemplos apresentados no decorrer desta unidade.
5) Além dos exercícios apresentados neste estudo, consulte outras referências. Fique à
vontade para compartilhar listas de exercícios e trocar ideias sobre como resolvê-los
com seus colegas de turma e com seu tutor pela Sala de Aula Virtual.
6) Atente para algumas observações importantes para o estudo desta unidade: introdu-
ção à linguagem SQL básica e avançada e principais operações para atualização dos
dados utilizando o PostgreSQL. Recorra aos exemplos apresentados na unidade, faça
consultas usando vários recursos, pois isso torna seu aprendizado mais estimulante e
desafiador.
4. INTRODUÇÃO À UNIDADE
Na unidade 3, você teve a oportunidade de aprender que os Sistemas Gerenciadores de
Bancos de Dados baseiam-se no modelo relacional e que é, a partir dele, que se desenvolve um
modelo de banco de dados relacional, fazendo o mapeamento do modelo entidade-relaciona-
mento para o modelo relacional.
Nesta unidade, você trabalhará com a linguagem SQL, que é a linguagem utilizada para
criação e manipulação de bancos de dados a partir dos Sistemas Gerenciadores de Bancos de
Dados Relacionais.
5. LINGUAGEM SQL
A linguagem SQL (Structured Query Language – Linguagem de Consulta Estruturada) não é
uma linguagem de programação de computadores criada com o propósito de desenvolver siste-
mas, como as linguagens Pascal, C, Basic, Cobol, Java, C/C++, C#, dentre outras. Trata-se de uma
linguagem declarativa, cuja finalidade é facilitar o acesso às informações por meio de consultas,
atualizações e manipulações de dados, os quais são armazenados em bancos de dados relacionais.
A linguagem SQL foi criada pela IBM (International Business Machine) e desenvolvida pelo
PhD Donald D. Chamberlin, em 1974, com o nome Structured English Query Language (SEQUEL).
A linguagem de consulta estruturada SEQUEL foi disponibilizada para uso de um banco de dados
relacional da própria IBM, agora denominada de SEQUEL-XRM (1974-1975). Entre o período
correspondente a 1976 e 1977, a IBM realizou uma revisão da linguagem SEQUEL, nomeando-
-a de SEQUEL/2, a qual, posteriormente, passou a ser conhecida e referenciada pela sigla SQL.
Em 1979, participantes do projeto de desenvolvimento do SYSTEM/R fundaram uma em-
presa, por ocasião denominada Relational Software Inc., que disponibilizou o primeiro Sistema
de Gerenciamento de Banco de Dados Relacional Comercial, totalmente baseado na linguagem
SQL. Esse SGBD, intitulado de Oracle (o mesmo Oracle atualmente conhecido), foi pioneiro na
forte concorrência junto à IBM.
Entre 1980 e 1981, a IBM implementou a linguagem SQL nos seus Sistemas de Geren-
ciamento de Bancos de Dados Comerciais (BD2 – DataBase2 e SQL/Data), garantindo que essa
linguagem de consulta estruturada SQL se tornasse um padrão.
© U4 – SQL – Uma Linguagem de Consulta 111
6. HISTÓRICO DO POSTGRESQL
O software PostgreSQL é um Sistema de Gerenciamento de Banco de Dados Objeto-Rela-
cional (SGBDOR), desenvolvido no Departamento de Ciência da Computação da Universidade da
Califórnia, em Berkeley. Sua distribuição é realizada em regime open source, como uma conside-
rável alternativa aos Sistemas de Gerenciamento de Banco de Dados Oracle, SQL Server, MySQL,
dentre outros.
No início de 1987, com objetivo de demonstrar o SGBD, uma versão preliminar foi liberada.
Entretanto, foi apenas no final de 1987 que ocorreu a liberação da versão 1.0 na Conferência ACM-
-SIGMOD, para um grupo restrito de usuários. Em 1990, a versão 2.0 foi liberada com inúmeras
melhorias em relação à primeira versão. A última versão oficial (versão 4.2) foi desenvolvida pela
Universidade da Califórnia em Berkeley. Andrew Yu e Jolly Chen, em 1994, incluíram ao SGBD um
interpretador da linguagem SQL, lançando um novo produto, ora nomeado de Postgres95.
O SGBD Postgres95 decolou rapidamente pelo fato de ter sido liberado livremente pela
internet e por apresentar melhor desempenho (cerca de 30% a 50%) comparado ao Postgres4.2.
Devido à associação do nome ao ano de 1995 (Postgres95), o grupo de desenvolvimento decidiu
alterar seu nome para PostgreSQL, nome pelo qual é conhecido atualmente. A versão utilizada
nesta obra para o Sistema de Gerenciamento de Banco de Dados PostgreSQL é a versão 9.0,
disponibilizada em setembro de 2011.
por meio da autenticação (login), utilizando o usuário root, nomeado de Postgres, e informar o
respectivo password, configurado na instalação do SGBD (conforme Anexo 1).
O primeiro passo para o desenvolvimento de um banco de dados é definir seu esquema.
Para isso, utiliza-se o comando CREATE DATABASE.
Exemplo:
CREATE DATABASE NOME
[ARGUMENTOS]
Em que:
1) Apenas o valor da variável NOME é obrigatório (representa o nome do banco de dados
(database) que será criado).
a) NOME: espaços em branco e caracteres especiais devem ser evitados.
2) Argumentos opcionais podem ser usados, como:
a) OWNER: usuário responsável pelo banco de dados que será criado.
b) TEMPLATE: permite criar um banco de dados seguindo um modelo estrutural pre-
existente.
c) ENCODING: indica qual o conjunto de caracteres que o banco de dados utilizará
(moeda corrente e acentuação).
d) TABLESPACE: define a qual tablespace este banco de dados pertencerá.
e) CONNECTION LIMIT: permite limitar o número de conexões simultâneas (-1 cor-
responde a infinitas conexões).
Exemplo:
CREATE DATABASE "FACULDADE"
TEMPLATE = TEMPLATE0
ENCODING 'WIN1252'
CONNECTION LIMIT -1;
Exemplo:
SELECT VERSION();
Imagine, agora, que necessitamos obter informações sobre a data atual do SGBD. De acor-
do com o exemplo a seguir, podemos extrair esse tipo de informação utilizando a instrução
SELECT CURRENT_DATE, obtendo, assim, a informação da data de acordo com as regras norte-
-americanas (AAAA-MM-DD), em que AAAA corresponde ao ano, MM ao mês e DD ao dia.
Exemplo:
SELECT CURRENT_DATE;
Exibida a data, seria também oportuno obter a hora atual do servidor (SGBD), por meio da
instrução SELECT CURRENT_TIME, formada pelo comando SELECT e a função CURRENT_TIME.
Observe que a hora será exibida no formato HH:MM:SS, em que HH corresponde às horas, MM
aos minutos e SS aos segundos.
Exemplo:
SELECT CURRENT_TIME;
A função NOW() é utilizada para exibir a data e a hora simultaneamente, podendo ser uti-
lizada junto à instrução SELECT, formando o comando SELECT NOW().
Exemplo:
SELECT NOW();
Além das informações de data e hora (NOW()), hora atual do servidor (CURRENT_TIME)
e versão atual do servidor de banco de dados (VERSION()), é permitido, também, extrairmos
informações sobre o usuário atual conectado no banco de dados, por meio da instrução SQL.
Veja a seguir:
Exemplo:
SELECT CURRENT_USER();
Calculadora do PostgreSQL
Por meio da instrução SELECT, o PostgreSQL permite a realização de diversas operações
aritméticas como adição (+), subtração (-), multiplicação (*), divisão (/) e resto de divisão (%). O
comando a seguir obtém o resultado de quatro operações aritméticas em uma única instrução
SELECT. Podemos lançar uso de parênteses, alterando a prioridade com que as operações serão
executadas.
Exemplo:
O nome da tabela é a indicação do nome da tabela a ser criada no banco de dados, co-
luna1 e coluna2 (campo) são a indicação dos nomes dos campos a serem definidos e tipo de
dados define o tipo de dado a partir de uma lista de tipos padrão.
O PostgreSQL trabalha com diversos tipos de dados, classificados de acordo com o con-
teúdo que será utilizado em uma determinada coluna. Os principais tipos de dados suportados
pelo nosso SGBD, ou seja, os tipos de dados (atributos) mais usuais podem ser visualizados no
Quadro 1.
A partir de agora, já podemos definir uma grande variedade de campos para a construção
das tabelas utilizadas na disciplina. Em nosso banco de dados, identificado como FACULDADE,
será criado um conjunto de tabelas, conforme visualizado no modelo disposto na Figura 1.
© U4 – SQL – Uma Linguagem de Consulta 117
Dê um duplo clique com o botão esquerdo do mouse sobre qualquer um dos ícones em
destaque. Esse procedimento exibirá a interface do pgAdmin III, como demonstrado na Figura 3.
É necessário conectarmos no SGBD; para isso, dê um clique com o botão direito do mouse
sobre o servidor, nomeado PostgreSQL 9.0 (localhost:5432), selecionando a opção connect/
conectar ou apenas dê um duplo clique com o botão esquerdo do mouse. Na sequência, será ne-
cessário informar a senha fornecida na instalação do PostgreSQL, conforme exibido na Figura 4.
Após obtermos êxito na conexão com o nosso SGBD, uma tela semelhante à Figura 5 será
exibida. Perceba que existe apenas um banco de dados (database/esquema) em nosso servidor,
chamado postgres. Selecione o banco de dados postgres e clique com o botão esquerdo do
mouse sobre o ícone Query Tool (Ctrl + E).
© U4 – SQL – Uma Linguagem de Consulta 119
Após a criação da sessão SQL para o banco de dados postgres, podemos criar um novo
banco de dados (schema/database): indique o nome e seus principais argumentos, conforme
exemplificado na Figura 6:
Figura 6 Tela de digitação de comandos SQL no pgAdmin III / Criação de um novo banco de dados.
Após clicar no botão/ícone Execute Query (F5), o banco de dados será criado, e a tela será
semelhante à exibida na Figura 7.
Para criar os objetos (tabelas), selecione o banco de dados FACULDADE e clique com o bo-
tão esquerdo do mouse sobre o ícone Query Tool (Ctrl + E), criando uma nova sessão SQL, agora
para o banco de dados FACULDADE. A partir daí, podemos inserir os comandos SQL a serem
aplicados para o banco de dados corrente (atual).
O primeiro objeto a ser criado para o banco de dados FACULDADE será a tabela respon-
sável pelo armazenamento de dados oriundos dos clientes, ora identificada de CLIENTES. Na
Tabela 2 podemos identificar os detalhes da estrutura da tabela CLIENTES.
Tabela 2 Clientes.
CAMPO TIPO DESCRIÇÃO
ID_CLIENTE integer Identificador do cliente (não nulo)
NM_CLIENTE varchar(10) Nome do cliente (não nulo)
SOBRENOME varchar(10) Sobrenome do cliente (não nulo)
DT_NASCIMENTO timestamp Data de nascimento do cliente
TELEFONE varchar(12) Telefone do cliente
FG_ATIVO integer Status do cliente (ativo/inativo)
Chave Primária Campo/Atributo ID_CLIENTE
© U4 – SQL – Uma Linguagem de Consulta 121
O campo/atributo ID_CLIENTE será definido como chave primária, fazendo com que não
seja permitido inserir dois clientes com o mesmo código. Eventualmente, caso deseje definir
uma tabela com mais de um campo contendo registros exclusivos (únicos), basta utilizar a cláu-
sula UNIQUE.
Em seguida, será criada a tabela CLIENTES a partir da interface do pgAdmin III, utilizada
anteriormente para a criação do banco de dados FACULDADE. Escreva a sequência de instruções
exatamente como nos comandos a seguir, dentro da sessão SQL do banco de dados FACULDADE.
Para criar a tabela (essa e as próximas que serão apresentadas), clique no botão/ícone Execute
Query (F5), como demonstrado na Figura 8.
Figura 8 Tela de digitação do comando SQL no pgAdmin III / Criação da tabela CLIENTES.
A segunda tabela a ser criada em nosso banco de dados será a tabela responsável pelo
armazenamento de dados pertinentes aos tipos de produtos vendidos, nomeada TIPOS_PRO-
DUTOS. Observe, na Tabela 3, a estrutura da tabela TIPOS_PRODUTOS:
Figura 9 Tela de digitação do comando SQL no pgAdmin III / Criação da tabela TIPOS_PRODUTOS.
A terceira tabela a ser criada em nosso banco de dados armazenará os dados referentes
aos produtos comercializados, a qual identificaremos como PRODUTOS. Observe, na Tabela 4, a
estrutura da tabela PRODUTOS.
Tabela 4 Produtos.
CAMPO TIPO DESCRIÇÃO
ID_PRODUTO integer Identificador do produto (não nulo)
ID_TIPO_PRODUTO integer Identificador do tipo do produto (não nulo)
© U4 – SQL – Uma Linguagem de Consulta 123
Figura 10 Tela de digitação do comando SQL no pgAdmin III / Criação da tabela PRODUTOS.
Veja que na Tabela 4 foram indicadas uma chave primária e uma chave estrangeira. A cha-
ve primária é uma chave primária simples, ou seja, composta por apenas um campo/atributo,
ID_PRODUTO. O campo ID_TIPO_PRODUTO é a chave estrangeira, definida por meio da cláusula
FOREIGN KEY.
Para especificar por qual tabela a chave estrangeira foi criada, utilizamos REFERENCES,
permitindo que o SGBD aceite apenas valores pré-cadastrados no campo indicado da tabela
referenciada.
A tabela FUNCIONARIOS será a quarta tabela a ser criada em nosso banco de dados. Essa
tabela será responsável por armazenar dados referentes aos funcionários. Observe a estrutura
utilizada para a tabela FUNCIONARIOS:
Tabela 5 Funcionários.
CAMPO TIPO DESCRIÇÃO
ID_FUNCIONARIO integer Identificador do funcionário (não nulo)
ID_GERENTE integer Identificador do gerente
NM_FUNCIONARIO varchar(10) Nome do funcionário (não nulo)
SOBRENOME_FUNCIONARIO varchar(10) Sobrenome do funcionário (não nulo)
CARGO varchar(20) Cargo do funcionário
SALARIO numeric(6,0) Salário do funcionário
FG_ATIVO integer Status do tipo do produto (ativo/inativo)
Chave Primária Campo/Atributo ID_FUNCIONARIO
A quinta tabela a ser criada em nosso banco de dados armazenará dados referentes às
compras efetuadas pelos clientes. Vamos identificar esta tabela como COMPRAS. A estrutura da
tabela pode ser visualizada na Tabela 6.
Tabela 6 Compras.
CAMPO TIPO DESCRIÇÃO
ID_PRODUTO integer Identificador do produto (não nulo)
ID_CLIENTE integer Identificador do cliente (não nulo)
QUANTIDADE integer Representa a quantidade de produtos comprados
FG_ATIVO integer Status do tipo do produto (ativo/inativo)
Chaves Primárias Campo/Atributo ID_PRODUTO e ID_CLIENTE
Chaves Estrangeiras Campo/Atributo ID_ PRODUTO e ID_CLIENTE
Em seguida, para criar a tabela definitivamente, insira as instruções dentro da sessão SQL
do banco de dados FACULDADE. Clique no botão/ícone Execute Query (F5), como demonstrado
na Figura 12.
Nessa tabela foi indicada uma chave primária composta (constituída por dois campos/
atributos), em que as mesmas também são chaves estrangeiras. A chave primária é uma chave
composta pelos campos ID_PRODUTO e ID_CLIENTE. Os campos ID_PRODUTO e ID_CLIENTE são
chaves estrangeiras, definidas pela cláusula FOREIGN KEY.
A palavra-chave REFERENCES é utilizada para indicar que uma referência (vínculo) foi cria-
da, fazendo com que o SGBD somente aceite valores previamente cadastrados no campo indi-
cado da tabela referenciada.
A tabela GRADES_SALARIOS é a sexta e última tabela pertinente ao nosso banco de dados
FACULDADE. Essa tabela armazenará informação dos limites salariais mínimos e máximos. Ob-
serve, na Tabela 7, a estrutura da tabela GRADES_SALARIOS:
Para finalizar a criação dos objetos (tabelas), escreva a sequência de instruções dentro
da sessão SQL do banco de dados FACULDADE. Clique no botão/ícone Execute Query (F5) para
consolidar a criação da tabela, como demonstrado na Figura 13.
Quando se cria uma tabela, o PostgreSQL, automaticamente, cria o índice para cada cha-
ve primária (PRIMARY KEY). Contudo, existem situações em que se faz necessária a criação de
outro índice para que o SGBD possa realizar pesquisas no banco de dados mais rapidamente. É
o caso, por exemplo, de quando se cria um índice para a coluna NM_FUNCIONARIO na tabela
FUNCIONARIOS, pois, certamente, serão realizadas pesquisas pelo nome dos funcionários. Va-
mos explorar, em detalhes e em um tópico exclusivo, a criação e gerenciamento de índices em
tabelas no PostgreSQL.
Cada valor informado no comando INSERT deve ser do mesmo tipo do campo respectivo,
ou seja, se o primeiro campo do comando for do tipo integer, o primeiro valor deverá ser do tipo
integer. Se o segundo campo for do tipo date, o segundo valor também deverá ser do tipo date
e, assim, sucessivamente. Se essa regra não for obedecida, o SGBD emitirá uma mensagem de
erro e não efetuará a inserção. Podemos tornar as operações permanentes usando a instrução
COMMIT e/ou desfazê-las com a instrução ROLLBACK.
Após a exposição de alguns detalhes sobre a instrução INSERT, podemos adicionar algu-
mas tuplas/linhas para as tabelas CLIENTES, TIPOS_PRODUTOS, PRODUTOS, COMPRAS, FUN-
CIONARIOS e GRADES_SALARIOS .
Exemplo:
Sintaxe
UPDATE <TABELA> SET
CAMPO1 = VALOR1,
CAMPO2 = VALOR2,
(...)
CAMPOn = VALORn
WHERE <CONDIÇÃO LÓGICA>
© U4 – SQL – Uma Linguagem de Consulta 131
Exemplo:
UPDATE CLIENTES
SET SOBRENOME = 'Queiroz'
WHERE ID_CLIENTE = 2;
SELECT id_cliente,
nm_cliente,
sobrenome,
dt_nascimento,
telefone
FROM clientes;
SELECT *
FROM clientes;
SELECT *
FROM clientes
WHERE id_cliente = 2;
Exemplo:
DELETE
FROM clientes
WHERE id_cliente = 3;
Observe que serão removidos todos os registros (tuplas/linhas) cujo resultado da condi-
ção lógica for verdadeiro (cláusula WHERE).
Cálculos Aritméticos
A maioria dos SGBDs permite a realização de cálculos em instruções SQL usando expres-
sões aritméticas, as quais consistem em dois operandos (números ou datas) e um operador
aritmético.
Os quatro operadores aritméticos são:
OPERADOR DESCRIÇÃO
+ Adição
- Subtração
* Multiplicação
/ Divisão
Nos exemplos a seguir, você verá a instrução proposta e, logo após, o resultado da execução.
Como primeiro exemplo do uso de cálculos em instruções SQL, utilizaremos o operador
de multiplicação (*) para calcular 2 multiplicado por 6. Os números 2 e 6 são os operandos.
Observe:
SELECT 2 * 6;
?column?
12
?column?
39
?column?
30
Além dos cálculos aritméticos efetuados nos exemplos anteriores, é permitido utilizar
operadores de adição e subtração com datas, como adicionar um número, representando um
determinado número de dias a uma data.
Para exemplificar, somaremos dois dias a 25 de julho de 2011, exibindo a data resultante:
SELECT DATE('25-JUL-2011') + 2;
?column?
27/07/2011
SELECT DATE('02/08/2011') - 3;
?column?
30/07/2011
Agora, subtrairemos uma data de outra, produzindo o número de dias entre elas. Para
isso, subtrairemos 01 de janeiro de 2011 de 31 de maio de 2011.
?column?
150
SELECT nm_produto,
preco + 2.00
FROM produtos;
© U4 – SQL – Uma Linguagem de Consulta 135
nm_produto ?column?
Ciência Moderna 21.95
Química 32.00
Supernova 27.99
Tanque de Guerra 15.95
SELECT nm_produto,
preco * 3 + 1
FROM produtos;
nm_produto ?column?
Ciência Moderna 60.85
Química 91.00
Supernova 78.97
Tanque de Guerra 42.85
SELECT nm_produto,
preco,
preco * 2 DOBRO_PREÇO
FROM produtos;
Para preservar a caixa do texto (maiúsculo e minúsculo) e usar espaços em nomes com-
postos do seu nome alternativo (apelido), basta envolvê-lo entre aspas duplas, conforme o
exemplo a seguir:
SELECT nm_produto,
preco,
preco * 2 "DoBrO dO PrEço"
FROM produtos;
Resultado da Expressão
30
Valores Nulos
Como podemos identificar um valor desconhecido (valor nulo) no banco de dados? Um
valor nulo não é uma string em branco, e sim um valor único cujo significado do valor da coluna
é desconhecido. Observe o exemplo a seguir: o cliente correspondente ao Número 4 tem um
valor nulo na coluna DT_NASCIMENTO, e o cliente identificado com o Número 5 tem um valor
nulo na coluna TELEFONE. Vamos consultar novamente a tabela CLIENTES para constatar essa
afirmativa:
SELECT *
FROM clientes;
Para verificar a existência de valores nulos, utilizamos IS NULL. Na instrução SELECT, a se-
guir, o cliente correspondente ao Número 4 é recuperado, pois seu valor da DT_NASCIMENTO é
um valor nulo:
SELECT id_cliente,
nm_cliente,
sobrenome,
dt_nascimento
FROM clientes
WHERE dt_nascimento IS NULL;
Em outro exemplo, o cliente cujo número equivale a 5 é recuperado, pois seu valor perti-
nente à coluna TELEFONE também corresponde a um valor nulo:
SELECT id_cliente,
nm_cliente,
sobrenome,
telefone
FROM clientes
WHERE telefone IS NULL;
SELECT id_cliente
FROM compras;
ID_CLIENTE
1
2
1
2
1
É possível identificar que alguns clientes fizeram mais de uma compra e, portanto, apare-
cem duplicados.
ID_CLIENTE
1
2
Comparando Valores
Para explorarmos o uso dos operadores de comparação, citaremos os mais usuais no Qua-
dro 3:
OPERADOR DESCRIÇÃO
= Igual
<> ou != Diferente
< Menor que
> Maior que
<= Menor ou igual a
>= Maior ou igual a
ANY Compara um valor com qualquer valor em uma lista
SOME Idêntico ao operador ANY (você deve usar ANY "mais legível")
ALL Compara um valor com todos os valores em uma lista
SELECT *
FROM clientes
WHERE id_cliente <> 2;
ID_PRODUTO NM_PRODUTO
3 Supernova
4 Tanque de Guerra
No próximo exemplo, o operador <= (menor ou igual a) é utilizado para recuperar os pro-
dutos da tabela PRODUTOS, cujos valores pertinentes à coluna ID_PRODUTO sejam <= (menor
ou igual a) ao Número 3.
ID_PRODUTO NM_PRODUTO
1 Ciência Moderna
2 Química
3 Supernova
Agora, o operador ANY será utilizado em uma cláusula WHERE para comparar um valor
com qualquer um dos valores de uma lista. Como pré-requisito, devemos inserir um operador,
=, <>, <, >, <= ou >=, antes de ANY. Veja como recuperar as tuplas/linhas da tabela CLIENTES,
onde os valores correspondentes à coluna ID_CLIENTE sejam maiores do que qualquer um dos
valores 2, 3 ou 4:
SELECT *
FROM clientes
WHERE id_cliente > ANY (SELECT id_cliente
FROM clientes
WHERE id_cliente = 2
OR id_cliente = 3
OR id_cliente = 4);
Usamos uma subconsulta (subquery) para recuperar a lista de valores pertinentes aos
identificadores dos clientes.
O operador ALL é utilizado na cláusula WHERE para comparar um determinado valor com
todos os valores de uma lista. Semelhante ao ANY, é necessário inserir um operador (=, <>, <, >,
<= ou >=) antes do ALL. Recuperaremos as tuplas/linhas da tabela CLIENTES, onde o valor asso-
ciado à coluna ID_CLIENTE seja maior do que os valores 2, 3 ou 4:
SELECT *
FROM clientes
WHERE id_cliente > ALL (SELECT id_cliente
FROM clientes
WHERE id_cliente = 2
OR id_cliente = 3
OR id_cliente = 4);
Idêntico ao exemplo anterior, lançamos uso de uma subconsulta (subquery) a fim de re-
cuperar uma lista de valores, os quais serão utilizados para comparar os identificadores dos
clientes.
OPERADOR DESCRIÇÃO
LIKE Corresponde a padrões em strings
IN Corresponde a listas de valores
BETWEEN Corresponde a um intervalo de valores
IS NULL Corresponde a valores nulos
SELECT *
FROM clientes
WHERE nm_cliente LIKE '_o%';
%\\%%
O caractere de escape (barra invertida) diz ao banco de dados como diferenciar os ca-
racteres a serem pesquisados dos caracteres curingas. O primeiro caractere % é tratado como
curinga, correspondendo a qualquer número de caracteres; o segundo % é tratado como um
caractere real a ser procurado; e, por fim, o terceiro caractere % é tratado como curinga, corres-
pondendo a qualquer número de caracteres.
Antes mesmo de aplicarmos um exemplo pertinente ao uso do caractere de escape, cria-
remos uma nova tabela em nosso banco de dados e, na sequência, serão inseridos alguns regis-
tros para essa tabela. Observe:
Agora, com a estrutura pronta, podemos utilizar o caractere de escape para procurar o
padrão '%\\%%' na coluna NOME, da tabela PROMOCAO:
SELECT *
FROM promocao
WHERE nome LIKE '%\\%%';
Para recuperar tuplas/linhas cujo valor da coluna esteja em uma lista de valores, utiliza-
mos o operador IN em uma cláusula WHERE. Por exemplo, podemos recuperar as tuplas/linhas
da tabela CLIENTES, em que os valores associados à coluna ID_CLIENTE corresponda aos Núme-
ros 2, 3 ou 5:
SELECT *
FROM clientes
WHERE id_cliente IN (2, 3, 5);
SELECT *
FROM clientes
WHERE id_cliente NOT IN (2, 3, 5);
Devemos observar que NOT IN retornará falso se o valor que estiver na lista for nulo. O
próximo exemplo não recupera nenhuma tupla/linha, pois o valor nulo está incluído na lista:
SELECT *
FROM clientes
WHERE id_cliente NOT IN (2, 3, 5, NULL);
O operador BETWEEN também é utilizado em uma cláusula WHERE, cujo objetivo é recu-
perar as tuplas/linhas onde o valor vinculado à coluna encontra-se em um determinado inter-
valo. O intervalo inclui valores das duas extremidades. Para exemplificar o uso do operador BE-
TWEEN, recuperaremos as tuplas/linhas da tabela CLIENTES, onde valores da coluna ID_CLIENTE
estejam entre o intervalo de 1 a 3:
SELECT *
FROM clientes
WHERE id_cliente BETWEEN 1 AND 3;
Similar ao operador IN, o BETWEEN também permite realizar a forma negativa, ou seja, re-
cuperar as tuplas/linhas não recuperadas no exemplo anterior, por meio do uso de NOT BETWEEN.
© U4 – SQL – Uma Linguagem de Consulta 143
SELECT *
FROM clientes
WHERE id_cliente NOT BETWEEN 1 AND 3;
OPERADOR DESCRIÇÃO
x AND y Retorna verdadeiro quando x e y são verdadeiros
x OR y Retorna verdadeiro quando x ou y são verdadeiros
NOT x Retorna verdadeiro se x for falso e retorna falso se x for verdadeiro
SELECT *
FROM clientes
WHERE dt_nascimento > '01/01/1970'
AND id_cliente > 3;
Para exemplificar o uso do operador OR, nossa próxima consulta recuperará as tuplas/
linhas da tabela CLIENTES, onde uma das duas condições é verdadeira:
• 1ª condição: valores da coluna DT_NASCIMENTO maior que 1º de janeiro de 1970.
• 2ª condição: valores da coluna ID_CLIENTE maior do que 3.
SELECT *
FROM clientes
WHERE dt_nascimento > '01/01/1970'
OR id_cliente > 3;
Quando você for utilizar os dois operadores, ou seja, mesclar AND e OR em uma mesma
expressão, AND terá precedência sobre OR (no caso, ter precedência significa ser executado
primeiro). Operadores de comparação terão precedência sobre AND. Caso deseje anular essa
precedência, faça uso de parênteses, o qual indicará a ordem de execução das expressões. A fim
de demonstrar o uso da mesclagem de operadores, o exemplo a seguir recupera as tuplas/linhas
da tabela CLIENTES, onde uma das três condições é verdadeira:
• 1ª condição: valores da coluna DT_NASCIMENTO maior que 1º de janeiro de 1970.
• 2ª condição: valores da coluna ID_CLIENTE menor que 2.
• 3ª condição: valores da coluna TELEFONE deverão possuir o número 1211 no final.
SELECT *
FROM clientes
WHERE dt_nascimento > '01/01/1970'
OR id_cliente < 2
AND telefone LIKE '%1211';
A cláusula ORDER BY
A cláusula ORDER BY é usada para classificar as tuplas/linhas recuperadas por uma consul-
ta. Pode especificar uma ou mais colunas nas quais os dados serão classificados.
Em nosso primeiro exemplo, usaremos a cláusula ORDER BY para classificar por SOBRENO-
ME as tuplas/linhas recuperadas da tabela CLIENTES:
SELECT *
FROM clientes
ORDER BY sobrenome;
A palavra-chave DESC pode ser utilizada para classificar as colunas em ordem decrescente, e
a palavra-chave ASC para especificar, explicitamente, uma classificação crescente (padrão/default).
No segundo exemplo, a cláusula ORDER BY é utilizada para classificar as tuplas/linhas re-
cuperadas da tabela CLIENTES por NM_CLIENTE em ordem crescente e SOBRENOME em ordem
decrescente:
SELECT *
FROM clientes
ORDER BY nm_cliente ASC, sobrenome DESC;
© U4 – SQL – Uma Linguagem de Consulta 145
O número da posição de coluna na cláusula ORDER BY pode ser utilizado para indicar qual
coluna deve ser classificada. Utilize 1 para classificar pela primeira coluna, 2 para classificar pela
segunda coluna, e assim sucessivamente. Para exemplificar o uso do ORDER BY posicional, a co-
luna ID_CLIENTE, que em nosso caso corresponde à primeira coluna (1), é usada para classificar
as tuplas/linhas recuperadas da tabela CLIENTES:
Junção (Join)
Quando trabalhamos em um banco de dados normalizado, é comum manipularmos in-
formações armazenadas em diversas tabelas simultaneamente. Como exemplo, podemos citar
a necessidade de obter o nome do produto e o nome do tipo de produto. As tabelas PRODU-
TOS e TIPOS_PRODUTOS são relacionadas entre si por meio da coluna de chave estrangeira
ID_TIPO_PRODUTO. A coluna ID_TIPO_PRODUTO (chave estrangeira – foreign key) da tabela
PRODUTOS aponta para a coluna ID_TIPO_PRODUTO (chave primária – primary key) da tabela
TIPOS_PRODUTOS.
Para ilustrar melhor a necessidade de realizar uma junção entre tabelas, segmentaremos
as informações que necessitamos, recuperando nessa instrução SELECT apenas as colunas NM_
PRODUTO e ID_TIPO_PRODUTO da tabela PRODUTOS para o produto cujo identificador corres-
ponda ao Número 3:
NM_PRODUTO ID_TIPO_PRODUTO
Supernova 2
SELECT ds_tipo_produto
FROM tipos_produtos
WHERE id_tipo_produto = 2;
DS_TIPO_PRODUTO
Vídeo
Agora que você entendeu a necessidade de realizar a junção de duas tabelas (PRODUTOS
e TIPOS_PRODUTOS), já estamos prontos para recuperar o nome do produto e a descrição do
tipo de produto usando apenas uma consulta, por meio de uma junção (JOIN). É simples: basta
incluirmos as duas tabelas na cláusula FROM da consulta e incluir as colunas relacionadas de
cada tabela na cláusula WHERE.
Exemplo:
E na cláusula WHERE:
SELECT produtos.nm_produto,
tipos_produtos.ds_tipo_produto
FROM produtos, tipos_produtos
WHERE produtos.id_tipo_produto = tipos_produtos.id_tipo_produto
AND produtos.id_produto = 3;
NM_PRODUTO DS_TIPO_PRODUTO
Supernova Vídeo
© U4 – SQL – Uma Linguagem de Consulta 147
Para darmos prosseguimento aos nossos exemplos de junção entre tabelas, será necessá-
rio incluirmos mais registros na tabela PRODUTOS, conforme as instruções INSERT. Veja a seguir:
Como segundo exemplo do uso de junção entre tabelas, realizaremos a junção entre as
tabelas PRODUTOS e TIPOS_PRODUTOS, obtendo todos os produtos ordenados pela coluna
NM_PRODUTO:
SELECT produtos.nm_produto,
tipos_produtos.ds_tipo_produto
FROM produtos, tipos_produtos
WHERE produtos.id_tipo_produto = tipos_produtos.id_tipo_produto
ORDER BY produtos.nm_produto;
NM_PRODUTO DS_TIPO_PRODUTO
2412: O Retorno Vídeo
Arquivos Z Vídeo
Ciência Moderna Livro
De outro planeta DVD
Força G DVD
Música clássica CD
NM_PRODUTO DS_TIPO_PRODUTO
Pop 3 CD
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Yell criativo CD
Observe que o produto My Front Line encontra-se ausente das tuplas/linhas resultantes.
Isso se deve ao fato de que o valor correspondente ao ID_TIPO_PRODUTO para essa tupla/linha
de produto corresponde a um valor nulo e a condição da junção (JOIN) não retorna o registro.
Como solução, é necessário utilizar uma junção externa (OUTER JOIN), recurso explorado ainda
nesse tópico.
A sintaxe de junção (JOIN) vista até o momento utiliza a sintaxe no padrão SQL/86 ANSI.
Para facilitar nossa vida quanto à realização de junção, a SQL permite utilizarmos apelidos
(alias) para as tabelas. Isso significa que podemos inserir nomes alternativos nas tabelas, por
exemplo: as tabelas PRODUTOS e TIPOS_PRODUTOS nas cláusulas SELECT e WHERE, evitando,
assim, a digitação redundante do nome das tabelas.
A consulta a seguir utiliza o apelido p para referenciar a tabela PRODUTOS e tp para refe-
renciar a tabela TIPOS_PRODUTOS.
NM_PRODUTO DS_TIPO_PRODUTO
2412: O Retorno Vídeo
Arquivos Z Vídeo
Ciência Moderna Livro
De outro planeta DVD
Força G DVD
Música clássica CD
Pop 3 CD
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Yell criativo CD
Produto Cartesiano
A ausência da condição JOIN promove a união de todas as tuplas/linhas de uma tabela
com todas as tuplas/linhas da outra tabela. Esse conjunto resultante é nomeado de produto
cartesiano.
Imagine que exista uma Tabela A contendo 50 tuplas/linhas, e uma segunda Tabela B con-
tendo 100 tuplas/linhas. Se selecionássemos as colunas das duas tabelas sem uma condição de
junção adequada (JOIN), obteríamos, como resultado, 5000 tuplas/linhas (cada linha da Tabela
A seria juntada a cada linha da Tabela B).
© U4 – SQL – Uma Linguagem de Consulta 149
A fim de elucidar melhor este exemplo, utilizaremos nosso cenário (banco de dados FA-
CULDADE) para apresentar um subconjunto das tuplas/linhas de um produto cartesiano entre
as tabelas PRODUTOS e TIPOS_PRODUTOS:
NM_PRODUTO DS_TIPO_PRODUTO
Ciência Moderna Livro
Química Livro
Supernova Livro
Tanque de Guerra Livro
Arquivos Z Livro
2412: O Retorno Livro
Força G Livro
De outro planeta Livro
Música clássica Livro
Pop 3 Livro
Yell criativo Livro
My Front Line Livro
Ciência Moderna Vídeo
Química Vídeo
Supernova Vídeo
Tanque de Guerra Vídeo
Arquivos Z Vídeo
2412: O Retorno Vídeo
Força G Vídeo
De outro planeta Vídeo
Música clássica Vídeo
Pop 3 Vídeo
Yell criativo Vídeo
My Front Line Vídeo
Ciência Moderna DVD
Química DVD
Supernova DVD
Tanque de Guerra DVD
Arquivos Z DVD
2412: O Retorno DVD
Força G DVD
De outro planeta DVD
Música clássica DVD
Pop 3 DVD
Yell criativo DVD
My Front Line DVD
Ciência Moderna CD
Química CD
Supernova CD
NM_PRODUTO DS_TIPO_PRODUTO
Tanque de Guerra CD
Arquivos Z CD
2412: O Retorno CD
Força G CD
De outro planeta CD
Música clássica CD
Pop 3 CD
Yell criativo CD
My Front Line CD
Ciência Moderna Revista
Química Revista
Supernova Revista
Tanque de Guerra Revista
Arquivos Z Revista
2412: O Retorno Revista
Força G Revista
De outro planeta Revista
Música clássica Revista
Pop 3 Revista
Yell criativo Revista
My Front Line Revista
SELECT c.nm_cliente,
c.sobrenome,
p.nm_produto AS PRODUTO,
tp.ds_tipo_produto AS TIPO
FROM clientes c, compras co, produtos p, tipos_produtos tp
WHERE c.id_cliente = co.id_cliente
AND p.id_produto = co.id_produto
AND p.id_tipo_produto = tp.id_tipo_produto
ORDER BY p.nm_produto;
© U4 – SQL – Uma Linguagem de Consulta 151
SELECT id_salario,
salario_minimo,
salario_maximo,
fg_ativo
FROM grades_salarios;
A consulta a seguir exemplifica a utilização de uma NÃO EQUIJOIN, a qual recupera o salá-
rio e os níveis salariais dos funcionários. O nível salarial é determinado pelo operador BETWEEN.
SELECT f.nm_funcionario,
f.sobrenome_funcionario,
f.cargo, f.salario,
gs.id_salario
FROM funcionarios f, grades_salarios gs
WHERE f.salario BETWEEN gs.salario_minimo AND gs.salario_maximo
ORDER BY gs.id_salario;
Já a junção externa (OUTER JOIN) recupera uma tupla/linha mesmo quando uma de suas
colunas contém um valor nulo. No próximo exemplo, o produto My Front Line, cujo ID_TIPO_
PRODUTO é nulo, é recuperado por meio da junção externa.
PRODUTO TIPO
2412: O Retorno Vídeo
Arquivos Z Vídeo
Ciência Moderna Livro
De outro planeta DVD
Força G DVD
Música clássica CD
My Front Line
Pop 3 CD
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Yell criativo CD
As junções externas (OUTER JOIN) podem ser segmentadas em dois tipos: junção externa
esquerda (LEFT OUTER JOIN) e junção externa direita (RIGHT OUTER JOIN). Sua sintaxe pode ser
compreendida como:
SELECT ...
FROM TABELA_1
...
Por outro lado, suponha que a tabela_2 contenha uma tupla/linha com um valor nulo
na coluna_2. A instrução SQL seria modificada para realizar uma junção externa direita (RIGHT
OUTER JOIN):
Para exemplificar o uso da junção externa direita (RIGHT OUTER JOIN), a tabela TIPOS_
PRODUTOS contém um tipo de produto não referenciado na tabela PRODUTOS, ou seja, não
existem produtos do tipo REVISTA na tabela PRODUTOS. Veja:
SELECT id_tipo_produto,
ds_tipo_produto,
fg_ativo
FROM tipos_produtos;
Veja como recuperar uma REVISTA em uma das tabelas, PRODUTOS e TIPOS_PRODUTOS,
utilizando a instrução SQL a seguir.
PRODUTO TIPO
2412: O Retorno Vídeo
Arquivos Z Vídeo
Ciência Moderna Livro
De outro planeta DVD
Força G DVD
Música clássica CD
Pop 3 CD
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Yell criativo CD
Revista
?column?
Frederico Munhoz trabalha para Rubens
Rubens Cardoso trabalha para Jaime
Susana Coimbra trabalha para Rubens
O padrão SQL/92 introduz as cláusulas INNER JOIN e ON para realizar uma junção interna.
A instrução SQL, a seguir, ilustra o uso do padrão SQL/92 para recuperar o nome do produto
(tabela PRODUTOS) e a descrição do tipo do produto (tabela TIPOS_PRODUTOS).
PRODUTO TIPO
2412: O Retorno Vídeo
Arquivos Z Vídeo
Ciência Moderna Livro
De outro planeta DVD
Força G DVD
Música clássica CD
Pop 3 CD
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Yell criativo CD
Já vimos como realizar uma consulta utilizando operadores de NÃO EQUIJOIN com a cláu-
sula ON no padrão SQL/86. Agora, traduziremos a consulta para o padrão SQL/92. Observe:
SELECT f.nm_funcionario,
f.sobrenome_funcionario,
f.cargo,
f.salario,
gs.id_salario
FROM funcionarios f
INNER JOIN grades_salarios gs ON(f.salario BETWEEN gs.salario_minimo AND
gs.salario_maximo)
ORDER BY gs.id_salario;
O padrão SQL/92 permite simplificar ainda mais a condição de JOIN com a cláusula USING.
Algumas limitações devem ser evidenciadas, como: a consulta deve usar uma EQUIJOIN, e as
colunas na EQUIJOIN devem ter o mesmo NOME. A próxima consulta implementa o uso de
© U4 – SQL – Uma Linguagem de Consulta 155
USING substituindo ON, para exibir o nome do produto (tabela PRODUTOS) e seu respectivo tipo
(tabela TIPOS_PRODUTOS).
PRODUTO TIPO
Ciência Moderna Livro
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Arquivos Z Vídeo
2412: O Retorno Vídeo
Força G DVD
De outro planeta DVD
Música clássica CD
Pop 3 CD
Yell criativo CD
O nome da coluna dentro da cláusula USING deverá, também, permanecer sozinho, con-
forme visualizado no exemplo a seguir, onde um erro é retornado.
É possível utilizar junções internas envolvendo mais de duas tabelas usando o padrão
SQL/92, conforme a consulta a seguir, a qual recupera o nome e sobrenome do cliente (tabela
CLIENTES), nome do produto (tabela PRODUTOS) e descrição do tipo de produto (tabela TIPOS_
PRODUTOS), com a identificação dos clientes e suas respectivas compras.
SELECT c.nm_cliente,
c.sobrenome,
p.nm_produto AS PRODUTO,
tp.ds_tipo_produto AS TIPO
FROM clientes c
INNER JOIN compras co USING (id_cliente)
INNER JOIN produtos p USING (id_produto)
INNER JOIN tipos_produtos tp USING (id_tipo_produto)
ORDER BY p.nm_produto;
As junções internas que fazem uso de diversas colunas também podem usufruir do padrão
SQL/92. Se uma junção (JOIN) utiliza mais de uma coluna nas duas tabelas, forneça essas colu-
nas em sua cláusula ON, utilizando, paralelamente, o operador AND.
Para exemplificar, considere duas tabelas nomeadas de TABELA_1 e TABELA_2, as quais
necessitamos juntar usando colunas chamadas de COLUNA_1 e COLUNA_2 nas duas tabelas.
Observe:
© U4 – SQL – Uma Linguagem de Consulta 157
SELECT ...
FROM TABELA_1
INNER JOIN TABELA_2 ON (TABELA_1.COLUNA_1 = TABELA_2.COLUNA_2
AND TABELA_1.COLUNA_2 = TABELA_2.COLUNA_2);
SELECT ...
FROM TABELA_1 { LEFT | RIGHT | FULL }
OUTER JOIN TABELA_2
Onde:
1) TABELA_1 e TABELA_2: são as tabelas pertinentes à junção.
2) LEFT: realiza uma JOIN externa esquerda.
3) RIGHT: realiza uma JOIN externa direita.
4) FULL: realiza uma JOIN externa completa (utiliza todas as tuplas/linhas da TABELA_1 e
TABELA_2, incluindo os valores nulos nas colunas usadas na junção).
O exemplo a seguir ilustra o uso da junção externa completa (FULL OUTER JOIN) empre-
gando o padrão SQL/92, a qual permite incluir as tuplas/linhas das tabelas unidas, inclusive
aqueles valores nulos em uma ou outra das colunas usadas na JOIN. Veja:
SELECT p.nm_produto AS PRODUTO,
tp.ds_tipo_produto AS TIPO
FROM produtos p
FULL OUTER JOIN tipos_produtos tp
USING (id_tipo_produto)
ORDER BY p.nm_produto;
PRODUTO TIPO
2412: O Retorno Vídeo
Arquivos Z Vídeo
Ciência Moderna Livro
De outro planeta DVD
Força G DVD
Música clássica CD
My Front Line
Pop 3 CD
Química Livro
Supernova Vídeo
Tanque de Guerra Vídeo
Yell criativo CD
Revista
SELECT tp.id_tipo_produto,
tp.ds_tipo_produto,
p.nm_produto,
p.ds_produto,
p.preco
FROM tipos_produtos tp
CROSS JOIN produtos p;
CONCAT(x, y)
AVG(x)
O comando retorna a média de x, em que x pode ser uma coluna e/ou uma expressão.
As funções de uma única linha são segmentadas em cinco tipos principais, detalhadas a
seguir:
1) Funções de caractere: manipulam strings de caracteres.
2) Funções numéricas: efetuam cálculos.
3) Funções de conversão: convertem um valor de um tipo para outro.
4) Funções de data: processam data e hora.
5) Funções de expressão regular: utilizam expressões regulares para procurar dados.
As funções de caractere aceitam a entrada de caractere (coluna ou expressão). Um exem-
plo é a função de caractere ASCII(x), utilizada para obter o valor ASCII do caractere x. Veja a
seguir:
SELECT ASCII('a'),
ASCII('A'),
ASCII('z'),
ASCII('Z'),
ASCII('0'),
ASCII('9');
Para realizar o inverso da função ASCII(x), a função CHR(x) permite obter o caractere com
o valor ASCII. Observe:
SELECT CHR(97),
CHR(65),
CHR(122),
CHR(90),
CHR(48),
CHR(57);
SELECT id_produto,
INITCAP(ds_produto)
FROM produtos
ORDER BY id_produto;
ID_PRODUTO INITCAP
1 Uma Descrição Da Ciência Moderna
2 Introdução À Química
3 Uma Estrela Explosiva
4 Filme De Ação Sobre Uma Possível Guerra
© U4 – SQL – Uma Linguagem de Consulta 161
ID_PRODUTO INITCAP
6 Série Sobre Atividades Misteriosas
7 Alien O Retorno
8 Aventuras Dos Heróis
9 Alienígena De Outro Planeta Na Terra
10 O Melhor Da Música Clássica
11 O Melhor Da Música Popular
12 Álbum De Estréia
13 Seus Maiores Sucessos
SELECT nm_produto,
LENGTH(nm_produto)
FROM produtos;
NM_PRODUTO LENGTH
Ciência Moderna 15
Química 7
Supernova 9
Tanque de Guerra 16
Arquivos Z 10
2412: O Retorno 15
Força G 7
De outro planeta 16
Música clássica 15
Pop 3 5
Yell criativo 13
My Front Line 13
NOME SOBRENOME
JAIME tenório
RUBENS cardoso
FREDERICO munhoz
SUSANA coimbra
RPAD LPAD
Ciência Moderna............... *+*+*+*+*+*+*+*+*+Uma descrição da ciência moderna
Química....................... *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+Introdução à Química
Supernova..................... *+*+*+*+*+*+*+*+*+*+*+*+*+*+*Uma estrela explosiva
Tanque de Guerra.............. *+*+*+*+*+*Filme de ação sobre uma possível guerra
Arquivos Z.................... *+*+*+*+*+*+*+*+Série sobre atividades misteriosas
2412: O Retorno............... *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*Alien O Retorno
Força G....................... *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+Aventuras dos heróis
De outro planeta.............. *+*+*+*+*+*+*+Alienígena de outro planeta na Terra
Música clássica............... *+*+*+*+*+*+*+*+*+*+*+*O melhor da música clássica
Pop 3......................... *+*+*+*+*+*+*+*+*+*+*+*+O melhor da música popular
Yell criativo................. *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+Álbum de estréia
My Front Line................. *+*+*+*+*+*+*+*+*+*+*+*+*+*+*Seus maiores sucessos
SELECT
LTRIM(' Olá pessoal, tudo joia?'),
RTRIM('Olá tudo bem!abc', 'abc'),
TRIM('x' FROM 'xxxAula de BDxxxxx');
© U4 – SQL – Uma Linguagem de Consulta 163
Para procurar uma string qualquer e substituí-la por outra, utilizamos a função REPLACE(x,
string de busca, string substituta), onde é realizada a busca baseando-se na string de busca em
x e substituída pela string substituta. O exemplo a seguir utiliza o produto cujo ID_PRODUTO
corresponda ao Número 1 (Ciência Moderna – a string Ciência será substituído por Física). Um
detalhe importante é que não é alterada a tupla/linha real no banco de dados; somente a tupla/
linha retornada pela função é modificada. Veja a seguir:
SELECT REPLACE(nm_produto,
'Ciência',
'Física')
FROM produtos
WHERE id_produto = 1;
REPLACE
Física Moderna
ORIGINAL SUBSTRING
Ciência Moderna iência
Química uímica
Supernova upernov
Tanque de Guerra anque d
Arquivos Z rquivos
2412: O Retorno 412: O
Força G orça G
De outro planeta e outro
Música clássica úsica c
Pop 3 op 3
Yell criativo ell cri
My Front Line y Front
É possível também fornecer qualquer expressão válida que seja avaliada como uma string.
No próximo exemplo – do uso de SUBSTR(x, início, comprimento) –, utilizaremos a função para
obter a substring DBA da string Administrador de Banco de Dados - DBA.
SUBSTR
DBA
Em uma instrução SQL é possível utilizar uma combinação de funções. Por exemplo, ima-
gine que é preciso combinar as funções UPPER(x) e SUBSTR(x, início, comprimento), em que a
saída da função SUBSTR() é passada para a função UPPER(x). Veja a seguir:
SELECT nm_produto,
UPPER(SUBSTR(nm_produto, 2, 8))
FROM produtos
ORDER BY id_produto;
NM_PRODUTO UPPER
Ciência Moderna IÊNCIA M
Química UÍMICA
Supernova UPERNOVA
Tanque de Guerra ANQUE DE
Arquivos Z RQUIVOS
2412: O Retorno 412: O R
Força G ORÇA G
De outro planeta E OUTRO
Música clássica ÚSICA CL
Pop 3 OP 3
Yell criativo ELL CRIA
My Front Line Y FRONT
SELECT id_produto,
preco,
preco - 30,
ABS(preco - 30)
FROM produtos;
A função identificada como CEIL(x) é oriunda, também, da família das funções numéricas,
cuja finalidade é obter o número menor inteiro, maior ou igual a x. Para ilustrar sua utilização,
a função CEIL(x) será utilizada para obter os valores absolutos de 5,8 e -5,2. O teto de 5,8 é 6,
porque corresponde ao número menor inteiro, maior do que 5,8, e o teto de -5,2 é -5, porque
-5,2 é negativo e o número menor inteiro, maior do que ele é -5.
SELECT CEIL(5.8),
CEIL(-5.2);
CEIL Ceil
6 -5
Oposto à função CEIL(x), a função FLOOR(x), por sua vez, obtém o maior número inteiro,
menor ou igual a x. Como exemplos serão utilizados os mesmos parâmetros da função anterior,
em que a função FLOOR(x) obterá o valor absoluto de 5,8 e -5,2. O piso de 5,8 é 5, porque 5 é
maior número inteiro, menor do que 5,8 e o piso de -5,2 é -6, porque -5,2 é negativo e o maior
número inteiro, menor do que este valor é -6.
SELECT FLOOR(5.8),
FLOOR(-5.2);
Floor floor
5 -6
A função MOD(x, y) obtém o resto da divisão de x por y. Essa função é frequentemente uti-
lizada para descobrir se um determinado número é par ou ímpar, ou até mesmo se um número
qualquer é múltiplo de outro. Como exemplo, a função MOD(x, y) será utilizada para obtermos
o resto da divisão, quando 8 for dividido por 3 e por 4. Acompanhe a seguir:
Mod mod
2 0
A função POWER(x, y) é uma função numérica que obtém o resultado de x elevado à po-
tência y. A função POWER(x, y) obterá 2 elevado às potências 1 e 3 como exemplo. Observe:
Power power
2 8
A função ROUND(x, [y]) é utilizada para obter o arredondamento de x com y casas deci-
mais (parâmetro opcional). Se o y for omitido, x será arredondado com zero casa decimal e se y
for negativo, x será arredondado à esquerda do ponto decimal.
Como exemplo, ROUND(x, [y]) será utilizado para obter o resultado do arredondamento
de 5,75 com zero, 1 e -1 casas decimais. Acompanhe:
SELECT ROUND(5.75),
ROUND(5.75, 1),
ROUND(5.75, -1);
SIGN(x) é uma função cujo objetivo é obter o sinal de x. A função retorna -1 se x for nega-
tivo, retorna 1 se x for positivo e retorna 0 (zero) se x for zero. Um exemplo é o uso da função
SIGN(x) para obter o sinal dos valores -5, 5 e 0. Observe:
SELECT SIGN(-5),
SIGN(5),
SIGN(0);
Para obter a raiz quadrada de um determinado número, você poderá recorrer à função
SQRT(x). Como exemplo, a função obterá a raiz quadrada de 25 e 5, respectivamente. Veja a
seguir:
SELECT SQRT(25),
SQRT(5);
SQRT SQRT
5 2.23606797749979
SELECT TRUNC(5.75),
TRUNC(5.75, 1),
TRUNC(5.75, -1);
© U4 – SQL – Uma Linguagem de Consulta 167
SELECT TO_CHAR(12345.67,
'99,999.99');
TO_CHAR
12,345.67
SELECT TO_CHAR(12345.67,
'99999.99');
TO_CHAR
12345.67
O parâmetro 0 (zero) retorna um número com zeros à esquerda e/ou à direita. O uso do
parâmetro 0 (zero) pode ser visualizado no exemplo a seguir. Observe:
SELECT TO_CHAR(12345.67,
'099,999.99');
TO_CHAR
012,345.67
O parâmetro . (ponto), por sua vez, retorna para a função um ponto decimal na posição
específica. Já o parâmetro , (vírgula) retorna uma vírgula também na posição especificada pela
função. Nos exemplos explorados até o momento, com a função TO_CHAR(x, [format]), utiliza-
mos um (somente o . (ponto)) ou ambos os parâmetros (. (ponto) e , (vírgula)).
A letra L também pode ser utilizada como parâmetro para a função TO_CHAR(x, [format]),
retornando o símbolo de moeda local na posição especificada. O símbolo vem da variável do
SGBD lc_monetary. No exemplo a seguir o parâmetro L é utilizado para inserir o símbolo da
moeda local. Veja:
SELECT TO_CHAR(12345.67,
'L99,999.99');
TO_CHAR
R$ 12,345.67
SELECT TO_CHAR(2011,
'RN');
TO_CHAR
MMXI
SELECT TO_CHAR(12345678.90,
'99,999.99');
TO_CHAR
##,###.##
ID_PRODUTO ?COLUMN?
1 O preço do produto é: R$ 19.95
2 O preço do produto é: R$ 30.00
3 O preço do produto é: R$ 25.99
4 O preço do produto é: R$ 13.95
6 O preço do produto é: R$ 49.99
7 O preço do produto é: R$ 14.95
8 O preço do produto é: R$ 13.49
9 O preço do produto é: R$ 12.99
10 O preço do produto é: R$ 10.99
11 O preço do produto é: R$ 15.99
12 O preço do produto é: R$ 14.99
13 O preço do produto é: R$ 13.49
© U4 – SQL – Uma Linguagem de Consulta 169
SELECT TO_NUMBER('970.13',
'999.99');
TO_NUMBER
970.13
SELECT
CAST(12345.67 AS VARCHAR(10)),
CAST('01-12-2009' AS DATE),
CAST(12345.678 AS NUMERIC(10,2));
SELECT AVG(preco)
FROM produtos;
AVG
19.7308333333333
A função COUNT(x) também faz parte das funções agregadas; ela obtém o número de
tuplas/linhas retornadas por uma consulta. Para exemplificar, utilizaremos a função COUNT(x)
para obter o número de tuplas/linhas na tabela PRODUTOS.
SELECT COUNT(id_produto)
FROM produtos;
COUNT
12
MAX MIN
49.99 10.99
As funções MAX(x) e MIN(x) permitem utilizar qualquer tipo de dado, inclusive strings e
datas. A função MAX(x) com strings são classificadas em ordem alfabética, com a string máxima
no final da lista e a string mínima no início. Para ilustrar essa funcionalidade, o exemplo a seguir
obtém as strings máxima e mínima pertinentes à coluna NM_PRODUTO, da tabela PRODUTOS:
SELECT MAX(nm_produto),
MIN(nm_produto)
FROM produtos;
MAX MIN
Yell criativo 2412: O Retorno
A data máxima ocorre no ponto mais recente no tempo e a data mínima, no ponto mais
antigo. Para exemplificar o uso das funções agregadas MAX(x) e MIN(x) manipulando datas, se-
rão obtidos os valores mínimo e máximo dos valores associados à coluna DT_NASCIMENTO, da
tabela CLIENTES.
SELECT MAX(DT_NASCIMENTO),
MIN(DT_NASCIMENTO)
FROM clientes;
MAX MIN
16/03/1971 00:00 01/01/1965 00:00
A função agregada que permite obter o desvio padrão de um determinado número é iden-
tificada como STDDEV(x). O desvio padrão é uma função estatística, definido como raiz quadra-
da da variância.
Um exemplo prático é o uso da função STDDEV(x) para obter o desvio padrão dos valores
da coluna PRECO da tabela PRODUTOS. Veja:
SELECT STDDEV(preco)
FROM produtos;
STDDEV
11.0896302572459215
© U4 – SQL – Uma Linguagem de Consulta 171
VARIÂNCIA DA COLUNA
122.979899242424242
SELECT id_cliente,
TO_CHAR(dt_nascimento, 'MONTH DD YYYY')
FROM clientes;
ID_CLIENTE TO_CHAR
1 JANUARY 01 1965
3 MARCH 16 1971
4
5 MAY 20 1970
6 JANUARY 01 1970
2 FEBRUARY 05 1968
SELECT TO_CHAR(now(),
'MONTH DD YYYY, HH24:MI:SS');
TO_CHAR
JANUARY 29 2010, 17:38:16
Agora, converteremos a data 5 de fevereiro de 1967 em uma string com o formato MON-
TH DD, YYYY, utilizando em conjunto a função TO_CHAR() e DATE. Veja a seguir:
SELECT TO_CHAR(DATE('05-02-1967'),
'MONTH DD, YYYY');
TO_CHAR
FEBRUARY 05, 1967
A função DATE também pode ser utilizada em conjunto com os operadores relacionais. Por
exemplo, imagine que desejamos recuperar todos os CLIENTES que possuem data de nascimen-
to (coluna DT_NASCIMENTO) posterior à data de 01 janeiro de 1971. A instrução SQL exemplifi-
ca o uso da função DATE que resolveria nosso problema:
SELECT nm_cliente,
dt_nascimento
FROM clientes
WHERE dt_nascimento > DATE '1971-01-01';
nm_cliente dt_nascimento
Marcelo 16/03/1971 00:00
A função EXTRACT() é responsável por extrair, por exemplo, o dia, o mês, o ano, a hora, o
minuto e o segundo de uma determinada data ou hora. No próximo exemplo, observaremos o
uso da função EXTRACT() para obter o dia, mês e ano da data de nascimento dos registros asso-
ciados à coluna nomeada de DT_NASCIMENTO da tabela CLIENTES. Acompanhe:
SELECT dt_nascimento,
EXTRACT(day FROM DT_NASCIMENTO) AS Dia,
EXTRACT(month FROM DT_NASCIMENTO) AS Mês,
EXTRACT(year FROM DT_NASCIMENTO) AS Ano
FROM clientes;
Esse exemplo também explora a função EXTRACT(). Observe as horas, minutos e segundos
do horário atual do sistema, obtido por meio da função NOW():
SELECT now(),
EXTRACT(hour FROM now()) AS Hora,
EXTRACT(minute FROM now()) AS Minuto,
EXTRACT(second FROM now()) AS Segundo;
A função AGE(), por sua vez, retorna a diferença de tempo entre duas datas. Para exempli-
ficar o uso dessa função, utilizaremos duas datas (coluna DT_NASCIMENTO e '2007-09-15') para
que seja retornada a diferença de tempo entre elas. Veja a seguir:
SELECT nm_cliente,
AGE('2011-12-31', dt_nascimento)
FROM clientes;
nm_cliente age
João 46 years 11 mons 30 days
Marcelo 40 years 9 mons 15 days
Henrique
Dolores 41 years 7 mons 11 days
Frederico 41 years 11 mons 30 days
Silvia 43 years 10 mons 26 days
Agrupando Tuplas/Linhas
Imagine que é preciso obter o preço médio dos diferentes tipos de produtos da tabela
PRODUTOS. Para facilitar essa tarefa, a cláusula GROUP BY deverá ser utilizada para agrupar as
tuplas/linhas semelhantes, ou seja, GROUP BY permite agrupar tuplas/linhas em uma tabela e
obter alguma informação sobre esses grupos de tuplas/linhas. Pensemos em um exemplo em
que a cláusula GROUP BY é utilizada para agrupar tuplas/linhas em blocos com um valor comum
de coluna, agrupando as tuplas/linhas da tabela PRODUTOS em blocos com o mesmo valor de
ID_TIPO_PRODUTO. Acompanhe a seguir:
SELECT id_tipo_produto
FROM produtos
GROUP BY id_tipo_produto;
id_tipo_produto
4
1
3
2
Outro exemplo é imaginar várias colunas sendo utilizadas, em que as colunas ID_PRODU-
TO e ID_CLIENTE da tabela COMPRAS são incluídas na cláusula GROUP BY. Veja:
SELECT id_produto,
id_cliente
FROM compras
GROUP BY id_produto, id_cliente;
id_produto id_cliente
4 1
2 2
3 1
1 2
1 1
Mais um exemplo é a cláusula GROUP BY sendo mesclada com a função agregada COUNT(x),
permitindo efetuar o cálculo no grupo de tuplas/linhas em cada bloco, retornando um valor por
bloco. O resultado é o número de tuplas/linhas com o mesmo valor de ID_TIPO_PRODUTO da
tabela PRODUTOS. Observe:
SELECT id_tipo_produto,
COUNT(id_produto) AS "Total por Tipo de Produto"
FROM produtos
GROUP BY id_tipo_produto
ORDER BY id_tipo_produto;
No próximo exemplo, GROUP BY se junta à função agregada AVG(x). Elas são utilizadas
para obter o preço médio dos diferentes tipos de produtos da tabela PRODUTOS.
SELECT id_tipo_produto,
AVG(preco) AS "Média dos Preços"
FROM produtos
GROUP BY id_tipo_produto
ORDER BY id_tipo_produto;
A utilização incorreta das chamadas funções agregadas ocorre quando a consulta contém
uma função agregada e recupera colunas não inseridas dentro da função agregada. Essas colu-
nas devem ser colocadas em uma cláusula GROUP BY. Para ilustrar o uso incorreto das chamadas
© U4 – SQL – Uma Linguagem de Consulta 175
SELECT id_tipo_produto,
AVG(preco)
FROM produtos;
Portanto, quando uma consulta contém uma função agregada e recupera colunas não
inseridas dentro de uma função agregada, essas colunas devem ser colocadas em uma cláusula
GROUP BY.
Também não é permitido utilizar a função agregada para limitar uma cláusula WHERE,
como podemos identificar na mensagem de erro (Figura 16) gerada a partir da consulta a seguir:
SELECT id_tipo_produto,
AVG(preco)
FROM produtos
WHERE AVG(preco) > 20
GROUP BY id_tipo_produto;
SELECT id_tipo_produto,
AVG(preco)
FROM produtos
GROUP BY id_tipo_produto
HAVING AVG(preco)> 20;
id_tipo_produto Avg
1 24.9750000000000000
2 26.2200000000000000
SELECT id_tipo_produto,
AVG(preco)
FROM produtos
WHERE preco < 15
GROUP BY id_tipo_produto
ORDER BY id_tipo_produto;
id_tipo_produto AVG
2 14.4500000000000000
3 13.2400000000000000
4 12.9900000000000000
13.4900000000000000
SELECT id_tipo_produto,
AVG(preco)
FROM produtos
WHERE preco < 15
© U4 – SQL – Uma Linguagem de Consulta 177
GROUP BY id_tipo_produto
HAVING AVG(preco) > 13
ORDER BY id_tipo_produto;
id_tipo_produto AVG
2 14.4500000000000000
3 13.2400000000000000
13.4900000000000000
Subconsultas
Basicamente, existem dois tipos de subconsultas, como detalharemos a seguir:
• Única tupla/linha: retornam zero ou uma tupla/linha para a instrução SQL externa.
Existe um caso especial de subconsulta de uma única tupla/linha que contém exata-
mente uma coluna, a qual é chamada de subconsulta escalar.
• Várias tuplas/linhas: retornam uma ou mais tuplas/linhas para a instrução SQL externa.
Além disso, dentre as subconsultas que podem retornar uma ou várias tuplas/linhas, três
tipos são identificadas como:
• Correlacionadas: referenciam uma ou mais colunas na instrução SQL externa. Elas são
chamadas de subconsultas correlacionadas porque são relacionadas à instrução SQL
externa por meio das mesmas colunas.
• Aninhadas: inseridas dentro de outra subconsulta. É permitido aninhar subconsultas
até uma profundidade de 255.
• Várias colunas: retornam mais de uma coluna para a instrução SQL externa.
Uma subconsulta de uma única tupla/linha pode ser inserida em uma cláusula WHERE,
HAVING ou FROM de uma instrução SELECT. Imagine que é necessário recuperar os registros de
NM_CLIENTE e SOBRENOME da tabela CLIENTES, cujo valor do SOBRENOME corresponda, por
exemplo, a Ribeiro. A seguinte instrução SQL poderia ser utilizada:
SELECT nm_cliente,
sobrenome
FROM clientes
WHERE id_cliente = (SELECT id_cliente
FROM clientes
WHERE sobrenome = 'Ribeiro');
nm_cliente sobrenome
Marcelo Ribeiro
SELECT id_cliente
FROM clientes
WHERE sobrenome = 'Ribeiro';
id_cliente
3
Essa subconsulta é executada primeiro (e apenas uma única vez), retornando o ID_CLIEN-
TE da coluna cujo valor do SOBRENOME corresponda a Ribeiro. O valor do ID_CLIENTE para essa
tupla/linha é 3, o qual é passado para a cláusula WHERE da consulta externa.
É possível utilizar outros operadores de comparação (<>, <, >, <= e >=) em uma subcon-
sulta de uma única tupla/linha, por exemplo, para obter o preço médio dos produtos, sendo ele
passado para a cláusula WHERE da consulta externa. A consulta interna retorna os valores de
ID_PRODUTO, NM_PRODUTO e PRECO dos produtos cujo preço seja maior do que a média de
preços. Acompanhe:
SELECT id_produto,
nm_produto,
preco
FROM produtos
WHERE preco > (SELECT AVG(preco)
FROM produtos);
AVG
19.7308333333333
Podemos observar que essa subconsulta é um exemplo de subconsulta escalar, pois re-
torna exatamente uma tupla/linha contendo apenas uma coluna. O valor retornado por uma
subconsulta escalar é tratado como um único valor escalar.
Existe também a possibilidade de inserir uma subconsulta na cláusula HAVING de uma
consulta externa, permitindo filtrar grupos de tuplas/linhas com base no resultado retornado
por sua subconsulta. Como exemplo, recuperaremos o valor do ID_TIPO_PRODUTO e o preço
médio dos produtos cujo preço médio seja inferior ao preço correspondente aos produtos. Veja:
SELECT id_tipo_produto,
AVG(preco)
FROM produtos
GROUP BY id_tipo_produto
HAVING AVG(preco) < (SELECT MAX(preco)
FROM produtos)
ORDER BY id_tipo_produto;
id_tipo_produto AVG
1 24.975000000000000
2 26.220000000000000
© U4 – SQL – Uma Linguagem de Consulta 179
id_tipo_produto AVG
3 13.240000000000000
4 13.990000000000000
13.490000000000000
As consultas identificadas como in line são aquelas que permitem inserir uma subconsulta
na cláusula FROM de uma consulta externa. Para ilustrar essa técnica, a próxima instrução SQL
recuperará os registros pertinentes às colunas ID_PRODUTO e NM_PRODUTO da tabela PRODU-
TOS, cujo valor da coluna ID_PRODUTO seja inferior ao número três.
No que diz respeito à cláusula FROM da consulta externa, a saída da subconsulta é apenas
outra fonte de dados.
No próximo exemplo, dotado de maior complexidade, recuperamos os valores correspon-
dentes às colunas ID_PRODUTO e PRECO da tabela PRODUTOS na consulta externa. A subcon-
sulta recupera o número de vezes que um determinado produto foi comprado:
SELECT produtos.id_produto,
preco,
Dados_Compra.Contagem_Produto
FROM produtos, (SELECT id_produto,
COUNT(id_produto) AS Contagem_Produto
FROM compras
GROUP BY id_produto) AS Dados_Compra
WHERE produtos.id_produto = Dados_Compra.id_produto;
Uma consulta de várias tuplas/linhas retorna uma ou mais tuplas/linhas para uma instru-
ção SQL externa. Os operadores IN, ANY e ALL são utilizados para realizar o tratamento de uma
subconsulta que retorna várias tuplas/linhas, permitindo verificar se o valor de uma coluna está
contido em uma lista de valores.
A lista de valores pode vir dos resultados retornados por uma subconsulta. O exemplo a
seguir utiliza o operador IN para verificar se um valor de ID_PRODUTO da tabela PRODUTOS está
na lista de valores retornada pela subconsulta.
SELECT id_produto,
nm_produto
FROM produtos
WHERE id_produto IN (SELECT id_produto
FROM produtos
WHERE nm_produto LIKE '%e%');
id_produto nm_produto
1 Ciência Moderna
3 Supernova
4 Tanque de Guerra
7 2412: O Retorno
9 De outro planeta
12 Yell criativo
13 My Front Line
No próximo exemplo, é utilizado o operador NOT IN para executar a lógica oposta de IN,
ou seja, obter os produtos que não estão na tabela COMPRAS.
SELECT id_produto,
nm_produto
FROM produtos
WHERE id_produto NOT IN (SELECT id_produto
FROM compras);
id_produto nm_produto
6 Arquivos Z
7 2412: O Retorno
8 Força G
9 De outro planeta
10 Música clássica
11 Pop 3
12 Yell criativo
13 My Front Line
O operador ANY é utilizado para comparar um valor com qualquer valor presente em uma
lista. Podemos, ainda, inserir um operador (=, <>, >, <, <= ou >=) antes de ANY. Para exemplificar
sua aplicabilidade, recuperaremos os funcionários cujo salário seja menor do que qualquer um
dos salários mais baixos da tabela GRADES_SALARIOS. Observe:
SELECT id_funcionario,
nm_funcionario,
salario
FROM funcionarios
WHERE salario < ANY (SELECT salario_minimo
FROM grades_salarios);
Por sua vez, o operador ALL é utilizado para comparar um valor com todos os valores pre-
sentes em uma lista. Semelhante ao operador ANY, ALL também permite inserir um operador (=,
<>, >, <, <= ou >=) antes dele. Modificamos o exemplo anterior para obter os funcionários cujo
salário seja superior a todos os salários mais altos da tabela GRADES_SALARIOS. Veja a seguir:
© U4 – SQL – Uma Linguagem de Consulta 181
SELECT id_funcionario,
nm_funcionario,
salario
FROM funcionarios
WHERE salario > ALL (SELECT salario_maximo
FROM grades_salarios);
Como podemos identificar, não existe nenhum funcionário que tenha o salário maior do
que o salário mais alto da tabela GRADES_SALARIOS.
Quanto às subconsultas que manipulam várias tuplas/linhas, existe ainda a possibilida-
de de escrevermos subconsultas que retornam várias colunas. Por exemplo, suponha que seja
necessário recuperarmos os produtos com o menor preço para cada grupo de tipo de produto.
Nesse caso, são retornados o valor correspondente ao ID_TIPO_PRODUTO e o valor do PRECO
mínimo para cada grupo de produtos, onde os mesmos são comparados com os valores ID_
TIPO_PRODUTO e PRECO para cada produto na cláusula WHERE da consulta externa.
SELECT id_produto,
id_tipo_produto,
nm_produto,
preco
FROM produtos
WHERE (id_tipo_produto, preco) IN (SELECT id_tipo_produto,
MIN(preco)
FROM produtos
GROUP BY id_tipo_produto);
SELECT id_produto,
id_tipo_produto,
nm_produto,
preco
FROM produtos externa
WHERE preco > (SELECT AVG(preco)
FROM produtos interna
WHERE interna.id_tipo_produto = externa.id_tipo_produto);
Utilizamos o apelido externa para rotular a consulta externa e o apelido interna para a
subconsulta interna. A referência à coluna ID_TIPO_PRODUTO nas partes interna e externa é o
que torna a subconsulta interna correlacionada à consulta externa. Em uma subconsulta corre-
lacionada, cada tupla/linha da consulta externa é passada por vez para a subconsulta.
A subconsulta lê uma tupla/linha de cada vez da consulta externa e a aplica na subconsulta
até que todas as tuplas/linhas da consulta externa sejam processadas. Em nosso exemplo, a con-
sulta externa recupera cada tupla/linha da tabela PRODUTOS e passa para a consulta interna.
Cada tupla/linha é lida pela consulta interna, a qual calcula o preço médio de cada produto onde
o valor de ID_TIPO_PRODUTO na consulta interna corresponda ao valor de ID_TIPO_PRODUTO
na consulta externa.
Os operadores EXISTS e NOT EXISTS podem ser utilizados em uma subconsulta correlacio-
nada. O operador EXISTS verifica a existência de tuplas/linhas retornadas por uma subconsulta.
Embora você possa usar EXISTS em subconsultas não correlacionadas, em geral ele é utilizado
em subconsultas correlacionadas. O operador NOT EXISTS executa a lógica oposta de EXISTS.
Como exemplo do uso do operador EXISTS em uma subconsulta, recuperaremos os funcionários
que gerenciam outros funcionários. Acompanhe:
SELECT id_funcionario,
nm_funcionario
FROM funcionarios externa
WHERE EXISTS (SELECT id_funcionario
FROM funcionarios interna
WHERE interna.id_gerente = externa.id_funcionario);
id_funcionario nm_funcionario
1 Jaime
2 Rubens
SELECT id_funcionario,
nm_funcionario
FROM funcionarios externa
WHERE EXISTS (SELECT 1
FROM funcionarios interna
WHERE interna.id_gerente = externa.id_funcionario);
© U4 – SQL – Uma Linguagem de Consulta 183
id_funcionario nm_funcionario
1 Jaime
2 Rubens
SELECT id_produto,
nm_produto
FROM produtos externa
WHERE NOT EXISTS (SELECT 1
FROM compras interna
WHERE interna.id_produto = externa.id_produto);
id_produto nm_produto
6 Arquivos Z
7 2412: O Retorno
8 Força G
9 De outro planeta
10 Música clássica
11 Pop 3
12 Yell criativo
13 My Front Line
SELECT id_tipo_produto,
AVG(preco)
FROM produtos
GROUP BY id_tipo_produto
HAVING AVG(preco) < (SELECT MAX(preco)
FROM produtos
WHERE id_tipo_produto IN (SELECT id_produto
FROM compras
WHERE quantidade > 1)
GROUP BY id_tipo_produto)
ORDER BY id_tipo_produto;
id_tipo_produto AVG
1 24.9750000000000000
2 26.2200000000000000
3 13.2400000000000000
4 13.9900000000000000
13.4900000000000000
Para finalizar o uso de subconsultas, é possível, em uma instrução UPDATE, definir uma
coluna com o resultado retornado por uma subconsulta de uma única tupla/linha. Por exem-
plo, definir o salário do funcionário cujo número (ID_FUNCIONARIO) corresponda ao Número 4
como a média dos níveis salariais altos retornados por uma subconsulta:
UPDATE funcionarios
SET salario = (SELECT AVG(salario_maximo)
FROM grades_salarios)
WHERE id_funcionario = 4;
DELETE
FROM funcionarios
WHERE salario > (SELECT AVG(salario_maximo)
FROM grades_salarios);
• renomear colunas;
• renomear tabelas.
Basicamente, todas essas ações são implementadas utilizando o comando ALTER TABLE.
Repare que, os dados presentes na coluna, ora removida, desaparecem, juntamente com
as eventuais restrições presentes na tabela e vinculadas à coluna descricao_produto.
É permitida a remoção em cascata, ou seja, remover eventuais dependências vinculadas a
coluna, adicionando CASCADE, conforme apresentado a seguir:
Note que associamos um nome para essa restrição (nome_restricao), promovendo faci-
lidades no que tange eventuais futuras manutenções aplicadas a essa restrição em particular.
Quando não identificamos as restrições impostas às tabelas, o SGBD se encarrega de nomeá-las,
entretanto, fazendo uso de nomenclaturas não tão amigáveis, mesclando números e letras.
Em nosso próximo exemplo, adicionaremos uma restrição de chave-estrangeira, associada
a coluna id_grupo_produto, conforme apresentado a seguir:
Para adicionar uma restrição não-nulo, que também pode ser produzida como uma restri-
ção de tabela, faça uso da seguinte sintaxe:
A restrição não-nulo anterior, será verificada imediatamente, sendo assim, os dados pre-
sentes na tabela e, especificamente vinculados a essa coluna, devem satisfazer a restrição antes
que ela possa ser adicionada.
Outro exemplo, imagine a necessidade de remover uma restrição não-nulo da coluna inti-
tulada de nr_produto, essa nomeada de nn_tb_produtos_nm_produto.
Repare que o comando anterior não afetará todas as tuplas existentes na tabela, apenas
irá alterar o valor padrão para futuras instruções INSERT.
Para remover qualquer valor padrão, você poderá utilizar o comando a seguir:
O exemplo anterior é basicamente o mesmo que configura o valor padrão para nulo
(NULL). Entretanto, não é considerado um erro remover um valor padrão que não tenha sido
definido, sobretudo, pelo valor padrão ser implicitamente o valor nulo.
A instrução anterior, apenas obterá êxito se cada dado existente na coluna preco for pas-
sível de conversão para o novo tipo, por meio de uma conversão implícita. Caso seja necessária
uma conversão mais complexa, você poderá adicionar uma cláusula USING responsável por es-
pecificar como converter os novos valores a partir dos dados antigos.
O PostgreSQL tentará converter o valor padrão da coluna (se houver) para o novo tipo
de dado, bem como todas as restrições que envolvem a coluna. Entretanto, essas conversões
poderão falhar, ou produzirem resultados inesperados. Na maioria das vezes, é melhor eliminar
todas as restrições associadas à coluna antes de alterar o seu tipo, e, na sequência, adicionar
novamente as restrições.
Caso, eventualmente, você tenha utilizado o nome da coluna como parte do nome de
uma restrição qualquer, será imprescindível alterar tais identificadores, a fim de evitar futuros
dissabores.
Criando views
Quando você cria uma VIEW, o SQL Server verifica a existência de objetos que contém referências em
uma definição de view. O nome de sua view deve seguir o padrão de regra de identificadores. A espe-
cificação do nome do proprietário de uma view é opcional* (caso você queira tornar uma view pública,
declare "dbo.nome_entidade"). Não atribua a uma view, um nome já utilizado para outro objeto exis-
tente no mesmo banco de dados.
Até o momento, você não sabe como criar uma view, onde criá-la, nem os passos para
sua criação – ou seja, você tem apenas a teoria. Mas, daqui em diante, serão apresentados os
comandos para a criação das views.
Então, vamos lá?!
Você cria uma view (visão) usando CREATE VIEW, que tem a sintaxe detalhada a seguir.
Observe:
Onde:
1) OR REPLACE significa que a visão substitui outra já existente.
2) TEMP | TEMPORARY define se a view será temporária, ou seja, se existirá somente
naquela sessão SQL.
3) nome_view é simplesmente o identificador da visão, ou seja, o nome da visão a qual
você referenciará quando julgar necessário.
4) nome da(s) coluna(s) é uma lista opcional do(s) nome(s) da(s) coluna(s) pertinente(s)
à view. Caso a lista de nomes não seja fornecida, é (são) utilizado(s) o(s) nome(s) da(s)
coluna(s) da própria consulta.
5) comando_select é a consulta propriamente dita, ou seja, uma instrução SELECT que
permitirá realizar a captura da(s) coluna(s) e tupla(s)/linha(s) da view.
É importante também mencionar a existência de dois tipos de views:
1) As consideradas views simples, que contêm uma consulta (query) que recupera regis-
tros de uma única tabela-base.
2) Views complexas, que contêm uma consulta que:
a) Recupera registros de várias tabelas-base.
b) Agrupa tuplas/linhas usando uma cláusula GROUP BY ou DISTINCT.
c) Contém uma chamada a uma determinada função.
O exemplo a seguir cria uma visão (view) nomeada de visao_produtos_baratos, cuja con-
sulta recupera produtos da tabela PRODUTOS, em que o preço do produto seja inferior a R$
15,00. Acompanhe:
No próximo exemplo, será criada uma visão (view) identificada como visao_funcionarios,
cuja consulta recuperará todas as colunas, exceto as colunas SALARIO e FG_ATIVO da tabela
FUNCIONARIOS.
Você perceberá que, após a criação de uma determinada visão (view), podemos usá-la
para acessar a tabela-base a qualquer momento e quantas vezes julgarmos necessário. A próxi-
ma consulta exemplifica a recuperação das tuplas/linhas da view visao_produtos_baratos. Veja:
SELECT id_produto,
nm_produto,
preco
FROM visao_produtos_baratos;
SELECT *
FROM visao_funcionarios;
A seguir, exemplificaremos como executar uma consulta a partir de uma view (nesse caso,
a view criada anteriormente e identificada de visao_tipos_produtos).
SELECT *
FROM visao_tipos_produtos;
O exemplo a seguir realiza a criação de views complexas, criando uma view chamada vi-
sao_media_produto, cuja consulta utiliza:
• Uma cláusula WHERE responsável por filtrar as tuplas/linhas da tabela PRODUTOS, sen-
do o valor do preço inferior a R$ 15,00.
• Uma cláusula GROUP BY para agrupar as tuplas/linhas pela coluna ID_TIPO_PRODUTO.
• E por fim, uma cláusula HAVING para filtrar os grupos de tuplas/linhas em que o preço
médio seja superior a R$ 13,00.
SELECT *
FROM visao_media_produto;
id_tipo_produto média_preço
2 14.4500000000000000
3 13.2400000000000000
13.4900000000000000
Para encerrar nossa discussão sobre visões (views), você também poderá excluir uma view
por meio do comando DROP VIEW. O exemplo seguinte exclui a visão identificada como visao_
media_produtos:
(SELECT AVG(salary)
FROM employee
WHERE dept_no =
(SELECT dept_no
FROM employee
WHERE last_name =
(SELECT last_name
FROM employee
WHERE salary > 50000)));
a) SELECT last_name.
b) SELECT dept_no.
c) SELECT AVG(salary).
d) SELECT name, salary, dept_id.
7) Ao tentar criar a tabela ALPHA_3000 com o comando a seguir, qual linha de comando causará erro?
1. CREATE TABLE alpha_3000
2. (3000_id NUMBER(9)
3. CONSTRAINT alpha_3000_id_pk PRIMARY KEY,
4. name VARCHAR2(25),
5. title VARCHAR2(25),
6. idname VARCHAR2(25)
7. CONSTRAINT alpha_3000_idname_nn NOT NULL);
a) Linha 1.
b) Linha 3.
c) Linha 2.
d) Linha 7.
8) O que acontece quando você realiza o UPDATE em uma tabela com a cláusula WHERE?
a) O comando não será executado.
b) Somente as linhas específicas serão updated.
c) Todas as linhas na tabela serão updated.
d) O comando será executado, mas as atualizações não serão feitas.
9) Quais tarefas são executadas com o comando DDL a seguir?
ALTER TABLE employee
ADD (end_date DATE);
Gabarito
Confira, a seguir, as respostas corretas para as questões autoavaliativas propostas:
2) e.
3) c.
4) b.
5) b.
6) a.
7) c.
8) b.
9) d.
10) a.
12. CONSIDERAÇÕES
A linguagem SQL, conteúdo estudado nesta unidade, é bastante utilizada no mundo todo
para acessar e manipular os dados armazenados em bancos de dados.
Os conceitos foram demonstrados e apresentados por meio de exemplos de um esquema
(database) criado inicialmente, identificado por FACULDADE, com o intuito de facilitar sua assi-
milação e demonstrar, assim como escrever, os comandos da linguagem SQL.
Na próxima unidade, você terá a oportunidade de aprender os conceitos de Dependência
Funcional para um banco de dados.
13. E-REFERÊNCIA
BIANCHI, W. Introdução a views. Disponível em: <http://www.devmedia.com.br/introducao-a-views/1614>. Acesso em: 23 out.
2012.
1. OBJETIVOS
• Conhecer a dependência dos dados existentes no contexto de Banco de Dados Relacio-
nais.
• Entender o processo de normalização de dados.
• Diferenciar as formas normais e seu emprego.
• Estar apto à realização do processo de normalização de dados.
2. CONTEÚDOS
• Dependência Funcional de um Banco de Dados Relacional.
• Normalização.
• Fatores a serem considerados no Projeto Físico de Banco de Dados Relacional.
4. INTRODUÇÃO À UNIDADE
Na unidade anterior, você teve a oportunidade de aprender como utilizar a linguagem SQL
na criação e manipulação dos bancos de dados por meio dos Sistemas Gerenciadores de Banco
de Dados (SGBD).
Nesta unidade, você estudará um tipo de restrição de integridade conhecido como de-
pendência funcional. Além disso, poderá realizar a normalização de atributos em relações e
conhecer alguns aspectos importantes como o desempenho e a carga de trabalho de um SGBD
ao converter o esquema lógico relacional em um esquema físico.
Por exemplo, considere os atributos A e B de uma entidade: pode-se dizer que B é funcio-
nalmente dependente de A se, e somente se, a cada valor de A estiver associado um único valor
de B. Em outras palavras, o CPF de um indivíduo, por exemplo, pode determinar o seu nome;
logo, o nome do indivíduo é dependente do seu CPF.
Considere o conjunto de atributos DataNascimento e Idade da entidade ALUNO. Pode-se
dizer que: o atributo Idade depende funcionalmente do atributo DataNascimento; o atributo
DataNascimento determina a Idade; ou Idade depende de DataNascimento.
Ou ainda, uma vez que você tem um número de CPF (o qual o identifica pelo Nome), é
possível afirmar que o Nome depende funcionalmente do CPF.
Uma dependência funcional é representada pelo símbolo .
Veja como se lê a seguinte notação:
AB
• A determina B.
• B é funcionalmente dependente de A.
Logo, você pode descrever as frases anteriores como:
DataNascimento Idade
CPF Nome
O conjunto de dependências funcionais pode ser utilizado para projetar um banco de da-
dos relacional, permitindo uma melhor compreensão dos dados. Entretanto, o estabelecimento
do conjunto de dependências funcionais é tarefa do projetista do banco de dados e deve ser
realizado com cuidado para não gerar restrições com regras difíceis de obedecer e, também, não
ignorar restrições que devem ser cumpridas pelo conjunto.
Existem algumas regras para se encontrar as dependências funcionais. Veja, a seguir, al-
gumas delas:
Separação ou Projetiva
CPF nome, sexo, então, CPF nome e CPF sexo
Leia o exemplo anterior da seguinte maneira:
Se com um número de CPF, eu encontro o nome e o sexo de uma pessoa, então com esse
mesmo número de CPF eu posso encontrar apenas o nome e com este mesmo número eu posso
encontrar apenas o sexo.
Notação: A BC, então A B e A C
União ou Aditiva
CEP endereço, CEP Bairro então CEP endereço, Bairro
Leia o exemplo anterior da seguinte maneira:
Se com um número de CEP, eu encontro o endereço de uma pessoa e com este mesmo
CEP eu encontro o bairro, então com CEP é possível determinar o endereço e o bairro.
Notação: A B, A C, então A BC
Transitividade
CPF DataNascimento e DataNascimento Idade, então CPF Idade
Leia o exemplo anterior da seguinte maneira:
Se com um número de CPF, eu encontro a data de nascimento de uma pessoa e com a data
de nascimento eu encontro a idade, então com o número do CPF eu posso encontrar a idade de
uma pessoa.
Notação: A B e B C, então A C
Pseudotransitividade
CPF código-aluno e código-aluno, mês mensalidade, então CPF, mês mensalidade
Leia o exemplo anterior da seguinte maneira:
Se com um número de CPF, você encontra o código do aluno e com o código do aluno e o
mês você verifica a situação da mensalidade naquele mês, então com o número do CPF e o mês
você pode encontrar a situação da mensalidade (débito ou não) naquele mês.
Notação: A B e BC D então AC D
Em alguns casos, pode existir a dependência multivalorada. Essa dependência ocorre
quando o valor de um atributo determina um conjunto de valores de outro atributo.
Exemplo:
CPF Nome: um único CPF determina um único nome.
CPF Dependentes: um único CPF determina vários dependentes.
A dependência multivalorada é representada por:
AB
• A multidetermina B.
• B é multidependente de A.
6. NORMALIZAÇÃO
Ted Codd apresentou, em 1972, os primeiros trabalhos que aplicavam conceitos de nor-
malização. Mas do que se trata a normalização?
A normalização é um processo destinado a avaliar e corrigir estruturas e tabelas, de modo
a reduzir as redundâncias de dados e, consequentemente, a probabilidade de anomalias. O
processo de normalização envolve a designação de atributos a tabelas com base no conceito de
determinação.
É função da normalização atuar como uma uma espécie de filtro sobre as entidades e os
relacionamentos, eliminando alguns elementos sem causar perda de informação. No decorrer
deste estudo, você observará como isso é realizado por meio das formas normais, as quais
foram introduzidas para atuar nos casos em que a informação se encontra disponível para ser
tratada, deixando os dados mais organizados dentro de um banco de dados.
Observe, a seguir, o que poderá ser evitado quando aplicada a normalização:
© U5 – Normalização e Desempenho em Sistema de Banco de Dados Relacional 199
Necessidade de normalização
Para melhor compreensão do processo de normalização, nosso modelo de estudo será
baseado em um banco de dados de uma empresa de construção, que tem as seguintes especi-
ficidades:
1) Gerencia vários projetos simultaneamente.
2) Cada projeto possui um nome e números próprios, e funcionários designados à sua
execução.
3) Cada funcionário possui um número, nome e classificação de seu cargo.
4) Cobra de seus clientes pelas horas gastas em cada contrato.
5) A taxa de cobrança horária depende da posição do funcionário alocado (valor de um
engenheiro é diferente do valor de um técnico).
6) Um funcionário pode estar alocado a um ou mais projetos simultaneamente.
Inicialmente, teremos uma tabela que contém os dados dos projetos e funcionários. Os
dados constituirão um relatório posterior. Veja a estrutura dessa tabela na Figura 1:
Conforme podemos observar, o modelo dessa tabela não se enquadra às melhores prá-
ticas já estudadas para a modelagem de um banco de dados. São encontradas as seguintes
deficiências:
1) O número de projeto (PROJ_NUM) destina-se, aparentemente, a constituir uma chave
primária (ou parte de uma), mas contém valores nulos.
2) As entradas induzem a inconsistência de dados: o cargo Eng. Eletricista, na coluna
JOB_CLASS, poderá ser inserido de distintas formas a cada cadastro, tais como: Elect.
Engineer, El. Eng, entre outras.
3) A tabela apresenta redundância de dados que originam as seguintes anomalias:
a) Anomalias de atualização: caso necessário, modificar o valor de JOB_CLASS para
o funcionário cujo EMP_NUM = 105 será muito trabalhoso (pensando em uma
base de dados com potenciais milhares de registros), pois todos os registros em
que o funcionário aparece deverão ser alterados.
b) Anomalias de inserção: considerando-se a necessidade de inserção de um novo
funcionário em um dado projeto, se este não tiver sido cadastrado, será necessá-
ria a criação de um projeto "fantasma" para concluir a entrada de dados.
c) Anomalias de exclusão: imaginemos a situação em que um funcionário está asso-
ciado a apenas um projeto: caso este deixe a empresa e seus dados sejam excluí-
dos, as informações pertinentes ao projeto também serão perdidas.
Embora tenhamos detectado várias deficiências de cunho estrutural na tabela em ques-
tão, ela parece atender as necessidades de geração de um relatório.
7. PROCESSO DE NORMALIZAÇÃO
Neste tópico, aprenderemos os procedimentos e as etapas necessárias à aplicação das
melhores práticas de normalização para a tabela da Figura 1. O objetivo da normalização é ga-
© U5 – Normalização e Desempenho em Sistema de Banco de Dados Relacional 201
rantir que todas as tabelas atendam ao conceito de relações bem estabelecidas, ou seja, que
tenham as seguintes características:
1) Cada tabela deve apresentar um único assunto: uma tabela de disciplina deverá con-
ter apenas as informações pertinentes à disciplina.
2) Nenhum item de dado deverá ser armazenado de forma desnecessária em mais de
uma tabela: como dito anteriormente, a redundância, caso não possa ser evitada,
deve ser minuciosamente controlada.
3) Todos os atributos não primários pertinentes à tabela deverão ser dependentes da
chave primária: isso garante a identificação exclusiva dos dados.
4) Todas as tabelas deverão estar livres das anomalias, de modo a garantir a integridade
e a consistência dos dados.
Para que possamos atender a todas as características elencadas, devemos proceder ao
processo de normalização, o qual passa por etapas, de modo a atingir formas normais sucessi-
vamente superiores. Porém, é importante lembrar que nem sempre o uso de formas normais
elevadas é a melhor opção.
As formais normais mais comuns estão descritas na Tabela 1:
Neste novo modelo, observa-se o emprego da 1NF, que descreve um formato de tabela
no qual:
• Todos os atributos de chave estão definidos.
• Não há grupos de repetição na tabela. Ou seja, cada intersecção de linha/coluna con-
tém um e somente um valor, não um conjunto de valores.
• Todos os atributos são dependentes de chave primária.
Depois de realizados os ajustes, podemos concluir que:
• Os atributos de chave primária são: PROJ_NUM e EMP_NUM.
• Existem dependências parciais: é necessário conhecer apenas o PROJ_NUM para que
se determine PROJ_NAME, ou seja, este é dependente apenas de uma parte da chave
primária. Da mesma forma, EMP_NAME, JOB_CLASS, CHG_HOUR e HOURS são depen-
dentes apenas de EMP_NUM.
Embora as dependências parciais não sejam recomendadas, muitas vezes seu uso é feito
baseando-se no desempenho. Contudo, tais dependências devem ser aplicadas no modelo de
banco de dados com muita precaução, pois uma tabela que contenha dependências parciais ain-
da está sujeita a redundâncias de dados e, portanto, a várias anomalias. As redundâncias, neste
caso, são inevitáveis, visto que as entradas das linhas exigirão duplicidade dos dados, podendo
ocorrer digitações inconsistentes com o padrão definido inicialmente e ocasionar a violação de
integridade.
PROJ_NUM
EMP_NUM
PROJ_NUM EMP_NUM
2) Cada um dos componentes se tornará a chave primária de uma nova tabela, ou seja,
a tabela original será dividida em três tabelas: PROJETO, FUNCIONARIO e DESIGNA-
CAO.
3) Distribuir os atributos dependentes: determinar os atributos interdependentes; logo,
as três novas tabelas serão compostas do seguinte modo:
A tabela DESIGNACAO, exibida na Figura 3, teve sua formação porque o número de ho-
ras gastas em cada projeto por cada funcionário é dependente tanto de PROJ_NUM como de
EMP_NUM: essas horas devem ser alocadas nesta tabela, no atributo ASSIGN_HOURS.
A tabela DESIGNACAO contém uma chave primária composta pelos atributos PROJ_NUM e
EMP_NUM. Qualquer atributo que faça parte, pelo menos, de uma chave é conhecido como atributo
primário ou atributo-chave. Portanto, PROJ_NUM e EMP_NUM são atributos primários (ou chave).
A partir da quebra da tabela originária (Figura 2), a maioria das anomalias ora discutidas
foi eliminada.
Caso queira-se adicionar, alterar ou excluir algum registro de PROJETO, basta realizar a
ação junto à respectiva tabela, tendo impacto apenas no registro alterado; todas as demais in-
formações correlacionadas a este projeto permanecerão íntegras e consistentes.
Como já discutido anteriormente, só existe ocorrência de dependência parcial a partir da
existência de chave primária composta por vários atributos da tabela; a tabela que possui ape-
nas um atributo como chave primária já está enquadrada na 2NF.
que é a chave deste índice, encontramos a página em que aquele conteúdo é abordado no livro;
no contexto de SGBD, encontramos o ponteiro.
A varredura de índice é mais eficiente do que a varredura completa de uma tabela, pois os
dados no índice são preordenados e sua quantidade geralmente é muito menor. Deste modo, ao
se realizar uma busca, é preferível e aconselhável que se utilize o índice para acessar uma tabela,
e não sua varredura completa.
Se os índices são tão importantes, por que não indexar a tabela toda? A resposta é sim-
ples: não é viável, pois o trabalho que seria despendido pelo SGBD para manter e atualizar todos
os índices seria, certamente, muito mais caro em termos de recursos e tempo, do que a sua não
utilização.
9. QUESTÕES AUTOAVALIATIVAS
Confira, a seguir, as questões propostas para verificar o seu desempenho no estudo desta
unidade:
1) Defina e exemplifique os conceitos a seguir:
a) Dependência funcional.
b) Dependência funcional parcial.
c) Dependência funcional transitiva.
d) Dependência funcional multivalorada.
e) Dependência funcional cíclica.
2) Quais são as principais anomalias que podem ocorrer em uma tabela sem normalização?
3) Quais as formas normais existentes para o processo de normalização? Defina suas principais características.
4) Quais são os cinco componentes que, eventualmente, podem ocasionar gargalos em um banco de dados?
8) Normalização é o processo de organização eficiente dos dados dentro de um banco de dados cujos objetivos
são eliminar dados redundantes e garantir que as dependências entre os dados façam sentido. Uma forma
normal é uma regra que deve ser aplicada na construção das tabelas do banco de dados para que estas sejam
bem projetadas.
A forma normal que é violada quando uma relação possui dependências multivaloradas indesejáveis, podendo,
por isso, ser usada para identificar e decompor tais relações, é conhecida por:
a) 1FN.
b) 2FN.
c) 3FN.
d) 4FN.
e) Forma Normal de Boyce-Codd (FNBC).
Gabarito
Confira, a seguir, as respostas corretas para as questões autoavaliativas propostas:
6) b.
7) a.
8) d.
10. CONSIDERAÇÕES
Nesta unidade, você teve a oportunidade de estudar o significado de dependência fun-
cional, o qual deverá ser utilizado desde o início do projeto para verificar as dependências dos
dados, auxiliando, assim, a otimização das consultas aos dados.
Ao conhecer a dependência que existe entre os atributos, você pôde observar que a nor-
malização induz o desenvolvedor a definir com precisão os dados realmente úteis e necessários
ao sistema, com refinamentos sucessivos das tabelas que eliminarão redundâncias, ambiguida-
des, relações duplicadas e anomalias de atualização.
Com o estudo desta unidade, é possível compreender os fatores relativos ao desenho de
um banco de dados focado em boa performance e os cuidados necessários para a manutenção
da performance com as políticas de tunning.
A próxima unidade terá como objetivo gerar a documentação de projeto de banco de da-
dos. Sua apresentação final do projeto será baseada em toda a teoria estudada até o momento.
11. E-REFERÊNCIA
Site pesquisado
RANGEL, A. L. Normalização. Disponível em: <https://sites.google.com/site/alexandrelrangel/Home/bancos-de-dados-i/BD1-E-
Normalização.pdf?attredirects=0&d=1>. Acesso em: 22 nov. 2012.
TAKAI, O. K.; ITALIANO, I. C.; FERREIRA, J.E. Apostila Introdução a banco de dados. São Paulo: DCC-IME-USP, 2005. Disponível em:
<http://www.ime.usp.br/~jef/apostila.pdf>. Acesso em: 09 out. 2012.
ROB, Peter. CORONEL, Carlos. Sistemas de Banco de Dados – projeto, implementação e administração. 8 ed. São Paulo: Cengage
Learning: 2011.
TAKAI, O. K.; ITALIANO, I. C.; FERREIRA, J.E. Apostila Introdução a banco de dados. São Paulo: DCC-IME-USP, 2005. Disponível em:
<http://www.ime.usp.br/~jef/apostila.pdf>. Acesso em: 09 out. 2012.
Gerenciamento de Transações
e Controle de Concorrência
1. OBJETIVOS
• Conhecer e definir transação.
• Conceituar os sistemas de processamento de transação.
• Aplicar as principais técnicas de controle de concorrência.
2. CONTEÚDOS
• Definição de transação.
• Tipos de falhas com operações de transação.
• Estados de uma transação.
• Propriedades das transações: ACID.
• Planos de execução das transações.
• Técnicas de controle de concorrência.
atento ao conteúdo que será estudado e, caso tenha dúvida, entre em contato com
seus colegas de curso ou seu tutor.
2) É importante que você estude a Unidade 4, pois é nela que se encontram os coman-
dos da linguagem de consulta SQL.
3) Se tiver dúvidas sobre as restrições de integridade, assunto que retomaremos nesta
unidade, volte ao conteúdo estudado na Unidade 3, tópico Restrições de Integridade
sobre Relações. Esses são conceitos importantes e devem ser bem compreendidos.
4) Concentre-se na definição de transação, os principais tipos de falhas oriundas das
transações, estados de uma transação etc.
5) É muito importante que você também abstraia o conceito e significado das proprieda-
des de uma transação (ACID): atomicidade, consistência, isolamento e durabilidade.
4. INTRODUÇÃO À UNIDADE
Até o momento, estudamos os conceitos fundamentais relacionados aos bancos de dados.
Vimos que existem três modelos: conceitual, lógico e físico.
Além disso, você aprendeu como elaborar o modelo de dados em nível conceitual, ao
criar o diagrama entidade-relacionamento. Você pôde compreender que esse modelo deve ser
mapeado para o modelo lógico e estudou como normalizar as relações e tratar as dependências
funcionais. Por fim, compreendeu que o modelo lógico dá origem ao modelo físico, em que o
banco de dados é criado no computador, por meio de um Sistema Gerenciador de Banco de
Dados.
Para continuar o nosso estudo, trataremos, nesta unidade, de assuntos relacionados aos
dados que já estão armazenados nos bancos de dados. Ou seja, estudaremos questões sobre
controle de transação, recuperação de dados em caso de falhas, segurança e distribuição de da-
dos. Esperamos que você tenha consolidado o conteúdo estudado anteriormente e tire o maior
proveito possível do que será apresentado a seguir.
Bom, vamos ao nosso estudo!
Para que não ocorra esse caos no sistema, existe a transação, que é uma unidade de exe-
cução de programa que acessa e, possivelmente, atualiza vários itens de dados. Ela é delimitada
pelas declarações:
rios, seguradoras, casas de câmbio, supermercados, entre outros, também são operados por
muitos usuários, que submetem transações concorrentes ao sistema.
Diversos usuários podem ter acesso aos bancos de dados. Geralmente, esse acesso ocorre
mediante alguma aplicação usada como interface (front-end) do banco de dados, possibilitando
o acesso simultâneo graças ao conceito de multiprogramação, que permite que o computador
execute diversos programas ao mesmo tempo. Se houver apenas uma unidade central de pro-
cessamento (CPU), ela poderá executar, no máximo, um processo de cada vez. Entretanto, siste-
mas operacionais com multiprogramação executam alguns comandos de um processo, depois
suspendem esse processo e executam alguns comandos do próximo processo, e assim por dian-
te. Portanto, a execução concorrente de processos é, na verdade, intercalada: se existem um
processo A e um processo B, estes serão executados concorrentemente de modo intercalado.
A intercalação possibilita a ocupação da CPU enquanto um processo executa uma opera-
ção de entrada ou saída (I/O), como ler um bloco de um disco, por exemplo. A CPU será chave-
ada para executar outro processo em vez de permanecer ociosa durante esse tempo de I/O. A
intercalação também impede que um processo longo retarde outros processos.
Observe que o fator que permite que muitas pessoas utilizem um único sistema ao mes-
mo tempo está relacionado ao conceito de multiprogramação, que possibilita ao computador
executar mais de um processo simultaneamente. Neste contexto, o sistema operacional executa
alguns comandos de um processo, depois interrompe essa execução e executa alguns comandos
de outro processo, e assim sucessivamente, dando a impressão de que os processos são execu-
tados ao mesmo tempo.
B
B
A A
t1 t2
Figura 2 Dois processos em execuções intercaladas.
A Figura 3 mostra que a Transação 1 leu um valor para o saldo e efetuou uma retira-
da, seguida de uma atualização. A Transação 2 leu o saldo atualizado pela Transação
1, efetuou um depósito e atualizou o saldo. Caso ocorra uma falha na Transação 1, o
valor original do saldo deve ser retornado e, temporariamente, a Transação 2 obtém
um valor incorreto para o saldo, pois ela ocorreu antes que o valor original fosse re-
tornado.
2) Sumário incorreto: esse problema ocorre quando uma transação utiliza uma função
de sumarização enquanto outras transações estão atualizando registros.
Função de sumarização é uma função que soma valores. Pode ocorrer um problema
de sumarização incorreta se essa função utilizar um valor que esteja sendo alterado
por outra função.
3) Leitura sem repetição: esse problema ocorre quando uma transação deve ler um item
duas vezes, porém, entre essas duas leituras, ocorre a modificação do item por outra
transação.
Consistência
Um banco de dados está em estado de consistência quando ele satisfaz as restrições espe-
cificadas no sistema. Esta propriedade indica a permanência do estado consistente do banco de
dados. Quando um banco de dados é consistente antes da execução de determinada transação,
ele deve continuar nesse estado de consistência após a execução completa da transação. A res-
ponsabilidade sobre a garantia dessa propriedade fica a cargo do programador, ao escrever os
programas, ou ao módulo do SGBD, responsável por garantir as restrições de integridade.
Isolamento
Essa propriedade deve garantir que a execução de uma transação não sofra interferência
das transações concorrentes. Isso significa que os dados utilizados durante a execução de uma
transação não podem ser utilizados por uma segunda transação até que a primeira seja devida-
mente concluída.
As atualizações de uma transação devem ser invisíveis às outras, até que elas sejam efeti-
vadas. Há uma classificação para os níveis de isolamento de uma transação, detalhada a seguir:
Durabilidade
Essa propriedade garante que as atualizações realizadas em um banco de dados por uma
transação devem persistir no banco de dados, independentemente da ocorrência de falhas. É de
responsabilidade do módulo de restauração do SGBD.
Ser serializável
Garante que o escalonador da execução atual das transações produza resultados consis-
tentes. Essa propriedade é importante em bancos de dados distribuídos e de multiusuários, nos
quais várias transações provavelmente serão executadas de modo simultâneo. Na situação em
que apenas uma transação é/será executada por vez, a serialização se faz desnecessária.
Bloqueios compartilhados/exclusivos
Os bloqueios compartilhados/exclusivos, também conhecidos como bloqueios de leitura/
escrita, possibilitam a alteração de um item X durante uma transação, caso seu acesso seja ex-
clusivo. As operações de bloqueio e seus respectivos estados são:
• read_lock(X);
• write_lock(X);
• unlock(X).
Uma tabela de bloqueio deve ser criada para manter o controle do número de transações
que controlam um bloqueio compartilhado, cujos registros contenham as seguintes informa-
ções: nome do item de dado (que está sendo bloqueado), LOCK, número de leituras e as tran-
sações_bloqueio.
Quando o estado de lock para um determinado item for do tipo write-locked, o valor para
o atributo transações_bloqueio é uma única transação que controla o bloqueio exclusivo para
a operação de escrita. Mas se o estado de lock for do tipo read_locked, então o valor para o
atributo transações_bloqueio deve ser uma lista com uma ou mais transações que controlam o
bloqueio compartilhado para a operação de leitura.
13. DEADLOCK
Deadlock refere-se à espera de uma transação por algum item que esteja bloqueado por
outra transação. É como uma fila de espera, em que cada transação fica aguardando que as ou-
tras transações do conjunto de transações libere o bloqueio de um item.
Veja o exemplo de deadlock ilustrado na Figura 4.
T1 T2
read_lock(A);
read_item(A);
read_lock(B);
read_item(B);
write_lock(B);
write-lock(A);
Figura 4 Exemplo da ocorrência de deadlock entre
duas transações.
Detecção de deadlock
A detecção de deadlock é uma técnica indicada quando as transações fazem poucos aces-
sos aos mesmos itens simultaneamente. Isso acontece quando as transações são curtas e blo-
queiam poucos itens. Uma vez identificada a existência de deadlock, algumas das transações
que o causam devem ser abortadas. Há algoritmos para se fazer a escolha dessas transações.
O uso de timeouts é outra técnica para se tratar deadlock. Porém, consiste em uma técnica
mais simples, na qual o sistema define um timeout. Se a transação esperar por um tempo maior
do que o definido pelo sistema, ela entra em deadlock e é abortada.
14. TIMESTAMPS
O timestamps marca o momento do início da transação. Conforme cada transação é sub-
metida ao sistema, é gerado um valor de timestamp, que são números sequenciais.
As transações são ordenadas pelo valor de seu timestamp (algoritmo de ordenação por
timestamp). Essa ordenação pode ser de dois tipos: básica e estrita.
Veja, a seguir, as características de cada tipo de ordenação de um timestamp.
2) Nesta unidade, você estudou que o padrão SQL especifica que uma transação inicia de modo subentendido. Por
quais comandos uma transação pode ser finalizada? Defina tais comandos.
Transação T1 Transação T2
1 Consulta Saldo Conta X
2 Grava Conta X com Saldo = Saldo + 100
3 Consulta Saldo Conta X
4 Encerra T1
5 Consulta Saldo Conta X
Se em (1) a Consulta do Saldo da Conta X resultar em 200, assinale a alternativa correta a seguir:
a) Em (3), a Consulta de Saldo resultará em 300.
b) Em (3), a Consulta de Saldo resultará em 100.
c) Em (3), a Consulta de Saldo resultará em 200.
d) Em (3), a Transação T2 entrará em espera da conclusão da Transação T1.
e) Em (5), a Consulta de Saldo resultará em 200.
7) Considere um sistema de controle de estoque de produtos simplificado e a execução das transações T1 e T2
conforme o Quadro 3.
Transação T1 Transação T2
1 Soma 50 ao Estoque do Produto 1 Subtrai 10 do Estoque do Produto 4
2 Soma 30 ao Estoque do Produto 2 Subtrai 20 do Estoque do Produto 5
3 Soma 100 ao Estoque do Produto 3 Subtrai 30 do Estoque do Produto 1
4 Encerra T1
5 Encerra T2
© U6 - Gerenciamento de Transações e Controle de Concorrência 229
Assinale a alternativa incorreta:
a) Após a execução de T1 e T2, o estoque do Produto 1 estará aumentado de 20.
b) Em (3), a Transação T2 entra em espera do encerramento de T1.
c) Ocorrerá um erro porque as duas transações alteram o estoque do Produto 1.
d) Após a execução de T1 e T2, o estoque do Produto 2 estará aumentado de 30 e o do Produto 4 diminuído
de 10.
e) A Transação T1 será executada de forma contínua, não dependendo do que ocorre na Transação T2.
8) Assinale a opção que não corresponde a uma característica de uma transação em um Sistema Gerenciador de
Banco de Dados:
a) Distributividade.
b) Atomicidade.
c) Durabilidade.
d) Consistência.
e) Isolamento.
Gabarito
Confira, a seguir, as respostas corretas para as questões autoavaliativas propostas:
6) d.
7) c.
8) a.
17. CONSIDERAÇÕES
Durante o estudo desta unidade, você teve a oportunidade de conhecer e compreender
os conceitos e as técnicas relacionados ao gerenciamento de transações e controle de concor-
rência.
Devido à complexidade e abrangência do assunto, procuramos abordar aqui os conceitos
considerados fundamentais. Recomendamos que você faça leituras com base na bibliografia
sugerida, procurando ampliar seu conhecimento, e realize as atividades propostas, pois elas o
ajudarão na fixação dos conceitos abordados.
1. OBJETIVOS
• Definir recuperação de dados.
• Conhecer as principais técnicas de recuperação de dados.
• Definir segurança.
• Aplicar medidas para a proteção de dados.
2. CONTEÚDOS
• Funções de um DBA.
• Backup e Recuperação.
• Caching de Disco.
• Transações: Checkpoints, Rollback.
• Recuperação baseada na Atualização Adiada.
• Recuperação baseada na Atualização Imediata.
• Paginação Shadow.
• Recuperação de falhas em Bancos de Dados Múltiplos.
• Recuperação de falhas por motivos de catástrofe.
• Segurança de Dados.
• Medidas de proteção aos Bancos de Dados.
232
232 © Banco de Dados
4. INTRODUÇÃO À UNIDADE
Na unidade anterior, estudamos que as informações sobre as atualizações que são reali-
zadas no banco de dados, pelas transações, ficam armazenadas no arquivo de log do sistema.
Nesta unidade, veremos que, em banco de dados, recuperação significa restauração. Essa
operação ocorre quando as transações falham e o banco precisa ser restaurado. Tais operações
devem ser controladas e executadas por um Administrador de Banco de Dados (DBA).
5. FUNÇÕES DE UM DBA
As responsabilidades do DBA variam a cada organização, mas, de modo geral, o DBA deve-
rá planejar a estratégia de administração de dados. São funções do DBA definir, implementar e
aplicar as políticas, padrões e procedimentos pertinentes a uma melhor conduta para o zelo das
informações contidas em um banco de dados.
Algumas operações envolvidas no trabalho do DBA, dentre as fases que constituem o pro-
jeto do banco de dados, são:
1) Planejamento do banco de dados: definição de padrões e procedimentos.
2) Coleta das necessidades de banco de dados e projeto conceitual.
3) Projeto lógico e transacional do banco de dados.
4) Projeto físico e implementação do banco de dados.
5) Teste e depuração do banco de dados.
6) Operações de manutenção do banco de dados, incluindo instalação, conversão e mi-
gração.
Veja, na Figura 1, a organização funcional do DBA.
© U7 - Recuperação de Banco de Dados e Segurança 233
O DBA tem importante papel técnico e exige uma ampla compreensão das funções, da
configuração, das linguagens de programação, da modelagem de dados, das metodologias de
projeto e do SGBD como um todo. Atividades como segurança, integridade, backup e recupera-
ção, treinamento e suporte são tarefas que serão recorrentemente vivenciadas dentro do cam-
po de trabalho de um DBA.
6. BACKUP E RECUPERAÇÃO
Um dos maiores ativos das organizações é o seu contingente informacional, e quando uma
organização necessita acessar determinada informação que não está prontamente disponível,
perdas podem ser geradas. Por isso, procedimentos de backup e restauração são imprescindí-
veis para assegurar a proteção e a constante disponibilidade das informações obtidas e acumu-
ladas ao longo do tempo.
Os procedimentos de backup e restauração são importantes em qualquer SGBD utilizado.
O DBA em questão deve garantir que os dados possam ser recuperados totalmente em caso de
perda física ou de perda de integridade dos dados.
A perda de dados pode apresentar-se de forma total ou parcial. A parcial ocorre em função
da perda de parte do banco de dados, especialmente de integridade. Já na perda total, o banco
de dados pode continuar a existir, mas a integridade ou o banco de dados físico é totalmente
perdido. Devido à série de problemas e "ameaças" que inferem no bom funcionamento e na dis-
ponibilidade correta dos dados, o DBA deve ater-se aos procedimentos de backup e restauração.
As atividades do DBA incluem o gerenciamento de desastres, de modo a garantir a dispo-
nibilidade dos dados após um possível desastre, seja ele físico ou uma falha de integridade. Para
tanto, é necessário um planejamento sistêmico dentro da organização, que deverá compreen-
der: planos de testes e planejamento de ações e procedimentos necessários à recuperação.
A seguir, observe as medidas que devem ser adotadas para os procedimentos de backup
e restauração dos dados.
1) Backups periódicos de dados e aplicações: muitos dos SGBDs utilizados atualmente
dispõem de ferramentas que garantem o backup e a recuperação dos dados no ban-
co. Cabe ao DBA fazer uso dessas ferramentas, de modo a adotar automatismo a tais
procedimentos. Em termos de banco de dados, denomina-se de dump o backup com-
pleto.
7. CACHING DE DISCO
Caching de disco, também conhecida como bufferização, é uma técnica na qual os itens
de dados a serem atualizados podem ficar armazenados nos buffers da memória principal para
serem atualizados e, somente depois, gravados no disco. O SGBD mantém controle sobre esses
buffers.
Os itens do banco de dados que ficam nos buffers são anotados em um catálogo. Dessa
forma, quando o SGBD solicitar algum item, primeiro será verificado se o item se encontra no
catálogo. Cada buffer no cache recebe um valor para um determinado atributo, para indicar se
houve ou não alteração do seu conteúdo. Quando a página é lida pela primeira vez, o atributo
recebe o valor zero (0). Sempre que houver uma atualização e o buffer for modificado, o valor
do atributo passa para um (1).
cado aos bancos de dados como forma de manter a atualização e a segurança das informações
contidas no banco de dados.
O backup consiste em copiar os dados gravados no disco magnético, assim como o arquivo
de log, em uma mídia mais barata e removível, ou mesmo em um disco de outro computador.
AUTHORITY AUT_EXEMPLO
GRANT RETRIEVE ( F#. FNOME. CIDADE ), DELETE
ON FUNCIONARIO F
TO Joao, Maria, Pedro ;
Em um dado momento, pode ser necessário que a autorização concedida seja anulada, e
talvez excluída. Observe no exemplo a seguir:
Ao contrário, as políticas de acesso obrigatório oferecem alto grau de proteção, pois, uma vez
impostas, evitam o fluxo ilegal dos dados e, por essa razão, são adequadas ao uso de órgãos
governamentais e militares, que exigem alto grau de proteção aos dados acessados.
Controle de acesso
Conhecido por DBA, o Administrador do Banco de Dados é o responsável por gerenciar
o sistema de banco de dados, o que inclui a responsabilidade pela segurança das informações
contidas no banco.
O Administrador do Banco de Dados pode criar contas para os usuários, conceder e re-
vogar privilégios e atribuir o nível de segurança adequado a cada tipo de usuário do banco de
dados. Para cada novo usuário, o DBA cria uma conta e uma senha. Ao entrar no sistema (login),
o SGBD valida a conta e a senha para disponibilizar os dados aos quais o usuário tem direito de
acesso.
Depois que o usuário já está devidamente autorizado a trabalhar com os dados, todos
os procedimentos executados por ele durante sua sessão de login são mantidos. A partir do
momento da conexão, sua conta fica registrada pelo SGBD, assim como o terminal ao qual se
conectou. Dessa forma, todas as operações executadas por um determinado usuário ficam re-
gistradas. Caso haja qualquer problema com o banco de dados, é possível descobrir qual foi o
responsável por causá-lo.
O registro das operações realizadas pelo usuário fica nos mesmos arquivos de log. Se hou-
ver necessidade, pode ser realizada uma auditoria de banco de dados, ou seja, uma verificação
nos arquivos de log para a identificação dos usuários e as operações realizadas por eles.
Controle de inferência
O controle de inferência refere-se à segurança de bancos de dados estatísticos e assegura
que os dados estatísticos serão acessados somente por pessoas autorizadas (gerentes, adminis-
tradores, diretores), pois a maioria desses dados estatísticos é utilizada para criar o ambiente de
BI (Business Intelligence), auxiliando a tomada de decisões empresariais)
Portanto, os bancos de dados estatísticos devem fornecer aos usuários os dados sobre os
indivíduos que compõem a população analisada, porém, devem assegurar a sua confidenciali-
dade.
Um problema que pode ocorrer é o da inferência a partir de consultas. Isso significa que
uma determinada informação pode não estar explícita no banco, mas pode ser "deduzida" a
partir da realização de várias consultas que levem o usuário a ter uma compreensão sobre as
informações obtidas, inferindo em um resultado. Isso pode ocasionar também em resultados
das consultas com valores que levem a uma inferência com alguma margem de erro. Por isso,
uma medida de segurança é a de não permitir consultas estatísticas quando o número de linhas/
tuplas de um determinado conjunto de informações ficar abaixo de um limiar considerado sa-
tisfatório pelos gerentes.
© U7 - Recuperação de Banco de Dados e Segurança 241
Controle de fluxo
O controle de fluxo é o responsável pela distribuição das informações entre os usuários
que têm permissão de acesso a elas e também por verificar se os usuários que recebem as infor-
mações têm permissão para recebê-las.
Você se lembra das classes de segurança apresentadas no Tópico Mecanismos de Acesso
Obrigatório? Pois bem, os controles de fluxo empregam o conceito de classes de segurança, o
que significa que, quando uma informação é enviada de um emissor a um receptor, a classe de
segurança do receptor deve ter, no mínimo, o mesmo privilégio que o da classe do emissor.
Quem determina por onde a informação deve caminhar é a política de fluxo. Por exemplo,
se as informações pertencerem às classes Confidencial e Não Confidencial, somente não será
permitido o fluxo de uma informação da classe Confidencial para a classe Não Confidencial.
Criptografia
A criptografia é um método que consiste em cifrar dados, de forma que eles fiquem dis-
farçados e não possam ser compreendidos (caso sejam acessados por algum tipo de usuário
sem permissão), além de manter os dados seguros em um ambiente não provido de segurança
satisfatória.
O processo consiste na aplicação de um algoritmo de criptografia, com o uso de uma cha-
ve de criptografia. Depois, para voltar os dados ao estado original, eles são decifrados por meio
de uma chave de criptografia. Quando uma mensagem criptografada é enviada a um destinatá-
rio, somente ele possui a chamada chave secreta, com a qual poderá ler a mensagem.
O governo dos Estados Unidos desenvolveu um sistema – Padrão de Criptografia de Da-
dos – que tem sido bastante aceito como padrão de criptografia. Trata-se de um algoritmo que
combina substituição e permutação, duas técnicas utilizadas na construção de criptografia.
Mensagens do tipo texto são cifradas em blocos de 64 bits (tamanho da chave), embora já exis-
tam outros padrões mais avançados, que trabalham com blocos de 128 bits.
A assinatura digital é uma cadeia de símbolos que utiliza técnicas de criptografia. Ela deve
associar um símbolo a uma pessoa, em um texto, de forma que esse símbolo permita que outras
pessoas identifiquem o dono da assinatura.
Entretanto, a assinatura digital não pode ser sempre a mesma para cada texto em que
ela aparece, pois seria alvo fácil de falsificação. Para que uma assinatura digital seja à prova de
falsificação, ela depende da mensagem e de um número secreto, que é único para o assinante.
Isso significa que a assinatura digital será criada com base em cada nova mensagem, além de um
registro da data e da hora, que reforçam a sua segurança.
3) Quais são as medidas que devem ser adotadas para os procedimentos de backup e restauração dos dados den-
tro de uma organização?
5) Que tipos de problema um DBA pode enfrentar quando trabalha com recuperação de falhas em bancos de
dados múltiplos?
6) Basicamente, três atributos devem ser considerados quando se trata de segurança. Defina-os detalhadamente.
17. CONSIDERAÇÕES
Nesta unidade, você teve a oportunidade de conhecer algumas técnicas de recuperação
de dados em banco de dados, em casos de ocorrência de falhas, e também estudou conceitos
relacionados à segurança dos dados – ambos de extrema importância para o sistema de bancos
de dados.
A recuperação refere-se a retornar os dados ao seu estado original no banco de dados,
caso uma transação falhe. Pode, também, estar relacionada a problemas físicos com o meio de
armazenamento: um problema no disco em que os dados estiverem gravados, por exemplo.
A questão da segurança trata de manter a integridade e a confidencialidade de informa-
ções. Há diferentes técnicas que são aplicadas de acordo com a necessidade de segurança para
as informações a serem acessadas.
Depois do estudo desta unidade, você consegue pensar nas consequências das falhas na
segurança dos dados de uma empresa? Tente relacioná-las às formas de manter a segurança
dos dados, a fim de se evitar prejuízos. Reflita a respeito e compartilhe suas reflexões com seus
colegas de turma.
1. OBJETIVOS
• Definir Fragmentação de Dados e reconhecer os tipos de Fragmentação.
• Explicar Replicação e Alocação de Dados.
• Classificar Sistemas Gerenciadores de Banco de Dados Distribuídos (SGBDDs).
• Conceituar Transação Distribuída.
• Identificar as falhas que ocorrem em Bancos de Dados Distribuídos.
2. CONTEÚDOS
• Fragmentação de Dados e seus tipos.
• Replicação e Alocação de Dados.
• Consultas em Bancos de Dados Distribuídos.
• Transação Distribuída.
• Controle de Concorrência e de Recuperação.
4. INTRODUÇÃO À UNIDADE
Na unidade anterior, você teve a possibilidade de aprender como recuperar dados em
bancos de dados e conhecer as principais técnicas de recuperação, a segurança de dados e algu-
mas medidas que podem ser tomadas para garantir a segurança dos dados.
Nesta unidade, estudaremos os Bancos de Dados Distribuídos. Existe um conceito que
define a computação distribuída e que pode ser aplicado não somente a banco de dados, mas a
quaisquer componentes que se encontram em computadores ou em locais diferentes e que, de
alguma forma, se relacionam. Observe:
Um sistema de computação distribuída pode ser entendido como vários componentes li-
gados por uma rede de computadores e que se relacionam para executarem tarefas em comum.
Segundo Elmasri e Navathe (2005, p. 579), Banco de Dados Distribuído (BDD) pode ser
definido como "uma coleção de múltiplos bancos de dados logicamente inter-relacionados, dis-
tribuídos por uma rede de computadores".
Um Sistema de Gerenciamento de Banco de Dados Distribuídos (SGBDD) tem por finalida-
de controlar o armazenamento e o processamento de dados relacionados logicamente por meio
de sistemas computacionais interconectados. Neste contexto, tanto os dados como as funções
de processamento são distribuídos entre os diversos locais, ou seja, uma matriz e inúmeras
filiais.
Ao analisar este novo modelo de banco de dados, o SGBDD enuncia que uma única apli-
cação deve possuir meios para que gerencie/opere de forma transparente, ou seja, sem que o
usuário tenha que fazer definições específicas em conformidade com sua necessidade, dados
dispersos. Podemos entender dispersão de dados como sendo um sistema de distintos SGBDs,
em servidores não centralizados, com sistemas operacionais não necessariamente iguais, em
outras palavras, um ambiente heterogêneo de dados.
A operação dos dados de forma transparente significa que, para o usuário que faz uso dos
dados por meio de uma aplicação qualquer, todo acesso deverá ocorrer de modo imperceptível,
para que tal distribuição não afete em nada sua usabilidade.
© U8 -Banco de Dados Distribuídos 245
O surgimento desta nova arquitetura de banco de dados veio atender a nova demanda de
corporações, que têm sofrido grandes mudanças em seus paradigmas administrativos, especial-
mente quanto à incorporação de meios tecnológicos.
Os primeiros sistemas de banco de dados foram implantados em meados da década de
1970, para atender as necessidades de armazenamento de informações de forma estruturada.
Esta centralização exigia que os dados corporativos fossem armazenados em um único local cen-
tral, normalmente um main-frame. Todo o acesso era provido em terminais sem capacidade de
processamento, os quais realizavam apenas consultas/solicitações aos main-frames.
Veja, na Figura 1, a abordagem de centralização dos dados.
internet como plataforma de acesso e distribuição de dados; na revolução das redes sem fios
pela qual o uso de dispositivos móveis tem se tornado cada vez mais comum (todos esses dispo-
sitivos acessam os dados a partir de localizações geograficamente variadas); no crescimento de
empresas que fornecem serviços de aplicações; na maior valorização dos dados (no sentido de
aplicar formas de análise e manipulação).
Esse cenário inovador e de mudanças contínuas tem feito com que os bancos de dados
descentralizados tornem-se mais adequados ao atendimento das novas demandas, haja vista
que os atuais Sistemas de Gerenciamento de Bancos de Dados Centralizados estão sujeitos a
alguns fatores como:
1) Queda de desempenho em razão do número crescente de localizações remotas.
2) Altos custos associados à manutenção e operação de grandes sistemas centrais.
3) Problemas de confiabilidade criados pela dependência de um local central.
4) Problemas de escalabilidade associados aos limites físicos impostos por uma única
localização.
5) Rigidez organizacional imposta pelo fato de o banco de dados eventualmente não dar
suporte à flexibilidade e agilidade exigidas pelas organizações modernas.
VANTAGENS DESVANTAGENS
• Menor risco de falha em ponto único: quando um • Aumento com custos de treinamento: os custos com
componente dos computadores falha, o trabalho é treinamento costumam ser mais elevados em modelos
mantido por outras estações. Os dados também são distribuídos do que em centralizados.
distribuídos em vários locais.
• Custos: os bancos de dados distribuídos exigem
• Independência do processador: o usuário final é capaz infraestrutura duplicada para operar.
de acessar todas as cópias disponíveis dos dados e suas
solicitações são processadas por qualquer processador no
local dos dados.
Confiabilidade e disponibilidade
Confiabilidade e disponibilidade são atributos que tendem a aumentar quando os dados
estão distribuídos.
A confiabilidade é a probabilidade de que, em um determinado momento, o sistema es-
teja em funcionamento.
Já a disponibilidade é a probabilidade de que, em um determinado intervalo de tempo, o
sistema esteja continuamente operante.
Se os dados estiverem armazenados em apenas um local, é mais fácil que o sistema fique
inoperante por determinado tempo. Portanto, na forma distribuída, se em um local houver al-
gum problema, os dados podem ser acessados de outro local, o que aumenta a confiabilidade
e a disponibilidade no sistema.
Desempenho
O desempenho em um banco de dados aumenta quando os dados estão localizados mais
próximos dos locais em que eles são necessários. Isso acontece porque a disputa pela CPU é
reduzida. Portanto, é função dos SGBDDs fragmentar o banco de dados para deixá-lo mais perto
do local em que será utilizado.
Conforme pode ser observado na Figura 2, este exemplo de banco de dados está dividido
em três fragmentos (E1, E2 e E3), situados em locais diferentes. Verifica-se que os computado-
res estão conectados por um sistema de rede. Neste ambiente de distribuição, os usuários em
questão não precisam saber onde se situam as informações acessadas por eles; tudo ocorre de
forma transparente.
Autonomia local
A autonomia local pode ser entendida como um ambiente onde os sites específicos, em
meio a um sistema distribuído, sejam autônomos. Ou seja, todas as configurações e customiza-
ções de um site específico podem ser manipuladas diretamente no mesmo, de modo que estas
alterações não implicarão no ambiente distribuído como um todo. Por exemplo, consideremos
um site A em que este tenha dependência de um site B. Considerando o conceito de autonomia
local, entende-se que alterações realizadas no site B, não devem inferir no site A.
A autonomia local também implica que dados locais são de propriedade e gerenciamento
locais, com contabilidade local: todos os dados realmente pertencem a algum banco de dados
local, mesmo que sejam acessíveis a partir de outros sites remotos. Desta forma, temáticas rela-
tivas à segurança, integridade e representação de armazenamento de dados locais permanecem
sob o controle e o domínio do site local.
Muito embora o conceito de autonomia local implique em total independência entre sis-
temas, este conceito não é efetivamente realizável. Em diversas situações é verificado que um
site A qualquer tem de conceder relativo controle a um site B. Desta forma, um melhor conceito,
mais prático e contextual de autonomia local, pode ser entendido como o modo em que os sites
devem possuir sua autonomia de forma mais extensível quão possível.
É importante saber que, em um sistema distribuído, os distintos pontos de localização de
dados podem ser denominados por: nós, site, ponto de distribuição, entre outros.
Fragmentação de dados
Vimos, no tópico anterior, os conceitos de fragmentação horizontal e fragmentação verti-
cal. Observe que a forma mais simples de fragmentação considera apenas um banco de dados,
sem replicação, ou seja, cada relação do banco (ou apenas parte dela) será armazenada em um
local.
A fragmentação ocorre, especialmente, para otimização de armazenamento de dados e
desempenho, ou seja, uma informação pode ser "dividida em pedaços" ou fragmentos. Os frag-
mentos, por sua vez, podem ser armazenados em locais distintos, de modo que uma dada infor-
mação que venha a ser mais utilizada pelo sistema, por exemplo, seja armazenada localmente,
minimizando-se assim o trafego de rede, por exemplo.
Há, ainda, a fragmentação mista, que consiste na combinação da fragmentação horizontal
com a vertical.
Uma fragmentação na horizontal acontece com o uso de uma operação SELECT, enquan-
to uma fragmentação na vertical é obtida com o uso de uma operação PROJECT.
Para conhecer os fragmentos e as suas localizações, podemos utilizar dois esquemas im-
portantes. São eles:
• Esquema de fragmentação: define um conjunto dos fragmentos com todos os atribu-
tos e tuplas do banco de dados. Dessa forma, se for necessário, é possível reconstruir
o banco de dados inteiro.
• Esquema de alocação: funciona como um tipo de mapeamento que indica o local em
que cada fragmento está armazenado.
© U8 -Banco de Dados Distribuídos 251
Replicação de dados
De acordo com Date (2003), um sistema admite replicação de dados se uma dada variável
de relação armazenada, ou um dado fragmento de uma variável de relação armazenada, pode
ser representado por muitas cópias ou réplicas distintas, armazenadas em sites distintos.
São três as formas como podem acontecer a replicação dos dados de um banco de dados,
a saber: total, parcial ou nenhuma.
A replicação é desejável por pelo menos duas razões:
1) Pode significar melhor desempenho (aplicações podem operar sobre cópias locais, em
vez de terem de se comunicar com sites remotos).
2) Também pode significar melhor disponibilidade (um dado objeto replicado permane-
ce disponível para processamento enquanto houver no mínimo uma cópia disponível).
Naturalmente, a maior desvantagem da replicação é que, quando um determinado objeto
replicado é atualizado, todas as cópias desse objeto precisam ser atualizadas; o problema da
propagação de atualizações.
A replicação total é conhecida como banco de dados distribuído completamente replica-
do. Nesse caso, o banco de dados inteiro é replicado para todos os sites do sistema distribuído.
A vantagem desse tipo de replicação é o aumento da disponibilidade dos dados, pois basta que
um dos sites esteja em funcionamento para se ter acesso aos dados do banco. Entretanto, são
desvantagens a redução da velocidade das operações de atualização (o cuidado está em manter
todas as cópias replicadas consistentes) e o fato de as técnicas de controle de concorrência e de
recuperação serem mais caras.
A Figura 3 ilustra a replicação dos dados em um SGBDD:
A Figura 3 demonstra a seguinte situação: suponha que o banco de dados A seja dividido
em dois fragmentos, A1 e A2. Dentro de um banco de dados distribuído replicado, por exemplo,
o cenário ilustrado pela Figura 3, é possível que o fragmento A1 seja armazenado nos locais S1
e S2, enquanto A2 é armazenado nos locais S2 e S3.
Embora a replicação traga benefícios, também impõe cargas adicionais ao processamento
ao SGBDD, pois cada cópia de dados deve ser mantida pelo sistema. Além disso, como dados
são replicados em outro local, há custos associados de armazenamento e ampliação dos tempos
transacionais.
Claretiano - Centro Universitário
252 © Banco de Dados
O contrário dessa forma é aquela na qual não há replicação alguma, conhecida como ne-
nhuma replicação.
A terceira forma, e a mais utilizada, é a replicação parcial dos dados, isto é, alguns frag-
mentos do banco de dados podem ser replicados e outros, não.
Até aqui, você teve a possibilidade de compreender que um esquema de replicação des-
creve como os fragmentos estão replicados. Veja, a seguir, o que é alocação de dados.
Alocação de dados
Refere-se à atribuição de um fragmento a um site, ou seja, determina o local em que um
fragmento ou suas cópias deverão ficar. Essa é a própria definição de distribuição de dados. São
estratégias de alocação:
• Alocação centralizada de dados: todo banco de dados é armazenado em um único
local.
• Alocação particionada de dados: o banco de dados é divido em duas ou mais partes se-
paradas, denominadas fragmentos, as quais são armazenadas em dois ou mais locais.
• Alocação replicada de dados: cópias de um ou mais fragmentos do banco de dados são
armazenadas em vários locais.
Considere um banco de dados para uma determinada universidade. Ele contém informa-
ções sobre os alunos, as matrículas, os professores, os funcionários, os departamentos, os labo-
ratórios, as bibliotecas etc. No entanto, as pessoas que acessam o banco têm diferentes interes-
ses sobre os dados armazenados.
Imagine que essa universidade tenha mais de um campus. Dessa forma, é necessário que
os dados estejam distribuídos pelos diferentes campi em seus respectivos sites. Supomos, ainda,
que em determinado campus não haja necessidade de que todos os atributos ou tuplas de uma
relação estejam presentes. Nesse caso, deve-se utilizar o recurso da fragmentação, que parti-
cionará as relações na vertical (atributos) ou na horizontal (tuplas). Os fragmentos obtidos são,
então, distribuídos aos diferentes sites. Pode acontecer, também, de não haver fragmentação e,
nesse caso, a relação inteira será replicada.
Chamamos o ato de distribuir esses fragmentos ou relações pelos sites de alocação.
Um SGBDD pode, ainda, ser classificado como federado. Isso significa que o servidor é um
SGBD com muita autonomia, com seus próprios usuários, transações e, até, DBA.
9. TRANSAÇÕES DISTRIBUÍDAS
Da mesma forma que as transações locais devem preservar as propriedades ACID, as tran-
sações distribuídas também o devem.
Conforme já estudamos na Unidade 6, o termo ACID refere-se às propriedades das transa-
ções, impostas pelo controle de concorrência e significa: Atomicidade, Consistência, Isolamento
e Durabilidade.
Relembraremos o que já foi estudado: as transações locais acessam e atualizam apenas o
banco de dados local, enquanto as distribuídas (ou globais) acessam e atualizam diversos ban-
cos de dados locais. Por esse motivo, é mais difícil a preservação das propriedades ACID, uma
vez que vários sites podem estar envolvidos no processo.
Não devemos nos esquecer de que as transações podem falhar e, se isso ocorrer no mo-
mento em que muitos sites estiverem envolvidos na execução, o processamento pode terminar
em erro.
Múltiplas cópias
Os sistemas distribuídos possuem múltiplas cópias de seus dados, as quais estão espalha-
das por diferentes sites. O controle de concorrência é responsável por manter a consistência
dessas cópias.
Falhas de sites
Se um site falhar, o SGBDD deve continuar operando com os demais sites e, quando um
site for recuperado, o banco de dados local deve ser atualizado.
Falhas de comunicação
As falhas de comunicação são falhas que ocorrem nos links de comunicação entre os sites,
e cabe ao sistema lidar com essas quebras.
Commit distribuído
O commit distribuído refere-se aos problemas que podem surgir caso uma transação es-
teja acessando bancos de dados armazenados em vários sites, e algum desses sites falhar no
momento do commit da transação. Nesses casos, utiliza-se o protocolo commit de duas fases,
capaz de tratar esse tipo de problema.
As falhas em sistemas distribuídos estão relacionadas com problemas que ocorrem nas
redes de computadores e, especificamente nesse caso, com a forma como os sites estão conec-
tados. Pense nas topologias de rede: agora, imagine que cada site seja um nó da rede. As dife-
rentes topologias de rede possuem características diferentes quanto às falhas e, dependendo da
topologia, uma falha em um único nó pode particionar a rede, enquanto, em outra topologia,
por exemplo, é necessário que mais de um nó falhe para que a rede seja particionada.
Desse modo, podemos dizer que um sistema distribuído que consegue detectar falhas é
considerado robusto. É desejável, ainda, que ele tenha a capacidade de reconfigurar o sistema e
possa continuar funcionando, e que recupere seu estado original. Os processos de recuperação
de falhas nos sistemas distribuídos são mais complexos do que para sistemas centralizados.
Os métodos de controle de concorrência distribuída são uma extensão das técnicas utili-
zadas para o controle de concorrência dos bancos de dados centralizados.
A ideia geral é que cada item de dados tenha o que se chama de cópia distinta, de forma
que todas as operações de bloqueio e desbloqueio sejam realizadas nessa cópia. A ideia da có-
© U8 -Banco de Dados Distribuídos 255
pia distinta é geral para todas as técnicas. No entanto, cada técnica possui sua forma de escolher
as cópias distintas.
Apresentamos, a seguir, algumas técnicas utilizadas no controle de concorrência distribu-
ída, com base na cópia distinta:
Site primário
Um dos sites é escolhido para ser o coordenador das solicitações de bloqueio e desblo-
queio (como na técnica sobre o bloqueio centralizado).
Cópia primária
O objetivo da cópia primária é que a carga de bloqueio seja distribuída por vários sites, de
forma que as cópias distintas fiquem armazenadas em diferentes sites. Dessa forma, se um site
falhar, serão afetadas apenas as transações que estejam acessando bloqueios para as cópias do
site afetado. As demais transações nada sofrerão.
Além da concorrência distribuída com base em cópias distintas, existe, ainda, o controle
de concorrência distribuída baseada em votação e o processo de recuperação distribuída. A téc-
nica de votação não trabalha com cópias distintas. A solicitação de bloqueio é enviada a todos
os sites que possuam uma cópia do item de dados, e aos sites cabe conceder ou negar o pedido.
Para a transação ter seu pedido atendido, é necessário que a maior parte das cópias dos itens de
dados conceda a permissão de bloqueio solicitada pela transação. Caso contrário, a solicitação
é cancelada.
Não será abordado aqui o processo de recuperação distribuída devido a sua complexida-
de. Segundo Elmasri e Navathe (2005, p. 595), "o processo de recuperação em bancos de dados
distribuídos é bastante complicado."
Apêndice 1
Instalação do PostgreSQL
1. APRESENTAÇÃO
Neste Apêndice, você terá a oportunidade de conhecer os procedimentos relativos à ins-
talação do PostgreSQL, que será utilizado durante o decorrer deste estudo
É importante ressaltar que para a construção deste Apêndice foram utilizadas informações
do próprio site do PostgreSQL, disponível em: <http://www.postgresql.org.br>. Acesso em: 23
out. 2012.
O PostgreSQL é um Sistema de Gerenciamento de Banco de Dados Objeto-Relacional ba-
seado no Postgres versão 4.2, desenvolvido pelo Departamento de Ciência da Computação da
Universidade da Califórnia, em Berkeley. O Postgres foi pioneiro em vários conceitos que se tor-
naram disponíveis somente bem mais tarde, em alguns sistemas de banco de dados comerciais.
O PostgreSQL é um descendente de código-fonte aberto do código original de Berkeley,
que suporta grande parte do padrão SQL e oferece muitas funcionalidades modernas, como:
1) Comandos complexos.
2) Chaves estrangeiras.
3) Gatilhos.
4) Visões.
5) Integridade transacional.
6) Controle de simultaneidade multiversão.
Além disso, o PostgreSQL pode ser ampliado pelo usuário de muitas maneiras como, por
exemplo, adicionando:
1) Tipos de dado.
2) Funções.
3) Operadores.
4) Funções de agregação.
5) Métodos de índice.
6) Linguagens procedurais.
Devido à sua licença liberal, o PostgreSQL pode ser utilizado, modificado e distribuído
por qualquer pessoa para qualquer finalidade, seja particular, comercial ou acadêmica, livre de
encargos.
Histórico
O Sistema de Gerenciamento de Banco de Dados Objeto-Relacional, hoje conhecido por
PostgreSQL, é derivado do pacote Postgres escrito na Universidade da Califórnia, em Berkeley.
Com mais de uma década de desenvolvimento, o PostgreSQL é atualmente o mais avançado
banco de dados de código aberto disponível.
O projeto Postgres, liderado pelo Professor Michael Stonebraker, foi patrocinado pela Defen-
se Advanced Research Projects Agency (DARPA), pelo Army Research Office (ARO), pela National
Science Foundation (NSF)) e pela ESL, Inc. A implementação do Postgres começou em 1986. Os
conceitos iniciais para o sistema foram apresentados em The design of Postgres, e a definição do
modelo de dados foi descrita em The Postgres data model. O projeto do sistema de regras desta
época foi detalhado em The design of the Postgres rules system, e os fundamentos lógicos e a ar-
quitetura do gerenciador de armazenamento, em The design of the Postgres storage system.
O Postgres passou por várias versões principais desde então. A primeira versão de de-
monstração do sistema se tornou operacional em 1987, e foi exibida em 1988 na Conferência
ACM-SIGMOD. A versão 1, descrita em The implementation of Postgres, foi liberada para alguns
poucos usuários externos em junho de 1989. Em resposta à crítica ao primeiro sistema de re-
gras, e a versão 2 foi liberada em junho de 1990, contendo um novo sistema de regras. A versão
3 surgiu em 1991, adicionando suporte a múltiplos gerenciadores de armazenamento, um exe-
cutor de comandos melhorado, e um sistema de regras reescrito. Em sua maior parte, as versões
seguintes, até o Postgres95, focaram a portabilidade e a confiabilidade.
O Postgres tem sido usado para implementar muitos aplicativos diferentes de pesquisa
e de produção, incluindo: sistema de análise de dados financeiros, pacote de monitoração de
desempenho de motor a jato, banco de dados de acompanhamento de asteróides, banco de da-
dos de informações médicas, e vários sistemas de informações geográficas. O Postgres também
tem sido usado como ferramenta educacional por várias universidades. Por fim, a Illustra Infor-
mation Technologies (posteriormente incorporada pela Informix, que agora pertence à IBM)
apossou-se do código e o comercializou. O Postgres se tornou o gerenciador de dados principal
do projeto de computação científica Sequoia 2000, no final de 1992.
O tamanho da comunidade de usuários externos praticamente dobrou durante o ano de
1993. Começou a ficar cada vez mais óbvio que a manutenção do código do protótipo e o su-
porte estavam consumindo grande parte do tempo que deveria ser dedicado a pesquisas de
banco de dados. Em um esforço para reduzir essa sobrecarga de suporte, o projeto do Postgres
de Berkeley terminou oficialmente na versão 4.2.
O Postgres95
Em 1994, Andrew Yu e Jolly Chen adicionaram um interpretador da linguagem SQL ao
Postgres. Sob um novo nome, o Postgres95 foi, em seguida, liberado na web para encontrar seu
próprio caminho no mundo, como descendente de código aberto do código original do Postgres
de Berkeley.
O código do Postgres95 era totalmente escrito em ANSI C, com tamanho reduzido em
25%. Muitas mudanças internas melhoraram o desempenho e a facilidade de manutenção. O
Postgres95 versão 1.0.x era 30 a 50% mais rápido que o Postgres versão 4.2, pelo Wisconsin
Benchmark. Além da correção de erros, vejamos as principais melhorias descritas a seguir.
1) A linguagem de comandos PostQUEL foi substituída pela linguagem SQL (implemen-
tada no servidor). Não foram permitidas subconsultas até o PostgreSQL, mas estas
podiam ser simuladas no Postgres95, por meio de funções SQL definidas pelo usuário.
As funções de agregação foram reimplementadas. Também foi adicionado suporte a
cláusula GROUP BY nas consultas.
2) Foi fornecido um novo programa para executar comandos SQL interativos, o psql, uti-
lizando o Readline do GNU, que substituiu com vantagens o programa monitor antigo.
3) A interface para objetos grandes foi revisada. A inversão de objetos grandes era o
único mecanismo para armazená-los (o sistema de arquivos inversão foi removido).
4) O sistema de regras no nível de instância foi removido. As regras ainda eram disponí-
veis como regras de reescrita.
© Apêndices 259
O PostgreSQL
Em 1996 ficou claro que o nome Postgres95 não resistiria ao teste do tempo. Foi escolhido
um novo nome, PostgreSQL, para refletir o relacionamento entre o Postgres original e as versões
mais recentes com capacidade SQL. Ao mesmo tempo, foi mudado o número da versão para
começar em 6.0, colocando a numeração de volta à sequência original começada pelo projeto
Postgres de Berkeley.
A ênfase durante o desenvolvimento do Postgres95 era identificar e compreender os pro-
blemas existentes no código do servidor. Com o PostgreSQL, a ênfase foi reorientada para o
aumento das funcionalidades e recursos, embora o trabalho continuasse em todas as áreas.
Instalação do PostgreSQL
O PostgreSQL pode ser obtido pelo site de sua organização mantenedora, disponível em:
<http://www.postgresql.org.br/downloads>. Acesso em: 23 out. 2012.
Ao acessar o endereço, deverá ser apresentada uma página similar à Figura 1. Veja:
Por se tratar de um sistema portável, ou seja, pode ser utilizado em diversos sistemas
operacionais, temos que escolher a versão adequada ao uso. Este Apêndice adotará o ambiente
Windows como padrão. Conforme pode ser observado na Figura 1, a área em destaque contém
as versões do SGBD para cada sistema operacional. Selecione aquele que atenderá suas neces-
sidades.
A etapa seguinte à seleção do sistema operacional levará à página exibida pela Figura 2.
Conforme indicado na Figura 5, acione o botão Next, para avançarmos para a etapa se-
guinte.
O próximo passo refere-se ao diretório onde o PostgreSQL deverá ser instalado, conforme
mostrado na Figura 6.
Chegamos a uma etapa muito importante para o SGBD: a definição da senha do supe-
rusuário, aquele que conterá os privilégios totais quanto ao SGBD, denominado por Postgres.
Como o banco de dados será para uso de estudo e aprendizado, e não para rodar uma aplicação
crítica, recomendamos o uso de uma senha fácil (123456). Preencha a senha e sua confirmação
conforme indicado na Figura 8.
Caso necessite utilizar outra porta, você deverá informá-la neste momento. Manteremos
a porta padrão. Prossiga acionando Next.
A última definição refere-se ao locale que o banco deverá suportar. Manteremos o padrão,
conforme indicado na Figura 10.
Mantendo-se a opção padrão, ou tendo selecionado algum locale específico, acione o bo-
tão Next.
Você será informado que o PostgreSQL está pronto para ser instalado. Ciente disto, sele-
cione a opção Next novamente, conforme Figura a 11.
Será dado início ao processo de instalação, conforme demonstrado na Figura 12. Aguarde
até seu término.
Ao término do processo será exibida a seguinte janela, conforme mostra a Figura 13.
© Apêndices 267
Como pode ser observado na Figura 13, desmarque a opção Launch Stack Build e clique
no botão Finish. Neste momento sua máquina já deverá dispor do PostgreSQL instalado.
O PostgreSQL tem um bom gerenciado nativo, o pgAdminIII. Localize-o no menu Iniciar de
seu sistema e acesse-o.
A interface do pgAdminIII é apresentada na Figura 14. Observe:
Seu ambiente deverá estar semelhante ao apresentado na Figura 14. Dê um clique duplo
na opção indicada na Figura 15.
Será solicitada a senha definida anteriormente (como mostra a Figura 16). Informe-a.
A partir de agora, seu banco de dados PostgreSQL está devidamente instalado e pronto
para ser usado.
Bons estudos!
2. E-REFERÊNCIAS
Sites pesquisados
COMUNIDADE BRASILEIRA DE POSTGRESQL. Disponível em: <http://www.postgresql.org.br>. Acesso em: 23 out. 2012.
COMUNIDADE BRASILEIRA DE POSTGRESQL. Disponível em: <http://www.postgresql.org.br/downloads>. Acesso em: 23 out.
2012.
Apêndice 2
Álgebra Relacional
1. APRESENTAÇÃO
A álgebra relacional é uma coleção de operações que utiliza uma linguagem formal para
manipular as relações. Essas operações são utilizadas para selecionar tuplas de relações indivi-
duais e para combinar tuplas relacionadas de relações diferentes para especificar uma consulta
em um banco de dados.
O resultado de cada operação é uma nova operação, a qual também pode ser manipulada
pela álgebra relacional.
A seguir, veja algumas operações da álgebra relacional.
Operação Select
A operação select é utilizada para selecionar um subconjunto de tuplas de uma relação. As
tuplas devem satisfazer uma condição de seleção.
As operações relacionais que podem ser aplicadas na operação select são:
•
Além dos operadores booleanos:
• and, or, not.
A operação select é unária, ou seja, só pode ser aplicada a uma única relação. Não é pos-
sível aplicar a operação sobre tuplas de relações distintas.
A forma geral de uma operação select é:
s <condição de seleção> ( <nome da relação> )
Na qual:
• a letra grega s (sigma) é utilizada para representar a operação de seleção;
• a <condição de seleção> é uma expressão booleana aplicada sobre os atributos da
relação;
• o <nome da relação> é o nome da relação sobre a qual será aplicada a operação select.
Exemplo
Considere a entidade ALUNO, a seguir:
ALUNO (código, nome, sexo, nascimento, rua, número, bairro, cidade, estado)
Consulta = s <condição de seleção> ( <nome da relação> )
Em linguagem SQL:
SELECT * FROM aluno WHERE sexo = "feminino";
Em linguagem SQL:
SELECT * FROM aluno WHERE sexo = "feminino" and cidade= "Batatais";
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 é:
p <lista de atributos> (<nome da relação>)
Na qual:
• a letra grega p (pi) representa a operação project;
• a <lista de atributos> representa a lista de atributos que o usuário deseja selecionar;
• o <nome da relação> representa a relação sobre a qual a operação project será aplicada.
Exemplo
Considere a entidade ALUNO, a seguir.
ALUNO (código, nome, sexo, nascimento, rua, número, bairro, cidade, estado)
Consulta = p código, nome (ALUNO)
Em linguagem SQL:
SELECT código, nome FROM aluno;
As operações project e select podem ser utilizadas de forma combinada, permitindo que
apenas determinadas colunas de determinadas tuplas possam ser selecionadas
Exemplo
p <lista de atributos> (s <condição de seleção> ( <nome da relação> ))
p código, nome (ssexo= "feminino" (ALUNO))
Operações matemáticas
Levando em consideração que as relações podem ser tratadas como conjuntos, podemos,
então, aplicar operações matemáticas sobre as relações. Estas operações são: união ( ), inter-
secção ( ), diferença (-) e produto cartesiano (X).
As operações união, interseção e diferença devem ser passíveis de união. Duas relações
R(A1,A2, … , An) e S(B1, B2,…, Bn) são passíveis de união se têm o mesmo grau e domínio (A) =
domínio(B), para 1 <= i <= n.
Observe, a seguir, a definição destas operações.
1) 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.
2) Intersecçã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.
3) 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.
4) Produto cartesiano: o produto cartesiano de duas relações R X S combina cada tupla
de R com cada tupla de S. O resultado de R(A1, A2,
, An) X S(B1, B2,
, Bm) é uma re-
lação T com n + m atributos T(A1, A2, …, An, B1, B2, …,Bm). Se R tem x tuplas e S tem
y tuplas, então R X S terá x*y tuplas.
Exemplos
União
Considere a entidade ALUNO, a seguir.
ALUNO (código, nome, sexo, nascimento, rua, número, bairro, cidade, estado)
Intersecção
Considere as entidades PROFESSOR E TUTOR.
PROFESSOR (código, nome, área, unidade)
TUTOR (código, nome, área, unidade)
PROFESSOR
NOME ÁREA
Alberto Silva Computação
Carlos Souza Matemática
Joaquim Nabuco Computação
Celso Prado Computação
TUTOR
NOME ÁREA
Alberto Silva Computação
Adelaide Almeida Matemática
Joaquim Nabuco Computação
Luiz Almeida Matemática
Diferença
Considere as entidades PROFESSOR e TUTOR.
Obtenha o nome e a área dos professores que não são tutores na unidade de Batatais.
P= p nome, área (s unidade = "Batatais" (PROFESSOR))
PROFESSOR
NOME ÁREA
Alberto Silva Computação
Carlos Souza Matemática
Joaquim Nabuco Computação
Celso Prado Computação
TUTOR
NOME ÁREA
Alberto Silva Computação
Adelaide Almeida Matemática
Joaquim Nabuco Computação
Luiz Almeida Matemática
Produto cartesiano
Considere as entidades DISCIPLINA e ALUNO.
DISCIPLINA
CÓDIGO_DISC NOME_DISC
1010 Banco de dados
1234 Lógica de programação
ALUNO
CÓDIGO_ALUNO NOME
32 José Carlos
34 Juliana Almeida
43 Luan Ribeiro
© Apêndices 275
DISCIPLINA X ALUNO
CÓDIGO_DISC NOME_DISC CÓDIGO_ALUNO NOME
1010 Banco de Dados 32 José Carlos
1234 Lógica de Programação 32 José Carlos
1010 Banco de Dados 34 Juliana Almeida
1234 Lógica de Programação 34 Juliana Almeida
1010 Banco de Dados 43 Luan Ribeiro
1234 Lógica de Programação 43 Luan Ribeiro
Operador Join
Join é uma das operações mais utilizadas na álgebra relacional e a forma mais comum de
combinar informação de duas ou mais relações.
Exemplo
Considere as relações R e S:
T= (R X <condição> S)
Produz uma relação com todas as combinações possíveis entre os registros da relação R
com a S condicionadas pela <condição>.
Pode-se dizer que:
(R X <condição> S) = s <condição> (R x S)
Exemplo
Qual o nome e o código do aluno que efetuou matrícula após o dia "10-01-2008"?
A diferença entre a operação join e o produto cartesiano é que o join efetua apenas as
combinações de tuplas que satisfizerem a condição de junção. No produto cartesiano, todas as
combinações aparecem no resultado, como foi visto anteriormente.
As junções permitem relacionar dados de duas ou mais tabelas de forma que se obtenha
uma única tabela como resultado. Em uma "junção", reconhece-se o select quando há mais de
uma tabela referida na cláusula from. Veja o exemplo a seguir:
Exemplo
SELECT "lista-de-colunas" FROM tabela1, tabela2 WHERE "condição(ões) "
Exemplo
SELECT "lista-de-colunas" FROM tabela1, tabela2 WHERE "AtributoA = AtributoB "
Já outro tipo de join, chamado de natural join ou junção natural, é um equijoin, no qual um
dos atributos com valores repetidos (condição de junção) é eliminado.
Operador divisão
A divisão de duas relações R S, em que atributos(S) atributos(R), resulta na relação T
com atributos(T) = {atributos(R) – atributos(S)}, onde, para cada tupla t que aparece no resulta-
do, os valores de t deverão aparecer em R, combinados com cada tupla de S.
R
A a1 a2 a3 a4 a1 a3 a2 a3 a4 a1 a2 a3
B b1 b1 b1 b1 b2 b2 b3 b3 b3 b4 b4 b4
S
A a1 a2 a3
T=R S
B b1 b4
Na maioria das vezes, a divisão é utilizada quando encontramos nas consultas frases do
tipo "para todos".
Exemplo
Obtenha o nome dos alunos que trabalham em todos os projetos em que o aluno Silva
trabalha.
Desse modo, você poderá encontrar os nomes dos demais alunos que trabalham nos mes-
mos projetos que o aluno Silva.
© Apêndices 277