SlideShare a Scribd company logo
1 of 76
Download to read offline
UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE)

  COORDENAÇÃO GERAL DE EDUCAÇÃO A DISTÂNCIA (EAD/UFRPE)




          Programação III




     Fernando Antonio Mota Trinta




                                                    Volume 3




                    Recife, 2011
Universidade Federal Rural de Pernambuco


Reitor: Prof. Valmar Corrêa de Andrade
Vice-Reitor: Prof. Reginaldo Barros
Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho
Pró-Reitor de Atividades de Extensão: Prof. Delson Laranjeira
Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena
Pró-Reitora de Pesquisa e Pós-Graduação: Profª Antonia Sherlânea Chaves Véras
Pró-Reitor de Planejamento: Prof. Romildo Morant de Holanda
Pró-Reitor de Gestão Estudantil: Prof. Valberes Bernardo do Nascimento
Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos



Produção Gráfica e Editorial
Capa e Editoração: Rafael Lira, Italo Amorim e Everton Felix
Revisão Ortográfica: Elias Vieira
Ilustrações: Allyson Vila Nova
Coordenação de Produção: Marizete Silva Santos
Sumário

   Apresentação................................................................................................................. 5

   Conhecendo o Volume 3 ................................................................................................ 6

   Capítulo 1 – Uma visão geral sobre bancos de dados...................................................... 8

       1. Introdução ...................................................................................................................8

       2. Por que os Bancos de Dados existem? ........................................................................9

       3. Arquitetura Geral de um SGBD ..................................................................................12

            3.1 Banco de Dados e uma visão em camadas ........................................................13

       4. A modelagem e a representação de dados em um SGBD .........................................14

            4.1 O Modelo Relacional ..........................................................................................15

            4.2 Um modelo relacional para o sistema bancário.................................................17

   Capítulo 2 – A linguagem estruturada de consulta: SQL ................................................ 23

       1. Introdução .................................................................................................................23

       2. Classificação de comandos SQL .................................................................................24

       3. Instalação e utilização do HyperSQL ..........................................................................25

       4. Comandos DDL ..........................................................................................................27

            4.1 Criando tabelas ..................................................................................................27

            4.2 Alterando tabelas ...............................................................................................31

            4.3 Apagando tabelas ..............................................................................................31

       5. Comandos DML e DQL ...............................................................................................32

            5.1 Inserindo dados em tabelas ...............................................................................32

            5.2 Visualizando dados das tabelas..........................................................................35

            5.3 Alterando dados em tabelas ..............................................................................41

            5.4 Removendo registros ........................................................................................42
Capítulo 3 – A especificação JDBC ................................................................................ 47

    1. Introdução .................................................................................................................47

    2. JDBC ...........................................................................................................................48

    3. Configurando eclipse para usar JDBC ........................................................................50

    4. Utilizando a API JDBC .................................................................................................55

         4.1 Estabelecendo uma conexão com o banco ........................................................55

         4.2 Acessando o banco de dados .............................................................................56

         4.3 Parametrizando consultas ..................................................................................61

    5. Transações com JDBC ................................................................................................63

    6. Integrando o Banco com o Sistema de Contas ..........................................................64

Conheça o Autor .......................................................................................................... 76
Apresentação
        Caro Cursista,
         Seja bem-vindo(a) ao curso de Programação III. Esta disciplina dará seqüência aos estudos iniciados
na disciplina de linguagem de programação II, apresentando conceitos avançados relacionados à construção
de aplicações orientadas a objetos. Este curso é composto por 4 volumes. No primeiro volume, estudamos a
importância da boa organização dos sistemas, por meio dos conceitos de arquitetura de software e padrões de
projeto. Em seguida, vimos como podemos criar aplicações multitarefa utilizando threads de threads, para, por fim,
aprendermos a gerenciar arquivos em aplicações orientadas a objetos.
         O segundo volume foi dedicado ao estudo do conceito de frameworks e à construção da interface do usuário,
utilizando recursos avançados como janelas, botões, listas de seleção, e outras metáforas bastante conhecidas das
aplicações modernas. Este assunto aborda ainda o chamado modelo de programação orientado a eventos.
         Este terceiro volume é totalmente dedicado ao estudo da integração de aplicações com bancos de dados.
Para isto, veremos primeiramente conceitos fundamentais sobre bancos de dados, para depois vermos como se dá
sua integração com aplicações.
        No quarto e último volume, você aprenderá a criar aplicações distribuídas utilizando duas abordagens: a
de sockets e a de objetos distribuídos. Em todos estes volumes, re-utilizaremos conceitos aprendidos no curso de
linguagem de programação II, e sempre que possível, utilizaremos o estudo de caso desenvolvido anteriormente, o
sistema de controle bancário, para apresentar os novos conceitos de cada capítulo.
        Portanto, é de fundamental importância que você tenha bem sedimentado os conceitos de orientação
a objetos para dar prosseguimento a esta disciplina. No mais, espero que você aproveite este material para
aprofundar-se ainda mais sobre como deve-se construir aplicações mais robustas e próximas de cenários reais do
desenvolvimento de software na atualidade.
        Bons estudos!
                                                Professor Fernando Trinta




                                                                                                                5
Programação III


                      Conhecendo o Volume 3
                               Neste terceiro volume, você irá encontrar o Módulo 3 da disciplina Programação III.
                      Para facilitar seus estudos, veja a organização deste terceiro módulo.

                              Módulo 3 – Uma introdução à integração de programas com bancos de
                      dados

                              Carga Horária do Módulo 3: 15 h
                              Objetivo do Módulo 3: Introduzir os conceitos básicos de bancos de dados, sua
                      organização interna de dados e relação com o mundo orientado a objetos. Apresentar a
                      linguagem SQL para manipulação de dados. Apresentar a especificação JDBC para conexão
                      de programas escritos em linguagem Java com bancos de dados.

                              Conteúdo Programático do Módulo 3

                          »   Introdução a bancos de dados;
                          »   A Linguagem SQL;
                          »   A Especificação JDBC.
                               Como relatado anteriormente, o terceiro volume desta disciplina é totalmente
                      dedicado à integração de programas como bancos de dados. Este é um assunto muito
                      importante. Praticamente todo sistema de informação é composto por programas que
                      interagem com bases de dados que são gerenciadas por um software específico, o sistema
                      gerenciador de bancos de dados ou SGBD. A importância da manutenção correta destes
                      dados é tanta, que esta é considerada uma área de pesquisa específica dentro da ciência da
                      computação, com disciplinas inteiras dedicadas a conceitos específicos e a forma correta de
                      se definir e manipular bancos de dados.
                               Não é objetivo desta disciplina abordar todos os conceitos relacionados à área de
                      bancos de dados. Para isto, existem dentro do curso disciplinas específicas para tal. Esta é
                      uma disciplina que busca abordar como se dá a integração entre o mundo do das aplicações
                      escritas em linguagens de programação orientadas a objetos e o mundo dos bancos de
                      dados. Desta forma, este volume apresenta apenas um subconjunto dos conceitos mais
                      relevantes de bancos de dados, e que são necessários para integração entre um programa
                      escrito em Java e uma base de dados.
                               Posso afirmar então que esta é uma disciplina com viés prático. Você verá no primeiro
                      capítulo, conceitos básicos sobre bancos de dados, enfatizando sua evolução histórica
                      e principalmente, como se dá a organização interna de um banco de dados. O segundo
                      capítulo é dedicado à linguagem SQL. Esta é a linguagem padrão para manipulação de dados
                      em um SGBD. No terceiro e último capítulo é apresentado o Java Database Connectivity, ou
                      simplesmente JDBC, a especificação padrão para integração entre programas orientados a
                      objetos escritos em Java e uma gama de bancos de dados disponibilizados pela indústria.




6
Programação III


         Capítulo 1


    O que vamos estudar neste capítulo?

    Neste capítulo, vamos estudar o seguinte tema:

»   Introdução a bancos de dados.

    Metas

    Após o estudo deste capítulo, esperamos que você consiga:

»   Aprender os conceitos relacionados com bancos de dados e suas diferenças em
    relação ao mundo orientado a objetos.




                                                                                               7
Programação III


                      Capítulo 1 – Uma visão geral sobre
                      bancos de dados


                                   Vamos conversar sobre o assunto?


                              Caro cursista,
                               A importância da informática é evidente pela dependência que a sociedade
                      contemporânea tem dos sistemas de informação (SI). Independente de seus diferentes
                      propósitos, estas aplicações tem como característica comum a manipulação de dados
                      de diversas formas, números e texto até conteúdo multimídia, como imagens e vídeos.
                      Gerenciar tais dados de forma eficiente é de fundamental importância para qualquer
                      instituição. Portanto, entender como os dados de uma aplicação devem ser representados
                      e como interagir com tais dados é também importante para qualquer desenvolvedor de
                      aplicações. Por conta disso, neste capítulo, vamos estudar os conceitos básicos necessários
                      para entender a importância e o funcionamento dos bancos de dados.




                      1. Introdução
                               Um Banco de Dados (também chamado de Base de Dados) é uma coleção de
                      dados relacionados, organizados e armazenados visando facilitar a manipulação dos dados
                      armazenados, permitindo realizar alterações, inserções, remoções e consultas. Neste
                      contexto, um “dado” representa um elemento que mantém a sua forma bruta (texto,
                      imagens, sons, vídeos, etc.) e que sozinho não levará a compreender determinada situação.
                      Já “Informação” é o conjunto de dados coletados de forma a se tornarem aplicáveis
                      a determinada situação, ou seja, sua forma e conteúdo são apropriados para um uso
                      específico.
                               A informação não existe por si só, ela é obtida através de uma interpretação
                      realizada sobre um grupo de dados. Por exemplo, em um sistema acadêmico os dados
                      representam as notas individuais de cada aluno, assim como seus nomes, idades, dentre
                      outros. Destes dados pode-se extrair como informação o fato que os alunos de uma turma
                      específica tiveram notas inferiores à média das demais turmas, e que portanto, precisam de
                      uma atenção maior por parte da coordenação da escola.
                                Em nosso cotidiano, existem várias bases de dados com as quais interagimos
                      diariamente. Verificar o saldo bancário de uma conta, consultar livros no sistema da
                      biblioteca, fazer a matrícula em um curso na universidade; em todos estes casos temos
                      exemplos de aplicações que manipulam dados como contatos, livros ou dados pessoais. Para
                      facilitar a interação das aplicações com estes dados, uma categoria especial de aplicações
                      foi desenvolvida ao longo dos anos, os chamados Sistemas Gerenciadores de Bancos de
                      Dados (SGBDs ou DBMS – Database Management System). Estes pacotes de software foram
                      desenvolvidos com funções específicas para manipular dados, com operações pré-definidas
                      para inserção, remoção, atualização e consulta dos dados armazenados.
                              Neste capítulo vamos estudar os conceitos fundamentais sobre bancos de dados,

8
Programação III

desde a motivação para sua existência, passando por a arquitetura geral destes sistemas,
chegando até a forma mais comum para representação dos dados, o modelo relacional
baseado em tabelas.




2. Por que os Bancos de Dados existem?
        No capítulo 3 do primeiro volume desta disciplina, vimos que é possível armazenar
dados em arquivos, permitindo que estas informação sejam salvas entre sessões de uso das
aplicações. Historicamente, esta foi a primeira forma pela qual aplicações gerenciaram seus
dados, onde cada aplicação definia a forma específica como seus dados eram manipulados.
Se mais de um programa desejasse utilizar os dados definidos em uma aplicação, todos
os programas precisavam também compartilhar a estrutura de como tais dados eram
armazenados.
         Com a popularização dos sistemas de informação, as empresas começaram a
enfrentar problemas relacionados à esta forma de gerenciamento. Se um determinado
sistema precisasse realizar alguma mudança na estrutura de dados, todos os demais sistemas
que acessassem os dados tinham que ser alterados, mesmo que a alteração ocorresse em
dados não manipulados pelos outros programas. Em outra situação, se os sistemas distintos
de uma mesma empresa utilizassem os mesmos dados, porém representados de forma
distinta por cada sistema, estes dados precisavam ser replicados em cada sistema. Esta
replicação trazia uma série de consequências negativas, dentre as quais pode-se destacar:

    »   Alta possibilidade de inconsistência de dados replicados: Caso um dado replicado
        fosse atualizado em uma aplicação, o mesmo deveria ser atualizado em todos os
        demais sistemas. Caso contrário, um mesmo dado apresentaria valores distintos
        para a empresa, ocasionando inconsistência de informações. Por exemplo: Uma
        empresa que tivesse dois sistemas, um de controle de pessoal e outro financeiro
        precisaria manter informações replicadas sobre seus funcionários. Se o endereço de
        um funcionário fosse atualizado em um sistema, precisaria também ser atualizado
        no outro;
    »   Maior custo de armazenamento: Os mesmos dados seriam armazenados diversas
        vezes, o que além de ocupar mais recursos, levaria a procedimentos extras para
        replicar as atualizações sobre os dados. No mesmo exemplo anterior, se houvessem
        mais sistemas que necessitassem das informações de um funcionário, os dados
        precisariam ser replicados para cada sistema.
         Com o passar dos anos e o aumento da importância dos sistemas de informação e
também de sua complexidade, buscou-se uma solução para tais problemas. O cenário vivido
então à época motivou à criação de um modelo onde dados fossem isolados de aplicações.
Os dados, então representados por arquivos, seriam responsáveis unicamente por guardar
as informações que fossem manipuladas pelos programas dos sistemas, representando
assim a própria base de dados (BD). Todo acesso ao BD passa a ser realizado de forma
centralizada e unificada por um sistema intermediário, o Sistema Gerenciador de Banco de
Dados - SGBD.
        O SGBD funciona como um sistema intermediário, que atua como ponte entre cada
aplicação e a base de dados representada pelos arquivos onde os dados são persistidos
fisicamente, como visto na Figura 1.




                                                                                                          9
Programação III




                                  Figura 1 – A visão de um SGBD como intermediário entre aplicações e dados



                               Dentre as vantagens desta abordagem tem-se:

                           »   O acesso e manipulação de dados entre diferentes sistemas passa a ser feito de uma
                               forma padronizada, que pode ser então compartilhadas entre várias aplicações;
                           »   Diferentes sistemas podem compartilhar os mesmos dados, delegando ao SGBD a
                               intermediação de acesso entre aplicações e dados;
                           »   Os sistemas passariam a enxergar apenas os dados que lhes interessam, criando a
                               idéia de visões. Por exemplo, se um banco de dados guarda todas as informações de
                               um determinado funcionário, como dados pessoais, salário, cargo, dentre outras,
                               um SGBD pode definir que uma determinada aplicação só consiga enxergar uma
                               parte destes dados;
                           »   Os sistemas não precisariam conhecer os detalhes de como seus dados estão
                               gravados fisicamente;
                           »   Os sistemas não precisariam ser modificados se a estrutura de dados que utilizam
                               não for modificada;
                           »   Funcionalidades importantes como auditoria, cópias de segurança (backups) e
                               segurança de acesso podem ser centralizadas e delegadas aos SGBD, abstraindo tais
                               questões para as aplicações que utilizam os dados.
                                Com tais vantagens, o uso de sistemas gerenciadores de bancos de dados foi
                       rapidamente aceito e se tornou um padrão na indústria. Hoje é difícil imaginar um sistema
                       comercial que não faça uso de SGBDs. Com o passar dos anos e a evolução de tais sistemas,
                       o SGBD passou de programas simples para complexos sistemas de programas com função
                       de habilitar desenvolvedores a criar e manter um banco de dados. Dentre suas funções
                       principais estão:

                           »   Definição do banco de dados: Envolve especificar estruturas e tipos de dados para
                               serem gravados no banco de dados, com uma descrição detalhada de cada tipo de
                               dado.
                           »   Construção do banco de dados: Processo de consistir e gravar inicialmente dados
                               no banco de dados.
                           »   Manipulação de um banco de dados: Inclui funções como consulta por dados
                               específicos e atualização para refletir as alterações no mundo real.
                               Hoje existem vários bancos de dados disponíveis no mercado, que possuem um
                       núcleo comum de funcionalidades, mas variam em relação ao suporte a quantidade de
                       usuários simultâneos, funcionalidades extras, eficiência e robustez. Obviamente, de acordo
                       com estes critérios, um SGBD pode custar até centenas de milhares de dólares. Porém, é
                       possível encontrar ótimas opções gratuitas disponíveis na Internet para serem utilizadas
                       como SGBDs. Alguns dos principais SGBDs disponíveis no mercado nos últimos anos são:

                           »   Oracle - Sistema comercial, mas possui versões gratuitas para uso acadêmico e/
10
Programação III

        ou doméstico (em casa). Ele foi o primeiro Banco de Dados Corporativo (cliente/
        servidor) possuindo grande variedade de distribuições (para Macintosh, Windows,
        Linux, FreeBSD, Unix) e para computadores de grande porte. Foi um dos primeiros
        a fazer parte do mercado Web. A participação do Oracle no mercado de Banco de
        Dados é bastante acentuada, principalmente em grandes empresas e em conjunto
        com sistemas de médio e grande porte. É um SGBD robusto e seguro, quando
        bem administrado. A Oracle também desenvolve uma suíte de desenvolvimento
        chamada de Oracle Developer Suite, utilizada na construção de programas de
        computador que interagem com a sua base de dados. Site Oficial em http://www.
        oracle.com/us/products/database/index.htm
    »   Microsoft SQL Server – é o banco de dados comercial da Microsoft. Ele é um dos
        principais concorrentes do Oracle. Tem como uma das vantagens o fato de, por
        ser um produto Microsoft, se integrar nativamente com produtos e linguagens
        da Microsoft (talvez seja esse o fator que o popularizou!). As versões atuais
        são independentes e operam exclusivamente sobre Windows. É um software
        proprietário e pago, como a maioria dos produtos Microsoft. Algumas empresas
        que usam o MS SQL Server e são consideradas casos de sucesso no Brasil são o
        Hipercard, o Banco Itaú e a ANEEL (vide: http://www.microsoft.com/brasil/
        servidores/sql/default.mspx). Site Oficial em http://www.microsoft.com/
        sqlserver/2008/en/us/
    »   MySQL - é, atualmente, um dos bancos de dados mais populares, com mais de 10
        milhões de instalações pelo mundo. Ele possui versões para Windows, Solaris, Unix,
        FreeBSD, Linux e é gratuito para uso não-comercial. Algumas das empresas mais
        famosas que fazem uso deste banco estão: NASA, Banco Bradesco, Dataprev, HP,
        Nokia, Sony e Lufthansa. O MySQL é usado principalmente para desenvolvimento
        WEB como servidor de dados para comércio eletrônico. Passou a ser considerado
        um SGBD de verdade (com conceito de transação) a partir da versão 5. Site Oficial
        em http://www.mysql.com/
    »   PostgreSQL - é um sistema gerenciador de banco de dados objeto relacional
        (SGBDOR), desenvolvido como projeto de código aberto. Ele é um dos SGBDs
        (Sistema Gerenciador de Bancos de Dados) de código aberto mais avançados, é
        grautito e tem uma boa aceitação no mercado. Originalmente concebido para
        rodar em Linux, ele possui versões para Windows. É usando, principalmente, para
        comércio eletrônico juntamente com linguagem PHP. O PostgreSQL é um projeto
        open source coordenado pelo PostgreSQL Global Development Group. Site Oficial
        em http://www.postgresql.org/
    »   Microsoft Access: é um banco de dados da Microsoft para uso em micros desktops
        e não em servidores. Esta é a principal diferença dele para os demais bancos
        SGBD como o Oracle, SQL Server e MySQL, por exemplo. Contudo, ele tem sido
        muito usado em pequenas e médias empresas para armazenamento de dados em
        pequenas quantidades. Agora, o MS Access não é considerado um SGBD completo,
        por não possuir todas as características de um. Mas ele permite o desenvolvimento
        rápido de aplicações que envolvem tanto a modelagem e estrutura de dados como
        também a interface a ser utilizada pelos usuários. A linguagem de programação
        disponível no access é a Microsoft Visual Basic for Applications, igualmente a
        outros produtos da série Microsoft Office. Maiores informações em: http://office.
        microsoft. com/pt-br/access/default.aspx
         Dos SGBDs listados acima vale ressaltar que o SQL Server e o Oracle tem versões
gratuitas, porém limitadas. O PostgreSQL é open source e e o MS Access é pagos (sendo que
o Access já vem em algumas versões do pacote Microsoft Office) e o MySQL é gratuito para

                                                                                                          11
Programação III

                       desenvolvimento, mas pago para produção.
                                A escolha de qual SGBD usar depende muito do projeto sendo desenvolvido e do
                       quanto a empresa está disposta a investir para armazenamento dos seus dados. Um SGBD
                       gratuito e muito popular nos dias de hoje é o PostGreSQL e vários sistemas de instituições
                       públicas vêm adotando o mesmo. Já no mundo corporativo o Oracle tem sido um dos mais
                       adotados, por ser um dos mais robustos.




                       3. Arquitetura Geral de um SGBD
                              Apesar de existir vários SGBD’s, uma arquitetura genérica para estes sistemas é
                       apresentada na literatura. Esta arquitetura apresenta os componentes citados na Figura 2.




                                                  Figura 2 - Arquitetura Geral de um SGBD



                              De acordo com esta arquitetura, os componentes funcionais de um sistema de
                       banco de dados incluem:

                           »   Gerenciador de arquivos, que gerencia a alocação do espaço na armazenagem do
                               disco e as estruturas de dados usadas para representar a informação armazenada
                               no disco;
                           »   Gerenciador do banco de dados, que fornece a interface entre os dados de baixo
                               nível armazenados no disco e os programas aplicativos e de consulta submetidos ao
                               sistema;
                           »   Processador de consultas, que traduz os comandos numa linguagem de consulta
                               para instruções de baixo nível que o gerenciador do banco de dados pode
                               interpretar. Além disso, o processador de consultas tenta transformar uma
                               requisição do usuário em uma forma compatível e mais eficiente com respeito ao
                               banco de dados, encontrando uma boa estratégia para a executar a consulta;
                           »   Pré-compilador da DML (Data Manipulation Language), que converte comandos
                               da DML embutidos em um aplicativo para chamadas de procedimento normal
                               na linguagem hospedeira. DML é uma linguagem para manipular dados e será
                               melhor vista no capítulo 2 deste volume. O pré-compilador precisa interagir com o
12
Programação III

        processador de consultas pra gerar o código apropriado;
    »   Compilador da DDL (Data Definition Language), que converte comandos da DDL em
        um conjunto de tabelas contendo metadados ou “dados sobre dados”. DDL permite
        que a estrutura de um banco seja criado, e assim como DML, será melhor abordado
        no capítulo 2;
       Adicionalmente, diversas estruturas de dados são requeridas como parte da
implementação do sistema físico, incluindo:

    »   Arquivos de dados, que armazenam o banco de dados propriamente dito;
    »   Dicionário de dados, que armazena metadados sobre a estrutura do banco de
        dados. O dicionário de dados é usado com freqüência. Assim, deve-se dar grande
        ênfase no desenvolvimento de um bom projeto e implementação eficiente do
        dicionário;
    »   Índices, que fornecem acesso rápido aos itens de dados guardando determinados
        valores.


3.1 Banco de Dados e uma visão em camadas

       Uma outra forma de se enxergar a arquitetura de um banco de dados é por meio
de uma visão em camadas. Nesta visão, um banco de dados é composto de três camadas,
como descrito na figura abaixo.




         O nível físico ou nível interno é aquele que está mais próximo ao armazenamento
físico dos dados. Este nível físico é descrito por meio de um esquema interno que define
como registros, campos e índices são representados, principalmente em relação à sequência
física dos dados.
        Já o nível lógico situa-se acima do físico e é responsável por descrever como dados
são representados e relacionamentos entre os próprios dados. Esta representação é mais
abstrata que os nível físico. Pode-se dizer que esta visão possibilita representar os dados
como estes realmente são, sem restrições que um usuário possa ter para visualizá-los, por
conta de uma linguagem de programação em particular.
        O nível do usuário é aquele em que os usuários possuem diferentes visões dos
dados, onde muitas vezes não é necessário o acesso a todos os dados da base. Neste nível
estão os programadores e usuários finais das aplicações.




                                                                                                           13
Programação III


                       4. A modelagem e a representação de dados em
                       um SGBD
                                 Pela arquitetura e visão em camadas de um banco de dados, é importante perceber
                       que bancos de dados tem um modelo específico de como os dados são representados e
                       armazenados. Os modelos de dados utilizados em bancos de dados correspondem a como
                       dados, relacionamentos, suas restrições e seus significados são descritos. Existem diferentes
                       classificações para os modelos de dados, de acordo com diferentes critérios de separação. A
                       seguir, apresentam-se cinco modelos de representação dos dados.
                                O modelo hierárquico foi a primeira proposta para a representação de dados, onde
                       os dados são representados por uma estrutura de árvore semelhante àquelas estudadas na
                       disciplina de estrutura de dados. Dados são acessados segundo um sequência hierárquica
                       com uma navegação do topo (raiz) para as folhas (nós sem folhas) e da esquerda para a
                       direita dentro de um mesmo nó ou registro.




                                                   Figura 3 - Modelo Hierárquico de Dados



                              Apesar de representar uma primeira tentativa na padronização da representação
                       de dados, o modelo hierárquica sofreu críticas por necessitar replicar dados em virtude
                       do modelo de árvore utilizado, o que também levava a desperdício de espaço de
                       armazenamento e à possibilidade de inconsistência de dados.
                               O modelo em rede, assim como o modelo hierárquico, utiliza apontadores entre
                       os dados. Porém, as associações entre os dados não necessariamente segue um modelo de
                       árvore top-down como anteriormente.




                                                    Figura 4 - Modelo de dados em rede



                               Na abordagem em rede não aparecem as anomalias de manutenção da base de
                       dados que aparecem em modelos hierárquicos. Porém, a necessidade que o programador
                       conheça as várias ligações existentes na base cria uma forte dependência da implementação.
                       As consultas são complicadas pois o programador é forcado a pensar em termos de ligações
14
Programação III

e, em como percorrê-las para obter as informações de que necessita. A independência de
dados fica prejudicada, pois a criação ou eliminação de ligações implica em alteração dos
programas.
        O modelo relacional utiliza a teoria dos conjuntos e álgebra relacional para definir
dados em função de tabelas, e relacionamentos entre os campos que formam os dados de
cada tabela. Falaremos mais sobre o modelo relacional ao final deste capítulo.




                            Figura 5 - Modelo Relacional de Dados



         O modelo objeto é aquele que procura utilizar os conceitos já conhecidos do
paradigma orientado a objetos para representar as informações da base. Os dados são
representados através de classes que apresentam dados membros. Campos são instâncias
destas classes.




                          Figura 6 - Modelos de dados como objetos



        Os bancos de dados orientados a objetos tem como objetivo integrar a orientação a
objeto com as aptidões dos bancos de dados, disponibilizando mais abstração da estrutura
de dados do que os bancos de dados convencionais. Existem atualmente ainda poucos
produtos no mercado.
        De todos estes modelos, o relacional são os de maior sucesso comercial até hoje, e
portanto, serão melhor estudados na próxima seção e servirão de base para os exemplos de
nosso volume.


4.1 O Modelo Relacional

       Este modelo foi o primeiro modelo de dados efetivamente utilizado em aplicações
comerciais. Este foi apresentado em 1970 por Codd em seus estudos na IBM sobre a

                                                                                                           15
Programação III

                       modelagem de dados. É o modelo que possui a base mais formal entre os modelos de
                       dados, entretanto é o mais simples e com estrutura de dados mais uniforme.
                                A estrutura fundamental do modelo relacional é a relação, mas conhecido como
                       tabela. Na verdade, o modelo é composto por uma coleção de tabelas de nomes únicos.
                       Cada relação ou tabela é constituída por uma ou mais colunas chamadas de atributos
                       (campos) que são os tipos dos dados contidos na relação. O conjunto de valores passíveis
                       de serem assumidos por um atributo será intitulado de domínio. Cada linha da relação é
                       chamada de tupla (registro). O esquema de uma relação nada mais é do que os campos
                       (colunas) existentes em uma relação ou tabela. Já a instância da relação consiste no conjunto
                       de valores que cada atributo assume em um determinado instante. Na intersecção de uma
                       linha com uma coluna encontra-se o dado. Para exemplificar tais conceitos, a figura abaixo
                       apresenta uma tabela para representar a entidade funcionário, com os campos CPF, Nome,
                       Idade e Salário. Nesta tabela, três registros são apresentados para representar os dados de
                       três funcionários.




                                           Figura 7 – Exemplo de uma tabela em um SGBD relacional



                                As relações não podem ser duplicadas (por exemplo, não podem existir dois estados
                       de Pernambuco, no conjunto de estados brasileiros) 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. Diferentemente dos modelos que o precederam o modelo relacional não tem
                       caminhos pré-definidos para se fazer acesso aos dados. Os relacionamentos entre as tabelas
                       são feitos através do uso de valores de atributos. Para exemplificar este relacionamento,
                       as relações funcionário e departamento representam as informações sobre funcionários
                       e departamentos que são relacionados pelo campo depto. Este relacionamento permite
                       identificar quais são os departamentos que cada funcionário trabalha.




                                           Figura 8 - Exemplo de relacionamento entre duas tabelas

16
Programação III

        Para trabalhar com tabelas, algumas restrições precisaram ser impostas para evitar
aspectos indesejáveis, como: Repetição de informação, incapacidade de representar parte
da informação e perda de informação. Essas restrições são: integridade referencial e chaves.
        Em relação as chaves, existem três principais tipos usadas em SGBDs relacionais:
as chaves primárias, as chaves candidatas e as chaves estrangeiras. A chave estrangeira é
aquela que consegue identificar de forma unívoca um registro. Por exemplo, os campos
CPF e registro nas tabelas apresentadas anteriormente são exemplos campos que não
se repetem ( ou que não devem se repetir), e portanto, seriam chaves primárias de suas
respectivas tabelas. Em geral, toda tabela deve possuir uma chave primária. Chaves
primárias não podem ter valores nulos e tendem a ser mínimas.
        Chaves candidatas possuem a mesma característica que uma chave primária,
mas que por questões funcionais não foram escolhidas como chave primária. Chaves
estrangeiras são valores que correspondem a chaves primárias de outras tabelas ou até
mesma da própria tabela, e que estabelecem relacionamentos entre entidades.
        Já a integridade referencial remete à garantia que haja integridade de dados,
através dos relacionamentos entre entidades. Por exemplo, na relação entre funcionários
e departamentos há uma garantia que para um funcionário ser incluído na base, ele deve
referenciar departamento válido. Ao mesmo tempo, um registro de um departamento não
pode ser excluído se algum registro de funcionário fizer menção a tal departamento.


4.2 Um modelo relacional para o sistema bancário

         Para ilustrar um modelo relacional, vamos criar um modelo de tabelas para
armazenar as informações do sistema bancário, utilizado como estudo de caso em nossa
disciplina. Lembrando um pouco deste sistema, em nosso banco, correntistas possuem uma
conta, que pode ser tanto uma conta convencional, uma conta especial ou uma poupança.
O diagrama de classes abaixo mostra as principais entidades de nosso sistema.




                      Figura 9 - Diagrama de Classes do sistema bancário



         Uma coisa importante é entender que o mundo OO é diferente do mundo de
bancos de dados relacionais. Enquanto o primeiro trabalha com objetos, polimorfismo,
herança, o segundo é constituído de tabelas, chaves e restrições. Porém, alguns elementos
conseguem ser relacionados, como atributos de objetos mapeados em campos de uma
tabela. Boa parte das classes de um diagrama de classes é diretamente mapeada em uma
tabela em um modelo relacional. Porém, outros conceitos precisam adaptações. Veja por
exemplo, a relação de herança entre as classes Conta, ContaEspecial e Poupanca. Os dados
de um objeto Conta podem ser mapeados para uma tabela também chamada CONTA, onde
os atributos da classe sejam mapeados em campos na tabela. Em geral, os bancos possuem

                                                                                                           17
Programação III

                       tipos semelhantes à maioria das linguagens de programação. Além disso, o campo numero
                       pode ser marcado como uma chave primária, pois toda conta deve ter um número único
                       que a identifica na base.




                               Esta mesma abordagem poderia ser utilizada para mapear as classes ContaEspecial
                       e Poupanca. Porém, isto acarretaria problemas para certas operações, como por exemplo,
                       fazer uma consulta do saldo de uma conta, sem conhecimento de seu tipo. Seria necessário
                       fazer consultas nas três tabelas, além de se replicar informações, o que dificultaria, por
                       exemplo, a introdução ou remoção de campos.




                               Para isto, pode-se utilizar a integridade referencial para melhorar a modelagem
                       relacional de tabelas. A Figura 10 mostra uma outra abordagem.




                                Figura 10 – Mapeando herança com integridade referencial e chaves estrangeiras


18
Programação III

         Nesta nova abordagem, os elementos comuns a todo tipo de campo são
representadas na tabela CONTA. É introduzido um campo para identificar que tipo de conta
se trata um registro na tabela. As tabelas CONTA_ESPECIAL e POUPANCA fazem referencia
à tabela CONTA por meio de uma chave estrangeira que aponta para os dados comuns,
enquanto armazenam informações específicas sobre seus tipos. Com isto, acaba-se a
replicação de informações e centraliza-se as modificações no modelo de dados.
        Com a idéia das chaves estrangeiras também é possível mapear os relacionamentos
existentes entre as classes do modelo OO. Por exemplo, uma conta possui um
relacionamento um objeto Pessoa que representa o correntista da conta. O correntista por
sua vez, possui dois relacionamentos com objetos do tipo Endereco, para representar os
endereços comercial e residencial do correntista. A figura abaixo mostra o modelo para o
mapeamento das classes Pessoa e Conta.




         Neste caso, as tabelas PESSOA e ENDERECO devem representar os objetos Pessoa
e Endereco. Para criar os mapeamentos é necessário as chaves em cada tabela. Para a
tabela PESSOA, a chave primária é facilmente identificada. Cada pessoa é identificada por
seu cpf, que é único para cada correntista. Porém, no caso do endereço, não há uma chave
explícita. Neste caso, a solução é criar um campo que assuma a função de chave e sirva
para identificar cada registro da tabela. Nestas situações, por via de regra, este campo é
preenchido automaticamente a cada inserção de um novo registro na tabela.
         Em certos casos, o simples relacionamento por meio de chaves estrangeiras não é
viável para representar o mapeamento de classes. Veja por exemplo a situação descrita no
diagrama UML a seguir.




                                                                                                          19
Programação III




                         Figura 11 – Diagrama de classes representando o relacionamento entre professores e disciplinas



                                O diagrama busca representar a situação onde um professor pode lecionar várias
                       disciplinas, e uma disciplina pode ser lecionada por diferentes professores. Nesta relação
                       de M:N (muitos para muitos) a solução passa pela criação de uma tabela intermediária. Esta
                       tabela cria mapeamentos de chave estrangeira para as tabelas que representam as duas
                       classes. Desta forma, é possível representar este tipo de relacionamento de dados, como
                       representado pela figura abaixo.




                                              Figura 12 - Mapeamento M:N no modelo relacional



                               Neste exemplo, a tabela PROFESSOR_DISCIPLINA possui a chave primária composta
                       pela união dos campos MATRICULA e CODIGO. O primeiro é chave estrangeira para a tabela
                       PROFESSOR, enquanto o segundo é chave estrangeira para a tabela DISCIPLINA. Pelos dados
                       do exemplo, o professor Fernando Trin ta (matrícula 1) leciona as disciplinas matemática
                       (código 55) e física (código 100).


                                     Exercícios


                           1. Descreva as motivações para o surgimento de sistemas gerenciadores de bases
                              de dados. Cite exemplos de seu dia a dia que utilizam bases de dados com muitos
                              dados (milhares de registros).
                           2. Busque na Internet, bancos de dados que sigam os seguintes modelos de dados: (a)
                              hierárquico, (b) em rede, (c) relacional e (d) orientado a objetos.
                           3. Utilizando o modelo de dados relacional, crie modelos para bancos de dados que
                              precisem guardar informações sobre:
                               a) Uma biblioteca que permita empréstimos de livros a seus usuários;
20
Programação III

        b) Um sistema acadêmico que represente alunos, professores e disciplinas;
        c) Uma loja de produtos eletrônicos.




             Vamos Revisar?



        Resumo

        Neste capítulo, você aprendeu conceitos básicos sobre bancos de dados, desde a
motivação para seu surgimento, passando por sua arquitetura e os principais modelos de
representação e organização de dados existentes na literatura. A maior importância deste
capítulo é apresentar o modelo relacional, pois este é o modelo dominante das aplicações
modernas. Entender como objetos são mapeados para tabelas é fundamental para
entender como sistemas escritos em linguagens orientadas a objetos podem persistir suas
informações em bases de dados relacionais.




                                                                                                        21
Programação III


                                Capítulo 2


                           O que vamos estudar neste capítulo?

                           Neste capítulo, vamos estudar o seguinte tema:

                       »   A Linguagem SQL de manipulação de dados.

                           Metas

                           Após o estudo deste capítulo, esperamos que você consiga:

                       »   Entender os principais comandos da linguagem SQL;
                       »   Aprender a utilizar um banco de dados simples chamado HyperSQL;
                       »   Realizar operações no HyperSQL com alguns dos principais comandos SQL.




22
Programação III


Capítulo 2 – A linguagem estruturada
de consulta: SQL


             Vamos conversar sobre o assunto?


        Caro cursista, depois de estudar e ter uma visão geral sobre como os bancos de
dados são organizados, é preciso então entender como os dados são manipulados por
usuários e aplicações. Para isto, este capítulo é dedicado totalmente ao estudo da linguagem
SQL, o padrão da indústria para a realização de operações em bases de dados relacionais.




1. Introdução
         Em qualquer base de dados, uma questão importante é como são realizadas as
operações sobre os dados armazenados. Em geral, todo SGBD fornece uma linguagem
de consulta por meio da qual usuários obtêm informações do banco de dados. Em geral,
estas linguagens são de nível mais alto que as linguagens de programação tradicionais, e
são categorizadas como procedurais ou não-procedurais (também referenciadas como
declarativas). Em uma linguagem procedural, o usuário deve “ensinar” ao sistema a
realização de uma seqüência de operações no banco de dados para obter o resultado
desejado. Em uma linguagem não-procedural, o usuário descreve a informação desejada
sem fornecer um procedimento específico para a obtenção dessas informações. Neste
contexto, uma linguagem que precisa ser estudada para manipulação de SGBDs relacionais
é a linguagem SQL.
        SQL (Linguagem de Consulta Estruturada, do inglês Structure Query Language)
é uma linguagem declarativa utilizada para manipulação de bases de dados relacionais,
desenvolvida no início da década de 70 nos laboratórios da IBM, originalmente com o nome
de SEQUEL (acrônimo para “Structured English Query Language” - Linguagem de Consulta
Estruturada em Inglês). O propósito da concepção de SEQUEL era demonstrar a viabilidade
do modelo relacional proposto por Codd. SQL
         O projeto de SEQUEL foi divulgado nos meios acadêmico por meio de conferências
e revistas especializadas, o que permitiu que seus conceitos pudessem ser implementados
por terceiros.
         No final da década de 70, duas outras companhias além da IBM iniciaram
desenvolvimento de produtos similares, que vieram a ser Oracle e Ingres. A Oracle
Corporation introduziu a primeira implementação de SQL comercialmente disponível, e é
hoje líder no mercado de servidores de bancos de dados. A IBM também implementou SQL
em seus sistemas de banco de dados DB2 e SQL/DS. Entre os anos 80 e 90, os produtos
com SQL se multiplicaram e hoje SQL é largamente implementada e aceita como o padrão
de facto da indústria para linguagem de acesso a bancos de dados, desde sistemas desktop
como o Microsoft Access para Windows até sistemas de gerenciamento e servidores de
bancos de dados de médio e grande porte em Unix, NT e mainframes.
        Hoje, SQL é padronizada por instituições normativas como a ANSI (Instituto

                                                                                                           23
Programação III

                       Americo de Normas, do inglês American National Standards Institute) e ISO (Organização
                       de Padrões Internacionais, do inglês International Standard Organization). Porém, certos
                       fabricantes introduzem extensões e variações específicas a seus produtos, o que acaba por
                       comprometer a portabilidade de programas que utilizem tais extensões para manipular
                       SGBDs.
                                No capítulo que segue, você aprenderá comandos básicos da linguagem SQL que
                       serão necessários para a manipulação de dados em seus programas escritos em Java. Para
                       que você veja na prática o uso destes comandos, você também aprenderá a manipular um
                       SGBD simples chamado HyperSQL, que também será utilizado nos exemplos do próximo
                       capítulo, quando finalmente virmos a integração de Java com este SGBD.




                       2. Classificação de comandos SQL
                                SQL oferece uma série de comandos para realizar suas operações e tem como
                       principais características a simplicidade e facilidade de uso. As operações em SQL podem
                       tanto definir o modelo de dados da base, quanto inserir, alterar ou apagar registros. De
                       forma a melhor organizar o conjunto completo de comandos, SQL classifica tais comandos
                       em cinco grupos:

                           »   DDL (Linguagem de Definição de Dados, do inglês Data Definition Language):
                               subconjunto que permite ao desenvolvedor definir tabelas novas e elementos
                               associados. Fazem parte deste grupo os comandos CREATE, ALTER TABLE e DROP.
                           »   DML(Linguagem de manipulação de dados, do inglês Data Manipulation Language):
                               subconjunto da linguagem da SQL que são utilizados para realizar inclusões,
                               consultas, exclusões e alterações de dados presentes em registros. Incluem o
                               comandos INSERT, UPDATE e DELETE.
                           »   DQL(Linguagem de consulta de dados, do inglês Data Query Language): formada
                               por apenas um comando, é a parte mais utilizada de SQL. Por meio do comando
                               SELECT, é possível realizar consultas dos mais diversos tipos, de acordo com
                               cláusulas e opções que podem ser utilizadas no comando.
                           »   TCL(Linguagem de controle de transações, do inglês Transaction Control Language):
                               Conjunto de operações utilizados para tratamento de transações. Uma transação é
                               um conjunto de operações individuais que devem ser agrupadas e tratadas como
                               uma só. Fazem parte desta classe os comandos START TRANSACTION, COMMIT e
                               ROLLBACK.
                           »   DCL(Linguagem de controle de dados, do inglês Data Control Language): Este
                               conjunto de comandos controla os aspectos de autorização de dados e permissões
                               de usuários para controlar quem tem acesso para ver ou manipular dados dentro
                               do banco de dados. Dois dos principais comandos são o GRANT e o REVOKE, que
                               respectivamente concedem e retiram permissões de usuários.
                                Em nossa disciplina, nós veremos principalmente os comandos DDL, DML e DQL.
                       Para isto, os comandos serão apresentados no contexto da criação de um banco de dados
                       para o sistema de controle bancário que nos acompanha desde a disciplina de linguagem de
                       programação II. Para que podemos ver na prática o uso de SQL, utilizaremos um banco bem
                       simples disponível na Internet chamado HyperSQL (http://hsqldb.org/). O HyperSQL é um
                       SGBD relacional escrito em Java que implementa as funcionalidades básicas necessárias para
                       nossos exemplos. Mas que isso, é um banco extremante portável, já que o seu executável
                       ocupa menos que 2Mb.

24
Programação III


3. Instalação e utilização do HyperSQL
         Para instalar e executar o HyperSQL é preciso ter a plataforma Java instalada e
baixar o aplicativo do site http://hsqldb.org/. Na sua distribuição, o HyperSQL é um arquivo
compactado, que quando descompactado cria uma árvore de diretórios contendo scripts
de execução, documentação, exemplos, código-fonte do banco, dentre outros, como
apresentado na Figura abaixo.




                  Figura 13 - Estrutura do HyperSQL, depois de descompactado



         Porém, apesar de todas essas informações, o único arquivo necessário para
executar o banco é o arquivo hsqldb.jar, localizado na pasta lib. Este arquivo representa o
banco, assim como a interface de administração e o driver JDBC que será necessário para
integrar os programas Java com o HyperSQL, a ser visto no próximo capítulo.
        O HyperSQL é um programa Java. Logo, para executá-lo basta usar o interpretador
java para executar a aplicação, cuja classe principal é a org.hsqlbd.server.Server. Logo, a
forma mais simples para isso é abrir uma janela para disparar o comando:

 java -cp .;<<caminho completo para o arquivo hsqldb.jar>> org.hsqlbd.server.Server

        Ao fazer isto, o processo é iniciado e são criados arquivos que representam os
dados no diretório onde o interpretador Java foi chamado. Na própria estrutura definida
na descompactação, já é sugerida a pasta Data para este fim. Logo, é sugerido que você
execute o processo dentro desta pasta, como apresentado na Figura abaixo.




                           Figura 14 - Rastro de execução do HyperSQL

                                                                                                           25
Programação III

                               Ao fazer isso, o processo fica em execução. Para finalizar a execução do processo,
                       basta pressionar [CRTL] + [C]. Ao executar o banco na forma mais simples, o HyperSQL cria
                       uma série de arquivos, padronizados pelo prefixo test, como visto na Figura.




                                            Figura 15 - Arquivos gerados na execução do HyperSQL



                                Estes arquivos representam os dados da base. É possível armazenar mais de uma
                       base, assim como criar arquivos com nomes específicos para cada banco. Tais informações
                       podem ser obtidas na documentação do HyperSQL. Nos exemplos utilizados neste livro,
                       utilizaremos o padrão fornecido para facilitar a didática.
                                Uma vez o banco estando em execução, é necessário interagir com a base. Para isto,
                       o HyperSQL fornece uma aplicação simples, baseada em uma janela Swing, que permite
                       visualizar o conteúdo do banco, bem como executar comandos a partir de uma janela de
                       interação. Esta aplicação também é fornecida com o arquivo hsqldb.jar, por meio da classe
                       org.hsqldb.util.DatabaseManagerSwing. Logo para executá-la, basta disparar o comando:

                        java -cp .;<<caminho completo para o arquivo hsqldb.jar>> org.hsqldb.util.DatabaseManagerSwing

                                Este comando pode ser disparado de qualquer diretório e a figura abaixo apresenta
                       a tela principal da aplicação.




                                       Figura 16 - Tela de Abertura da aplicação DatabaseManagerSwing



26
Programação III

         Na execução do aplicativo, é apresentada uma janela com uma série de opções para
conexão com o banco. Para a correta conexão, devem ser mantidas as opções apresentadas
na Figura, e então pressionado o botão OK. Feito isso, você estará conectado ao Banco e
pronto para executar operações. Nas próximas seções, utilizaremos esta interface para ver
na práticas exemplos de vários comandos SQL.




4. Comandos DDL
        Os primeiros comandos que precisam ser realizados para se manipular um banco de
dados são aqueles que permitem a criação das tabelas, índices, chaves, e demais elementos
que compõem a base de dados. São três os principais comandos DDL existentes em SQL:

    »   CREATE: comando que permite que sejam criados as tabelas, seus campos, chaves,
        além dos relacionamentos entre tais elementos;
    »   ALTER TABLE: comando que permite que sejam feitas alterações em elementos já
        existentes da base de dados;
    »   DROP: comando que apaga um elemento da base de dados.
       Vamos começar a ver tais comandos e a criar nossa base de testes. Primeiramente,
vamos criar a base.


4.1 Criando tabelas

        Vamos começar pelo comando CREATE, que tem sua sintaxe simplificada da
seguinte forma:


 CREATE <<NOME_TABELA> (<<CAMPO1>> <<TIPO_CAMPO1>> <<OPÇÕES_CAMPO1>>,


 <<CAMPO1>> <<TIPO_CAMPO1>> <<OPÇÕES_CAMPO1>>,


                                            ...


 <<CAMPON>> <<TIPO_CAMPON>> <<OPÇÕES_CAMPON>>


 FOREIGN KEY(<<CAMPO>>) REFERENCES <<TABELA>> (<<CAMPO_CHAVE>>)


        Nesta definição, dá-se um nome para uma tabela e em seguida faz-se a definição de
cada um de seus campos. Cada campo tem obrigatoriamente um nome e um tipo, além de
cláusulas a mais que definem se um campo é chave primária, se ele pode ou não ter valores
nulos.
         Em relação aos tipos, os bancos definem tipos primários para valores de seus
campos, da mesma forma que linguagens de programação definem seus tipos básicos.
Embora SQL defina valores padrões para os principais de dados como inteiros, alfanuméricos,
booleanos, dentre outros, é importante verificar a documentação da base de dados a ser
utilizada, para verificar os tipos definidos por tal SGBD.
       No caso do HyperSQL, os principais tipos que serão usados neste volume são
apresentados na tabela a seguir:



                                                                                                          27
Programação III


                                         Tipo                                     Descrição

                                       INTERGE                            Valores numéricos inteiros

                                       DOUBLE                        Valores numéricos de ponto flutuante

                                 VARCHAR (TAMANHO)               Valores alfanuméricos com tamanho definido

                                      BOOLEAN                                   Valores lógicos

                                       IDENTITY                 Valores inteiros pré-definidos em uma sequência


                                                   Tabela 1 - Tipos de Dados do HyperSQL



                                É possível observar que com exceção do tipo IDENTITY, os demais são equivalentes
                       a tipos já vistos na linguagem Java, como int, double, String e boolean. O tipo IDENTITY é
                       uma opção muito útil para definirmos uma chave primária de uma tabela cujo valor seja
                       gerado automaticamente pelo próprio banco. Veremos mais sobre o tipo IDENTITY logo a
                       seguir.
                                 Existem ainda opções que podem ser associadas a cada campo. Uma das principais
                       opções é identificar se um determinado campo é a chave primária da tabela. Para isto,
                       utiliza-se a expressão PRIMARY KEY associado ao campo que será a chave primária da
                       tabela. Se for uma chave composta, cada campo da chave composta deve ser marcada com
                       este atributo. Também é possível determinar se um campo pode ou não ter valores nulos
                       em algum registro da tabela. Caso isso não seja permitido, pode-se adicionar à definição do
                       campo a expressão NOT NULL.
                               Para exemplificar, vamos utilizar o comando CREATE para criar a tabela Endereco do
                       sistema de controle bancário. Para isto, utilizamos então o seguinte comando:


                        CREATE TABLE ENDERECO (ID_ENDERECO IDENTITY PRIMARY KEY,
                                                  RUA VARCHAR(255) NOT NULL,
                                                  NUMERO VARCHAR(255) NOT NULL,
                                                  BAIRRO VARCHAR(255) NOT NULL,
                                                  CIDADE VARCHAR(255) NOT NULL,
                                                  ESTADO VARCHAR(20) NOT NULL,
                                                  CEP VARCHAR(8) NOT NULL)


                                Neste comando, está sendo criada uma tabela chamada ENDERECO com 7 campos.
                       Todos os campos, com exceção de ID_ENDERECO são alfanuméricos. O campo ESTADO pode
                       ter valores com no máximo 20 caracteres, enquanto o campo CEP pode ter valores com no
                       máximo 8 caracteres. Os demais podem ter o valor máximo de 255 caracteres.
                               O campo ID_ENDERECO é definido como um IDENTITY. Além disso, este campo
                       também é definido como chave primária da tabela, que será utilizado para o relacionamento
                       com os correntistas. Lembrando: cada correntista possui dois endereços: um comercial
                       e outro residencial. O número associado a cada registro de endereço será utilizado para
                       efetuar esta relação. Para que o desenvolvedor não se preocupe com a geração dos valores
                       deste campo, o tipo IDENTITY é utilizado. A figura abaixo mostra a execução do comando na
                       aplicação de gerenciamento do HyperSQL.



28
Programação III




                    Figura 17 – Execução do Comando CREATE no HyperSQL



       Para executar o comando basta digitá-lo, e depois pressionar o botão ‘Execute SQL’.
Note que no painel esquerdo, após a realização do comando, a tabela ENDERECO é listada.
        Continuando a criação do nosso banco, é necessário criar a tabela PESSOA, que
guardará os dados dos correntistas do banco. Esta tabela deve possuir os campos CPF, NOME,
SEXO, além de chaves estrangeiras para a tabela endereço. Estas chaves representarão os
endereços comercial e residencial de cada correntista. Para criar a tabela pessoa utiliza-se
então o comando CREATE da seguinte forma:

 CREATE TABLE PESSOA (CPF VARCHAR(11) PRIMARY KEY NOT NULL,
                  NOME VARCHAR(255) NOT NULL,
                  SEXO VARCHAR(1) NOT NULL,
                  END_RESIDENCIAL INTEGER NOT NULL,
                  END_COMERCIAL INTEGER NOT NULL,
                  FOREIGN KEY(END_RESIDENCIAL) REFERENCES ENDERECO(ID_ENDERECO),
                  FOREIGN KEY(END_COMERCIAL) REFERENCES ENDERECO(ID_ENDERECO))

         Veja que cada campo utiliza a sintaxe já explicada anteriormente. O campo CPF é um
candidato natural a chave primária da tabela, uma vez que o CPF de uma pessoa nunca deve
ser igual ao de outra. A novidade é a definição de duas chaves estrangeiras pelos campos
END_RESIDENCIAL e END_COMERCIAL. Veja que inicialmente eles são definidos como dois
campos inteiros convencionais. Porém, nas duas últimas linhas, a cláusula FOREIGN KEY faz
uma associação entre estes campos, e o campo ID_ENDERECO da tabela ENDERECO. Desta
forma, esta associação indica que para serem válidos, os dois campos devem conter valores
válidos para o campo ID_ENDERECO da tabela ENDERECO. Esta regra será reforçada quando
começarmos a colocar dados nas tabelas. Porém, este mesmo tipo de raciocínio vale para a
criação da tabela CONTA.
       Toda conta possui seu número e saldo. Mas além disso, precisa estar relacionada a
uma pessoa que represente o correntista da conta. Logo, é necessário também a definição
                                                                                                           29
Programação III

                       de uma chave estrangeira para estabelecer este relacionamento. O comando apresentado a
                       seguir cria a tabela PESSOA:

                        CREATE TABLE CONTA (NUMERO INTEGER PRIMARY KEY NOT NULL,
                                         TIPO INTEGER NOT NULL,
                                         SALDO DOUBLE NOT NULL,
                                         CPF VARCHAR(11) NOT NULL,
                                         FOREIGN KEY(CPF) REFERENCES PESSOA(CPF))

                              Observe que o número da conta é utilizado como chave primária da tabela, pois
                       não devem haver contas com o mesmo número. O campo CPF é definido e, por fim, definido
                       como chave estrangeira relacionada com a tabela PESSOA.
                                Note que existe um campo a mais na definição da tabela CONTA: o campo tipo.
                       Lembre-se que uma conta pode ser uma conta normal, uma conta especial ou mesmo uma
                       poupança. Logo é preciso determinar este tipo na tabela. Além disso, nos casos da conta
                       especial e da poupança, é necessário ainda armazenar informações extras. Por isso, são
                       definidas novas tabelas: CONTA_ESPECIAL e POUPANCA. Cada uma delas possui uma relação
                       com a tabela CONTA por meio de uma chave estrangeira, e suas definições são apresentadas
                       a seguir:

                        CREATE TABLE CONTA_ESPECIAL (NUMERO INTEGER PRIMARY KEY NOT NULL,
                                                  LIMITE FLOAT NOT NULL,
                                                  FOREIGN KEY(NUMERO) REFERENCES CONTA(NUMERO))



                        CREATE TABLE POUPANCA (NUMERO INTEGER PRIMARY KEY NOT NULL,
                                                  DIA_ANIVERSARIO INTEGER NOT NULL,
                                                  TAXA_JUROS DOUBLE NOT NULL,
                                                  FOREIGN KEY(NUMERO) REFERENCES CONTA(NUMERO))

                               A Figura abaixo mostra o banco de dados, após todas a tabelas terem sido criadas.




                                             Figura 18 - Visão do SGBD após criação das tabelas
30
Programação III

        Percebe-se que existe uma ordem natural na criação das tabelas no banco. Primeiro,
deve-se criar sem nenhum tipo de dependência com outras tabelas, para então se partir
para aquelas com maior número de referências a outras tabelas do banco.


4.2 Alterando tabelas

        Uma vez criada uma tabela, é possível fazer modificações na estrutura da mesma.
Tais ações são fundamentais para alterações em bancos de dados que sofram modificações
para atender novos requisitos, como surgimento de novos campos ou novos relacionamentos
com outras tabelas. Para isto, utiliza-se o comando ALTER TABLE, cuja sintaxes básicas são
apresentadas a seguir:

 ALTER TABLE <<TABELA>> {ADD COLUMN <<CAMPO>> <<TIPO>> <<OPÇÕES>>}
                   {ADD FOREIGN KEY<<CAMPO>> REFERENCES <<TABELA(CAMPO)>>}
                   {DROP COLUMN <<CAMPO>>}
                   {ALTER COLUMN <<CAMPO>> RENAME TO <<NOVO_NOME_CAMPO>>}


 ou


 ALTER TABLE <<TABELA>> RENAME TO <<NOVO_NOME_TABELA>>

          Seguem alguns exemplos do uso do comando ALTER TABLE:

      »   Para adicionar um campo ESCOLARIDADE na tabela pessoa, utiliza-se o comando:

 ALTER TABLE PESSOA ADD COLUMN ESCOLARIDADE VARCHAR NOT NULL

      »   Para remover o campo criado:

 ALTER TABLE PESSOA DROP COLUMN ESCOLARIDADE

      »   Para mudar o nome do campo END_COMERCIAL para ENDERECO_COMERCIAL na
          tabela PESSOA:

 ALTER TABLE PESSOA ALTER COLUMN END_COMERCIAL RENAME TO ENDERECO_COMERCIAL

         O comando ALTER TABLE permite fazer outras mudanças nas tabelas, como mudar
o tipo de um campo ou seu tamanho, que porém nesta disciplina não serão abordados.
Uma coisa importante é que fazer alterações em tabelas que não possuam dados é muito
menos restritivo que naquelas que já possuem informações. Por exemplo, se quiséssemos
criar uma campo com a restrição NOT NULL em uma tabela que já possua 10 registros, isso
não seria possível, pois ao criar o campo, todo registro possuiria um campo sem nenhum
valor. Neste caso, a solução seria primeiro criar o campo, depois atribuir valores para cada
registro existente, para só então aplicar a restrição sobre valores nulos.


4.3 Apagando tabelas

        Por fim, o último comando DDL é o DROP. Este comando permite apagar uma tabela
da base de dados, e sua sintaxe é bem sucinta:

 DROP TABLE <<TABELA>>

        É importante observar que apesar de sua simplicidade, existem ressalvas ao se
apagar uma tabela. Por exemplo, se você tentar apagar a tabela CONTA do banco de dados
                                                                                                           31
Programação III

                       obterá uma mensagem de erro, como demonstrado abaixo.




                                 Figura 19 - Erro ao se apagar uma tabela que possui referências a outras tabelas



                                A razão para este erro são os relacionamentos que uma tabela pode ter com outras
                       tabelas, que impossibilitam que a mesma seja removida do banco. No nosso caso, as tabelas
                       CONTA_ESPECIAL e POUPANCA referenciam a tabela CONTA, ou seja, são dependentes de
                       informações contidas nesta última tabela. Portanto, a tabela CONTA não pode ser removida
                       sem que antes, tais relacionamentos sejam desfeitos. No caso, ou as relações são desfeitas,
                       ou as tabelas CONTA_ESPECIAL e POUPANCA são removidas primeiramente.




                       5. Comandos DML e DQL
                                Uma vez a base criada, o banco se vê pronto para receber dados em cada tabela.
                       Em SQL as instruções DML (Data Manipulation Language) são usadas para manipulação
                       de dados e consiste nas operações de inserir dados (insert into), alterar dados (update) e
                       excluir dados (delete), e são consideradas operações essenciais e de grande aplicação nas
                       operações com banco de dados. Já o único comando DQL é o SELECT, que é utilizado para
                       retornar os resultados de consultas. Estes comandos serão apresentados em conjunto para
                       que a medida que dados sejam alterados, tais modificações possam ser visualizadas. Vamos
                       ver cada um deles a seguir.


                       5.1 Inserindo dados em tabelas

                               Vamos começar com o comando INSERT INTO, cuja sintaxe é apresentada abaixo:

                        INSERT INTO <<TABELA>> [( <<COLUNA1>>, <<COLUNA2>>,...,<<COLUNA_N>>] ) ] {


                        VALUES(<<VALOR1>>, << VALOR 2>>,...,<< VALOR _N>>)}

                               O comando insert into permite que sejam criados registros em uma tabela. De
                       acordo com esta sintaxe, um exemplo para inserção de dados na tabela ENDERECO seria
                       como descrito a seguir.

                        INSERT INTO ENDERECO(RUA, NUMERO, BAIRRO, CIDADE, ESTADO, CEP) VALUES(‘Avenida
                        Recife’,’213’,’Boa Viagem’, ‘Recife’, ‘Pernambuco’, ‘51020021’);

32
Programação III

        Note que há uma correspondência entre cada campo e seu respectivo valor, e que
os valores alfanuméricos são delimitados por aspas simples. No caso específico da tabela
ENDERECO, você deve se lembrar que existe o campo ID_ENDERECO, definido como do tipo
identidade e que também é a chave primária da tabela. Relembrando, o valor deste campo
é determinado pelo próprio banco de dados como uma sequência de valores inteiros que
começa com 0 (zero) e que a cada novo registro é adicionado uma unidade.
         Ao executar este comando no HyperSQL, obtém-se como resultado o número de
registros afetados pelo comando. Neste caso, o valor obtido é 1(um), como ilustrado a
seguir.




                              Figura 20 - Comando Insert no HyperSQL



        Um detalhe importante na inserção de dados é a atenção em relação as
dependências entre as tabelas. Por exemplo, para inserir dados na tabela PESSOA, são
necessárias informações dos endereços comercial e residencial de cada correntista. Logo, é
necessário que estas informações estejam previamente cadastradas. Tome como exemplo,
o cadastro de uma pessoa com os seguintes dados:

         Dados                                                   Valor

 Nome                        Fernando Trinta

 CPF                         111111111-11

 Sexo                        Masculino

 Endereço Residencial        Avenida Recife, 213, Boa Viagem, Recife – Pernambuco, CEP: 51020021

 Endereço Comercial          Avenida Caxangá, 23, Cordeiro, Recife – Pernambuco, CEP: 51040031

        O endereço residencial já foi cadastrado anteriormente. Mas para cadastrar a
pessoa, é necessário cadastrar seu endereço comercial. Logo, primeiro tem-se que executar
o seguinte comando:

 INSERT INTO ENDERECO(RUA, NUMERO, BAIRRO, CIDADE, ESTADO, CEP) VALUES(‘Avenida
 Caxangá’,’23’,’Cordeiro’, ‘Recife’,’Pernambuco’, ‘51040031’);

        Assume-se que ao criar este segundo endereço, o valor de seu campo ID_
ENDERECO será igual a 1 (um), pois o primeiro registro iniciou com 0 (zero). Agora com os
dois endereços cadastrados, é possível cadastrar o registro da pessoa na tabela PESSOA.

                                                                                                                   33
Programação III


                        INSERT     INTO     PESSOA(CPF,      NOME,      SEXO,     END_RESIDENCIAL,       END_COMERCIAL)
                        VALUES(‘11111111111’,’Fernando Trinta’, ‘M’, 0, 1)

                              Se por acaso, ao tentar incluir uma pessoa, se utiliza-se um valor para os endereços
                       que não fosse válido, ou seja, inexistente, a operação seria invalidada. Veja por exemplo, o
                       que acontece ao tentar inserir o registro passando o valor 3 para END_COMERCIAL.




                                   Figura 21 - Erro ao inserir um registro sem as devidas dependências satisfeitas



                                Isso atesta o fato que é necessário ter atenção em se manter as relações de
                       integridade referencial entre as tabelas. Por exemplo, para inserir um registro na tabela
                       CONTA, é necessária a informação sobre o correntista. No caso, é necessário o CPF de uma
                       pessoa cadastrada na tabela PESSOA. O comando abaixo cria um registro de uma conta cujo
                       correntista é a pessoa de CPF igual a 11111111111, com número da conta igual a 1 e saldo
                       de R$ 1000,00.

                        INSERT INTO CONTA(NUMERO, SALDO, TIPO, CPF) VALUES (1, 1000, 1, ‘11111111111’);

                               Em relação ao campo tipo, o valor estabelecido é determinado pelo desenvolvedor.
                       No caso desta base de dados, será utilizada a seguinte tabela:

                                                   Tipo da Conta             Valor do Campo Tipo

                                                       Normal                         0

                                                      Especial                        1

                                                     Poupança                         2

                                Logo, a conta criada anteriormente é uma conta especial. Sendo uma conta
                       especial, é necessário também inserir informações na tabela CONTA_ESPECIAL, como por
                       exemplo, com o comando a seguir.

                        INSERT INTO CONTA_ESPECIAL(NUMERO, LIMITE) VALUES(1, 300);

                                Veja que neste caso, os valores dos campos NUMERO nas duas tabelas são iguais,
                       estabelecendo a ligação entre os dois registros. Neste caso, estabelece-se que a conta
                       especial de número 1 tem como limite o valor de R$ 300,00.
                                 É importante também ressaltar que as restrições sobre dados nulos e chaves

34
Programação III

primárias são verificadas na inserção de novos dados. Caso se tente burlar algumas destas
regras, uma mensagem de erro é exibida, como no caso abaixo, onde tenta-se cadastrar
uma conta com número igual a de outra conta já cadastrada na base de dados.




        Figura 22 - Erro ao se tentar incluir um registro com uma chave primária já existente




5.2 Visualizando dados das tabelas

         Até então, a certeza sobre a inserção dos dados nas tabelas só poderia ser verificada
pelas respostas dos comandos INSERT realizados. Porém, uma maneira mais segura seria
verificar se os dados constam ou nas tabelas. Para isto, devemos utilizar o comando SELECT,
cuja sintaxe simplificada é apresentada a seguir.

 SELECT { EXPRESSÃO | TABELA.CAMPO | * } [, ... ]


 FROM <<LISTA DE TABELAS>


 [WHERE <<EXPRESSÃO>>]


 [ORDER BY <<CAMPO>> [{ASC | DESC}] ]


 [GROUP BY <<EXPRESSÃO>> ]

        Esta é uma versão simplificada do comando SELECT. Existem outras cláusulas que
não serão apresentas aqui por questões de escopo da disciplina, e também porque as
cláusulas aqui citadas serão suficientes para nossos exemplos.
       Na sua versão mais simples, é possível listar todos os registros e campos de
uma determinada tabela. Por exemplo, caso você queira ver todos os registros da tabela
ENDERECO, deve usar o comando a seguir:

 SELECT * FROM ENDERECO

        Este comando indica que queremos visualizar todos os campos de todos os registros
da tabela ENDERECO. Porém, é possível especificar que queremos ver apenas um conjunto
dos campos, listando-os individualmente no comando SELECT, como exemplificado abaixo.

 SELECT RUA FROM ENDERECO

                                                                                                                  35
Programação III

                               Veja na Figura abaixo, o resultado da execução do comando SELECT no banco criado
                       até então:




                                Note que há outros registros. Estes registros foram inseridos propositadamente por
                       meio de outros comandos INSERT. Note também que como havíamos dito, o campo ID_
                       ENDERECO tem valores numéricos que são atribuídos automaticamente para cada registro.
                       Com isto, podemos utilizar o comando SELECT para visualizar qual o valor gerado para um
                       registro de um endereço e depois utilizá-lo para inserir uma pessoa.
                               Caso se queira refinar uma busca, é possível utilizar a cláusula WHERE. Esta cláusula
                       define uma condição de busca que deve ser satisfeita por um registro para que ele seja
                       retornado como resposta ao SELECT. Para definir esta condição, SQL utiliza operadores
                       lógicos e relacionais já conhecidos das linguagens de programação. A tabela a seguir
                       apresenta os operadores lógicos presentes em SQL.
                               Tabela 2 – Operadores lógicos de SQL

                               Operador                                        Descrição


                                                 “E” lógico, avalia duas condições e retorna verdadeiro apenas se ambas
                                 AND
                                                 forem verdadeiras


                                                 “OU” lógico, avalia duas condições e retorna verdadeiro se alguma das
                                  OR
                                                 condições for verdadeira

                                 NOT             Negacão lógica, retorna o valor contrário da expressão avaliada

                               Em relação aos operadores relacionais, estes são usados para realizar comparações
                       entre valores. A tabela abaixo apresenta os principais operadores relacionais presentes em
                       SQL.




36
Programação III

        Tabela 3 – Operadores relacionais em SQL

      Operador                                        Descrição

          <           Menor

          >           Maior

         <=           Menor ou igual

         >=           Maior ou igual

          =           Igual

         !=           Diferente

      BETWEEN         Utilizado para especificar um intervalo de valores

                      Utilizado na comparação de um modelo e para especificar registros de um
        LIKE          banco de dados.”Like” + extensão % vai significar buscar todos resultados
                      com o mesmo início da extensão

        Para ilustrar sua utilização, vamos apresentar alguns exemplos. Para listar todas as
ruas de endereço localizados no bairro de Boa Viagem:




        Para listar todas as ruas que começam com a palavra ‘AVENIDA’:




      Para listar todas as ruas que começam com a palavra ‘AVENIDA’ e que o ID_
ENDERECO estejam entre 1 e 3.

                                                                                                                37
Programação III




                               A cláusula ORDER BY permite que os resultados apresentados sejam ordenados de
                       acordo com seus valores. É possível definir tanto a ordenação crescente (que é o padrão),
                       quanto decrescente de valores. Por exemplo, para listar os nomes de todas as ruas em
                       ordem decrescente, utilizaríamos o seguinte comando

                        SELECT RUA FROM ENDERECO ORDER BY RUA DESC

                               Veja a execução do comando na figura abaixo




                                Antes de valor sobre a última cláusula, a GROUP BY, é necessário dizer que SQL
                       fornece também um conjunto de funções para agregação de valores. A cláusula GROUP
                       utiliza estas funções para que os resultados de sua chamada sejam aplicadas em um
                       conjunto de registros que são agrupados por um critério comum. A tabela a seguir apresenta
                       as principais funções de agregação.
                               Tabela 4 - Operadores escalares em SQL

                            Função                                         Descrição

                              AVG         Utilizada para calcular a média dos valores de um campo determinado

                            COUNT         Utilizada para devolver o número de registros da seleção

                             SUM          Utilizada para devolver a soma de todos os valores de um campo determinado

                             MAX          Utilizada para devolver o valor mais alto de um campo especificado

                             MIN          Utilizada para devolver o valor mais baixo de um campo especificado

38
Programação III

       Para exemplificar o uso das funções de agregação e da cláusula GROUP BY, tome
com exemplo a tabela CONTA, com os seguintes dados cadastrados.




        Imagine então que se queira saber qual é a média dos saldos entre todas as contas
cadastradas. Para isso, utiliza-se a função AVG, como apresentado a seguir.




        Caso se queira descobrir o maior e o menor saldo de uma conta, utiliza-se as
funções MAX e MIN, como ilustrado a seguir.




           A cláusula GROUP BY permite que as funções de agregação sejam agrupadas. Para
ilustrar, imagine a consulta onde se queira saber qual o menor e maior saldo das contas de

                                                                                                          39
Programação III

                       cada correntista, dado que existem pessoas com mais de uma conta no banco. Para isto,
                       utiliza-se a cláusula GROUP BY, como exemplificado a seguir.




                                Note que nesta última consulta, utiliza-se um novo recurso. Cada campo utilizado
                       na consulta pode ter um ‘apelido’. No caso, utiliza-se a palavras ‘AS’ como uma ligação entre
                       o valor do campo e seu apelido. Este novo identificador é utilizado na resposta da consulta,
                       como visto na Figura.
                               Por fim, deixamos as consultas mais complexas. Imagine a situação onde você
                       queira visualizar o nome de todos os correntistas que tenham contas especiais. Neste caso
                       há um problema, pois a informação sobre o tipo da conta é armazenada na tabela CONTA,
                       e o nome de cada correntista fica na tabela PESSOA. A princípio, teríamos que fazer duas
                       consultas. Primeiro, descobrir quais são os cpfs das contas especiais na tabela CONTA, e
                       depois utilizar estes valores para criar uma segunda consulta na tabela PESSOA.
                               Porém, é possível fazer esta consulta com um único comando SQL, por meio da
                       junção de tabelas. Veja que tanto a tabela CONTA, quanto a tabela PESSOA possuem um
                       campo em comum: o CPF. Logo, este campo servirá de ligação entre as duas tabelas em uma
                       consulta. A consulta que pretendemos é apresentada a seguir

                        SELECT NOME FROM CONTA AS C, PESSOA AS P WHERE (TIPO = 1) AND (C.CPF = P.CPF)

                               Nesta consulta, verifica-se que podem-se ser obtidos todos os campos das tabelas
                       citadas na cláusula FROM, no caso, as tabelas CONTA e PESSOA. No caso, só estamos
                       querendo retornar o nome. Este é um campo que só existe na tabela PESSOA, então o
                       compilador SQL não vai se perder para obter esta informação. Caso houvessem dois campos
                       com o mesmo nome em tabelas distintas, é necessário especificar qual campo de que tabela
                       se deseja retorna. Para isto, deve-se utilizar o nome da tabela (ou seu apelido), seguido por
                       um ponto “.” e o nome do campo.
                                Note que da mesma forma que campos podem ser renomeados, tabelas também.
                       Neste exemplo, CONTA passa ser referenciada por “C”, e PESSOA por “P”. Esta substituição é
                       para diminuir o tamanho das cláusulas SQL. A junção das tabelas se dá na cláusula WHERE.
                       Nela, além de se filtrar as contas pelo seu tipo, faz uma ligação entre as duas tabelas através
                       dos números de CPF. A Figura a seguir apresenta a execução desta consulta no HyperSQL.




40
Programação III




        Outro exemplo de junção mais complexo seria: Qual o estado do endereço
residencial do correntista cuja conta seja a de número 1?
        Neste caso, é necessário fazer a junção de 3 tabelas: CONTA, PESSOA e ENDERECO,
pois o estado é parte da tabela ENDERECO, enquanto o número da conta está na tabela
CONTA. A única ligação entre as duas tabelas é a tabela PESSOA. A figura abaixo apresenta o
comando SELECT e sua execução no HyperSQL.




5.3 Alterando dados em tabelas

        Uma vez que já existam dados, o comando UPDATE permite que os valores de um
ou vários campos de um ou mais registros sejam alterados. Sua sintaxe é descrita a seguir.

 UPDATE <<TABELA>> SET <<COLUNA1>> = <<VALOR1>>,


 <<COLUNA2>> = <<VALOR2>>


 [WHERE <<EXPRESSÃO>>]

         A idéia do comando UPDATE é especificar novos valores para campos que devem
ser alterados de acordo com uma condição de pesquisa. Por exemplo, imagine que se queira
modificar o nome do correntista ‘Fernando Trinta’ para ‘Fernando Antonio Mota Trinta’.
Neste caso, utiliza-se o seguinte comando:

 UPDATE PESSOA SET NOME = ‘Fernando Antonio Mota Trinta’ WHERE CPF = ‘11111111111’

                                                                                                          41
Programação III

                               Note que neste caso, a condição indica que apenas o registro cujo CPF seja igual a
                       ‘11111111111’ tenha o nome alterado para ‘’Fernando Antonio Mota Trinta’. De acordo com
                       os dados cadastrados até então, só existe um registro que satisfaça esta condição, e este
                       será o único registro alterado. Se não houvesse nenhum registro que satisfizesse a condição,
                       nenhum registro seria alterado.
                                É importante salientar que se nenhum condição de seleção for especificada na
                       cláusula WHERE, a atualização se dá em todas os registros da tabela. Por exemplo, caso se
                       queira aumentar o saldo de todas as contas em 50%. Neste caso, não há necessidade de se
                       definir a cláusula WHERE, como ilustrado na figura abaixo.




                               Duas observações importantes neste último exemplo. Primeiro, é possível utilizar
                       expressões matemáticas para atualizações, assim como nos critérios de busca bem como
                       nos resultados das consultas. Segundo, o resultado do comando UPDATE é o número
                       de registros afetados por sua execução. No nosso exemplo, cinco linhas da tabela foram
                       modificadas pelo comando UPDATE.




                       5.4 Removendo registros

                             O último dos comandos DML é aquele que permite a exclusão de registros, o
                       comando DELETE. A sintaxe simplificada do comando é apresentada a seguir

                        DELETE FROM <<TABELA>> [ WHERE CONDIÇÃO ]

42
Programação III

          O comando DELETE remove todas os registros de uma determinada tabela que
obedeçam ao critério de busca definido na cláusula WHERE. Se não for definido nenhum
critério, todas as linhas da tabela são removidas, o que indica que o comando deve ser
utilizado com cuidado.
        É importante também frisar que para que as linhas de uma coluna sejam removidas,
as condições de integridade referencial entre os dados da tabela devem ser satisfeitos. Por
exemplo, na tabela CONTAS, existem registros que são referenciados por outras tabelas,
com as contas especiais ou poupanças.
       A tentativa de se remover um registro nestas condições ocasionará um erro, como
apresentado pela figura abaixo.




       Logo, para efetivamente se apagar um registro, deve-se seguir a ordem correta
de remoção de dependência entre registros que estejam relacionados. No caso de nosso
exemplo, primeiro deve-se apagar o registro na tabela CONTA_ESPECIAL, para então
remover o registro na tabela CONTA, como apresentado a seguir.




        Note que os dois comandos (assim como mais de um comando) podem ser
disparados na mesma janela. Estes são executados na ordem em que são digitados na
ferramenta.




                                                                                                          43
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC
Banco de Dados SQL JDBC

More Related Content

What's hot

Curso de Sistema Operacional Linux
Curso de Sistema Operacional Linux Curso de Sistema Operacional Linux
Curso de Sistema Operacional Linux Luiz Avelar
 
Curso de Multimídia na Educação.
Curso de Multimídia na Educação.Curso de Multimídia na Educação.
Curso de Multimídia na Educação.Luiz Avelar
 
Dissertação google inc act on general strike suzart Attain to cpf 051 812 95...
Dissertação  google inc act on general strike suzart Attain to cpf 051 812 95...Dissertação  google inc act on general strike suzart Attain to cpf 051 812 95...
Dissertação google inc act on general strike suzart Attain to cpf 051 812 95...Sandro Santana
 
Modelos de avaliacao de ambientes virtuais de aprendizagem
Modelos de avaliacao de ambientes virtuais de aprendizagemModelos de avaliacao de ambientes virtuais de aprendizagem
Modelos de avaliacao de ambientes virtuais de aprendizagemjoao jose saraiva da fonseca
 
Curso de Computação Gráfica 3D
Curso de Computação Gráfica 3DCurso de Computação Gráfica 3D
Curso de Computação Gráfica 3DLuiz Avelar
 
Curso Básico de CAD: Projeto Auxiliado por Computador
Curso Básico de CAD: Projeto Auxiliado por ComputadorCurso Básico de CAD: Projeto Auxiliado por Computador
Curso Básico de CAD: Projeto Auxiliado por ComputadorLuiz Avelar
 
Curso de ilustração Digital
Curso de ilustração DigitalCurso de ilustração Digital
Curso de ilustração DigitalLuiz Avelar
 
ESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAIS
ESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAISESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAIS
ESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAISPerpetuo Rodrigues
 
Banco de dados_-_volume_4_v10
Banco de dados_-_volume_4_v10Banco de dados_-_volume_4_v10
Banco de dados_-_volume_4_v10CLEAN LOURENÇO
 
Estudo De Aplicabilidade Do PadrãO Mvc Fernando & Leonardo
Estudo De Aplicabilidade Do PadrãO Mvc   Fernando & LeonardoEstudo De Aplicabilidade Do PadrãO Mvc   Fernando & Leonardo
Estudo De Aplicabilidade Do PadrãO Mvc Fernando & LeonardoFernando A. Barbeiro Campos
 

What's hot (12)

Curso de Sistema Operacional Linux
Curso de Sistema Operacional Linux Curso de Sistema Operacional Linux
Curso de Sistema Operacional Linux
 
Curso de Multimídia na Educação.
Curso de Multimídia na Educação.Curso de Multimídia na Educação.
Curso de Multimídia na Educação.
 
Dissertação google inc act on general strike suzart Attain to cpf 051 812 95...
Dissertação  google inc act on general strike suzart Attain to cpf 051 812 95...Dissertação  google inc act on general strike suzart Attain to cpf 051 812 95...
Dissertação google inc act on general strike suzart Attain to cpf 051 812 95...
 
Modelos de avaliacao de ambientes virtuais de aprendizagem
Modelos de avaliacao de ambientes virtuais de aprendizagemModelos de avaliacao de ambientes virtuais de aprendizagem
Modelos de avaliacao de ambientes virtuais de aprendizagem
 
Curso de Computação Gráfica 3D
Curso de Computação Gráfica 3DCurso de Computação Gráfica 3D
Curso de Computação Gráfica 3D
 
Curso Básico de CAD: Projeto Auxiliado por Computador
Curso Básico de CAD: Projeto Auxiliado por ComputadorCurso Básico de CAD: Projeto Auxiliado por Computador
Curso Básico de CAD: Projeto Auxiliado por Computador
 
Access1
Access1Access1
Access1
 
Multimida na educação
Multimida na educaçãoMultimida na educação
Multimida na educação
 
Curso de ilustração Digital
Curso de ilustração DigitalCurso de ilustração Digital
Curso de ilustração Digital
 
ESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAIS
ESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAISESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAIS
ESTUDO DE CASOS SOBRE A APLICAÇÃO DA WEB SEMÂNTICA NAS REDES SOCIAIS
 
Banco de dados_-_volume_4_v10
Banco de dados_-_volume_4_v10Banco de dados_-_volume_4_v10
Banco de dados_-_volume_4_v10
 
Estudo De Aplicabilidade Do PadrãO Mvc Fernando & Leonardo
Estudo De Aplicabilidade Do PadrãO Mvc   Fernando & LeonardoEstudo De Aplicabilidade Do PadrãO Mvc   Fernando & Leonardo
Estudo De Aplicabilidade Do PadrãO Mvc Fernando & Leonardo
 

Viewers also liked

Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggersDaniel Maia
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Ryan Padilha
 
Sap innovation forum istanbul 2012
Sap innovation forum istanbul 2012Sap innovation forum istanbul 2012
Sap innovation forum istanbul 2012ugur candan
 
Alumnos 4º e.s.o. 2011-12
Alumnos 4º e.s.o.   2011-12Alumnos 4º e.s.o.   2011-12
Alumnos 4º e.s.o. 2011-12Begoña Prado
 
Ma il garage dove è finito?
Ma il garage dove è finito? Ma il garage dove è finito?
Ma il garage dove è finito? hormann1
 
A cultura castrexa. Continuación tema 12 1º eso (3ª parte)
A cultura castrexa. Continuación tema 12 1º eso (3ª parte)A cultura castrexa. Continuación tema 12 1º eso (3ª parte)
A cultura castrexa. Continuación tema 12 1º eso (3ª parte)feli555
 
数字电路简明教程[1]
数字电路简明教程[1]数字电路简明教程[1]
数字电路简明教程[1]yangkun521316
 
Ones de cabell retro.
Ones de cabell retro.Ones de cabell retro.
Ones de cabell retro.sarasareta
 
Horse breeder/Leanna
Horse breeder/LeannaHorse breeder/Leanna
Horse breeder/Leannalmpelkey
 
Presentatie Urban Photo Collective (NL)
Presentatie Urban Photo Collective (NL)Presentatie Urban Photo Collective (NL)
Presentatie Urban Photo Collective (NL)Jeroen Mooijman
 

Viewers also liked (20)

Prática de laboratório utilizando views, stored procedures e triggers
Prática de laboratório   utilizando views, stored procedures e triggersPrática de laboratório   utilizando views, stored procedures e triggers
Prática de laboratório utilizando views, stored procedures e triggers
 
Apostila banco de dados
Apostila banco de dadosApostila banco de dados
Apostila banco de dados
 
Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)Orientação a Objetos no Delphi - Controle de Estoque (III)
Orientação a Objetos no Delphi - Controle de Estoque (III)
 
Act2 reconocimiento general
Act2 reconocimiento generalAct2 reconocimiento general
Act2 reconocimiento general
 
Banyoles
BanyolesBanyoles
Banyoles
 
Sap innovation forum istanbul 2012
Sap innovation forum istanbul 2012Sap innovation forum istanbul 2012
Sap innovation forum istanbul 2012
 
Alumnos 4º e.s.o. 2011-12
Alumnos 4º e.s.o.   2011-12Alumnos 4º e.s.o.   2011-12
Alumnos 4º e.s.o. 2011-12
 
France from above
France from aboveFrance from above
France from above
 
Open Data
Open DataOpen Data
Open Data
 
Ma il garage dove è finito?
Ma il garage dove è finito? Ma il garage dove è finito?
Ma il garage dove è finito?
 
A cultura castrexa. Continuación tema 12 1º eso (3ª parte)
A cultura castrexa. Continuación tema 12 1º eso (3ª parte)A cultura castrexa. Continuación tema 12 1º eso (3ª parte)
A cultura castrexa. Continuación tema 12 1º eso (3ª parte)
 
数字电路简明教程[1]
数字电路简明教程[1]数字电路简明教程[1]
数字电路简明教程[1]
 
L'esfera
L'esferaL'esfera
L'esfera
 
Johanna Guananga
Johanna GuanangaJohanna Guananga
Johanna Guananga
 
Quadres
QuadresQuadres
Quadres
 
Ones de cabell retro.
Ones de cabell retro.Ones de cabell retro.
Ones de cabell retro.
 
Horse breeder/Leanna
Horse breeder/LeannaHorse breeder/Leanna
Horse breeder/Leanna
 
Mercedez benz el jac
Mercedez benz el jacMercedez benz el jac
Mercedez benz el jac
 
unas fotitoZ
unas fotitoZ unas fotitoZ
unas fotitoZ
 
Presentatie Urban Photo Collective (NL)
Presentatie Urban Photo Collective (NL)Presentatie Urban Photo Collective (NL)
Presentatie Urban Photo Collective (NL)
 

Similar to Banco de Dados SQL JDBC

Livro banco de_dados_volume_02
Livro banco de_dados_volume_02Livro banco de_dados_volume_02
Livro banco de_dados_volume_02CLEAN LOURENÇO
 
Trabalho banco de dados orientado a objetos
Trabalho banco de dados orientado a objetosTrabalho banco de dados orientado a objetos
Trabalho banco de dados orientado a objetoseneck
 
Caderno de info(banco de dados).
Caderno de info(banco de dados).Caderno de info(banco de dados).
Caderno de info(banco de dados).Ajudar Pessoas
 
Livro banco de_dados_volume_03
Livro banco de_dados_volume_03Livro banco de_dados_volume_03
Livro banco de_dados_volume_03CLEAN LOURENÇO
 
Introdução a Deep Learning
Introdução a Deep LearningIntrodução a Deep Learning
Introdução a Deep LearningCristian Muñoz
 
Banco dados i prof ivan (acesse www.portalgsti.com.br)
Banco dados i prof ivan (acesse  www.portalgsti.com.br)Banco dados i prof ivan (acesse  www.portalgsti.com.br)
Banco dados i prof ivan (acesse www.portalgsti.com.br)Andre Sidou
 
programacao-c-banco-de-dados
programacao-c-banco-de-dadosprogramacao-c-banco-de-dados
programacao-c-banco-de-dadosRaul Dias
 
ESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATE
ESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATEESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATE
ESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATEFernando A. Barbeiro Campos
 
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...Gabriel Cabral
 
Avaliação NOSQL para indexação do Twitter
Avaliação NOSQL para indexação do TwitterAvaliação NOSQL para indexação do Twitter
Avaliação NOSQL para indexação do TwitterCaliel Costa
 
Apostila hibernate
Apostila hibernateApostila hibernate
Apostila hibernateAgenor Neto
 
Identificando e corrigindo problemas de performance em banco de dados (2)
Identificando e corrigindo problemas de performance em banco de dados (2)Identificando e corrigindo problemas de performance em banco de dados (2)
Identificando e corrigindo problemas de performance em banco de dados (2)Vinicius Pires
 
Livro Algoritmos e Programação de Computadores Autores JR., Dilermando
Livro Algoritmos e Programação de Computadores Autores JR., DilermandoLivro Algoritmos e Programação de Computadores Autores JR., Dilermando
Livro Algoritmos e Programação de Computadores Autores JR., DilermandoOs Fantasmas !
 

Similar to Banco de Dados SQL JDBC (20)

Livro banco de_dados_volume_02
Livro banco de_dados_volume_02Livro banco de_dados_volume_02
Livro banco de_dados_volume_02
 
Trabalho banco de dados orientado a objetos
Trabalho banco de dados orientado a objetosTrabalho banco de dados orientado a objetos
Trabalho banco de dados orientado a objetos
 
Fundamentos de banco dados
Fundamentos de banco dadosFundamentos de banco dados
Fundamentos de banco dados
 
Caderno de info(banco de dados).
Caderno de info(banco de dados).Caderno de info(banco de dados).
Caderno de info(banco de dados).
 
Livro banco de_dados_volume_03
Livro banco de_dados_volume_03Livro banco de_dados_volume_03
Livro banco de_dados_volume_03
 
Fundamentos de banco dados
Fundamentos de banco dadosFundamentos de banco dados
Fundamentos de banco dados
 
Estruturas de dados em c
Estruturas de dados em cEstruturas de dados em c
Estruturas de dados em c
 
Mapeamento objeto relacional
Mapeamento objeto relacionalMapeamento objeto relacional
Mapeamento objeto relacional
 
Ct java vi_2010_16
Ct java vi_2010_16Ct java vi_2010_16
Ct java vi_2010_16
 
Introdução a Deep Learning
Introdução a Deep LearningIntrodução a Deep Learning
Introdução a Deep Learning
 
Tcc versao final-15-12
Tcc versao final-15-12Tcc versao final-15-12
Tcc versao final-15-12
 
Banco dados i prof ivan (acesse www.portalgsti.com.br)
Banco dados i prof ivan (acesse  www.portalgsti.com.br)Banco dados i prof ivan (acesse  www.portalgsti.com.br)
Banco dados i prof ivan (acesse www.portalgsti.com.br)
 
programacao-c-banco-de-dados
programacao-c-banco-de-dadosprogramacao-c-banco-de-dados
programacao-c-banco-de-dados
 
ESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATE
ESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATEESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATE
ESTUDO DE MAPEAMENTO OBJETO-RELACIONAL COM FRAMEWORK HIBERNATE
 
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
Monografia - Engenharia de software baseada em modelos um estudo sobre WebML ...
 
Avaliação NOSQL para indexação do Twitter
Avaliação NOSQL para indexação do TwitterAvaliação NOSQL para indexação do Twitter
Avaliação NOSQL para indexação do Twitter
 
Apostila hibernate
Apostila hibernateApostila hibernate
Apostila hibernate
 
Relatório de fim de curso
Relatório de fim de cursoRelatório de fim de curso
Relatório de fim de curso
 
Identificando e corrigindo problemas de performance em banco de dados (2)
Identificando e corrigindo problemas de performance em banco de dados (2)Identificando e corrigindo problemas de performance em banco de dados (2)
Identificando e corrigindo problemas de performance em banco de dados (2)
 
Livro Algoritmos e Programação de Computadores Autores JR., Dilermando
Livro Algoritmos e Programação de Computadores Autores JR., DilermandoLivro Algoritmos e Programação de Computadores Autores JR., Dilermando
Livro Algoritmos e Programação de Computadores Autores JR., Dilermando
 

Banco de Dados SQL JDBC

  • 1. UNIVERSIDADE FEDERAL RURAL DE PERNAMBUCO (UFRPE) COORDENAÇÃO GERAL DE EDUCAÇÃO A DISTÂNCIA (EAD/UFRPE) Programação III Fernando Antonio Mota Trinta Volume 3 Recife, 2011
  • 2. Universidade Federal Rural de Pernambuco Reitor: Prof. Valmar Corrêa de Andrade Vice-Reitor: Prof. Reginaldo Barros Pró-Reitor de Administração: Prof. Francisco Fernando Ramos Carvalho Pró-Reitor de Atividades de Extensão: Prof. Delson Laranjeira Pró-Reitora de Ensino de Graduação: Profª. Maria José de Sena Pró-Reitora de Pesquisa e Pós-Graduação: Profª Antonia Sherlânea Chaves Véras Pró-Reitor de Planejamento: Prof. Romildo Morant de Holanda Pró-Reitor de Gestão Estudantil: Prof. Valberes Bernardo do Nascimento Coordenação Geral de Ensino a Distância: Profª Marizete Silva Santos Produção Gráfica e Editorial Capa e Editoração: Rafael Lira, Italo Amorim e Everton Felix Revisão Ortográfica: Elias Vieira Ilustrações: Allyson Vila Nova Coordenação de Produção: Marizete Silva Santos
  • 3. Sumário Apresentação................................................................................................................. 5 Conhecendo o Volume 3 ................................................................................................ 6 Capítulo 1 – Uma visão geral sobre bancos de dados...................................................... 8 1. Introdução ...................................................................................................................8 2. Por que os Bancos de Dados existem? ........................................................................9 3. Arquitetura Geral de um SGBD ..................................................................................12 3.1 Banco de Dados e uma visão em camadas ........................................................13 4. A modelagem e a representação de dados em um SGBD .........................................14 4.1 O Modelo Relacional ..........................................................................................15 4.2 Um modelo relacional para o sistema bancário.................................................17 Capítulo 2 – A linguagem estruturada de consulta: SQL ................................................ 23 1. Introdução .................................................................................................................23 2. Classificação de comandos SQL .................................................................................24 3. Instalação e utilização do HyperSQL ..........................................................................25 4. Comandos DDL ..........................................................................................................27 4.1 Criando tabelas ..................................................................................................27 4.2 Alterando tabelas ...............................................................................................31 4.3 Apagando tabelas ..............................................................................................31 5. Comandos DML e DQL ...............................................................................................32 5.1 Inserindo dados em tabelas ...............................................................................32 5.2 Visualizando dados das tabelas..........................................................................35 5.3 Alterando dados em tabelas ..............................................................................41 5.4 Removendo registros ........................................................................................42
  • 4. Capítulo 3 – A especificação JDBC ................................................................................ 47 1. Introdução .................................................................................................................47 2. JDBC ...........................................................................................................................48 3. Configurando eclipse para usar JDBC ........................................................................50 4. Utilizando a API JDBC .................................................................................................55 4.1 Estabelecendo uma conexão com o banco ........................................................55 4.2 Acessando o banco de dados .............................................................................56 4.3 Parametrizando consultas ..................................................................................61 5. Transações com JDBC ................................................................................................63 6. Integrando o Banco com o Sistema de Contas ..........................................................64 Conheça o Autor .......................................................................................................... 76
  • 5. Apresentação Caro Cursista, Seja bem-vindo(a) ao curso de Programação III. Esta disciplina dará seqüência aos estudos iniciados na disciplina de linguagem de programação II, apresentando conceitos avançados relacionados à construção de aplicações orientadas a objetos. Este curso é composto por 4 volumes. No primeiro volume, estudamos a importância da boa organização dos sistemas, por meio dos conceitos de arquitetura de software e padrões de projeto. Em seguida, vimos como podemos criar aplicações multitarefa utilizando threads de threads, para, por fim, aprendermos a gerenciar arquivos em aplicações orientadas a objetos. O segundo volume foi dedicado ao estudo do conceito de frameworks e à construção da interface do usuário, utilizando recursos avançados como janelas, botões, listas de seleção, e outras metáforas bastante conhecidas das aplicações modernas. Este assunto aborda ainda o chamado modelo de programação orientado a eventos. Este terceiro volume é totalmente dedicado ao estudo da integração de aplicações com bancos de dados. Para isto, veremos primeiramente conceitos fundamentais sobre bancos de dados, para depois vermos como se dá sua integração com aplicações. No quarto e último volume, você aprenderá a criar aplicações distribuídas utilizando duas abordagens: a de sockets e a de objetos distribuídos. Em todos estes volumes, re-utilizaremos conceitos aprendidos no curso de linguagem de programação II, e sempre que possível, utilizaremos o estudo de caso desenvolvido anteriormente, o sistema de controle bancário, para apresentar os novos conceitos de cada capítulo. Portanto, é de fundamental importância que você tenha bem sedimentado os conceitos de orientação a objetos para dar prosseguimento a esta disciplina. No mais, espero que você aproveite este material para aprofundar-se ainda mais sobre como deve-se construir aplicações mais robustas e próximas de cenários reais do desenvolvimento de software na atualidade. Bons estudos! Professor Fernando Trinta 5
  • 6. Programação III Conhecendo o Volume 3 Neste terceiro volume, você irá encontrar o Módulo 3 da disciplina Programação III. Para facilitar seus estudos, veja a organização deste terceiro módulo. Módulo 3 – Uma introdução à integração de programas com bancos de dados Carga Horária do Módulo 3: 15 h Objetivo do Módulo 3: Introduzir os conceitos básicos de bancos de dados, sua organização interna de dados e relação com o mundo orientado a objetos. Apresentar a linguagem SQL para manipulação de dados. Apresentar a especificação JDBC para conexão de programas escritos em linguagem Java com bancos de dados. Conteúdo Programático do Módulo 3 » Introdução a bancos de dados; » A Linguagem SQL; » A Especificação JDBC. Como relatado anteriormente, o terceiro volume desta disciplina é totalmente dedicado à integração de programas como bancos de dados. Este é um assunto muito importante. Praticamente todo sistema de informação é composto por programas que interagem com bases de dados que são gerenciadas por um software específico, o sistema gerenciador de bancos de dados ou SGBD. A importância da manutenção correta destes dados é tanta, que esta é considerada uma área de pesquisa específica dentro da ciência da computação, com disciplinas inteiras dedicadas a conceitos específicos e a forma correta de se definir e manipular bancos de dados. Não é objetivo desta disciplina abordar todos os conceitos relacionados à área de bancos de dados. Para isto, existem dentro do curso disciplinas específicas para tal. Esta é uma disciplina que busca abordar como se dá a integração entre o mundo do das aplicações escritas em linguagens de programação orientadas a objetos e o mundo dos bancos de dados. Desta forma, este volume apresenta apenas um subconjunto dos conceitos mais relevantes de bancos de dados, e que são necessários para integração entre um programa escrito em Java e uma base de dados. Posso afirmar então que esta é uma disciplina com viés prático. Você verá no primeiro capítulo, conceitos básicos sobre bancos de dados, enfatizando sua evolução histórica e principalmente, como se dá a organização interna de um banco de dados. O segundo capítulo é dedicado à linguagem SQL. Esta é a linguagem padrão para manipulação de dados em um SGBD. No terceiro e último capítulo é apresentado o Java Database Connectivity, ou simplesmente JDBC, a especificação padrão para integração entre programas orientados a objetos escritos em Java e uma gama de bancos de dados disponibilizados pela indústria. 6
  • 7. Programação III Capítulo 1 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar o seguinte tema: » Introdução a bancos de dados. Metas Após o estudo deste capítulo, esperamos que você consiga: » Aprender os conceitos relacionados com bancos de dados e suas diferenças em relação ao mundo orientado a objetos. 7
  • 8. Programação III Capítulo 1 – Uma visão geral sobre bancos de dados Vamos conversar sobre o assunto? Caro cursista, A importância da informática é evidente pela dependência que a sociedade contemporânea tem dos sistemas de informação (SI). Independente de seus diferentes propósitos, estas aplicações tem como característica comum a manipulação de dados de diversas formas, números e texto até conteúdo multimídia, como imagens e vídeos. Gerenciar tais dados de forma eficiente é de fundamental importância para qualquer instituição. Portanto, entender como os dados de uma aplicação devem ser representados e como interagir com tais dados é também importante para qualquer desenvolvedor de aplicações. Por conta disso, neste capítulo, vamos estudar os conceitos básicos necessários para entender a importância e o funcionamento dos bancos de dados. 1. Introdução Um Banco de Dados (também chamado de Base de Dados) é uma coleção de dados relacionados, organizados e armazenados visando facilitar a manipulação dos dados armazenados, permitindo realizar alterações, inserções, remoções e consultas. Neste contexto, um “dado” representa um elemento que mantém a sua forma bruta (texto, imagens, sons, vídeos, etc.) e que sozinho não levará a compreender determinada situação. Já “Informação” é o conjunto de dados coletados de forma a se tornarem aplicáveis a determinada situação, ou seja, sua forma e conteúdo são apropriados para um uso específico. A informação não existe por si só, ela é obtida através de uma interpretação realizada sobre um grupo de dados. Por exemplo, em um sistema acadêmico os dados representam as notas individuais de cada aluno, assim como seus nomes, idades, dentre outros. Destes dados pode-se extrair como informação o fato que os alunos de uma turma específica tiveram notas inferiores à média das demais turmas, e que portanto, precisam de uma atenção maior por parte da coordenação da escola. Em nosso cotidiano, existem várias bases de dados com as quais interagimos diariamente. Verificar o saldo bancário de uma conta, consultar livros no sistema da biblioteca, fazer a matrícula em um curso na universidade; em todos estes casos temos exemplos de aplicações que manipulam dados como contatos, livros ou dados pessoais. Para facilitar a interação das aplicações com estes dados, uma categoria especial de aplicações foi desenvolvida ao longo dos anos, os chamados Sistemas Gerenciadores de Bancos de Dados (SGBDs ou DBMS – Database Management System). Estes pacotes de software foram desenvolvidos com funções específicas para manipular dados, com operações pré-definidas para inserção, remoção, atualização e consulta dos dados armazenados. Neste capítulo vamos estudar os conceitos fundamentais sobre bancos de dados, 8
  • 9. Programação III desde a motivação para sua existência, passando por a arquitetura geral destes sistemas, chegando até a forma mais comum para representação dos dados, o modelo relacional baseado em tabelas. 2. Por que os Bancos de Dados existem? No capítulo 3 do primeiro volume desta disciplina, vimos que é possível armazenar dados em arquivos, permitindo que estas informação sejam salvas entre sessões de uso das aplicações. Historicamente, esta foi a primeira forma pela qual aplicações gerenciaram seus dados, onde cada aplicação definia a forma específica como seus dados eram manipulados. Se mais de um programa desejasse utilizar os dados definidos em uma aplicação, todos os programas precisavam também compartilhar a estrutura de como tais dados eram armazenados. Com a popularização dos sistemas de informação, as empresas começaram a enfrentar problemas relacionados à esta forma de gerenciamento. Se um determinado sistema precisasse realizar alguma mudança na estrutura de dados, todos os demais sistemas que acessassem os dados tinham que ser alterados, mesmo que a alteração ocorresse em dados não manipulados pelos outros programas. Em outra situação, se os sistemas distintos de uma mesma empresa utilizassem os mesmos dados, porém representados de forma distinta por cada sistema, estes dados precisavam ser replicados em cada sistema. Esta replicação trazia uma série de consequências negativas, dentre as quais pode-se destacar: » Alta possibilidade de inconsistência de dados replicados: Caso um dado replicado fosse atualizado em uma aplicação, o mesmo deveria ser atualizado em todos os demais sistemas. Caso contrário, um mesmo dado apresentaria valores distintos para a empresa, ocasionando inconsistência de informações. Por exemplo: Uma empresa que tivesse dois sistemas, um de controle de pessoal e outro financeiro precisaria manter informações replicadas sobre seus funcionários. Se o endereço de um funcionário fosse atualizado em um sistema, precisaria também ser atualizado no outro; » Maior custo de armazenamento: Os mesmos dados seriam armazenados diversas vezes, o que além de ocupar mais recursos, levaria a procedimentos extras para replicar as atualizações sobre os dados. No mesmo exemplo anterior, se houvessem mais sistemas que necessitassem das informações de um funcionário, os dados precisariam ser replicados para cada sistema. Com o passar dos anos e o aumento da importância dos sistemas de informação e também de sua complexidade, buscou-se uma solução para tais problemas. O cenário vivido então à época motivou à criação de um modelo onde dados fossem isolados de aplicações. Os dados, então representados por arquivos, seriam responsáveis unicamente por guardar as informações que fossem manipuladas pelos programas dos sistemas, representando assim a própria base de dados (BD). Todo acesso ao BD passa a ser realizado de forma centralizada e unificada por um sistema intermediário, o Sistema Gerenciador de Banco de Dados - SGBD. O SGBD funciona como um sistema intermediário, que atua como ponte entre cada aplicação e a base de dados representada pelos arquivos onde os dados são persistidos fisicamente, como visto na Figura 1. 9
  • 10. Programação III Figura 1 – A visão de um SGBD como intermediário entre aplicações e dados Dentre as vantagens desta abordagem tem-se: » O acesso e manipulação de dados entre diferentes sistemas passa a ser feito de uma forma padronizada, que pode ser então compartilhadas entre várias aplicações; » Diferentes sistemas podem compartilhar os mesmos dados, delegando ao SGBD a intermediação de acesso entre aplicações e dados; » Os sistemas passariam a enxergar apenas os dados que lhes interessam, criando a idéia de visões. Por exemplo, se um banco de dados guarda todas as informações de um determinado funcionário, como dados pessoais, salário, cargo, dentre outras, um SGBD pode definir que uma determinada aplicação só consiga enxergar uma parte destes dados; » Os sistemas não precisariam conhecer os detalhes de como seus dados estão gravados fisicamente; » Os sistemas não precisariam ser modificados se a estrutura de dados que utilizam não for modificada; » Funcionalidades importantes como auditoria, cópias de segurança (backups) e segurança de acesso podem ser centralizadas e delegadas aos SGBD, abstraindo tais questões para as aplicações que utilizam os dados. Com tais vantagens, o uso de sistemas gerenciadores de bancos de dados foi rapidamente aceito e se tornou um padrão na indústria. Hoje é difícil imaginar um sistema comercial que não faça uso de SGBDs. Com o passar dos anos e a evolução de tais sistemas, o SGBD passou de programas simples para complexos sistemas de programas com função de habilitar desenvolvedores a criar e manter um banco de dados. Dentre suas funções principais estão: » Definição do banco de dados: Envolve especificar estruturas e tipos de dados para serem gravados no banco de dados, com uma descrição detalhada de cada tipo de dado. » Construção do banco de dados: Processo de consistir e gravar inicialmente dados no banco de dados. » Manipulação de um banco de dados: Inclui funções como consulta por dados específicos e atualização para refletir as alterações no mundo real. Hoje existem vários bancos de dados disponíveis no mercado, que possuem um núcleo comum de funcionalidades, mas variam em relação ao suporte a quantidade de usuários simultâneos, funcionalidades extras, eficiência e robustez. Obviamente, de acordo com estes critérios, um SGBD pode custar até centenas de milhares de dólares. Porém, é possível encontrar ótimas opções gratuitas disponíveis na Internet para serem utilizadas como SGBDs. Alguns dos principais SGBDs disponíveis no mercado nos últimos anos são: » Oracle - Sistema comercial, mas possui versões gratuitas para uso acadêmico e/ 10
  • 11. Programação III ou doméstico (em casa). Ele foi o primeiro Banco de Dados Corporativo (cliente/ servidor) possuindo grande variedade de distribuições (para Macintosh, Windows, Linux, FreeBSD, Unix) e para computadores de grande porte. Foi um dos primeiros a fazer parte do mercado Web. A participação do Oracle no mercado de Banco de Dados é bastante acentuada, principalmente em grandes empresas e em conjunto com sistemas de médio e grande porte. É um SGBD robusto e seguro, quando bem administrado. A Oracle também desenvolve uma suíte de desenvolvimento chamada de Oracle Developer Suite, utilizada na construção de programas de computador que interagem com a sua base de dados. Site Oficial em http://www. oracle.com/us/products/database/index.htm » Microsoft SQL Server – é o banco de dados comercial da Microsoft. Ele é um dos principais concorrentes do Oracle. Tem como uma das vantagens o fato de, por ser um produto Microsoft, se integrar nativamente com produtos e linguagens da Microsoft (talvez seja esse o fator que o popularizou!). As versões atuais são independentes e operam exclusivamente sobre Windows. É um software proprietário e pago, como a maioria dos produtos Microsoft. Algumas empresas que usam o MS SQL Server e são consideradas casos de sucesso no Brasil são o Hipercard, o Banco Itaú e a ANEEL (vide: http://www.microsoft.com/brasil/ servidores/sql/default.mspx). Site Oficial em http://www.microsoft.com/ sqlserver/2008/en/us/ » MySQL - é, atualmente, um dos bancos de dados mais populares, com mais de 10 milhões de instalações pelo mundo. Ele possui versões para Windows, Solaris, Unix, FreeBSD, Linux e é gratuito para uso não-comercial. Algumas das empresas mais famosas que fazem uso deste banco estão: NASA, Banco Bradesco, Dataprev, HP, Nokia, Sony e Lufthansa. O MySQL é usado principalmente para desenvolvimento WEB como servidor de dados para comércio eletrônico. Passou a ser considerado um SGBD de verdade (com conceito de transação) a partir da versão 5. Site Oficial em http://www.mysql.com/ » PostgreSQL - é um sistema gerenciador de banco de dados objeto relacional (SGBDOR), desenvolvido como projeto de código aberto. Ele é um dos SGBDs (Sistema Gerenciador de Bancos de Dados) de código aberto mais avançados, é grautito e tem uma boa aceitação no mercado. Originalmente concebido para rodar em Linux, ele possui versões para Windows. É usando, principalmente, para comércio eletrônico juntamente com linguagem PHP. O PostgreSQL é um projeto open source coordenado pelo PostgreSQL Global Development Group. Site Oficial em http://www.postgresql.org/ » Microsoft Access: é um banco de dados da Microsoft para uso em micros desktops e não em servidores. Esta é a principal diferença dele para os demais bancos SGBD como o Oracle, SQL Server e MySQL, por exemplo. Contudo, ele tem sido muito usado em pequenas e médias empresas para armazenamento de dados em pequenas quantidades. Agora, o MS Access não é considerado um SGBD completo, por não possuir todas as características de um. Mas ele permite o desenvolvimento rápido de aplicações que envolvem tanto a modelagem e estrutura de dados como também a interface a ser utilizada pelos usuários. A linguagem de programação disponível no access é a Microsoft Visual Basic for Applications, igualmente a outros produtos da série Microsoft Office. Maiores informações em: http://office. microsoft. com/pt-br/access/default.aspx Dos SGBDs listados acima vale ressaltar que o SQL Server e o Oracle tem versões gratuitas, porém limitadas. O PostgreSQL é open source e e o MS Access é pagos (sendo que o Access já vem em algumas versões do pacote Microsoft Office) e o MySQL é gratuito para 11
  • 12. Programação III desenvolvimento, mas pago para produção. A escolha de qual SGBD usar depende muito do projeto sendo desenvolvido e do quanto a empresa está disposta a investir para armazenamento dos seus dados. Um SGBD gratuito e muito popular nos dias de hoje é o PostGreSQL e vários sistemas de instituições públicas vêm adotando o mesmo. Já no mundo corporativo o Oracle tem sido um dos mais adotados, por ser um dos mais robustos. 3. Arquitetura Geral de um SGBD Apesar de existir vários SGBD’s, uma arquitetura genérica para estes sistemas é apresentada na literatura. Esta arquitetura apresenta os componentes citados na Figura 2. Figura 2 - Arquitetura Geral de um SGBD De acordo com esta arquitetura, os componentes funcionais de um sistema de banco de dados incluem: » Gerenciador de arquivos, que gerencia a alocação do espaço na armazenagem do disco e as estruturas de dados usadas para representar a informação armazenada no disco; » Gerenciador do banco de dados, que fornece a interface entre os dados de baixo nível armazenados no disco e os programas aplicativos e de consulta submetidos ao sistema; » Processador de consultas, que traduz os comandos numa linguagem de consulta para instruções de baixo nível que o gerenciador do banco de dados pode interpretar. Além disso, o processador de consultas tenta transformar uma requisição do usuário em uma forma compatível e mais eficiente com respeito ao banco de dados, encontrando uma boa estratégia para a executar a consulta; » Pré-compilador da DML (Data Manipulation Language), que converte comandos da DML embutidos em um aplicativo para chamadas de procedimento normal na linguagem hospedeira. DML é uma linguagem para manipular dados e será melhor vista no capítulo 2 deste volume. O pré-compilador precisa interagir com o 12
  • 13. Programação III processador de consultas pra gerar o código apropriado; » Compilador da DDL (Data Definition Language), que converte comandos da DDL em um conjunto de tabelas contendo metadados ou “dados sobre dados”. DDL permite que a estrutura de um banco seja criado, e assim como DML, será melhor abordado no capítulo 2; Adicionalmente, diversas estruturas de dados são requeridas como parte da implementação do sistema físico, incluindo: » Arquivos de dados, que armazenam o banco de dados propriamente dito; » Dicionário de dados, que armazena metadados sobre a estrutura do banco de dados. O dicionário de dados é usado com freqüência. Assim, deve-se dar grande ênfase no desenvolvimento de um bom projeto e implementação eficiente do dicionário; » Índices, que fornecem acesso rápido aos itens de dados guardando determinados valores. 3.1 Banco de Dados e uma visão em camadas Uma outra forma de se enxergar a arquitetura de um banco de dados é por meio de uma visão em camadas. Nesta visão, um banco de dados é composto de três camadas, como descrito na figura abaixo. O nível físico ou nível interno é aquele que está mais próximo ao armazenamento físico dos dados. Este nível físico é descrito por meio de um esquema interno que define como registros, campos e índices são representados, principalmente em relação à sequência física dos dados. Já o nível lógico situa-se acima do físico e é responsável por descrever como dados são representados e relacionamentos entre os próprios dados. Esta representação é mais abstrata que os nível físico. Pode-se dizer que esta visão possibilita representar os dados como estes realmente são, sem restrições que um usuário possa ter para visualizá-los, por conta de uma linguagem de programação em particular. O nível do usuário é aquele em que os usuários possuem diferentes visões dos dados, onde muitas vezes não é necessário o acesso a todos os dados da base. Neste nível estão os programadores e usuários finais das aplicações. 13
  • 14. Programação III 4. A modelagem e a representação de dados em um SGBD Pela arquitetura e visão em camadas de um banco de dados, é importante perceber que bancos de dados tem um modelo específico de como os dados são representados e armazenados. Os modelos de dados utilizados em bancos de dados correspondem a como dados, relacionamentos, suas restrições e seus significados são descritos. Existem diferentes classificações para os modelos de dados, de acordo com diferentes critérios de separação. A seguir, apresentam-se cinco modelos de representação dos dados. O modelo hierárquico foi a primeira proposta para a representação de dados, onde os dados são representados por uma estrutura de árvore semelhante àquelas estudadas na disciplina de estrutura de dados. Dados são acessados segundo um sequência hierárquica com uma navegação do topo (raiz) para as folhas (nós sem folhas) e da esquerda para a direita dentro de um mesmo nó ou registro. Figura 3 - Modelo Hierárquico de Dados Apesar de representar uma primeira tentativa na padronização da representação de dados, o modelo hierárquica sofreu críticas por necessitar replicar dados em virtude do modelo de árvore utilizado, o que também levava a desperdício de espaço de armazenamento e à possibilidade de inconsistência de dados. O modelo em rede, assim como o modelo hierárquico, utiliza apontadores entre os dados. Porém, as associações entre os dados não necessariamente segue um modelo de árvore top-down como anteriormente. Figura 4 - Modelo de dados em rede Na abordagem em rede não aparecem as anomalias de manutenção da base de dados que aparecem em modelos hierárquicos. Porém, a necessidade que o programador conheça as várias ligações existentes na base cria uma forte dependência da implementação. As consultas são complicadas pois o programador é forcado a pensar em termos de ligações 14
  • 15. Programação III e, em como percorrê-las para obter as informações de que necessita. A independência de dados fica prejudicada, pois a criação ou eliminação de ligações implica em alteração dos programas. O modelo relacional utiliza a teoria dos conjuntos e álgebra relacional para definir dados em função de tabelas, e relacionamentos entre os campos que formam os dados de cada tabela. Falaremos mais sobre o modelo relacional ao final deste capítulo. Figura 5 - Modelo Relacional de Dados O modelo objeto é aquele que procura utilizar os conceitos já conhecidos do paradigma orientado a objetos para representar as informações da base. Os dados são representados através de classes que apresentam dados membros. Campos são instâncias destas classes. Figura 6 - Modelos de dados como objetos Os bancos de dados orientados a objetos tem como objetivo integrar a orientação a objeto com as aptidões dos bancos de dados, disponibilizando mais abstração da estrutura de dados do que os bancos de dados convencionais. Existem atualmente ainda poucos produtos no mercado. De todos estes modelos, o relacional são os de maior sucesso comercial até hoje, e portanto, serão melhor estudados na próxima seção e servirão de base para os exemplos de nosso volume. 4.1 O Modelo Relacional Este modelo foi o primeiro modelo de dados efetivamente utilizado em aplicações comerciais. Este foi apresentado em 1970 por Codd em seus estudos na IBM sobre a 15
  • 16. Programação III modelagem de dados. É o modelo que possui a base mais formal entre os modelos de dados, entretanto é o mais simples e com estrutura de dados mais uniforme. A estrutura fundamental do modelo relacional é a relação, mas conhecido como tabela. Na verdade, o modelo é composto por uma coleção de tabelas de nomes únicos. Cada relação ou tabela é constituída por uma ou mais colunas chamadas de atributos (campos) que são os tipos dos dados contidos na relação. O conjunto de valores passíveis de serem assumidos por um atributo será intitulado de domínio. Cada linha da relação é chamada de tupla (registro). O esquema de uma relação nada mais é do que os campos (colunas) existentes em uma relação ou tabela. Já a instância da relação consiste no conjunto de valores que cada atributo assume em um determinado instante. Na intersecção de uma linha com uma coluna encontra-se o dado. Para exemplificar tais conceitos, a figura abaixo apresenta uma tabela para representar a entidade funcionário, com os campos CPF, Nome, Idade e Salário. Nesta tabela, três registros são apresentados para representar os dados de três funcionários. Figura 7 – Exemplo de uma tabela em um SGBD relacional As relações não podem ser duplicadas (por exemplo, não podem existir dois estados de Pernambuco, no conjunto de estados brasileiros) 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. Diferentemente dos modelos que o precederam o modelo relacional não tem caminhos pré-definidos para se fazer acesso aos dados. Os relacionamentos entre as tabelas são feitos através do uso de valores de atributos. Para exemplificar este relacionamento, as relações funcionário e departamento representam as informações sobre funcionários e departamentos que são relacionados pelo campo depto. Este relacionamento permite identificar quais são os departamentos que cada funcionário trabalha. Figura 8 - Exemplo de relacionamento entre duas tabelas 16
  • 17. Programação III Para trabalhar com tabelas, algumas restrições precisaram ser impostas para evitar aspectos indesejáveis, como: Repetição de informação, incapacidade de representar parte da informação e perda de informação. Essas restrições são: integridade referencial e chaves. Em relação as chaves, existem três principais tipos usadas em SGBDs relacionais: as chaves primárias, as chaves candidatas e as chaves estrangeiras. A chave estrangeira é aquela que consegue identificar de forma unívoca um registro. Por exemplo, os campos CPF e registro nas tabelas apresentadas anteriormente são exemplos campos que não se repetem ( ou que não devem se repetir), e portanto, seriam chaves primárias de suas respectivas tabelas. Em geral, toda tabela deve possuir uma chave primária. Chaves primárias não podem ter valores nulos e tendem a ser mínimas. Chaves candidatas possuem a mesma característica que uma chave primária, mas que por questões funcionais não foram escolhidas como chave primária. Chaves estrangeiras são valores que correspondem a chaves primárias de outras tabelas ou até mesma da própria tabela, e que estabelecem relacionamentos entre entidades. Já a integridade referencial remete à garantia que haja integridade de dados, através dos relacionamentos entre entidades. Por exemplo, na relação entre funcionários e departamentos há uma garantia que para um funcionário ser incluído na base, ele deve referenciar departamento válido. Ao mesmo tempo, um registro de um departamento não pode ser excluído se algum registro de funcionário fizer menção a tal departamento. 4.2 Um modelo relacional para o sistema bancário Para ilustrar um modelo relacional, vamos criar um modelo de tabelas para armazenar as informações do sistema bancário, utilizado como estudo de caso em nossa disciplina. Lembrando um pouco deste sistema, em nosso banco, correntistas possuem uma conta, que pode ser tanto uma conta convencional, uma conta especial ou uma poupança. O diagrama de classes abaixo mostra as principais entidades de nosso sistema. Figura 9 - Diagrama de Classes do sistema bancário Uma coisa importante é entender que o mundo OO é diferente do mundo de bancos de dados relacionais. Enquanto o primeiro trabalha com objetos, polimorfismo, herança, o segundo é constituído de tabelas, chaves e restrições. Porém, alguns elementos conseguem ser relacionados, como atributos de objetos mapeados em campos de uma tabela. Boa parte das classes de um diagrama de classes é diretamente mapeada em uma tabela em um modelo relacional. Porém, outros conceitos precisam adaptações. Veja por exemplo, a relação de herança entre as classes Conta, ContaEspecial e Poupanca. Os dados de um objeto Conta podem ser mapeados para uma tabela também chamada CONTA, onde os atributos da classe sejam mapeados em campos na tabela. Em geral, os bancos possuem 17
  • 18. Programação III tipos semelhantes à maioria das linguagens de programação. Além disso, o campo numero pode ser marcado como uma chave primária, pois toda conta deve ter um número único que a identifica na base. Esta mesma abordagem poderia ser utilizada para mapear as classes ContaEspecial e Poupanca. Porém, isto acarretaria problemas para certas operações, como por exemplo, fazer uma consulta do saldo de uma conta, sem conhecimento de seu tipo. Seria necessário fazer consultas nas três tabelas, além de se replicar informações, o que dificultaria, por exemplo, a introdução ou remoção de campos. Para isto, pode-se utilizar a integridade referencial para melhorar a modelagem relacional de tabelas. A Figura 10 mostra uma outra abordagem. Figura 10 – Mapeando herança com integridade referencial e chaves estrangeiras 18
  • 19. Programação III Nesta nova abordagem, os elementos comuns a todo tipo de campo são representadas na tabela CONTA. É introduzido um campo para identificar que tipo de conta se trata um registro na tabela. As tabelas CONTA_ESPECIAL e POUPANCA fazem referencia à tabela CONTA por meio de uma chave estrangeira que aponta para os dados comuns, enquanto armazenam informações específicas sobre seus tipos. Com isto, acaba-se a replicação de informações e centraliza-se as modificações no modelo de dados. Com a idéia das chaves estrangeiras também é possível mapear os relacionamentos existentes entre as classes do modelo OO. Por exemplo, uma conta possui um relacionamento um objeto Pessoa que representa o correntista da conta. O correntista por sua vez, possui dois relacionamentos com objetos do tipo Endereco, para representar os endereços comercial e residencial do correntista. A figura abaixo mostra o modelo para o mapeamento das classes Pessoa e Conta. Neste caso, as tabelas PESSOA e ENDERECO devem representar os objetos Pessoa e Endereco. Para criar os mapeamentos é necessário as chaves em cada tabela. Para a tabela PESSOA, a chave primária é facilmente identificada. Cada pessoa é identificada por seu cpf, que é único para cada correntista. Porém, no caso do endereço, não há uma chave explícita. Neste caso, a solução é criar um campo que assuma a função de chave e sirva para identificar cada registro da tabela. Nestas situações, por via de regra, este campo é preenchido automaticamente a cada inserção de um novo registro na tabela. Em certos casos, o simples relacionamento por meio de chaves estrangeiras não é viável para representar o mapeamento de classes. Veja por exemplo a situação descrita no diagrama UML a seguir. 19
  • 20. Programação III Figura 11 – Diagrama de classes representando o relacionamento entre professores e disciplinas O diagrama busca representar a situação onde um professor pode lecionar várias disciplinas, e uma disciplina pode ser lecionada por diferentes professores. Nesta relação de M:N (muitos para muitos) a solução passa pela criação de uma tabela intermediária. Esta tabela cria mapeamentos de chave estrangeira para as tabelas que representam as duas classes. Desta forma, é possível representar este tipo de relacionamento de dados, como representado pela figura abaixo. Figura 12 - Mapeamento M:N no modelo relacional Neste exemplo, a tabela PROFESSOR_DISCIPLINA possui a chave primária composta pela união dos campos MATRICULA e CODIGO. O primeiro é chave estrangeira para a tabela PROFESSOR, enquanto o segundo é chave estrangeira para a tabela DISCIPLINA. Pelos dados do exemplo, o professor Fernando Trin ta (matrícula 1) leciona as disciplinas matemática (código 55) e física (código 100). Exercícios 1. Descreva as motivações para o surgimento de sistemas gerenciadores de bases de dados. Cite exemplos de seu dia a dia que utilizam bases de dados com muitos dados (milhares de registros). 2. Busque na Internet, bancos de dados que sigam os seguintes modelos de dados: (a) hierárquico, (b) em rede, (c) relacional e (d) orientado a objetos. 3. Utilizando o modelo de dados relacional, crie modelos para bancos de dados que precisem guardar informações sobre: a) Uma biblioteca que permita empréstimos de livros a seus usuários; 20
  • 21. Programação III b) Um sistema acadêmico que represente alunos, professores e disciplinas; c) Uma loja de produtos eletrônicos. Vamos Revisar? Resumo Neste capítulo, você aprendeu conceitos básicos sobre bancos de dados, desde a motivação para seu surgimento, passando por sua arquitetura e os principais modelos de representação e organização de dados existentes na literatura. A maior importância deste capítulo é apresentar o modelo relacional, pois este é o modelo dominante das aplicações modernas. Entender como objetos são mapeados para tabelas é fundamental para entender como sistemas escritos em linguagens orientadas a objetos podem persistir suas informações em bases de dados relacionais. 21
  • 22. Programação III Capítulo 2 O que vamos estudar neste capítulo? Neste capítulo, vamos estudar o seguinte tema: » A Linguagem SQL de manipulação de dados. Metas Após o estudo deste capítulo, esperamos que você consiga: » Entender os principais comandos da linguagem SQL; » Aprender a utilizar um banco de dados simples chamado HyperSQL; » Realizar operações no HyperSQL com alguns dos principais comandos SQL. 22
  • 23. Programação III Capítulo 2 – A linguagem estruturada de consulta: SQL Vamos conversar sobre o assunto? Caro cursista, depois de estudar e ter uma visão geral sobre como os bancos de dados são organizados, é preciso então entender como os dados são manipulados por usuários e aplicações. Para isto, este capítulo é dedicado totalmente ao estudo da linguagem SQL, o padrão da indústria para a realização de operações em bases de dados relacionais. 1. Introdução Em qualquer base de dados, uma questão importante é como são realizadas as operações sobre os dados armazenados. Em geral, todo SGBD fornece uma linguagem de consulta por meio da qual usuários obtêm informações do banco de dados. Em geral, estas linguagens são de nível mais alto que as linguagens de programação tradicionais, e são categorizadas como procedurais ou não-procedurais (também referenciadas como declarativas). Em uma linguagem procedural, o usuário deve “ensinar” ao sistema a realização de uma seqüência de operações no banco de dados para obter o resultado desejado. Em uma linguagem não-procedural, o usuário descreve a informação desejada sem fornecer um procedimento específico para a obtenção dessas informações. Neste contexto, uma linguagem que precisa ser estudada para manipulação de SGBDs relacionais é a linguagem SQL. SQL (Linguagem de Consulta Estruturada, do inglês Structure Query Language) é uma linguagem declarativa utilizada para manipulação de bases de dados relacionais, desenvolvida no início da década de 70 nos laboratórios da IBM, originalmente com o nome de SEQUEL (acrônimo para “Structured English Query Language” - Linguagem de Consulta Estruturada em Inglês). O propósito da concepção de SEQUEL era demonstrar a viabilidade do modelo relacional proposto por Codd. SQL O projeto de SEQUEL foi divulgado nos meios acadêmico por meio de conferências e revistas especializadas, o que permitiu que seus conceitos pudessem ser implementados por terceiros. No final da década de 70, duas outras companhias além da IBM iniciaram desenvolvimento de produtos similares, que vieram a ser Oracle e Ingres. A Oracle Corporation introduziu a primeira implementação de SQL comercialmente disponível, e é hoje líder no mercado de servidores de bancos de dados. A IBM também implementou SQL em seus sistemas de banco de dados DB2 e SQL/DS. Entre os anos 80 e 90, os produtos com SQL se multiplicaram e hoje SQL é largamente implementada e aceita como o padrão de facto da indústria para linguagem de acesso a bancos de dados, desde sistemas desktop como o Microsoft Access para Windows até sistemas de gerenciamento e servidores de bancos de dados de médio e grande porte em Unix, NT e mainframes. Hoje, SQL é padronizada por instituições normativas como a ANSI (Instituto 23
  • 24. Programação III Americo de Normas, do inglês American National Standards Institute) e ISO (Organização de Padrões Internacionais, do inglês International Standard Organization). Porém, certos fabricantes introduzem extensões e variações específicas a seus produtos, o que acaba por comprometer a portabilidade de programas que utilizem tais extensões para manipular SGBDs. No capítulo que segue, você aprenderá comandos básicos da linguagem SQL que serão necessários para a manipulação de dados em seus programas escritos em Java. Para que você veja na prática o uso destes comandos, você também aprenderá a manipular um SGBD simples chamado HyperSQL, que também será utilizado nos exemplos do próximo capítulo, quando finalmente virmos a integração de Java com este SGBD. 2. Classificação de comandos SQL SQL oferece uma série de comandos para realizar suas operações e tem como principais características a simplicidade e facilidade de uso. As operações em SQL podem tanto definir o modelo de dados da base, quanto inserir, alterar ou apagar registros. De forma a melhor organizar o conjunto completo de comandos, SQL classifica tais comandos em cinco grupos: » DDL (Linguagem de Definição de Dados, do inglês Data Definition Language): subconjunto que permite ao desenvolvedor definir tabelas novas e elementos associados. Fazem parte deste grupo os comandos CREATE, ALTER TABLE e DROP. » DML(Linguagem de manipulação de dados, do inglês Data Manipulation Language): subconjunto da linguagem da SQL que são utilizados para realizar inclusões, consultas, exclusões e alterações de dados presentes em registros. Incluem o comandos INSERT, UPDATE e DELETE. » DQL(Linguagem de consulta de dados, do inglês Data Query Language): formada por apenas um comando, é a parte mais utilizada de SQL. Por meio do comando SELECT, é possível realizar consultas dos mais diversos tipos, de acordo com cláusulas e opções que podem ser utilizadas no comando. » TCL(Linguagem de controle de transações, do inglês Transaction Control Language): Conjunto de operações utilizados para tratamento de transações. Uma transação é um conjunto de operações individuais que devem ser agrupadas e tratadas como uma só. Fazem parte desta classe os comandos START TRANSACTION, COMMIT e ROLLBACK. » DCL(Linguagem de controle de dados, do inglês Data Control Language): Este conjunto de comandos controla os aspectos de autorização de dados e permissões de usuários para controlar quem tem acesso para ver ou manipular dados dentro do banco de dados. Dois dos principais comandos são o GRANT e o REVOKE, que respectivamente concedem e retiram permissões de usuários. Em nossa disciplina, nós veremos principalmente os comandos DDL, DML e DQL. Para isto, os comandos serão apresentados no contexto da criação de um banco de dados para o sistema de controle bancário que nos acompanha desde a disciplina de linguagem de programação II. Para que podemos ver na prática o uso de SQL, utilizaremos um banco bem simples disponível na Internet chamado HyperSQL (http://hsqldb.org/). O HyperSQL é um SGBD relacional escrito em Java que implementa as funcionalidades básicas necessárias para nossos exemplos. Mas que isso, é um banco extremante portável, já que o seu executável ocupa menos que 2Mb. 24
  • 25. Programação III 3. Instalação e utilização do HyperSQL Para instalar e executar o HyperSQL é preciso ter a plataforma Java instalada e baixar o aplicativo do site http://hsqldb.org/. Na sua distribuição, o HyperSQL é um arquivo compactado, que quando descompactado cria uma árvore de diretórios contendo scripts de execução, documentação, exemplos, código-fonte do banco, dentre outros, como apresentado na Figura abaixo. Figura 13 - Estrutura do HyperSQL, depois de descompactado Porém, apesar de todas essas informações, o único arquivo necessário para executar o banco é o arquivo hsqldb.jar, localizado na pasta lib. Este arquivo representa o banco, assim como a interface de administração e o driver JDBC que será necessário para integrar os programas Java com o HyperSQL, a ser visto no próximo capítulo. O HyperSQL é um programa Java. Logo, para executá-lo basta usar o interpretador java para executar a aplicação, cuja classe principal é a org.hsqlbd.server.Server. Logo, a forma mais simples para isso é abrir uma janela para disparar o comando: java -cp .;<<caminho completo para o arquivo hsqldb.jar>> org.hsqlbd.server.Server Ao fazer isto, o processo é iniciado e são criados arquivos que representam os dados no diretório onde o interpretador Java foi chamado. Na própria estrutura definida na descompactação, já é sugerida a pasta Data para este fim. Logo, é sugerido que você execute o processo dentro desta pasta, como apresentado na Figura abaixo. Figura 14 - Rastro de execução do HyperSQL 25
  • 26. Programação III Ao fazer isso, o processo fica em execução. Para finalizar a execução do processo, basta pressionar [CRTL] + [C]. Ao executar o banco na forma mais simples, o HyperSQL cria uma série de arquivos, padronizados pelo prefixo test, como visto na Figura. Figura 15 - Arquivos gerados na execução do HyperSQL Estes arquivos representam os dados da base. É possível armazenar mais de uma base, assim como criar arquivos com nomes específicos para cada banco. Tais informações podem ser obtidas na documentação do HyperSQL. Nos exemplos utilizados neste livro, utilizaremos o padrão fornecido para facilitar a didática. Uma vez o banco estando em execução, é necessário interagir com a base. Para isto, o HyperSQL fornece uma aplicação simples, baseada em uma janela Swing, que permite visualizar o conteúdo do banco, bem como executar comandos a partir de uma janela de interação. Esta aplicação também é fornecida com o arquivo hsqldb.jar, por meio da classe org.hsqldb.util.DatabaseManagerSwing. Logo para executá-la, basta disparar o comando: java -cp .;<<caminho completo para o arquivo hsqldb.jar>> org.hsqldb.util.DatabaseManagerSwing Este comando pode ser disparado de qualquer diretório e a figura abaixo apresenta a tela principal da aplicação. Figura 16 - Tela de Abertura da aplicação DatabaseManagerSwing 26
  • 27. Programação III Na execução do aplicativo, é apresentada uma janela com uma série de opções para conexão com o banco. Para a correta conexão, devem ser mantidas as opções apresentadas na Figura, e então pressionado o botão OK. Feito isso, você estará conectado ao Banco e pronto para executar operações. Nas próximas seções, utilizaremos esta interface para ver na práticas exemplos de vários comandos SQL. 4. Comandos DDL Os primeiros comandos que precisam ser realizados para se manipular um banco de dados são aqueles que permitem a criação das tabelas, índices, chaves, e demais elementos que compõem a base de dados. São três os principais comandos DDL existentes em SQL: » CREATE: comando que permite que sejam criados as tabelas, seus campos, chaves, além dos relacionamentos entre tais elementos; » ALTER TABLE: comando que permite que sejam feitas alterações em elementos já existentes da base de dados; » DROP: comando que apaga um elemento da base de dados. Vamos começar a ver tais comandos e a criar nossa base de testes. Primeiramente, vamos criar a base. 4.1 Criando tabelas Vamos começar pelo comando CREATE, que tem sua sintaxe simplificada da seguinte forma: CREATE <<NOME_TABELA> (<<CAMPO1>> <<TIPO_CAMPO1>> <<OPÇÕES_CAMPO1>>, <<CAMPO1>> <<TIPO_CAMPO1>> <<OPÇÕES_CAMPO1>>, ... <<CAMPON>> <<TIPO_CAMPON>> <<OPÇÕES_CAMPON>> FOREIGN KEY(<<CAMPO>>) REFERENCES <<TABELA>> (<<CAMPO_CHAVE>>) Nesta definição, dá-se um nome para uma tabela e em seguida faz-se a definição de cada um de seus campos. Cada campo tem obrigatoriamente um nome e um tipo, além de cláusulas a mais que definem se um campo é chave primária, se ele pode ou não ter valores nulos. Em relação aos tipos, os bancos definem tipos primários para valores de seus campos, da mesma forma que linguagens de programação definem seus tipos básicos. Embora SQL defina valores padrões para os principais de dados como inteiros, alfanuméricos, booleanos, dentre outros, é importante verificar a documentação da base de dados a ser utilizada, para verificar os tipos definidos por tal SGBD. No caso do HyperSQL, os principais tipos que serão usados neste volume são apresentados na tabela a seguir: 27
  • 28. Programação III Tipo Descrição INTERGE Valores numéricos inteiros DOUBLE Valores numéricos de ponto flutuante VARCHAR (TAMANHO) Valores alfanuméricos com tamanho definido BOOLEAN Valores lógicos IDENTITY Valores inteiros pré-definidos em uma sequência Tabela 1 - Tipos de Dados do HyperSQL É possível observar que com exceção do tipo IDENTITY, os demais são equivalentes a tipos já vistos na linguagem Java, como int, double, String e boolean. O tipo IDENTITY é uma opção muito útil para definirmos uma chave primária de uma tabela cujo valor seja gerado automaticamente pelo próprio banco. Veremos mais sobre o tipo IDENTITY logo a seguir. Existem ainda opções que podem ser associadas a cada campo. Uma das principais opções é identificar se um determinado campo é a chave primária da tabela. Para isto, utiliza-se a expressão PRIMARY KEY associado ao campo que será a chave primária da tabela. Se for uma chave composta, cada campo da chave composta deve ser marcada com este atributo. Também é possível determinar se um campo pode ou não ter valores nulos em algum registro da tabela. Caso isso não seja permitido, pode-se adicionar à definição do campo a expressão NOT NULL. Para exemplificar, vamos utilizar o comando CREATE para criar a tabela Endereco do sistema de controle bancário. Para isto, utilizamos então o seguinte comando: CREATE TABLE ENDERECO (ID_ENDERECO IDENTITY PRIMARY KEY, RUA VARCHAR(255) NOT NULL, NUMERO VARCHAR(255) NOT NULL, BAIRRO VARCHAR(255) NOT NULL, CIDADE VARCHAR(255) NOT NULL, ESTADO VARCHAR(20) NOT NULL, CEP VARCHAR(8) NOT NULL) Neste comando, está sendo criada uma tabela chamada ENDERECO com 7 campos. Todos os campos, com exceção de ID_ENDERECO são alfanuméricos. O campo ESTADO pode ter valores com no máximo 20 caracteres, enquanto o campo CEP pode ter valores com no máximo 8 caracteres. Os demais podem ter o valor máximo de 255 caracteres. O campo ID_ENDERECO é definido como um IDENTITY. Além disso, este campo também é definido como chave primária da tabela, que será utilizado para o relacionamento com os correntistas. Lembrando: cada correntista possui dois endereços: um comercial e outro residencial. O número associado a cada registro de endereço será utilizado para efetuar esta relação. Para que o desenvolvedor não se preocupe com a geração dos valores deste campo, o tipo IDENTITY é utilizado. A figura abaixo mostra a execução do comando na aplicação de gerenciamento do HyperSQL. 28
  • 29. Programação III Figura 17 – Execução do Comando CREATE no HyperSQL Para executar o comando basta digitá-lo, e depois pressionar o botão ‘Execute SQL’. Note que no painel esquerdo, após a realização do comando, a tabela ENDERECO é listada. Continuando a criação do nosso banco, é necessário criar a tabela PESSOA, que guardará os dados dos correntistas do banco. Esta tabela deve possuir os campos CPF, NOME, SEXO, além de chaves estrangeiras para a tabela endereço. Estas chaves representarão os endereços comercial e residencial de cada correntista. Para criar a tabela pessoa utiliza-se então o comando CREATE da seguinte forma: CREATE TABLE PESSOA (CPF VARCHAR(11) PRIMARY KEY NOT NULL, NOME VARCHAR(255) NOT NULL, SEXO VARCHAR(1) NOT NULL, END_RESIDENCIAL INTEGER NOT NULL, END_COMERCIAL INTEGER NOT NULL, FOREIGN KEY(END_RESIDENCIAL) REFERENCES ENDERECO(ID_ENDERECO), FOREIGN KEY(END_COMERCIAL) REFERENCES ENDERECO(ID_ENDERECO)) Veja que cada campo utiliza a sintaxe já explicada anteriormente. O campo CPF é um candidato natural a chave primária da tabela, uma vez que o CPF de uma pessoa nunca deve ser igual ao de outra. A novidade é a definição de duas chaves estrangeiras pelos campos END_RESIDENCIAL e END_COMERCIAL. Veja que inicialmente eles são definidos como dois campos inteiros convencionais. Porém, nas duas últimas linhas, a cláusula FOREIGN KEY faz uma associação entre estes campos, e o campo ID_ENDERECO da tabela ENDERECO. Desta forma, esta associação indica que para serem válidos, os dois campos devem conter valores válidos para o campo ID_ENDERECO da tabela ENDERECO. Esta regra será reforçada quando começarmos a colocar dados nas tabelas. Porém, este mesmo tipo de raciocínio vale para a criação da tabela CONTA. Toda conta possui seu número e saldo. Mas além disso, precisa estar relacionada a uma pessoa que represente o correntista da conta. Logo, é necessário também a definição 29
  • 30. Programação III de uma chave estrangeira para estabelecer este relacionamento. O comando apresentado a seguir cria a tabela PESSOA: CREATE TABLE CONTA (NUMERO INTEGER PRIMARY KEY NOT NULL, TIPO INTEGER NOT NULL, SALDO DOUBLE NOT NULL, CPF VARCHAR(11) NOT NULL, FOREIGN KEY(CPF) REFERENCES PESSOA(CPF)) Observe que o número da conta é utilizado como chave primária da tabela, pois não devem haver contas com o mesmo número. O campo CPF é definido e, por fim, definido como chave estrangeira relacionada com a tabela PESSOA. Note que existe um campo a mais na definição da tabela CONTA: o campo tipo. Lembre-se que uma conta pode ser uma conta normal, uma conta especial ou mesmo uma poupança. Logo é preciso determinar este tipo na tabela. Além disso, nos casos da conta especial e da poupança, é necessário ainda armazenar informações extras. Por isso, são definidas novas tabelas: CONTA_ESPECIAL e POUPANCA. Cada uma delas possui uma relação com a tabela CONTA por meio de uma chave estrangeira, e suas definições são apresentadas a seguir: CREATE TABLE CONTA_ESPECIAL (NUMERO INTEGER PRIMARY KEY NOT NULL, LIMITE FLOAT NOT NULL, FOREIGN KEY(NUMERO) REFERENCES CONTA(NUMERO)) CREATE TABLE POUPANCA (NUMERO INTEGER PRIMARY KEY NOT NULL, DIA_ANIVERSARIO INTEGER NOT NULL, TAXA_JUROS DOUBLE NOT NULL, FOREIGN KEY(NUMERO) REFERENCES CONTA(NUMERO)) A Figura abaixo mostra o banco de dados, após todas a tabelas terem sido criadas. Figura 18 - Visão do SGBD após criação das tabelas 30
  • 31. Programação III Percebe-se que existe uma ordem natural na criação das tabelas no banco. Primeiro, deve-se criar sem nenhum tipo de dependência com outras tabelas, para então se partir para aquelas com maior número de referências a outras tabelas do banco. 4.2 Alterando tabelas Uma vez criada uma tabela, é possível fazer modificações na estrutura da mesma. Tais ações são fundamentais para alterações em bancos de dados que sofram modificações para atender novos requisitos, como surgimento de novos campos ou novos relacionamentos com outras tabelas. Para isto, utiliza-se o comando ALTER TABLE, cuja sintaxes básicas são apresentadas a seguir: ALTER TABLE <<TABELA>> {ADD COLUMN <<CAMPO>> <<TIPO>> <<OPÇÕES>>} {ADD FOREIGN KEY<<CAMPO>> REFERENCES <<TABELA(CAMPO)>>} {DROP COLUMN <<CAMPO>>} {ALTER COLUMN <<CAMPO>> RENAME TO <<NOVO_NOME_CAMPO>>} ou ALTER TABLE <<TABELA>> RENAME TO <<NOVO_NOME_TABELA>> Seguem alguns exemplos do uso do comando ALTER TABLE: » Para adicionar um campo ESCOLARIDADE na tabela pessoa, utiliza-se o comando: ALTER TABLE PESSOA ADD COLUMN ESCOLARIDADE VARCHAR NOT NULL » Para remover o campo criado: ALTER TABLE PESSOA DROP COLUMN ESCOLARIDADE » Para mudar o nome do campo END_COMERCIAL para ENDERECO_COMERCIAL na tabela PESSOA: ALTER TABLE PESSOA ALTER COLUMN END_COMERCIAL RENAME TO ENDERECO_COMERCIAL O comando ALTER TABLE permite fazer outras mudanças nas tabelas, como mudar o tipo de um campo ou seu tamanho, que porém nesta disciplina não serão abordados. Uma coisa importante é que fazer alterações em tabelas que não possuam dados é muito menos restritivo que naquelas que já possuem informações. Por exemplo, se quiséssemos criar uma campo com a restrição NOT NULL em uma tabela que já possua 10 registros, isso não seria possível, pois ao criar o campo, todo registro possuiria um campo sem nenhum valor. Neste caso, a solução seria primeiro criar o campo, depois atribuir valores para cada registro existente, para só então aplicar a restrição sobre valores nulos. 4.3 Apagando tabelas Por fim, o último comando DDL é o DROP. Este comando permite apagar uma tabela da base de dados, e sua sintaxe é bem sucinta: DROP TABLE <<TABELA>> É importante observar que apesar de sua simplicidade, existem ressalvas ao se apagar uma tabela. Por exemplo, se você tentar apagar a tabela CONTA do banco de dados 31
  • 32. Programação III obterá uma mensagem de erro, como demonstrado abaixo. Figura 19 - Erro ao se apagar uma tabela que possui referências a outras tabelas A razão para este erro são os relacionamentos que uma tabela pode ter com outras tabelas, que impossibilitam que a mesma seja removida do banco. No nosso caso, as tabelas CONTA_ESPECIAL e POUPANCA referenciam a tabela CONTA, ou seja, são dependentes de informações contidas nesta última tabela. Portanto, a tabela CONTA não pode ser removida sem que antes, tais relacionamentos sejam desfeitos. No caso, ou as relações são desfeitas, ou as tabelas CONTA_ESPECIAL e POUPANCA são removidas primeiramente. 5. Comandos DML e DQL Uma vez a base criada, o banco se vê pronto para receber dados em cada tabela. Em SQL as instruções DML (Data Manipulation Language) são usadas para manipulação de dados e consiste nas operações de inserir dados (insert into), alterar dados (update) e excluir dados (delete), e são consideradas operações essenciais e de grande aplicação nas operações com banco de dados. Já o único comando DQL é o SELECT, que é utilizado para retornar os resultados de consultas. Estes comandos serão apresentados em conjunto para que a medida que dados sejam alterados, tais modificações possam ser visualizadas. Vamos ver cada um deles a seguir. 5.1 Inserindo dados em tabelas Vamos começar com o comando INSERT INTO, cuja sintaxe é apresentada abaixo: INSERT INTO <<TABELA>> [( <<COLUNA1>>, <<COLUNA2>>,...,<<COLUNA_N>>] ) ] { VALUES(<<VALOR1>>, << VALOR 2>>,...,<< VALOR _N>>)} O comando insert into permite que sejam criados registros em uma tabela. De acordo com esta sintaxe, um exemplo para inserção de dados na tabela ENDERECO seria como descrito a seguir. INSERT INTO ENDERECO(RUA, NUMERO, BAIRRO, CIDADE, ESTADO, CEP) VALUES(‘Avenida Recife’,’213’,’Boa Viagem’, ‘Recife’, ‘Pernambuco’, ‘51020021’); 32
  • 33. Programação III Note que há uma correspondência entre cada campo e seu respectivo valor, e que os valores alfanuméricos são delimitados por aspas simples. No caso específico da tabela ENDERECO, você deve se lembrar que existe o campo ID_ENDERECO, definido como do tipo identidade e que também é a chave primária da tabela. Relembrando, o valor deste campo é determinado pelo próprio banco de dados como uma sequência de valores inteiros que começa com 0 (zero) e que a cada novo registro é adicionado uma unidade. Ao executar este comando no HyperSQL, obtém-se como resultado o número de registros afetados pelo comando. Neste caso, o valor obtido é 1(um), como ilustrado a seguir. Figura 20 - Comando Insert no HyperSQL Um detalhe importante na inserção de dados é a atenção em relação as dependências entre as tabelas. Por exemplo, para inserir dados na tabela PESSOA, são necessárias informações dos endereços comercial e residencial de cada correntista. Logo, é necessário que estas informações estejam previamente cadastradas. Tome como exemplo, o cadastro de uma pessoa com os seguintes dados: Dados Valor Nome Fernando Trinta CPF 111111111-11 Sexo Masculino Endereço Residencial Avenida Recife, 213, Boa Viagem, Recife – Pernambuco, CEP: 51020021 Endereço Comercial Avenida Caxangá, 23, Cordeiro, Recife – Pernambuco, CEP: 51040031 O endereço residencial já foi cadastrado anteriormente. Mas para cadastrar a pessoa, é necessário cadastrar seu endereço comercial. Logo, primeiro tem-se que executar o seguinte comando: INSERT INTO ENDERECO(RUA, NUMERO, BAIRRO, CIDADE, ESTADO, CEP) VALUES(‘Avenida Caxangá’,’23’,’Cordeiro’, ‘Recife’,’Pernambuco’, ‘51040031’); Assume-se que ao criar este segundo endereço, o valor de seu campo ID_ ENDERECO será igual a 1 (um), pois o primeiro registro iniciou com 0 (zero). Agora com os dois endereços cadastrados, é possível cadastrar o registro da pessoa na tabela PESSOA. 33
  • 34. Programação III INSERT INTO PESSOA(CPF, NOME, SEXO, END_RESIDENCIAL, END_COMERCIAL) VALUES(‘11111111111’,’Fernando Trinta’, ‘M’, 0, 1) Se por acaso, ao tentar incluir uma pessoa, se utiliza-se um valor para os endereços que não fosse válido, ou seja, inexistente, a operação seria invalidada. Veja por exemplo, o que acontece ao tentar inserir o registro passando o valor 3 para END_COMERCIAL. Figura 21 - Erro ao inserir um registro sem as devidas dependências satisfeitas Isso atesta o fato que é necessário ter atenção em se manter as relações de integridade referencial entre as tabelas. Por exemplo, para inserir um registro na tabela CONTA, é necessária a informação sobre o correntista. No caso, é necessário o CPF de uma pessoa cadastrada na tabela PESSOA. O comando abaixo cria um registro de uma conta cujo correntista é a pessoa de CPF igual a 11111111111, com número da conta igual a 1 e saldo de R$ 1000,00. INSERT INTO CONTA(NUMERO, SALDO, TIPO, CPF) VALUES (1, 1000, 1, ‘11111111111’); Em relação ao campo tipo, o valor estabelecido é determinado pelo desenvolvedor. No caso desta base de dados, será utilizada a seguinte tabela: Tipo da Conta Valor do Campo Tipo Normal 0 Especial 1 Poupança 2 Logo, a conta criada anteriormente é uma conta especial. Sendo uma conta especial, é necessário também inserir informações na tabela CONTA_ESPECIAL, como por exemplo, com o comando a seguir. INSERT INTO CONTA_ESPECIAL(NUMERO, LIMITE) VALUES(1, 300); Veja que neste caso, os valores dos campos NUMERO nas duas tabelas são iguais, estabelecendo a ligação entre os dois registros. Neste caso, estabelece-se que a conta especial de número 1 tem como limite o valor de R$ 300,00. É importante também ressaltar que as restrições sobre dados nulos e chaves 34
  • 35. Programação III primárias são verificadas na inserção de novos dados. Caso se tente burlar algumas destas regras, uma mensagem de erro é exibida, como no caso abaixo, onde tenta-se cadastrar uma conta com número igual a de outra conta já cadastrada na base de dados. Figura 22 - Erro ao se tentar incluir um registro com uma chave primária já existente 5.2 Visualizando dados das tabelas Até então, a certeza sobre a inserção dos dados nas tabelas só poderia ser verificada pelas respostas dos comandos INSERT realizados. Porém, uma maneira mais segura seria verificar se os dados constam ou nas tabelas. Para isto, devemos utilizar o comando SELECT, cuja sintaxe simplificada é apresentada a seguir. SELECT { EXPRESSÃO | TABELA.CAMPO | * } [, ... ] FROM <<LISTA DE TABELAS> [WHERE <<EXPRESSÃO>>] [ORDER BY <<CAMPO>> [{ASC | DESC}] ] [GROUP BY <<EXPRESSÃO>> ] Esta é uma versão simplificada do comando SELECT. Existem outras cláusulas que não serão apresentas aqui por questões de escopo da disciplina, e também porque as cláusulas aqui citadas serão suficientes para nossos exemplos. Na sua versão mais simples, é possível listar todos os registros e campos de uma determinada tabela. Por exemplo, caso você queira ver todos os registros da tabela ENDERECO, deve usar o comando a seguir: SELECT * FROM ENDERECO Este comando indica que queremos visualizar todos os campos de todos os registros da tabela ENDERECO. Porém, é possível especificar que queremos ver apenas um conjunto dos campos, listando-os individualmente no comando SELECT, como exemplificado abaixo. SELECT RUA FROM ENDERECO 35
  • 36. Programação III Veja na Figura abaixo, o resultado da execução do comando SELECT no banco criado até então: Note que há outros registros. Estes registros foram inseridos propositadamente por meio de outros comandos INSERT. Note também que como havíamos dito, o campo ID_ ENDERECO tem valores numéricos que são atribuídos automaticamente para cada registro. Com isto, podemos utilizar o comando SELECT para visualizar qual o valor gerado para um registro de um endereço e depois utilizá-lo para inserir uma pessoa. Caso se queira refinar uma busca, é possível utilizar a cláusula WHERE. Esta cláusula define uma condição de busca que deve ser satisfeita por um registro para que ele seja retornado como resposta ao SELECT. Para definir esta condição, SQL utiliza operadores lógicos e relacionais já conhecidos das linguagens de programação. A tabela a seguir apresenta os operadores lógicos presentes em SQL. Tabela 2 – Operadores lógicos de SQL Operador Descrição “E” lógico, avalia duas condições e retorna verdadeiro apenas se ambas AND forem verdadeiras “OU” lógico, avalia duas condições e retorna verdadeiro se alguma das OR condições for verdadeira NOT Negacão lógica, retorna o valor contrário da expressão avaliada Em relação aos operadores relacionais, estes são usados para realizar comparações entre valores. A tabela abaixo apresenta os principais operadores relacionais presentes em SQL. 36
  • 37. Programação III Tabela 3 – Operadores relacionais em SQL Operador Descrição < Menor > Maior <= Menor ou igual >= Maior ou igual = Igual != Diferente BETWEEN Utilizado para especificar um intervalo de valores Utilizado na comparação de um modelo e para especificar registros de um LIKE banco de dados.”Like” + extensão % vai significar buscar todos resultados com o mesmo início da extensão Para ilustrar sua utilização, vamos apresentar alguns exemplos. Para listar todas as ruas de endereço localizados no bairro de Boa Viagem: Para listar todas as ruas que começam com a palavra ‘AVENIDA’: Para listar todas as ruas que começam com a palavra ‘AVENIDA’ e que o ID_ ENDERECO estejam entre 1 e 3. 37
  • 38. Programação III A cláusula ORDER BY permite que os resultados apresentados sejam ordenados de acordo com seus valores. É possível definir tanto a ordenação crescente (que é o padrão), quanto decrescente de valores. Por exemplo, para listar os nomes de todas as ruas em ordem decrescente, utilizaríamos o seguinte comando SELECT RUA FROM ENDERECO ORDER BY RUA DESC Veja a execução do comando na figura abaixo Antes de valor sobre a última cláusula, a GROUP BY, é necessário dizer que SQL fornece também um conjunto de funções para agregação de valores. A cláusula GROUP utiliza estas funções para que os resultados de sua chamada sejam aplicadas em um conjunto de registros que são agrupados por um critério comum. A tabela a seguir apresenta as principais funções de agregação. Tabela 4 - Operadores escalares em SQL Função Descrição AVG Utilizada para calcular a média dos valores de um campo determinado COUNT Utilizada para devolver o número de registros da seleção SUM Utilizada para devolver a soma de todos os valores de um campo determinado MAX Utilizada para devolver o valor mais alto de um campo especificado MIN Utilizada para devolver o valor mais baixo de um campo especificado 38
  • 39. Programação III Para exemplificar o uso das funções de agregação e da cláusula GROUP BY, tome com exemplo a tabela CONTA, com os seguintes dados cadastrados. Imagine então que se queira saber qual é a média dos saldos entre todas as contas cadastradas. Para isso, utiliza-se a função AVG, como apresentado a seguir. Caso se queira descobrir o maior e o menor saldo de uma conta, utiliza-se as funções MAX e MIN, como ilustrado a seguir. A cláusula GROUP BY permite que as funções de agregação sejam agrupadas. Para ilustrar, imagine a consulta onde se queira saber qual o menor e maior saldo das contas de 39
  • 40. Programação III cada correntista, dado que existem pessoas com mais de uma conta no banco. Para isto, utiliza-se a cláusula GROUP BY, como exemplificado a seguir. Note que nesta última consulta, utiliza-se um novo recurso. Cada campo utilizado na consulta pode ter um ‘apelido’. No caso, utiliza-se a palavras ‘AS’ como uma ligação entre o valor do campo e seu apelido. Este novo identificador é utilizado na resposta da consulta, como visto na Figura. Por fim, deixamos as consultas mais complexas. Imagine a situação onde você queira visualizar o nome de todos os correntistas que tenham contas especiais. Neste caso há um problema, pois a informação sobre o tipo da conta é armazenada na tabela CONTA, e o nome de cada correntista fica na tabela PESSOA. A princípio, teríamos que fazer duas consultas. Primeiro, descobrir quais são os cpfs das contas especiais na tabela CONTA, e depois utilizar estes valores para criar uma segunda consulta na tabela PESSOA. Porém, é possível fazer esta consulta com um único comando SQL, por meio da junção de tabelas. Veja que tanto a tabela CONTA, quanto a tabela PESSOA possuem um campo em comum: o CPF. Logo, este campo servirá de ligação entre as duas tabelas em uma consulta. A consulta que pretendemos é apresentada a seguir SELECT NOME FROM CONTA AS C, PESSOA AS P WHERE (TIPO = 1) AND (C.CPF = P.CPF) Nesta consulta, verifica-se que podem-se ser obtidos todos os campos das tabelas citadas na cláusula FROM, no caso, as tabelas CONTA e PESSOA. No caso, só estamos querendo retornar o nome. Este é um campo que só existe na tabela PESSOA, então o compilador SQL não vai se perder para obter esta informação. Caso houvessem dois campos com o mesmo nome em tabelas distintas, é necessário especificar qual campo de que tabela se deseja retorna. Para isto, deve-se utilizar o nome da tabela (ou seu apelido), seguido por um ponto “.” e o nome do campo. Note que da mesma forma que campos podem ser renomeados, tabelas também. Neste exemplo, CONTA passa ser referenciada por “C”, e PESSOA por “P”. Esta substituição é para diminuir o tamanho das cláusulas SQL. A junção das tabelas se dá na cláusula WHERE. Nela, além de se filtrar as contas pelo seu tipo, faz uma ligação entre as duas tabelas através dos números de CPF. A Figura a seguir apresenta a execução desta consulta no HyperSQL. 40
  • 41. Programação III Outro exemplo de junção mais complexo seria: Qual o estado do endereço residencial do correntista cuja conta seja a de número 1? Neste caso, é necessário fazer a junção de 3 tabelas: CONTA, PESSOA e ENDERECO, pois o estado é parte da tabela ENDERECO, enquanto o número da conta está na tabela CONTA. A única ligação entre as duas tabelas é a tabela PESSOA. A figura abaixo apresenta o comando SELECT e sua execução no HyperSQL. 5.3 Alterando dados em tabelas Uma vez que já existam dados, o comando UPDATE permite que os valores de um ou vários campos de um ou mais registros sejam alterados. Sua sintaxe é descrita a seguir. UPDATE <<TABELA>> SET <<COLUNA1>> = <<VALOR1>>, <<COLUNA2>> = <<VALOR2>> [WHERE <<EXPRESSÃO>>] A idéia do comando UPDATE é especificar novos valores para campos que devem ser alterados de acordo com uma condição de pesquisa. Por exemplo, imagine que se queira modificar o nome do correntista ‘Fernando Trinta’ para ‘Fernando Antonio Mota Trinta’. Neste caso, utiliza-se o seguinte comando: UPDATE PESSOA SET NOME = ‘Fernando Antonio Mota Trinta’ WHERE CPF = ‘11111111111’ 41
  • 42. Programação III Note que neste caso, a condição indica que apenas o registro cujo CPF seja igual a ‘11111111111’ tenha o nome alterado para ‘’Fernando Antonio Mota Trinta’. De acordo com os dados cadastrados até então, só existe um registro que satisfaça esta condição, e este será o único registro alterado. Se não houvesse nenhum registro que satisfizesse a condição, nenhum registro seria alterado. É importante salientar que se nenhum condição de seleção for especificada na cláusula WHERE, a atualização se dá em todas os registros da tabela. Por exemplo, caso se queira aumentar o saldo de todas as contas em 50%. Neste caso, não há necessidade de se definir a cláusula WHERE, como ilustrado na figura abaixo. Duas observações importantes neste último exemplo. Primeiro, é possível utilizar expressões matemáticas para atualizações, assim como nos critérios de busca bem como nos resultados das consultas. Segundo, o resultado do comando UPDATE é o número de registros afetados por sua execução. No nosso exemplo, cinco linhas da tabela foram modificadas pelo comando UPDATE. 5.4 Removendo registros O último dos comandos DML é aquele que permite a exclusão de registros, o comando DELETE. A sintaxe simplificada do comando é apresentada a seguir DELETE FROM <<TABELA>> [ WHERE CONDIÇÃO ] 42
  • 43. Programação III O comando DELETE remove todas os registros de uma determinada tabela que obedeçam ao critério de busca definido na cláusula WHERE. Se não for definido nenhum critério, todas as linhas da tabela são removidas, o que indica que o comando deve ser utilizado com cuidado. É importante também frisar que para que as linhas de uma coluna sejam removidas, as condições de integridade referencial entre os dados da tabela devem ser satisfeitos. Por exemplo, na tabela CONTAS, existem registros que são referenciados por outras tabelas, com as contas especiais ou poupanças. A tentativa de se remover um registro nestas condições ocasionará um erro, como apresentado pela figura abaixo. Logo, para efetivamente se apagar um registro, deve-se seguir a ordem correta de remoção de dependência entre registros que estejam relacionados. No caso de nosso exemplo, primeiro deve-se apagar o registro na tabela CONTA_ESPECIAL, para então remover o registro na tabela CONTA, como apresentado a seguir. Note que os dois comandos (assim como mais de um comando) podem ser disparados na mesma janela. Estes são executados na ordem em que são digitados na ferramenta. 43