Você está na página 1de 129

2007 by Digerati Books Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998.

Nenhuma parte deste livro, sem autorizao prvia por escrito da editora, poder ser reproduzida ou transmitida sejam quais forem os meios empregados: eletrnicos, mecnicos, fotogrcos, gravao ou quaisquer outros.

Diretor Editorial Luis Matos Assistncia Editorial Monalisa Neves Erika S Edio de Arte e Projeto Grco Daniele Ftima Preparao dos originais Ricardo Dino de Freitas

Reviso Guilherme Laurito Summa Diagramao Rogrio Chagas Capa FullCASE Comunicao

Dados Internacionais de Catalogao na Publicao (CIP) (Cmara Brasileira do Livro, SP, Brasil)
F375c Ferrari, Fabrcio Augusto. Crie banco de dados em MySQL / Fabrcio Augusto Ferrari. So Paulo: Digerati Books, 2007. 128 p. ISBN 978-85-60480-25-8 1. MySQL (Linguagem de programao de computadores). 2. Bancos de dados. I. Ttulo.

CDD 005.13

Universo dos Livros Editora Ltda. Rua Tito, 1.609 CEP 05051-001 So Paulo/SP Telefone: (11) 3648-9090 Fax: (11) 3648-9083 www.universodoslivros.com.br e-mail: editor@universodoslivros.com.br Conselho Administrativo: Alessandro Gerardi, Alessio Fon Melozo, Luis Afonso G. Neira, Luis Matos e William Nakamura.

Sumrio
Captulo 1 Introduo aos bancos de dados ................................. 5
Introduo ao SQL ................................................................................6 Conceitos bsicos do SQL .................................................................10 Os dialetos do SQL .............................................................................12 Sobre os Sistemas de Gerenciamento de Bancos de Dados Relacionais (SGBDR) .......................................13 Instalando o MySQL 5 no Windows XP ............................................14 Caractersticas dos bancos de dados relacionais ............................23

Captulo 2 Trabalhando com o SQL (Parte 1) .............................. 45


Introduo .......................................................................................... 46 Criando um novo banco de dados ................................................... 48 Excluindo um banco de dados ..........................................................50 Selecionando um banco de dados ....................................................51 Criando e listando as tabelas .............................................................52 Visualizando a estrutura das tabelas .................................................55 Inserindo dados em uma tabela ........................................................56 Visualizando o contedo de uma tabela ...........................................57 Consideraes sobre os tipos de dados para as colunas................58 Sobre a notao cientca (vrgula varivel) .....................................63

Captulo 3 Trabalhando com o SQL (Parte 2) .............................. 67


Criando uma tabela mais complexa ..................................................68 Inserindo novos dados na tabela .......................................................73 Congurando chaves primrias compostas .....................................76 Tabelas e ndices .................................................................................77 Valores predenidos para os campos (Default) ...............................81 Modicando as tabelas ..................................................................... 83 Tipos de dados especiais .................................................................. 86

Captulo 4 Inserindo e modificando dados ................................. 89


Introduo .......................................................................................... 90 Sobre o comando INSERT ................................................................ 90

Inserindo novos registros na tabela ..................................................91 Atualizando registros da tabela .........................................................93 Excluindo registros da tabela ............................................................95 Excluindo todos os registros da tabela de uma s vez ................... 96

Captulo 5 Realizando consultas no SQL ...................................... 97


Introduo ...........................................................................................98 Uso simples do comando SELECT .....................................................98 Uso do alias para os campos .............................................................99 A clusula ORDER BY ........................................................................103 Sobre funes no SQL .....................................................................105 A clusula GROUP BY ........................................................................108

Captulo 6 Outros SGBDR ...........................................................111


Introduo ......................................................................................... 112 O Oracle ............................................................................................. 112 O Microsoft SQL Server ................................................................... 117 O Firebird ...........................................................................................122

Captulo 1
Introduo aos bancos de dados

Antes de nos aprofundarmos no conhecimento do SQL, fundamental entendermos o que e como estruturado um banco de dados. Neste tpico, veremos algumas noes importantes para criao de um banco de dados eciente e bem planejado. Apesar de o termo banco de dados parecer um tanto quanto tcnico para a maioria das pessoas, trata-se de um conceito amplamente conhecido e empregado por quase toda populao mundial. De fato, a grande maioria das pessoas hoje tem acesso a equipamentos, cuja funo (principal ou secundria) o armazenamento de informaes. Quem, hoje em dia, no usa, por exemplo, um telefone celular? Desde o seu surgimento, esse tipo de aparelho possui uma agenda, na qual podemos gravar nomes e telefones para, em um segundo momento, acess-los. Uma lista telefnica impressa tambm um exemplo vlido de banco de dados, pois nela so relatados todos os nomes, endereos e nmeros de telefone das empresas e dos moradores da sua cidade e, eventualmente, dos arredores. Tudo isso remete ao conceito de banco de dados, ou seja, um local no qual possvel armazenar informaes, para consulta ou utilizao, quando necessrio. Independentemente do aplicativo que se deseja usar para o armazenamento e manipulao das informaes, todos os bancos de dados so constitudos por trs elementos bsicos: campos, registros e tabelas. O que so campos? Num banco de dados, chamado de campo o espao reservado para a insero de um determinado dado. O que so registros? Um registro nada mais que um conjunto de campos, ou seja, de dados sobre um determinado assunto. O que so tabelas? Todos os registros, isto , as chas que contm os dados que armazenamos, so agrupados nas tabelas do banco de dados.

Introduo ao SQL
Como vimos no tpico anterior, todos os sistemas de computao para o gerenciamento de informaes so baseados em registros (ou record, em ingls). Um registro um conjunto simples de dados com o qual se identica determinado elemento (uma pessoa,

Crie Banco de Dados em MySQL


6

um objeto, um evento etc.), associando a ele uma srie de atributos que o caracterizam de maneira unvoca, por exemplo: nome, sobrenome e endereo, e nmero de telefone, no caso de uma pessoa; local, data e hora em que certo evento ser realizado; cdigo, peso, dimenses e cor, caso se trate de um objeto ou produto. Cada informao inserida separadamente dentro de um espao a ela reservada, chamado de campo (ou eld, em ingls). Um exemplo de estrutura de dados pode ser vista na tabela do exemplo a seguir: cada clula da tabela um campo, que contm apenas um tipo de informao; cada linha da tabela constitui um registro:
Augusto Nayana Cludio Daniela J. Vsica Couto Vsica Savoi (62)9876-5432 (34)3216-5498 (62)3789-6545 (11)3558-9899 Tabela 1.1: Registros. Goinia Patos de Minas Ap. de Goinia So Paulo GO MG GO SP

A dcada de 1970 foi um marco na evoluo dos bancos de dados digitais, pois viu o nascimento dos bancos de dados relacionais, denidos como conjuntos auto-explicativos de registros integrados. Antes disso, os bancos de dados utilizavam estruturas hierrquicas, o que tornava sua estrutura muito articulada e complexa de se consultar. Para saber um pouco mais... O modelo relacional para gerncia de bancos de dados (SGBD) um modelo de dados baseado em lgica de predicados e na teoria de conjuntos. Historicamente, ele o sucessor do modelo hierrquico e do modelo em rede. Estas arquiteturas antigas so at hoje utilizadas em alguns Data Centers com alto volume de dados, em que a migrao inviabilizada pelo custo que ela demandaria; existem ainda os novos modelos baseados em orientao ao objeto, que, na maior parte das vezes, so encontrados como kits de construo de SGBD, ao invs de um SGBD propriamente dito. O modelo relacional foi o primeiro modelo de banco de dados formal. Somente depois, seus antecessores, os bancos de dados hierrquicos e em rede, passaram a ser tambm descritos em linguagem formal.

Introduo aos bancos de dados


7

O modelo relacional foi inventado pelo Dr. Ted Codd e posteriormente mantido e aprimorado por Chris Date e Hugh Darwen como um modelo geral de dados. No Terceiro Manifesto (1995), eles mostraram como o modelo relacional pode ser estendido com caractersticas de orientao ao objeto sem comprometer os seus princpios fundamentais. A linguagem padro para os bancos de dados relacionais, SQL, do ingls Structured Query Language, apenas vagamente remanescente do modelo matemtico. Atualmente ela adotada, apesar de suas restries, porque antiga e muito mais popular que qualquer outra linguagem de banco de dados. A principal proposio do modelo relacional que todos os dados sejam representados como relaes matemticas, isto , um subconjunto do produto Cartesiano de n conjuntos. No modelo matemtico (diferentemente do SQL), a anlise dos dados feita em uma lgica de predicados de dois valores (ou seja, sem o valor nulo), isto signica que existem dois possveis valores para uma proposio verdadeira ou falsa. Os dados so tratados pelo clculo relacional ou lgebra relacional. O modelo relacional permite ao projetista criar um modelo lgico consistente da informao a ser armazenada. Este modelo lgico pode ser renado atravs de um processo de normalizao. Um banco de dados construdo puramente baseado no modelo relacional estar inteiramente normalizado. O plano de acesso, outras implementaes e detalhes de operao so tratados pelo sistema DBMS, e no devem ser reetidos no modelo lgico. Isto se contrape prtica comum para DBMSs SQL nos quais o ajuste de desempenho freqentemente requer mudanas no modelo lgico. Os blocos bsicos do modelo relacional so: o domnio, ou tipo de dado; uma tupla, que um conjunto de atributos que so ordenados em pares de domnio e valor; uma relvar (varivel relacional), que um conjunto de pares ordenados de domnio e nome que serve como um cabealho para uma relao; e uma relao, que um conjunto desordenado de tuplas. Apesar destes conceitos matemticos, eles correspondem basicamente aos conceitos tradicionais dos bancos de dados. Uma relao similar ao conceito de tabela e uma tupla similar ao conceito de linha. O princpio bsico do modelo relacional o princpio da informao: toda informao representada por valores em relaes.

Crie Banco de Dados em MySQL


8

Assim, as relvars no so relacionadas umas s outras no momento do projeto. Entretanto, os projetistas utilizam o mesmo domnio em vrios relvars, e se um atributo dependente de outro, esta dependncia garantida atravs da integridade referencial. Como todos os bancos de dados, o relacional tambm tem sua estrutura baseada em registros relacionados e organizados em tabelas. Essas relaes tornam os registros integrados. Um subconjunto especco de dados constitui um dicionrio de dados, que determina a maneira em que os registros de dados so relacionados, quais vnculos existem para a sua utilizao e outras caractersticas. Esses dados descritivos so chamados metadados e graas a eles que um banco de dados autodescritivo, ou seja, contm uma descrio de sua prpria estrutura. A presena de todos esses elementos (dados e metadados) transforma o banco de dados em uma estrutura informtica acessvel por qualquer aplicao que seja capaz de explorar os metadados, extrair informaes sobre os dados e trat-los para copi-los, alter-los e criar novos. A caracterstica autodescrevente de um banco de dados faz com que a aplicao que o acessa no precise gerenciar a estrutura dos registros, e sim, limite-se a utiliz-los, pois o prprio banco de dados se encarregar de criar espao para novos registros, alterando seu contedo de acordo com as solicitaes da aplicao que est acessando-o. Assim, os bancos de dados com essas caractersticas no so simplesmente conjuntos de dados, mas contm mecanismos automatizados que se encarregam da gesto dos registros, por esse motivo so chamados Sistemas Gerenciadores de Banco de Dados Relacionais (SGBDR), ou Relational Database Management Systems (RDMS). Em um banco de dados relacional, as informaes so estruturadas em tabelas, divididas em linhas e colunas: as linhas so os registros e as colunas constituem os campos. H diversas razes para que o modelo de banco de dados relacional substituisse o modelo hierrquico: primeiramente porque o SGBDR permite adicionar com facilidade novas tabelas em um banco de dados, relacionando seus dados e sem afetar substancialmente a estrutura do banco de dados e sem a necessidade de alterar os aplicativos que trabalharo com as tabelas; em segundo lugar, num

Introduo aos bancos de dados


9

banco de dados relacional muito simples alterar a estrutura de uma ou mais tabelas, inserindo ou excluindo linhas e colunas de acordo com as necessidades sem comprometer a funcionalidade do banco de dados; outra razo relevante do sucesso dos SGBDR que todos eles podem ser acessados utilizando uma nica ferramenta, chamada Structured Query Language (SQL), disponvel praticamente para todas as plataformas de hardware, desde os mainframes at computadores portteis. Neste livro, veremos como acessar e manipular um banco de dados relacional utilizando os comandos oferecidos pelo SQL. A linguagem SQL deriva diretamente do SEQUEL (Structured English Query Language). O SEQUEL tinha como objetivo se tornar uma linguagem universal (cujos comandos originaram do idioma ingls), usada para acessar os dados armazenados em um banco de dados, ignorando as complicaes derivadas da estrutura interna de funcionamento de cada um. A primeira verso a ser usada foi distribuda em 1981 pela IBM e foi denominada Structured Query Language / Data System, ou simplesmente SQL/DS. Esta nova linguagem despertou o interesse dos maiores construtores de computadores de grande porte (mainframes) e das empresas que desenvolviam softwares para aqueles equipamentos, pois, graas ao SQL/DS, seria possvel simplicar os processos de manipulao de grandes quantidades de dados, que naquela poca ainda empregavam estruturas hierrquicas. Nos anos seguintes, o SQL deixou de ser um produto exclusivo da IBM e se tornou, de fato, uma linguagem de acesso a bancos de dados muito articulada e funcional, que pode ser empregada em computadores de arquiteturas totalmente diferentes.

Conceitos bsicos do SQL


Os computadores trabalham executando programas escritos em uma linguagem de programao especca. As linguagens de programao so conjuntos de comandos e palavras-chave que devem ser utilizados respeitando regras de composio predenidas, que constituem a sintaxe. No decorrer dos anos, desde o surgimento da informtica, foram criadas inmeras linguagens de programao, cada qual com seus comandos e sintaxe, para tornar mais vivel a interao do usurio

Crie Banco de Dados em MySQL


10

com o computador. Entre as linguagens mais conhecidas, podemos citar: FORTRAN, CLIPPER, COBOL, PASCAL, BASIC, VB, DELPHI, C (e seus derivados), JAVA etc. Em todos os casos, estamos falando de linguagens que permitem ao computador realizar qualquer tipo de operao (clculos, armazenar e manipular dados, desenhar, digitar textos etc.). Para isso, nos oferecem comandos por meio dos quais o programador deve instruir o computador sobre como cada tarefa deve ser realizada. No caso do SQL, estamos falando de uma linguagem um pouco diferente, antes de tudo porque pode ser usada exclusivamente para acessar dados em um banco de dados, isto , trata-se de uma linguagem especca para a manipulao de tabelas de dados. Alm disso, o SQL no serve para criar rotinas de procedimentos a serem executados pelo computador, e sim, para informar quais dados (ou conjuntos de dados) queremos manipular. De fato, a nalidade do SQL acessar dados, independentemente do tipo de hardware ou software que estamos usando.

Tabelas, consultas e views


A linguagem SQL baseada no conceito de views (vises, em portugus). Uma view uma tabela virtual cujos registros so constitudos por campos que, no banco de dados fsico, podem pertencer a registros localizados em tabelas diferentes. Utilizando o SQL, podemos criar views realizando queries, ou seja, pesquisas, nas tabelas fsicas existentes no banco de dados. O termo query signica: pergunta, interrogao e, na linguagem SQL, indica uma requisio precisa de dados a serem extrados a partir de um banco de dados. Em outras palavras, uma query uma lista de elementos (campos) que contm os dados que desejamos obter. A partir da extrao de dados de uma ou mais tabelas, gerada uma nova tabela virtual (view), que contm os campos ltrados de acordo com os critrios especicados. Denimos uma view como uma tabela virtual porque, quando gerada, no armazenada em disco, mas apenas visualizada. Essa caracterstica permite imprimila em papel ou torn-la uma tabela fsica pertencente ao banco de dados, gravando-a junto com as demais tabelas que constituem a estrutura do banco de dados. O SQL permite tambm operar no apenas com dados existentes: possvel criar novas tabelas criando novos campos ou, ainda, form-las por campos obtidos a partir de

Introduo aos bancos de dados


11

clculos ou operaes feitas em campos de outras tabelas. Essas tabelas so chamadas de tabelas de base e so fsicas, ou seja, ao serem geradas so gravadas sicamente no banco de dados. A linguagem SQL um conjunto de comandos (ou instrues) que permitem gerar enunciados, ou seja, linhas de comandos compostas por uma ou mais instrues. Alguns comandos permitem ou at mesmo exigem o uso de parmetros adicionais, chamados de clusulas e predicados. Basicamente, todos os comandos do SQL so verbos em ingls (select, create, alter etc.), e as clusulas so preposies do mesmo idioma (from, as, by, in etc.).

Grupos de comandos SQL


Os comandos do SQL so classicados em trs grupos, de acordo com suas principais funes: DDL (Denition Data Language): so todos aqueles comandos usados para criar e alterar tabelas que compem o banco de dados, ou seja, os comandos que denem a estrutura dos dados; DML (Data Manipulation Language): pertencem a este grupo todos os comandos usados para extrair informaes das tabelas, ou seja, para manipular os dados existentes; DCL (Data Control Language): trata-se de um conjunto de comandos usado em sistemas multiusurio para denir os privilgios de acesso aos dados a cada usurio. Os comandos de controle de acesso aos dados so usados para implementar segurana e privacidade em bancos de dados.

Os dialetos do SQL
Como j dissemos, o SQL uma linguagem que possui seus comandos, seus parmetros e sua sintaxe especcos. A integridade dessas caractersticas constantemente monitorada e mantida por um comit, o American National Standards Institute (algo como Instituto Americano de Padres Nacionais), mais conhecido como ANSI. O primeiro padro para o SQL foi publicado em 1986, e em 1989 teve sua primeira atualizao. Em 1992, houve outra atualizao, que se tornou conhecida como SQL92, ou simplesmente SQL2. A ltima atualizao de 1999, mas foi publicada ocialmente em 2000, com o nome SQL99 (ou SQL3).

Crie Banco de Dados em MySQL


12

Essa ltima verso foi assumida como padro tambm por outra instituio, a ISO (International Standards Organization Organizao de Padres Internacionais). A denio de padres para os comandos, os parmetros e a sintaxe do SQL , sem dvida alguma, um fato positivo, pois evita divergncias entre as atualizaes lanadas que devem respeitar as diretrizes estabelecidas pelo ANSI e pela ISO. Contudo, os produtores de softwares lanam com freqncia verses prprias desta linguagem, adicionando ao SQL novos comandos e funcionalidades. Essas verses so chamadas dialetos e, alm dos comandos bsicos do SQL (cerca de 50 instrues), trazem outros que, em alguns casos, fogem do propsito inicial do SQL, que nasceu como linguagem para a manipulao de dados em bancos de dados. Assim, possvel encontrar dialetos SQL que trazem comandos para a criao de estruturas condicionais (IF...THEN...ELSE...), tpicos das linguagens de programao para desenvolvimento de softwares, ou instrues para estruturas de controle (WHILE...) etc. Para os puristas do SQL, tratam-se de alteraes que descaracterizam a linguagem, pois tentam transform-la em algo para o qual no foi criada. De qualquer forma, os dialetos apresentam novas funcionalidades que visam sempre aprimorar a manipulao de bancos de dados, desde alteraes simples at mais complexas.

Sobre os Sistemas de Gerenciamento de Bancos de Dados Relacionais (SGBDR)


Para utilizar as caractersticas e o funcionamento do SQL preciso se servir de um Sistema de Gerenciamento de Bancos de Dados Relacionais (SGBDR), isto , de um ambiente no qual possamos utilizar os comandos desta linguagem para manipular dados. A discusso sobre qual o melhor SGBDR ampla e praticamente sem m, pois h legies de usurios prontos a jurar que o sistema que usam melhor que qualquer outro. De fato, no mercado existem diversos SGBDRs nos quais podemos operar usando o SQL. Existem SGBDRs criados para trabalhar em servidores de redes locais (LANs), tais como o Oracle, o Microsoft SQL Server, o Sybase. Tratam-se de sistemas muito difusos, porm, no ao alcance de todos, pois seu custo inicial de implantao de aproximadamente 10 mil dlares e pode chegar facilmente a valores bem mais altos, de acordo com as exigncias.

Introduo aos bancos de dados


13

Para os exemplos e as demonstraes deste livro, usaremos um SGBDR, que foi desenvolvido tendo como referncia os sistemas mais utilizados no mercado (Microsoft SQL Server e Oracle), capaz de operar com os comandos SQL e, o mais importante, gratuito: trata-se do MySQL, um SGBDR que pode ser obtido facilmente em sites de download pela Internet. Por exemplo, no site http://www.mysqlbrasil.com.br/ possvel no s baixar a ltima verso do MySQL (tanto para Windows como para sistemas Linux), mas tambm obter manuais, participar de fruns, eventos e treinamentos promovidos pela comunidade MySQL do nosso pas. Como veremos ao longo dos captulos deste livro, para trabalhar com o SQL bastam poucas linhas de comandos (ou enunciados), que sero digitados em uma janela a qual servir de interface entre ns e o banco de dados no qual queremos trabalhar.

Instalando o MySQL 5 no Windows XP


Apesar de estar disponvel tambm para outras plataformas, neste tpico veremos como instalar o MySQL em um microcomputador com sistema operacional Windows XP Service Pack 2, devido maior difuso desse sistema operacional em ambientes tanto corporativos quanto domsticos. No momento da redao deste livro, foi utilizada a verso mais atual (5.0.27), que pode ser obtida gratuitamente a partir do endereo: http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.27win32.zip/from/pick#mirrors Neste site, basta escolher um mirror, ou seja, um dos links por meio dos quais possvel baixar o arquivo mysql-5.0.27-win32.zip (com aproximadamente 40 MB), que contm o instalador do MySQL 5 para Windows XP. Uma vez feito o download, preciso descompactar os arquivos baixados em uma pasta qualquer do disco rgido do computador; para isso, basta usar um software de compactao/descompactao como WinZip, WinRar, WinAce ou, ainda, recorrer opo de descompactao do prprio Windows XP. Aps descompactar o arquivo baixado, basta dar clique duplo sobre o arquivo Setup.exe para iniciar a instalao do MySQL. A partir

Crie Banco de Dados em MySQL


14

da, preciso seguir as instrues fornecidas pelo Windows Installer para continuar com a instalao. Veja as etapas em detalhes: 1. A primeira janela apresentada nos d as boas-vindas; para continuar, clique no boto Next (prximo), como mostra a Figura 1.1.

Figura 1.1: Na tela de boas-vindas, clique em Next para proceder com a instalao.

2. Na segunda etapa, podemos escolher entre instalao tpica (Typical), completa (Complete) ou personalizada (Custom). A primeria opo instala as funes mais comuns, indicadas para uso geral; a segunda, todas as funcionalidades do MySQL, o que exigir mais espao no HD do computador, mas proporcionar maior exibilidade no trabalho; a terceira opo permite decidir quais caractersticas desejamos instalar e quais descartar. Para o nosso exemplo, mantenha a primeira opo e clique em Next novamente (Figura 1.2).

Figura 1.2: Na segunda etapa, selecione o tipo de instalao desejada e clique em Next para avanar.

Introduo aos bancos de dados


15

3. Ao optar pela instalao tpica ou completa, a terceira etapa mostrar apenas um resumo das opes de instalao escolhidas; para continuar, basta clicar no boto Install para iniciar a instalao do MySQL, como mostra a Figura 1.3. Se, na etapa anterior, tivesse sido marcardo a opo Custom, seria apresentada uma janela adicional, na qual deveremos escolher as caractersticas a serem instaladas (Figura 1.4). Vale a pena ressaltar que a instalao personalizada deve ser realizada apenas por usurios que j conhecem o MySQL e compreendem o funcionamento de cada elemento do programa, caso contrrio, poder apresentar falhas no funcionamento.

Figura 1.3: Na terceira etapa, so exibidas as informaes sobre o tipo de instalao escolhida e a pasta do sistema em que o software ser instalado. Clicando em Install, ser iniciada a cpia dos arquivos.

Figura 1.4: Caso selecionssemos a instalao personalizada Custom usaramos esta janela para especicar quais caractersticas do MySQL deveriam ser instaladas no computador. Feito isso, bastaria clicar em Install para nalizar a instalao.

Crie Banco de Dados em MySQL


16

4. Durante algum tempo, que depende da congurao do computador em uso, ser exibida uma barra de progresso, que nos mantm informados sobre o andamento da instalao (Figura 1.5). Ao terminar a cpia dos arquivos necessrios para o funcionamento do MySQL, exibida uma janela na qual podemos nos registrar no site MySQL.com para receber informaes sobre as atualizaes do aplicativo (Figura 1.6). Para o nosso exemplo, pule essa parte marcando a opo Skip Sign-Up (pular registro) e clique em Next.

Figura 1.5: Esta barra de progresso nos informa sobre o andamento da instalao.

Figura 1.6: Se desejar, poder efetuar o cadastro no site MySQL.com para receber informaes atualizadas a respeito do MySQL. Marque a opo Skip Sign-Up para no efetuar o registro.

5. Enm, uma tela nal nos informa que a instalao foi concuda com xito (Figura 1.7). Agora preciso congurar o MySQL para podermos trabalhar, portanto, mantenha marcada a opo Congure the MySQL Server now e clique no boto Finish (Concluir).

Introduo aos bancos de dados


17

Figura 1.7: A instalao est concluda. Agora preciso congurar o MySQL Server.

6. iniciado, ento, um novo assistente, que se encarrega de nos guiar no processo de congurao do MySQL Server. Clique em Next (Figura 1.8).

Figura 1.8: Um novo assistente nos ajudar na congurao do servidor do MySQL.

7. Na etapa sucessiva, podemos optar pela congurao detalhada ou padro. A primeira permite denir a congurao mais adequada ao sistema em uso, a segunda adota uma congurao que se adequa maioria dos sistemas. Marque a segunda opo e clique em Next (Figura 1.9).

Crie Banco de Dados em MySQL


18

Figura 1.9: Marque a opo Standard Conguration para iniciar a congurao padro do MySQL Server; em seguida clique em Next.

8. Na terceira etapa de congurao, so apresentadas trs opes: a primeira (Install As Windows Service) registra o MySQL como um servio do sistema operacional, o que o torna mais seguro e menos vulnervel; a segunda (Launch the MySQL Server automatically), faz com que o MySQL Server seja executado automaticamente ao inicializar o Windows; a terceira (Include Bin Directory in Windows PATH), inclui a pasta de trabalho do MySQL nas variveis de PATH do Windows, para que os comandos SQL possam ser executados a partir do prompt de comando do Windows no modo MS-DOS (Figura 1.10). Mantenha as opes padro e clique novamente em Next para proceder.

Figura 1.10: Nesta etapa, mantenha as opes padro e clique em Next.

Introduo aos bancos de dados


19

9. Na etapa seguinte (Figura 1.11), necessrio denir as opes de segurana, criando contas de usurios para ter acesso ao servidor do MySQL. A primeira opo, Modify Security Settings, serve para denir a senha de acesso do usurio Root, o administrador do servidor: digite ento uma senha de acesso no campo Enter the root password (digite a senha de root) e conrme-a, digitando-a novamente no campo Retype the password (redigite a senha). Se marcarmos a opo Enable root access from remote machines, habilitaremos o acesso ao servidor a partir de outros computadores ligados em rede com aquele em que o MySQL server est instalado. possvel tambm criar uma conta de usurio annimo (Create An Anonymous Account), que no necessitar de senha para acessar o servidor. Trata-se de uma opo perigosa, pois qualquer usurio do computador poder acessar o servidor e mudar suas conguraes. Mantenha as opes padro e clique em Next.

Figura 1.11: Aps denir a senha de acesso ao servidor, clique em Next para proceder com a congurao.

10. Denidas as conguraes, o assistente pede para clicar no boto Execute para aplicar as opes especicadas (Figura 1.12). Ento, clique e aguarde a concluso do processo.

Crie Banco de Dados em MySQL


20

Figura 1.12: Clicando no boto Execute, aplicamos as opes de congurao denidas nas etapas anteriores.

11. Aps alguns instantes, somos noticados de que o processo foi concludo. Clique em Finish para sair do assistente e terminar. Pronto! Agora o MySQL est instalado e pronto para ser usado!

Como funciona o MySQL


Aps a instalao, o MySQL 5.0 encontra-se armazenado na pasta Arquivos de Programas, dentro de uma subpasta especca, chamada MySQL Server 5.0. Observao: obviamente, trata-se do caminho padro usado pelo instalador (que vimos em detalhes no tpico anterior). Vale lembrar que a pasta de instalao pode ter sido alterada durante o processo de instalao; neste caso, os arquivos do MySQL 5.0 estaro na pasta especicada pelo usurio nas etapas de instalao do software.

Introduo aos bancos de dados


21

Dentro da pasta em que o MySQL foi instalado, encontra-se uma subpasta chamada Docs, na qual est gravado o arquivo manual. chm, que o manual para o uso do MySQL; para abri-lo e ler seu contedo, d clique duplo sobre o arquivo. Nele, podemos encontrar as informaes que desejamos, procurando em uma lista de tpicos ou realizando pesquisas, como ocorre geralmente nos sistemas de ajuda de outros softwares. Infelizmente, toda a documentao em ingls, por isso, o conhecimento desse idioma indispensvel. Na pasta MySQL Server 5.0 h tambm uma subpasta chamada Data, na qual so armazenados os bancos de dados criados com o MySQL. Cada banco de dado salvo dentro de uma pasta especca que traz como rtulo o nome dado ao banco de dados na hora de ger-lo. Para iniciar o MySQL, basta localizar seu grupo de cones no menu Iniciar do Windows, como mostram os procedimentos a seguir: 1. Clique em Iniciar > Programas (ou Todos os Programas, dependendo da verso e da congurao do seu sistema operacional), localize no grupo de programas o MySQL 5.0 e, nele, clique no cone rotulado como MySQL Command Line Client. 2. Ser aberta uma janela do prompt do MS-DOS na qual solicitada a senha para o acesso ao sistema. Digite a senha que foi denida durante a instalao e pressione Enter. 3. Imediatamente exibido o texto de boas-vindas (em ingls) e disponibilizando o ambiente para a digitao de comandos, chamado comumente de Prompt do MySQL, representado desta forma:
mysql>

aqui que digitaremos todas as linhas de comando SQL para o gerenciamento dos nossos bancos de dados. Antes de iniciar o uso do MySQL, preciso vericar se o servio est ativo no sistema. Nas verses mais recentes do Windows, o servio MySQL ativado automaticamente na instalao do software. Todavia, possvel que seja necessrio ativ-lo manualmente. Para vericar se o MySQL foi iniciado no sistema, faa o seguinte: 1. Caso esteja aberta, feche a janela do prompt do MySQL.

Crie Banco de Dados em MySQL


22

2. Abra o menu Iniciar, localize e acesse o Painel de Controle do Windows. 3. Clique no cone Ferramentas administrativas. Observao: no Windows XP, o painel de controle pode ser apresentado de duas formas: Modo Clssico ou Exibio por categorias. No primeiro caso, o cone Ferramentas Administrativas se encontra junto com as demais opes; em Exibio por categorias, esta opo est dentro do grupo Desempenho e manuteno. 4. Abra a opo Servios, tambm com clique duplo. 5. Na parte direita da janela, so listados todos os servios instalados no sistema. Use a barra de rolagem para navegar nas opes at encontrar o item MySQL. Os servios so listados em ordem alfabtica crescente, portanto, no ser difcil encontrar o item desejado. 6. Clique sobre o item e verique se sua direita, na coluna Status, aparece a indicao Iniciado, que signica que o servio est ativo. 7. Caso no esteja, no centro da mesma janela esto os comandos para iniciar o MySQL, sob forma de um link (texto azul sublinhado). Clique em Iniciar o servio e feche todas as janelas em seguida. Feito isso, o MySQL est ativo e pronto para ser usado.

Caractersticas dos bancos de dados relacionais


Como vimos, o SQL utilizado para criar e manipular bancos de dados relacionais. Isto quer dizer que os comandos do grupo DDL (Data Denition Language) do SQL permitem gerar facilmente tabelas que formam um banco de dados. A estrutura e o contedo dessas tabelas devem ser denidos antes, utilizando um software especco para esse m. Para que um banco de dados possa ser considerado relacional, as tabelas que o compem devem ser construdas respeitando certos vnculos, chamados Normal Forms (formas normais, em portugus),

Introduo aos bancos de dados


23

por isso, as tabelas que respeitam esse esquema so chamadas tabelas normalizadas. A teoria que est por trs do gerenciamento de tabelas normais bastante complexa, todavia, podemos resumi-la em alguns conceitos essenciais, que veremos ao longo deste captulo.

Chaves primrias e univocidade dos dados


Cada registro de uma tabela deve ser unvoco, isto , cada linha da tabela deve ser diferente, em pelo menos uma coluna, das demais. Registros idnticos dentro de uma tabela causariam ambigidade e redundncias inteis e, portanto, devem ser evitados. Por esse motivo, de fundamental importncia, aps a entrada de dados, vericar a redundncia de dados e eliminar os registros duplicados. Os registros de uma tabela no so numerados e a ordem na qual so listados na tabela aleatria, respeitando geralmente a ordem cronolgica da insero dos dados, assim, para diferenciar um registro do outro, preciso analisar com cuidado o contedo de cada campo, e, visto que cada registro pode conter um nmero considervel de campos, imprescindvel identicar os campos da tabela que contero dados unvocos, ou seja, que jamais sero repetidos dentro da mesma tabela. Os campos (ou colunas) da tabela que possuem essa caracterstica de univocidade so chamados de chaves candidatas e, entre eles, preciso eleger um que ser a chave primria, que identicar sem ambigidade cada registro da tabela. Em um cadastro de pessoas, por exemplo, deveremos vericar quais dados jamais poderiam ser repetidos: podem existir vrias pessoas com o mesmo nome e sobrenome, liao, naturalidade etc.; mas, com certeza, jamais existiro duas pessoas com o mesmo CPF ou com o mesmo nmero de RG. Neste caso, os campos CPF e RG seriam chaves candidatas e escolheremos uma delas para servir de chave primria, um dado que usaremos para identicar cada pessoa de maneira exclusiva. Uma tabela pode ter somente uma chave primria, cuja presena garante a univocidade dos registros. Uma chave primria pode ser: Simples: formada por um s campo da tabela (por exemplo, o CPF, no caso de um banco de dados de pessoas); Composta: formada por mais de um campo da tabela (por exemplo, CPF e RG). Geralmente, as chaves primrias compos-

Crie Banco de Dados em MySQL


24

tas so usadas quando um s campo no suciente para garantir a univocidade dos registros. Quando uma tabela no tem, em sua estrutura, nenhum campo que possa ser usado como chave primria, aconselhvel adicionar uma coluna para esse m. Por exemplo, em uma tabela de produtos podemos ter vrios produtos com o mesmo nome, o mesmo preo etc. Entretanto, podemos criar um campo Cdigo, que contenha um valor (numrico ou alfanumrico) diferente para cada registro. Assim, cada cdigo identicar um determinado produto de maneira unvoca e poderemos usar este campo como chave primria da nossa tabela. Vale a pena ressaltar que no obrigatrio denir uma chave primria em uma tabela, contudo, aconselhvel faz-lo para no comprometer o correto funcionamento do banco de dados.

Chaves externas e relacionamentos entre tabelas


Um banco de dados criado para poder gerenciar informaes contidas em tabelas diferentes, sendo que cada uma delas agrupa dados relativos a um mesmo contexto. Pensemos em um sistema de gerenciamento de uma empresa da rea do comrcio de produtos e servios: provavelmente ser necessrio manter um cadastro de clientes, um de fornecedores, um de produtos comercializados e outro de pedidos. Cada um desses cadastros ser estruturado em uma tabela separada, porm, essas tabelas esto diretamente relacionadas, pois, por exemplo, cada pedido envolver um determinado cliente e diversos produtos, dados esses que constam em outras tabelas do mesmo banco de dados. Quando determinados dados de uma tabela esto relacionados a dados do mesmo tipo de outra tabela, possvel estabelecer um relacionamento entre eles. Para entender melhor o conceito de relacionamento entre dados de tabelas diferentes, veja o exemplo a seguir: Suponhamos que uma empresa utiliza um banco de dados para manter o controle de seus clientes, fornecedores, produtos e pedidos; esse banco de dados seria estruturado em quatro tabelas distintas, mostradas a seguir:

Introduo aos bancos de dados


25

26 CPF Endereo CEP Cidade Estado 789888245-65 659666232-45 788332698-87 Tabela 1.2: Clientes. Rua 1 n 999 Av. Z n 888 Pa. C12 n 777 12345-678 12345-789 12345-789 Goinia So Paulo Patos de Minas GO SP MG Endereo CEP 12345-678 12345-789 12345-789 Av. C33 n 555 Rua 98 n 211 Av. 65 n 444 Cidade Rio de Janeiro So Paulo So Paulo Estado RJ SP SP Telefone 3789-9874 3456-9878 3112-9874 Tabela 1.3: Fornecedores.

Crie Banco de Dados em MySQL

Nome_ Completo

Augusto Vsica Daniela Savoi Marianna Favesi

Razo_Social

CNPJ

New-Line Imp. Exp. Ltda. TopTech Ltda. Teratron Ltda.

78945612345654 65498732145654 12365478921123

Cdigo 00121 00232 00454

Descrio DVD +R 4.7 GB PenDrive 2 GB CD-R 700 MB

Valor_Unitrio 1,99 178,00 0,99

Tabela 1.4: Produtos. Num_Pedido


Linha 1 em branco Linha 2 em branco Linha 3 em branco

Nome_Cliente
Linha 1 em branco Linha 2 em branco Linha 3 em branco

Produto
Linha 1 em branco Linha 2 em branco Linha 3 em branco

Valor_Pedido
Linha 1 em branco Linha 2 em branco Linha 3 em branco

Tabela 1.5: Pedidos.

Como podemos observar, a tabela Pedidos contm informaes presentes em duas outras tabelas: o campo Nome_Cliente, que corresponde ao campo Nome_Completo da tabela Clientes, e o campo Produto, que corresponde ao campo Descrio, da tabela Produtos. Em casos como esse, dizemos que se trata de campos relacionados. Geralmente, o relacionamento estabelecido no banco de dados usando a chave primria de uma tabela, relacionando-a com o campo correspondente de outra: o campo relacionado chave primria chamado chave externa e as duas tabelas so chamadas tabelame (que contm a chave primria), e tabela-lha (que contm a chave externa). Os relacionamentos podem ser de vrios tipos: Um-para-um: quando para cada registro da tabela-me corresponde um nico registro na tabela-lha; Um-para-muitos: quando para cada registro na tabela-me h vrios registros na tabela-lha; Muitos-para-muitos: para cada valor do campo de uma tabela, pode haver n valores no campo da outra tabela e vice-versa. Em bancos de dados relacionais, isso normalmente feito por meio de uma tabela de ligao. Vejamos isso com maiores detalhes nos tpicos a seguir.

Introduo aos bancos de dados


27

Relacionamentos um-para-um
Dissemos que duas tabelas possuem relacionamento um-paraum quando, para cada linha da tabela principal (ou tabela-me), existe apenas uma linha na tabela-lha, e vice-versa. Trata-se de um tipo de relacionamento pouco empregado.

Relacionamentos um-para-muitos
Duas tabelas esto relacionadas na modalidade um-para-muitos quando, para cada registro da tabela principal, podem ter zero, um ou mais registros relacionados na tabela secundria, mas, para cada registro da tabela secundria, h apenas um registro na tabela principal. Ao contrrio do anterior, esse tipo de relacionamento muito usado nas estruturas dos bancos de dados, por isso, de suma importncia entender seu funcionamento. Veja um exemplo a seguir: O nosso banco de dados possui uma tabela na qual inserimos os dados relativos aos clientes da nossa empresa, com a estrutura apresentada na Tabela 1.2: Clientes. Suponhamos que seja necessrio inserir nesta tabela os dados relativos aos nmeros de telefone de cada cliente. Algumas pessoas possuem apenas um nmero, outras dois (residencial e celular), trs (residencial, celular e comercial), ou at mesmo quatro ou mais nmeros para contato. Para contemplar todas as possibilidades, seria necessrio adicionar pelo menos quatro colunas nossa tabela, como mostrado a seguir:
Telefone_residencial Telefone_celular Telefone_comercial Linha 1 em branco Linha 2 em branco Linha 1 em branco Linha 2 em branco Linha 1 em branco Linha 2 em branco Telefone_outro Linha 1 em branco Linha 2 em branco

Tabela 1.6: Nmeros de telefone.

Seria uma soluo simples, mas no a melhor, pois diversos registros poderiam apresentar campos vazios, pois nem todas as pessoas possuem quatro nmeros de telefone, ou, ainda, se algum de

Crie Banco de Dados em MySQL


28

nossos clientes tiver mais de quatro nmeros para contato seramos obrigados a desconsiderar parte deles, porque no h campos onde inseri-los. A soluo ideal para casos como esse adicionar ao banco de dados uma nova tabela, chamada, por exemplo, Telefones, cuja estrutura poderia ser como a mostrada a seguir:
Cdigo_Telefone Linha 1 em branco Linha 2 em branco ID_Cliente Linha 1 em branco Linha 2 em branco Tabela 1.7: Telefones. N_Telefone Linha 1 em branco Linha 2 em branco

Nesta tabela, o campo Cdigo_Telefone, a chave primria e o campo ID_Cliente a chave externa, ou seja, um campo relacionado com a chave primria da tabela Clientes (que poderia ser o campo CPF) que estabelece um relacionamento entre cada cliente e seus respectivos nmeros de telefone. Para cada pessoa listada na tabela Clientes, pode haver nenhum, um ou mais nmeros na tabela Telefones; a correspondncia entre os registros das duas tabelas realizada por maio do campo ID_ Cliente da tabela Telefones, que, estando relacionado com o campo CPF (chave primria da tabela Clientes), identica de maneira unvoca cada cliente da tabela e associa a ele os nmeros de telefone digitados na tabela. No obrigatrio que para cada cliente da tabela Clientes haja um nmero correspondente na tabela Telefones, porm, para cada nmero de telefone na tabela Telefones pode existir apenas UM cliente relacionado. Em outras palavras, UM cliente pode possuir MUITOS nmeros de telefone. A Figura 1.13 mostra, de maneira esquemtica, um relacionamento um-para-muitos.

Introduo aos bancos de dados


29

Figura 1.13: O esquema de um relacionamento um-para-muitos: esquerda, a tabela Clientes, o lado um, e, direita, a tabela Telefones, o lado muitos. Para cada cliente, identicado de maneira unvoca pelo campo CPF a chave primria podem existir vrios registros na tabela Telefones. Os dados so relacionados graas ao campo ID_Cliente, que o CPF do cliente do qual desejamos cadastrar o(s) nmero(s).

Relacionamentos muitos-para-muitos
Temos um relacionamento muitos-para-muitos quando, para cada registro da tabela-me, existem vrios registros correspondentes na tabela-lha, e vice-versa. Esse tipo de relacionamento s pode ser criado com a ajuda de uma outra tabela, denominada tabela de associao, que se torna uma intermediao entre as outras duas. Esta tabela dever possuir duas chaves externas, uma para a tabela principal (me) e outra para a tabela secundria (lha). As duas tabelas devero estar ligadas com a terceira por um relacionamento do tipo um-para-muitos.

Crie Banco de Dados em MySQL


30

Para car mais claro, utilizaremos como exemplo um banco de dados para o controle de livros de uma biblioteca; podemos organizar nossos dados em trs tabelas: Livros, Autores e Editoras. A estrutura dessas tabelas seria mais ou menos assim:
ISBN Linha 1 em branco Linha 2 em branco Ttulo Linha 1 em branco Linha 2 em branco Ano Linha 1 em branco Linha 2 em branco Cdigo_Editora Linha 1 em branco Linha 2 em branco

Tabela 1.8: Livros.


Cdigo_Autor Linha 1 em branco Linha 2 em branco Nome_Autor Linha 1 em branco Linha 2 em branco

Tabela 1.9: Autores.


Cdigo_Editora Linha 1 em branco Linha 2 em branco Nome Linha 1 em branco Linha 2 em branco Cidade Linha 1 em branco Linha 2 em branco Estado Linha 1 em branco Linha 2 em branco

Tabela 1.10: Editoras.

A tabela Livros contm informaes sobre os livros disponveis e usa como chave primria o campo ISBN, um cdigo que identica todos os livros publicados no mundo de maneira unvoca. Sabemos que, para cada editora, podemos ter muitos livros, ento estabelecemos um relacionamento um-para-muitos entre as tabelas Editora (um) e Livros (muitos); o campo responsvel pelo relacionamento Cdigo_Editora, presente em ambas as tabelas e que na tabela Editoras a chave primria, enquanto na tabela Livros a chave externa.

Introduo aos bancos de dados


31

O relacionamento entre as tabelas Livros e Autores um pouco mais complexo, pois, para cada autor, podemos ter mais de um livro e vice-versa, ou seja, um mesmo livro pode ter sido escrito por mais de um autor; trata-se de um relacionamento muitos-para-muitos. Para estabelecer esse relacionamento, ser necessrio criar uma quarta tabela, que chamaremos Ttulos_e_Autores, a qual ser usada para realizar a associao entre as tabelas Livros e Autores. Sua estrutura pode ser assim:
ISBN Linha 1 em branco Linha 2 em branco Cdigo_Autor Linha 1 em branco Linha 2 em branco

Tabela 1.11: Ttulos e autores.

Como podemos observar, esta tabela possui um campo ISBN, relacionado com a chave primria da tabela Livros, e um campo Cdigo_Autor, relacionado com o mesmo campo que a chave primria da tabela Autores. Assim, a tabela Ttulos_e_Autores funciona como uma ponte entre as tabelas Livros e Autores, realizando o relacionamento muitospara-muitos. O esquema desse relacionamento pode ser visto na Figura 1.14.

Figura 1.14: Representao esquemtica de um relacionamento muitos-para-muitos. Veja como a tabela Ttulos_e_Autores que possui duas chaves primrias funciona como uma ponte de ligao entre as tabelas Livros e Autores.

Normalizao de formas normais


As Formas Normais so critrios rigorosos usados para auxiliar no planejamento das tabelas de um banco de dados relacional e so

Crie Banco de Dados em MySQL


32

baseadas nas teorias dos conjuntos e da lgica matemtica. Ao longo do tempo, foram encontradas e denidas vrias formas normais, que estabelecem vnculos para nveis progressivos, ou seja, uma tabela construda de acordo com a terceira Forma Normal, por exemplo, respeita tambm a primeira e a segunda.

A Primeira Forma Normal (1FN)


Vejamos, no exemplo a seguir, como funciona a Primeira Forma Normal (ou First Normal Form 1NF, como chamada em ingls). Utilizaremos como exemplo a tabela mostrada a seguir:
Nome Completo Doodle Moraz Fernando de Castro Junqueira Marianna Favesi Augusto Vsica Margarida Ferreira dos Santos Daniela Savoi Endereo Av. C32 n 666, Goinia GO Rua B n 456, Goinia GO Pa. C12 n 777, Patos de Minas MG Rua 1 n 999, Goinia GO Rua 7 n 234, Ribeiro Preto SP Av. Z n 888, So Paulo SP

Tabela 1.12: Nome completo e endereo.

Os itens listados nas linhas da tabela so pessoas, e as colunas contm apenas duas informaes para cada uma delas: o nome completo e o endereo Observao: os dados apresentados na tabela anterior e em outras tabelas so, obviamente, ctcios. Ao acompanhar os procedimentos desse livro, no ser necessrio copi-los, use dados de sua preferncia e, quando necessrio, ajuste os critrios utilizados nas explicaes para adequ-los s informaes inseridas. Preocupe-se apenas em manter a estrutura das tabelas mostradas, isto , a quantidade e o tipo de campo, as chaves primrias etc. Se desejssemos classicar os dados desta tabela em ordem alfabtica crescente pelo sobrenome, seria impossvel, pois o sobrenome est junto com o nome dentro do campo Nome Completo e, alm disso, encontra-se depois do nome.

Introduo aos bancos de dados


33

Dada a estrutura da tabela, no conseguiramos tambm extrair, por exemplo, as pessoas que moram na mesma cidade ou estado, pois esses dados se encontram misturados com a rua e o nmero, no campo Endereo. Se organizarmos os dados, como mostrado na tabela a seguir, poderemos realizar as operaes citadas anteriormente (e muitas outras) com extrema facilidade:
Nome Sobrenome Completo Doodle Fernando Marianna Augusto Margarida Daniela Moraz de Castro Junqueira Favesi Vsica Ferreira dos Santos Savoi Endereo Cidade Estado

Av. C32 n 666 Rua B n 456 Pa. C12 n 777 Rua 1 n 999 Rua 7 n 234 Av. Z n 888

Goinia Goinia Patos de Minas Goinia Ribeiro Preto So Paulo

GO GO MG GO SP SP

Tabela 1.13: Detalhes dos clientes.

Veja como todas as informaes, com base nas quais poderemos querer trabalhar (ltrar, excluir, classicar etc.), encontram-se separadas em campos diferentes. Uma tabela com essa estrutura respeita a Primeira Forma Normal, que determina que cada coluna deva conter apenas um atributo, ou seja, uma informao, relacionada ao item relacionado naquela linha; em outras palavras, o contedo de uma coluna deve ser um nico dado no divisvel.

A Segunda Forma Normal (2FN)


Vamos analisar agora um exemplo um pouco mais complexo. A tabela a seguir, que faz parte de um banco de dados de uma em-

Crie Banco de Dados em MySQL


34

presa, tem como propsito reunir as informaes sobre a quantidade de horas trabalhadas por cada funcionrio em cada projeto em desenvolvimento.
Matrcula Nome do Funcionrio Projeto Horas Trabalhadas 28; 30; 12

FV-911

Doodle Moraz

Projeto-AX; Projeto-BX; Projeto-CX Projeto-BX; Projeto-DX Projeto-DX Projeto-AX; Projeto-CX Projeto-BX Projeto-CX; Projeto-DX

FV-465

Fernando de Castro Junqueira

41; 13

FV-732 FV-245

Marianna Favesi Augusto Vsica

9 32; 18

FV-348 FV-611

Margarida Ferreira dos Santos Daniela Savoi

8 26; 31

Tabela 1.14: Horas trabalhadas.

Observando a tabela, notamos que no respeita a Primeira Forma Normal, pois os campos Nome do Funcionrio, Projeto e Horas Trabalhadas podem ser divididos em campos separados, como mostrado a seguir:

Introduo aos bancos de dados


35

36
Projeto 1 Projeto 1 28 Projeto-BX Projeto-AX Projeto-BX 32 8 Projeto-CX 26 Projeto-DX 31 41 Projeto-CX 18 Projeto-BX 30 Projeto-CX Projeto 2 Hs Projeto 2 Projeto 3 Hs Hs Projeto 3 12 Projeto-DX Projeto-DX 13 9 Projeto 4 Hs Projeto 4 Projeto-AX

Crie Banco de Dados em MySQL


Tabela 1.15: Detalhes de horas trabalhadas por projeto.

Matrcula

Nome do

Sobrenome do

Funcionario Funcionario

FV-911

Doodle

Moraz

FV-465

Fernando

de Castro Junqueira

FV-732

Marianna

Favesi

FV-245

Augusto

Vsica

FV-348

Margarida

Ferreira dos Santos

FV-611

Daniela

Savoi

Esta nova estrutura respeita a Primeira Forma Normal, porm, no cou fcil de se consultar, pois deixa muitas clulas vazias. Alm disso, se surgisse um quinto projeto (e um sexto, um stimo etc.) seria preciso modicar a estrutura da tabela adicionando duas novas colunas para cada novo projeto (Projeto 5 e Hs Projeto 5, e assim por diante). Para organizar melhor esses dados, recomendvel criar duas tabelas distintas, ambas de acordo com a Primeira Forma Normal, e relacionadas entre si. Portanto, a soluo seria criar uma tabela que contenha apenas os dados relativos aos funcionrios (que chamaremos de tabela Funcionrios), assim:
Matrcula FV-911 FV-465 FV-732 FV-245 FV-348 FV-611 Nome do Funcionrio Sobrenome do Funcionrio Doodle Fernando Marianna Augusto Margarida Daniela Moraz de Castro Junqueira Favesi Vsica Ferreira dos Santos Savoi Tabela 1.16: Funcionrios.

Nesta tabela, deniremos uma chave primria que identique de maneira unvoca cada funcionrio, neste caso, o campo Matrcula. Ento, criaremos uma segunda tabela, chamada Andamento de Projetos, na qual inseriremos os projetos em andamento e a quantidade de horas, relacionando cada projeto ao respectivo funcionrio por meio da chave externa, que o nmero de matrcula. A estrutura dessa tabela poderia ser a seguinte:
Matrcula Projeto Horas Trabalhadas 28 32 30 41 8 12 18 26

FV-911 FV-245 FV-911 FV-465 FV-348 FV-911 FV-245 FV-611

Projeto-AX Projeto-AX Projeto-BX Projeto-BX Projeto-BX Projeto-CX Projeto-CX Projeto-CX

Introduo aos bancos de dados


37

Matrcula FV-465 FV-732 FV-611

Projeto Projeto-DX Projeto-DX Projeto-DX

Horas Trabalhadas 13 9 31

Tabela 1.17: Andamento de Projetos.

Nesta tabela, deniremos uma chave primria composta, ou seja, formada por mais de um campo que, neste caso, sero Matrcula e Projeto. Agora a nossa tabela, ou melhor, a estrutura dela, foi adequada Segunda Forma Normal (2FN), segundo a qual as colunas de uma tabela devem conter atributos relacionados a um nico item da tabela, identicado pela chave primria. Em palavras mais simples, uma tabela no deve conter campos com dados redundantes. Suponhamos, agora, que seja preciso acrescentar na tabela Andamento de Projetos um campo no qual ser inserida uma breve descrio do projeto. Provavelmente modicaremos a estrutura da tabela da seguinte forma:
Matrcula Projeto Horas Trabalhadas 28 Descrio

FV-911

Projeto-AX

Realizao de material publicitrio para a empresa X Realizao de material publicitrio para a empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123

FV-245

Projeto-AX

32

FV-911

Projeto-BX

30

FV-465

Projeto-BX

41

FV-348

Projeto-BX

FV-911

Projeto-CX

12

FV-245

Projeto-CX

18

Crie Banco de Dados em MySQL


38

Matrcula FV-611

Projeto Projeto-CX

Horas Trabalhadas 26

Descrio Realizao da abertura do programa de TV 123 Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y

FV-465

Projeto-DX

13

FV-732

Projeto-DX

FV-611

Projeto-DX

31

Tabela 1.18: Andamento de Projetos.

Assim estruturada, a tabela respeita a Primeira Forma Normal, mas no a Segunda, pois h informaes repetidas no campo Descrio. Portanto, ser preciso criar mais uma tabela, que podemos chamar Detalhes de Projetos, com as caractersticas mostradas a seguir:
Projeto Projeto-AX Projeto-AX Projeto-BX Projeto-BX Projeto-BX Projeto-CX Projeto-CX Projeto-CX Projeto-DX Projeto-DX Projeto-DX Descrio Realizao de material publicitrio para a empresa X Realizao de material publicitrio para a empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123 Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y Tabela 1.19: Detalhes de Projetos.

Neste caso, a chave primria o campo Projeto, cujo contedo um nome que identica de maneira unvoca cada projeto em andamento.

Introduo aos bancos de dados


39

A Terceira Forma Normal (3FN)


A Terceira Forma Normal nos impe outra diretriz a ser seguida: nenhum atributo pode depender de outro que no seja a chave primria. Para entender melhor, vejamos mais um exemplo que usa o sistema de controle de projetos dos tpicos anteriores. Suponhamos que surja a necessidade de acrescentar, para cada projeto, o nome do respectivo Supervisor; provavelmente, seramos levados a reestruturar a tabela Detalhes de Projetos da seguinte maneira:
Projeto Projeto-AX Descrio Realizao de material publicitrio para a empresa X Realizao de material publicitrio para a empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123 Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y ID_Supervisor SV-1504 Nome_Supervisor Frederico

Projeto-AX

SV-1504

Frederico

Projeto-BX

SV-1512

Mrcio

Projeto-BX

SV-1512

Mrcio

Projeto-BX

SV-1512

Mrcio

Projeto-CX

SV-2606

Luciane

Projeto-CX

SV-2606

Luciane

Projeto-CX

SV-2606

Luciane

Projeto-DX

SV-0906

Eduardo

Projeto-DX

SV-0906

Eduardo

Projeto-DX

SV-0906

Eduardo

Tabela 1.20: Nome do Supervisor.

Crie Banco de Dados em MySQL


40

Com essa nova estrutura, porm, a tabela no respeita nem a Segunda Forma Normal nem a Terceira Forma Normal: primeiramente porque existem dados redundantes nos registros da tabela, e tambm porque o atributo Nome_Supervisor no depende da chave primria da tabela (que o campo Projeto), e sim, de um outro cdigo (no campo ID_Supervisor) que no chave primria. Para que o nosso banco de dados seja normalizado, isto , respeite todas as Formas Normais, ser preciso criar uma nova tabela, que no nosso exemplo chamamos Supervisores, que contenha apenas os dados relativos aos supervisores e que ser o lado um de um relacionamento um-para-muitos com a tabela Detalhes de Projetos, na qual permanecer apenas o campo ID_Supervisor que ser a chave externa usada para estabelecer o relacionamento com o mesmo campo (a chave primria) da tabela Supervisores. Resumindo, essa ser a estrutura das tabelas Detalhes de Projetos e Supervisores:
Projeto Projeto-AX Projeto-AX Projeto-BX Projeto-BX Projeto-BX Projeto-CX Projeto-CX Projeto-CX Projeto-DX Projeto-DX Projeto-DX Descrio Realizao de material publicitrio para a empresa X Realizao de material publicitrio para a empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Desenvolvimento do website da empresa X Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123 Realizao da abertura do programa de TV 123 Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y Desenvolvimento do website da empresa Y ID_Supervisor SV-1504 SV-1504 SV-1512 SV-1512 SV-1512 SV-2606 SV-2606 SV-2606 SV-0906 SV-0906 SV-0906

Tabela 1.21: Detalhes de Projetos. ID_Supervisor SV-1504 SV-1504 SV-1512 SV-1512 SV-1512 SV-2606 Nome_Supervisor Frederico Frederico Mrcio Mrcio Mrcio Luciane

Introduo aos bancos de dados


41

ID_Supervisor SV-2606 SV-2606 SV-0906 SV-0906 SV-0906

Nome_Supervisor Luciane Luciane Eduardo Eduardo Eduardo

Tabela 1.22: Supervisores.

Depois de rever a estrutura das tabelas do nosso exemplo para adequ-la s trs Formas Normais, obteremos um banco de dados articulado em quatro tabelas, como podemos ver no esquema da Figura 1.15.

Figura 1.15: O banco de dados usado para o nosso exemplo, respeita agora as trs Formas Normais. Veja como cada tabela est relacionada com a(s) outra(s). Os campos com asterisco representam as chaves primrias de cada tabela.

Algumas consideraes sobre planejamento


preciso lembrar que as regras xadas para as trs Formas Normais so cumulativas; isto quer dizer que, para respeitar a Terceira Forma Normal, a primeira e a segunda tambm devem ser respeitadas. Vale a pena ressaltar que, na teoria desenvolvida por especialistas em bancos de dados, foram denidas outras Formas Normais para a padronizao da estrutura das tabelas, contudo, a aplicao das trs formas vistas neste captulo mais que suciente para criar bancos de dados normalizados, bem planejados e, principalmente, funcionais.

Crie Banco de Dados em MySQL


42

Na fase de planejamento das tabelas que agruparo os dados do nosso banco de dados, o conhecimento das Formas Normais muito importante, todavia, indispensvel analisar e denir com cuidado as nalidades do banco de dados e traar os resultados que se deseja obter. No se esquea que um banco de dados deve ser basicamente uma ferramenta para manipular com maior facilidade dados que, na maioria dos casos, so a matria-prima do nosso trabalho ou atividade.

Introduo aos bancos de dados


43

Captulo 2
Trabalhando com o SQL (Parte 1)

Introduo
Por incrvel que parea, a linguagem SQL no trazia, originalmente, nenhum comando para a criao de um banco de dados. Isto pode parecer ilgico, mas existe uma explicao: o SQL uma ferramenta para criar, gerenciar e utilizar tabelas, enquanto o banco de dados o objeto (software) que as contm. De fato, no faz parte das nalidades do SQL denir caractersticas e funcionamento de um banco de dados, mas apenas manipular dados contidos dentro de tabelas. Todavia, precisamos de um banco de dados para, em seguida, estruturar as tabelas e inserir os dados a serem armazenados, por isso, todas as implementaes do SQL trazem pelo menos um comando para criar um banco de dados vazio e algumas ferramentas para excluir bancos de dados existentes. Ao criar um banco de dados como MySQL em ambiente Windows, criada apenas uma pasta vazia, dentro da qual sero armazenados os arquivos gerados utilizando os comandos para criar tabelas. Em outros SGBDR (Sistemas para o Gerenciamento de Bancos de Dados Relacionais), como o Oracle ou o Microsoft SQL Server, por exemplo, o comando para a criao de um novo banco de dados gera estruturas de dados complexas. Todos os procedimentos e exemplos dos tpicos deste captulo sero baseados no software MySQL. Na medida em que digitamos uma linha de comando, a interface do MySQL Control Center destaca na cor azul e em negrito as palavras reconhecidas como palavras-chave do SQL, deixando as demais palavras em estilo normal e na cor cinza. As palavras-chave podem ser digitadas em maisculo ou minsculo, sem problemas, tanto no MySQL como nos demais softwares para o uso desta linguagem. No decorrer dos exemplos deste livro, usaremos tipos de fonte diferentes para representar as linhas de cdigo para realizarmos operaes em bancos de dados com o Structured Query Language (SQL). Veja alguns exemplos: Todas as palavras-chave das instrues SQL sero escritas em maisculo, como mostrado a seguir:

Crie Banco de Dados em MySQL


46

CREATE TABLE

Os elementos, ou parmetros, especicados para cada comando aparecero em itlico, como no exemplo a seguir:
CREATE TABLE nome _ da _ tabela

Parmetros ou comandos opcionais, isto , instrues adicionais dadas aos comandos, aparecero em maisculo e dentro de colchetes, assim:
CREATE TABLE [IF NOT EXISTS] nome _ da _ tabela

Quando, em uma instruo, podemos utilizar um entre vrios parmetros alternativos, todas as opes sero apresentadas e separadas por barras verticais (|). Caso esses parmetros sejam opcionais, sero listados entre colchetes, como no exemplo a seguir:
DROP TABLE nome _ da _ tabela [RESTRICT | CASCADE]

Nos casos em que obrigatrio escolher um parmetro dentro de uma srie de opes, a lista das alternativas ser exibida dentro de chaves, e cada parmetro disponvel ser separado dos outros por barras verticais, como mostrado a seguir:
UPDATE {nome _ da _ tabela | nome _ da _ view}

Em algumas circunstncias, possvel que um mesmo elemento possa ser repetido diversas vezes; nesses casos, usaremos a seguinte representao:
Col1, col2, ...

Quando, no meio de uma linha de comando, encontrarmos parnteses e vrgulas, esses elementos constituem parte integrante da linha de comando e devem ser escritas exatamente como apresentado no livro. J os colchetes [ ] e as chaves { } no devero ser digitados (veja o signicado desses elementos nos pargrafos anteriores).

Trabalhando com o SQL (parte 1)


47

As linhas de comando SQL podem ser muito compridas, portanto, possvel que se articulem em mais de uma linha na tela do computador. A quebra de linha pode ocorrer em qualquer lugar da linha em que seja necessrio dar um espao. Jamais devemos quebrar palavras-chave ou nomes de parmetros e opes. Na linguagem SQL, toda linha de comando (ou instruo) deve ser encerrada com o caractere ponto-e-vrgula (;). Todavia, muitos ambientes de programao aceitam sua omisso, o que no prejudica o funcionamento do cdigo. A linguagem SQL no impe nenhum limite quanto ao tamanho das tabelas criadas, isto , quantidade de linhas e colunas. Entretanto, cada ambiente de desenvolvimento apresenta as suas prprias limitaes. No caso do ambiente MySQL, os limites so praticamente innitos, pois as tabelas criadas por esse SGBDR nada mais so que simples arquivos gerados de acordo com as especicaes do sistema operacional no qual estamos trabalhando. Portanto, no h nada que impea de criar uma tabela de tamanho considervel (um ou mais gigabytes, por exemplo), contudo, uma tabela com essas caractersticas traria problemas na fase de trabalho, pois nem todo computador seria capaz de gerenciar corretamente tamanha quantidade de dados em uma s tabela. Por isso, deveremos sempre levar em considerao o conceito de base que norteia a criao de um banco de dados: os dados devem ser sempre ordenados em vrias tabelas, cada qual contendo dados homogneos, ou seja, do mesmo tipo.

Criando um novo banco de dados


Vejamos, ento, como se cria um novo banco de dados utilizando o MySQL. Siga os passos a seguir: 1. Ative o MySQL Command Line Client e, ao ser solicitado, digite a sua senha de acesso. 2. No Prompt do MySQL, digite a seguinte linha de comando:
mysql> CREATE DATABASE Teste; [Enter]

Lembre-se de nalizar sempre as linhas de comando com o caractere ponto-e-vrgula. O novo banco de dados foi criado e o MySQL nos informa disso exibindo uma mensagem (em ingls) logo depois da instruo que digitamos:

Crie Banco de Dados em MySQL


48

mysql> CREATE DATABASE Teste; Query OK, 1 row affected (0.08 sec) mysql>

3. Podemos vericar rapidamente a existncia do banco de dados recm-criado, bem como a de todos os outros criados anteriormente, utilizando a instruo SHOW DATABASES (mostrar bancos de dados); para isso, digite a seguinte linha de comando:
mysql> SHOW DATABASES; +---------------------+ | Databases | +---------------------+ | information _ schema | | mysql | | test | | teste | +---------------------+ 4 rows in set (0.05 sec) [Enter]

Como podemos observar, exibida a lista dos bancos de dados existentes que, no nosso exemplo, so quatro; os primeiros trs so criados na instalao do MySQL (information_schema, mysql e test), o ltimo (teste), foi criado por ns usando o comando CREATE DATABASE (criar banco de dados). O comando SHOW DATABASES muito til para sabermos os nomes dos bancos de dados j existentes, visto que no podemos criar dois bancos de dados com o mesmo nome. Por exemplo, se tentssemos criar novamente o banco de dados teste, receberamos a seguinte mensagem de erro:
Cant create database Teste Database exists .

A mensagem nos informa que no possvel criar um banco de dados com o nome teste, pois ele j existe. Este tipo de erro pode ser prevenido acrescentando ao comando CREATE a clausula if not exists (em ingls se no existe). Veja um exemplo:
mysql> CREATE DATABASE IF NOT EXISTS Teste; [Enter]

Trabalhando com o SQL (parte 1)


49

Traduzindo ao p da letra, seria algo como: Se no existe, crie o banco de dados Teste. Caso o banco de dados tenha sido criado com sucesso, ser exibida a mensagem j vista no Passo 2 desses procedimentos. Se j houver um banco de dados com o nome especicado, nada acontecer e no ser exibida qualquer mensagem de erro, devido clusula limitativa que especicamos. Ao denirmos o nome do novo banco de dados, precisamos respeitar algumas limitaes: O comprimento mximo do nome no pode superar 64 caracteres; Podemos usar letras, nmeros, traos, underlines; desaconselhase o uso de acentos e cedilhas, e proibido o uso de barras (/ ou \) e pontos (.).

Excluindo um banco de dados


No tpico anterior, vimos como criar um banco de dados com o comando CREATE DATABASE. Vejamos agora como excluir um banco de dados existente. preciso ressaltar que, ao apagar um banco de dados, todas as suas tabelas e os dados nelas contidos tambm sero apagados e, portanto, perdidos de maneira irreversvel. Para excluir um banco de dados, usa-se o comando DROP DATABASE; para excluir, por exemplo, o banco de dados Teste criado no tpico anterior, faa o seguinte: 1. No prompt do MySQL, digite a linha de comando como mostrada a seguir:
mysql> DROP DATABASE Teste; [Enter]

2. Ser exibida a mensagem de conrmao a seguir (o valor entre parnteses o tempo que o computador levou para realizar a operao):
mysql> DROP DATABASE Teste; Query OK, 1 row affected (0.05 sec)

Se tentarmos apagar um banco de dados que no existe, receberemos uma mensagem de erro. Por exemplo, tente apagar novamen-

Crie Banco de Dados em MySQL


50

te o banco de dados Teste. Como ele j foi excludo e, portanto, no existe mais, o MySQL mostrar esta mensagem:
ERROR 1008 (HY000): Cant drop database Teste; database doesnt exist

O que signica que no foi possvel apagar o banco de dados Teste, pois ele no existe. Podemos evitar esse erro usando a clusula IF EXISTS (se existe, em ingls), da seguinte maneira:
mysql> DROP DATABASE IF EXISTS Teste; [Enter]

Traduzindo o comando em portugus, caria mais ou menos assim: Exclua o banco de dados Teste, caso exista.

Selecionando um banco de dados


Como vimos, podemos criar vrios bancos de dados, porm, podemos manipular apenas um por vez. Assim, antes de comear, preciso selecionar qual ser o banco de dados que queremos alterar. Isso feito utilizando o comando USE (usar em ingls), seguido pelo nome do banco de dados em questo. Ento, faamos o seguinte: vamos criar um novo banco de dados, listar os bancos de dados existentes e, por m, selecionar o nosso para que possa ser manipulado. Siga os passos a seguir: 1. No prompt do MySQL, digite:
mysql> CREATE DATABASE MeuBD; [Enter]

2. Recebida a mensagem de conrmao, digite:


mysql> SHOW DATABASES; [Enter]

Que resultar na seguinte lista:


+---------------------+ | Databases | +---------------------+ | information _ schema | | meubd |

Trabalhando com o SQL (parte 1)


51

| mysql | | test | +---------------------+ 4 rows in set (0.05 sec)

3. Note que o segundo item da lista o banco de dados recmcriado; ento, digite:
mysql> USE MeuBD; [Enter]

A mensagem Database changed nos informa que o banco de dados foi ativado. O comando USE no prev o uso de argumentos (clusulas), portando, no possvel, por exemplo, usar IF EXISTS para evitar erros. Alm disso, preciso digitar o nome do banco de dados que se deseja ativar exatamente da mesma forma em que foi digitado ao cri-lo. Assim, recomendamos sempre usar o comando SHOW DATABASES para visualizar os nomes dos bancos de dados, mais especicamente do banco de dados que se deseja utilizar, para no incorrer em mensagens de erro.

Criando e listando as tabelas


No tpico Criando um novo banco de dados aprendemos a usar o comando CREATE associado ao objeto DATABASE para criar um banco de dados. O comando CREATE pode ser associado tambm ao objeto TABLE (tabela) para criar novas tabelas no banco de dados ativo. De fato, o comando CREATE TABLE um dos mais importantes da linguagem SQL, pois a partir de uma nova tabela que comearemos a manipulao dos dados. A sintaxe deste comando a seguinte:
CREATE [GLOBAL TEMPORARY | LOCAL TEMPORARY] TABLE nome _ da _ tabela [ON COMMIT {PRESERVE ROWS | DELETE ROWS}] (nome _ da _ coluna tipo _ de _ dados especicaes, [nome _ da _ coluna, tipo _ de _ dados especicaes2,...]) | [LIKE nome _ da _ tabela] | [vnculo _ tabela],...n] ]

Crie Banco de Dados em MySQL


52

Vista assim, a sintaxe pode parecer muito complexa. Na verdade, mais simples do que possamos pensar. Vamos nos aprofundar um pouco mais. Antes de tudo, importante lembrar que cada dialeto do SQL pode apresentar inmeras opes e argumentos adicionais para este comando, alm das previstas pelo padro SQL99. Obviamente, nos nossos exemplos veremos como usar o comando CREATE TABLE no MySQL, comeando pelas opes mais bsicas para, em seguida, analisarmos as mais complexas. Uma tabela deve ter um nome e pelo menos uma coluna, tambm identicada com um nome prprio e obrigatoriamente diferente do nome da tabela. Visto que as colunas so, na verdade, recipientes de dados, para cada tipo de coluna preciso denir que tipo de dados conter (nmeros, textos etc.), especicando uma ou mais caractersticas (especicaes) que identiquem aquele determinado tipo de dados. Assim, considerando apenas as opes essenciais, a sintaxe do comando CREATE TABLE a seguinte:
CREATE TABLE nome _ da _ tabela (nome _ coluna1 tipo _ de _ dados especicaes, [nome _ coluna2 tipo _ de _ dados especicaes,...]

Com base nas informaes que possumos at o momento, vamos criar uma tabela, que chamaremos de Cadastro, cuja estrutura composta por duas colunas (Nome e sobrenome). Observao: lembre-se que para criar uma tabela indispensvel selecionar o banco de dados que a conter. No tpico Selecionando um banco de dados, criamos e selecionamos um banco de dados vazio chamado MeuBD. Se desejar acompanhar os procedimentos descritos a seguir, voc dever estar com um banco de dados criado e ativo. Ento, siga os passos mostrados: 1. No prompt do MySQL, digite esta linha de comando:
mysql> CREATE TABLE Cadastro (Nome CHAR (15), Sobrenome CHAR (20)); [Enter]

Trabalhando com o SQL (parte 1)


53

Vejamos em detalhes o que signica a instruo digitada: primeiramente foi usado o comando CREATE TABLE (criar tabela), seguido pelo nome da tabela a ser criada (no nosso exemplo, Cadastro). Entre parnteses, denimos o nome da primeira coluna (Nome), o tipo de dados (CHAR, ou seja, caracteres de texto) e o tamanho mximo dos dados desta coluna (15); em outras palavras, criamos uma coluna chamada Nome, que conter um texto de, no mximo, 15 caracteres. Aps a vrgula, denimos as caractersticas da segunda coluna, que se chama Sobrenome, tambm conter textos (CHAR) e seu comprimento mximo ser de 20 caracteres. Neste caso, CHAR uma palavra-chave que identica o tipo de dados que a coluna armazenar. Congurando uma coluna para armazenar dados desse tipo, no signica que no poderemos digitar nmeros, mas sim que, mesmo que seu contedo seja uma srie numrica, o banco de dados a tratar sempre como se fosse um texto, ou seja, no ser possvel, por exemplo, realizar clculos matemticos com o contedo daquela coluna. 2. Aps termos recebido a mensagem que conrma a execuo do comando (Query OK, 0 rows affected (0.16 sec)), e de voltar ao prompt do MySQL, digite a instruo a seguir para vericar a existncia da tabela criada:
mysql> SHOW TABLES; [Enter]

Ser exibida a lista mostrada a seguir:


+---------------------+ | Tables _ in _ meuBD | +---------------------+ | cadastro | +---------------------+ 1 row in set (0.01 sec)

O comando SHOW no pertence ao padro SQL99 denido por ANSI/ISO, mas encontra-se disponvel em vrios dialetos do SQL. No caso do MySQL, pode ser combinado com a respectiva palavrachave para visualizar uma lista dos bancos de dados existentes (SHOW DATABASES), das tabelas existentes (SHOW TABLES), das colunas de uma tabela etc. Trata-se de um comando muito til quando precisamos vericar rapidamente as caractersticas de um banco de dados

Crie Banco de Dados em MySQL


54

ou de um dos seus elementos antes de digitar a linha de comando que o afetar.

Visualizando a estrutura das tabelas


Podemos tambm analisar a estrutura de uma tabela de maneira aprofundada usando o comando DESCRIBE (descrever, em ingls), seguido pelo nome da tabela. Vejamos como aplic-lo tabela que criamos no tpico anterior: 1. No prompt do MySQL, digite:
mysql> DESCRIBE Cadastro; [Enter]

O resultado ser como mostrado a seguir:


+-------------+ +-----------+ | | Field | | Type +-------------+ +-----------+ | Nome | | char(15) | | Sobrenome | | char(20) | +-------------+ +-----------+ 2 rows in set (0.04 sec) +--------+ | Null | +--------+ | YES | | YES | +--------+ +-------+ | Key | +-------+ | | | | +-------+ +----------+ | Default | +----------+ | NULL | | NULL | +----------+ +--------+ | Extra | +--------+ | | | | +--------+

Assim como o comando SHOW, o comando DESCRIBE tambm no faz parte do padro SQL99, mas muito difuso entre os dialetos SQL. De fato, sua utilidade indiscutvel, como podemos perceber no exemplo anterior, obtivemos uma descrio detalhada das informaes a respeito da nossa tabela. Sua nica limitao que todas essas informaes so exibidas em ingls, o que, se no chega a ser um problema, pelo menos diculta a vida de quem no domina o idioma. Para ajudar a entender, vejamos detalhadamente cada informao que o comando DESCRIBE nos retornou: Na primeira coluna, so exibidos os campos (Field) da nossa tabela, que so Nome e Sobrenome; A segunda coluna nos mostra o tipo de dados (Type) que cada coluna contm. No nosso exemplo, ambas as colunas foram predispostas para armazenar valores alfanumricos (CHAR), porm, a primeira tem limite de 15 caracteres, enquanto a segunda pode conter at 20 caracteres; A terceira coluna (Null) nos informa que ambos os campos podero (Yes) conter valores nulos; A coluna Key se refere chave primria. Na nossa tabela, nenhum dos dois campos foi denido;

Trabalhando com o SQL (parte 1)


55

A quinta coluna (Default) traz informaes sobre qual o valor padro para cada coluna, ou seja, ao inserir um novo registro, qual ser o valor que este ter por padro. Na nossa tabela, ambas as colunas sero vazias (Null); A coluna Extra traz informaes adicionais de qualquer tipo a respeito de cada coluna da tabela. Como no especicamos nenhuma, encontra-se vazia.

Inserindo dados em uma tabela


A tabela Cadastro, que criamos nos tpicos anteriores, ainda no contm dados, pois denimos a sua estrutura, mas ainda no realizamos a insero de valores nas colunas. Para inserir dados nesta e em outras tabelas preciso usar o comando INSERT (inserir, em ingls), cuja sintaxe basicamente a seguinte:
INSERT nome _ da _ tabela VALUES (valor1, valor2,...)

Trata-se de uma sintaxe bastante simples: primeiramente digitamos o comando INSERT seguido pelo nome da tabela na qual queremos inserir os dados; ento, especicamos a clusula VALUES (valores) e, entre parnteses, os valores de cada coluna da tabela, separados por vrgulas. Quando os valores a serem inseridos forem do tipo texto (CHAR) devero ser especicados entre aspas duplas. Veja um exemplo para entender melhor: Vamos inserir na nossa tabela Cadastro o primeiro item, ou seja, a primeira pessoa: 1. Lembre-se que a nossa tabela constituda por dois campos (Nome e Sobrenome), ambos do tipo CHAR (texto); assim, para inserir, respectivamente, o nome e o sobrenome da primeira pessoa, digite o enunciado mostrado a seguir:
mysql> INSERT Cadastro VALUES (Augusto, J. Vsica); [Enter]

2. Em instantes, o MySQL nos retorna a mensagem de conrmao para o comando digitado:


Query OK, 1 row affected (0.06 sec)

Crie Banco de Dados em MySQL


56

Para vericarmos se os dados realmente foram inseridos na tabela, e, o mais importante, se foram inseridos na seqncia correta, preciso visualizar o contedo da tabela que, at o momento, deveria ser de um nico registro; para isso, precisamos do comando SELECT, do qual falaremos no tpico seguinte.

Visualizando o contedo de uma tabela


No tpico anterior, inserimos o primeiro registro na nossa tabela Cadastro, mas o que fazer se desejarmos ver esse contedo para vericar se foi digitado corretamente? para isso que o SQL oferece o comando SELECT, considerado um dos comandos fundamentais da Structured Query Language (SLQ). Este comando pertence ao grupo chamado Data Manipulation Language (DML) Linguagem de Manipulao de Dados e, como o prprio nome deixa imaginar, usado para selecionar dados de uma tabela. O comando SELECT , basicamente, a ferramenta principal para consultar informaes de um banco de dados, por isso, comumente chamado de query (que, em ingls, signica consulta). Sua sintaxe essencial muito simples:
SELECT dados _ desejados FROM nome _ da _ tabela;

Em que dados_desejados aquilo que se deseja obter da tabela especicada como argumento da clusula FROM; em outras palavras, dados_desejados o critrio com base no qual sero extrados os dados da tabela. Para denir esse critrio, podemos usar uma palavra inteira, parte dela, ou, ainda, usar os caracteres especiais asterisco (*) e interrogao (?), cujos signicados so os seguintes: Asterisco (*): signica tudo, ou seja, todos os dados. Pode ser combinado com um ou mais caracteres para especicar conjuntos de dados com algo em comum, por exemplo, em geral, se digitarmos o critrio A* signica que queremos ver todos os registros cujo contedo comea com a letra A; Interrogao (?): representa um caractere desconhecido. Por exemplo, se denirmos como critrio o valor ?????, quer dizer que queremos ver somente os registros que, em determinado campo, contenham valores de cinco caracteres.

Trabalhando com o SQL (parte 1)


57

Vamos utilizar o comando SELECT para visualizar todo o contedo da nossa tabela. Para isso, digite a linha de comando a seguir:
mysql> SELECT * FROM Cadastro; [Enter]

Em poucos instantes, veremos o resultado, que no nosso exemplo ser:


+---------+-------------+ | Nome | Sobrenome | +---------+-------------+ | Augusto | J. Vsica | +---------+-------------+ 1 row in set (0.03 sec)

Experimente agora inserir mais um item na tabela usando o comando INSERT, (como mostrado no tpico Inserindo dados em uma tabela) e, em seguida, visualize o contedo da tabela com a ajuda do comando SELECT.

Consideraes sobre os tipos de dados para as colunas


preciso tomar muito cuidado ao denirmos os tipos de dados para as colunas da tabela em que estamos trabalhando. De fato, se planejarmos de maneira errada as caractersticas dos dados que cada coluna ir conter, correremos o risco de perder dados sem perceber, ou ento, o nosso banco de dados se tornar invivel para se trabalhar. Para entender melhor do que estamos falando, faamos um teste com a nossa tabela Cadastro: sabemos que dispomos de dois campos (Nome e Sobrenome), e que, para cada um deles, foi denido um limite de caracteres (respectivamente, 15 para o primeiro e 20 para o segundo), mas, o que aconteceria se tentssemos inserir na tabela um sobrenome com, por exemplo, 30 ou mais caracteres? Vejamos: 1. Com o banco de dados MeuBD ainda ativo e a tabela Cadastro ainda aberta, digite no prompt do MySQL o enunciado mostrado a seguir:
mysql> INSERT Cadastro VALUES (Luiz Henrique, Magalhes Figueiredo de Castro Jnior); [Enter]

Crie Banco de Dados em MySQL


58

Imediatamente, receberemos do MySQL uma mensagem de erro como mostrado a seguir:


ERROR 1406 (22001): Data too long for column Sobrenome at row 1

Isso signica que digitamos um valor longo demais (TOO LONG) para a coluna Sobrenome e, portanto, o registro no foi inserido. sabido que sobrenomes como o do nosso exemplo no so raros no nosso pas, portanto, evidente que um limite de apenas 20 caracteres para o sobrenome constitui um obstculo para o nosso trabalho. Para evitar erros de planejamento na estrutura das nossas tabelas, veremos neste tpico alguns detalhes importantssimos sobre os tipos de dados que as colunas podem armazenar e as caractersticas de todos eles. A seguir, veremos um exemplo prtico: Um campo destinado a conter caracteres em uma tabela SQL pode conter de 1 at 255 caracteres. Quando este campo denido como CHAR, especicando um comprimento (como na tabela Cadastro do nosso exemplo), estamos denindo um tamanho mximo efetivo e o campo ocupar sempre o mesmo espao na memria do computador, mesmo que contenha menos caracteres; em outras palavras, se denimos um campo CHAR com comprimento de 80 caracteres, este ocupar sempre 80 bytes na memria, mesmo se os dados nele contidos no usam os 80 caracteres reservados. Por isso, os campos do tipo CHAR so chamados de campos com comprimento xo. Dispomos tambm de outro tipo de dado para armazenar seqncias de caracteres, chamado VARCHAR, que aproveita melhor o espao na memria: de fato, ao especicarmos um comprimento para um campo do tipo VARCHAR, estamos denindo um teto mximo e no um tamanho xo. Por isso, os campos desse tipo so tidos como campos com comprimento varivel. Em palavras mais simples, se denirmos um campo como VARCHAR (80) esse campo no ocupar sempre 80 bytes na memria, mas apenas o espao correspondente quantidade efetiva de caracteres nele contidos. evidente, ento, o quanto importante denir corretamente o tipo de dado para cada coluna e como isso afeta de maneira incisiva o funcionamento das tabelas do nosso banco de dados. A seguir, os tipos de dados disponveis na linguagem SQL e os do MySQL, e suas respectivas descries.

Trabalhando com o SQL (parte 1)


59

60
Tipo de dados do padro SQL99 Descrio Usado para nmeros inteiros, positivos ou negativos, que vo de -9.223.372.036.854.775.808 a +9.223.372.036.854.775.807. CHARACTER(n) Usado para seqncias de caracteres de comprimento xo, a quantidade de caracteres denida no parmetro n e pode variar de 1 a 255. Usado para datas (no formato ano-ms-dia), dentro do intervalo de 1000-1-1 a 9999-12-31. Usado para valores de data e hora que vo de 1000-1-1 00:00:00 a 9999-12-31 23:59:59. Usado para nmeros decimais no arredondados, denidos com p nmeros antes da vrgula e s casas decimais. Usado para valores numricos com vrgula varivel, com preciso dupla (at 308 posies). Usado para uma seqncia de caracteres que pode ter somente um valor escolhido dentro de uma lista de valores (Valor1, Valor2,...). Permite selecionar dentro de 65.535 valores diferentes. FLOAT(p) Usado para valores numricos com vrgula varivel (at 38 posies). Usado para nmeros inteiros, positivos ou negativos, que vo de -2.147.483.548 a +2.147.483.547. DATE datetime DECIMAL(p,s) Double precision INT, INTEGER

Tipo de dados do MySQL

bigint

CHAR(n)

Crie Banco de Dados em MySQL

DATE

datetime

DECIMAL(p,s)

DOUBLE(p,s)Double Precision

ENUM(Valor1, Valor2,...)

Float

INT, INTEGER

Tipo de dados do MySQL Binary large object (BLOB)

Tipo de dados do padro SQL99

Descrio Usado para blocos de caracteres binrios ou de texto longo (at 4.294.967.295 caracteres). Usado para blocos de caracteres binrios ou de texto longo (at 16.444.216 caracteres). Usado para nmeros inteiros, positivos ou negativos, que vo de -8.388.608 a +8.388.607.

LONGBLOB, LONGTEXT

MEDIUMBLOB, MEDIUMTEXT

mediumint

NUMERIC(p,s) O mesmo que DECIMAL. O mesmo que DOUBLE PRECISION. Double precision

NUMERIC(p,s)

REAL(p,s)

SET(Valor1, Valor2,...)

Usado para uma seqncia de caracteres que pode ter zero ou mais valores, especicados na lista (Valor1, Valor2,...). A lista pode conter at 64 valores diferentes. smallint Usado para nmeros inteiros, positivos ou negativos, que vo de -32.758 a +32.757. Usado para blocos de texto longo com at 65.536 caracteres. Usado para valores de hora no formato hh:mm:ss. Usado para valores de data e hora que vo de 1970-01-01 00:00:00 at 2037-12-31 23:59:59. O parmetro n pode ter seu valor congurado em 14, 12, 8 ou 6 e se refere ao comprimento do valor armazenado. Usado para valores de BLOB ou TEXT com at 255 caracteres de comprimento.

smallint

TEXT TIME Timestamp

Linha 18 vazia

TIME

TIMESTAMP(n)

Trabalhando com o SQL (parte 1)

TINYBLOB, TINYTEXT

61

62
Tipo de dados do padro SQL99 Descrio Usado para nmeros inteiros, positivos ou negativos, que vo de -128 a +127, ou entre 0 e 255, se no especicar o sinal (+/-). CHARACTER VARYING(n) Usado para seqncias alfanumricas de comprimento varivel, de at 255 caracteres. Usado para valores de anos, com dois ou quatro dgitos, no intervalo de (19)70 at (20)69, para o formato de dois dgitos, ou de 1901 at 2155, para o formato de quatro dgitos - .

Crie Banco de Dados em MySQL

Tipo de dados do MySQL

Tinyint

VARCHAR(n)

YEAR[(2 | 4)]

Tabela 2.1: Tipos de dados disponveis na linguagem SQL e do MySQL, e suas respectivas descries.

Para alguns tipos de dados prevista a indicao de dois parmetros entre parnteses, o primeiro representa a preciso e o segundo a escala. Por exemplo:
DECIMAL(5,2)

Que representa um nmero decimal com preciso 5 e escala 2. A preciso indica a quantidade de valores signicativos que sero armazenados no campo, j a escala representa a quantidade de nmeros aps a vrgula, isto , as casas decimais. Em uma coluna do tipo DECIMAL (5,2), os valores possveis variam de -99,99 e 999,99 (o sinal de menos (-) ocupa uma posio entre as indicadas no parmetro preciso). Esse tipo de dado bastante utilizado para armazenar valores em dinheiro, no arredondveis, enquanto os outros tipos, com vrgula varivel (FLOAT, DOUBLE, REAL), so empregados para armazenar valores numricos potencialmente muito grandes ou muito pequenos adotando a notao cientca, que realiza arredondamentos. Os tipos de dados BLOB (Large Binari Objects) se referem a arquivos no formato binrio, que geralmente contm imagens ou sons. O padro SQL inclui tambm um tipo de dados chamado Boolean, que no existe no MySQL, usado para armazenar os valores lgicos Verdadeiro/Falso. No MySQL isto feito usando o tipo tinyint com parmetro (1).

Sobre a notao cientfica (vrgula varivel)


A notao cientca usada, geralmente, nos clculos relacionados engenharia, astronomia, fsica e a outras cincias para representar, de maneira mais compacta, nmeros muito extensos ou muito pequenos. Essa representao feita utilizando o esquema: m 10 e em que m denominado mantissa e a parte signicativa do nmero em questo, e e o expoente que representa a ordem de grandeza. Para transformar um nmero qualquer para a notao cientca padronizada, devemos deslocar a vrgula obedecendo ao princpio de equlbrio.

Trabalhando com o SQL (parte 1)


63

Vejamos o exemplo a seguir: 253 756,42 A notao cientca padronizada exige que a mantissa esteja entre 1 e 10. Nessa situao, o valor adequado seria 2,5375642 (observe que a seqncia de algarismos a mesma, somente foi alterada a posio da vrgula). Para o exponente, vale o princpio de equilbrio: cada casa decimal que diminui o valor da mantissa aumenta o expoente em uma unidade, e vice-versa. Nesse caso, o expoente 5. Observe a transformao passo a passo: 253 756,42 = 25 375,642 101 = 2 537,5642 102 = 253,75642 103 = 25,375642 104 = 2,5375642 105 Um outro exemplo, com valor menor que 1: 0,0000000475 = 0,000000475 10-1 = 0,00000475 10-2 = 0,0000475 10-3 = 0,000475 10-4 = 0,00475 10-5 = 0,0475 10-6 = 0,475 10-7 = 4,75 10-8 Desse modo, os exemplos anteriores caro, respectivamente, assim: 6 105 3 107 5 1014 7 1033 4 10-4 1 10-8 6 10-16 8 10-49 A notao cientca chamada tambm representao com vrgula mvel (ou varivel) oating point, em ingls porque a posio da vrgula (casas decimais) muda em funo do valor direita do smbolo e. Por exemplo, o nmero 5,83E+130 representa o nmero 583 seguido por 128 zeros. Nos clculos realizados com nmeros cientcos do tipo FLOAT, o MySQL considera as casas decimais at a trigsima oitava posio.

Crie Banco de Dados em MySQL


64

Para os nmeros do tipo DOUBLE PRECISION, as posies decimais consideradas chegam a 308. Obviamente, trata-se de limites muito elevados, que devem ser utilizados apenas quando criamos tabelas nas quais sero realizados clculos cientcos muito complexos e renados. Nos bancos de dados comuns, usados, por exemplo, para gerenciar dados relativos movimentao bancria, controle de estoque, vendas etc., melhor usar o tipo DECIMAL, que armazena dados numricos decimais e sem arredondamentos.

Trabalhando com o SQL (parte 1)


65

Captulo 3
Trabalhando com o SQL (Parte 2)

Criando uma tabela mais complexa


Nos tpicos anteriores, criamos uma tabela chamada Cadastro, cuja estrutura cou bastante simples. Por meio do exemplo, aprendemos a utilizar o comando CREATE TABLE para criar uma nova tabela vazia. J vimos tambm que a sintaxe do comando CREATE TABLE possui uma quantidade considervel de opes (clusulas e parmetros) que permitem criar tabelas extremamente complexas. De fato, os bancos de dados do SQL so usados normalmente para criar e manipular tabelas com estruturas articuladas em inmeras colunas e com os mais diversos tipos de dados. No exemplo desse tpico, criaremos um enunciado mais complexo que criar uma tabela de movimentao bancria, que chamaremos Movimentacao. Siga os passos a seguir: 1. No prompt do MySQL, digite o enunciado mostrado a seguir:
mysql> CREATE TABLE Movimentacao (Codigo INT NOT NULL PRIMARY KEY AUTO _ INCREMENT, Banco CHAR(10), Conta CHAR(10), Tipo CHAR(3), Numero CHAR(3), Data DATETIME, Valor DECIMAL(8,2) NOT NULL, Descricao VARCHAR(50)); [Enter]

Note que a linha de comando foi digitada sem caracteres acentuados e substituindo os cedilhas por c comuns, pois a sintaxe do MySQL no permite o uso desses tipos de caracteres. 2. Aguarde a mensagem de conrmao:
Query OK, 0 rows affected (0.06 sec)

E, em seguida, use o comando DESCRIBE para vericar sua estrutura; o enunciado o seguinte:
mysql> DESCRIBE Movimentacao; [Enter]

3. O resultado ser igual ao mostrado a seguir:

Crie Banco de Dados em MySQL


68

+------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | Codigo | int(11) | NO | PRI | NULL | auto _ increment| | Banco | char(10) | YES | | NULL | | | Conta | char(10) | YES | | NULL | | | Tipo | char(3) | YES | | NULL | | | Numero | char(3 | YES | | NULL | | | Data | datetime | YES | | NULL | | | Valor | decimal(8,2) | NO | | | | | Descricao | varchar(50) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ 8 rows in set (0.02 sec)

Vejamos em detalhes o que signica o enunciado que formulamos e qual foi o resultado que obtivemos: Usando o comando CREATE TABLE criamos uma nova tabela, cujo nome Movimentacao (foi preciso retirar o acento e o cedilha para que o SQL aceitasse esse nome). At aqui, tudo igual como ocorreu com a criao da tabela Cadastro, vista anteriormente; Denimos que essa nova tabela formada por oito campos (ou colunas), chamados, respectivamente, Codigo, Banco, Conta, Tipo, Numero, Data, Valor e Descricao (aqui tambm tornou-se necessrio retirar acentos e cedilhas); O campo Codigo ser um nmero inteiro (INT) com tamanho mximo de 11 caracteres; esse campo foi denido como chave primria (PRI), e no aceitar valores nulos, ou seja, no poder ser deixado em branco, e ser incrementado automaticamente a cada novo registro (auto _ increment); Os campos Banco, Conta, Tipo, Numero so do tipo CHAR, ou seja, podero receber seqncias de caracteres alfanumricos. Para cada campo foi denido o comprimento, ou seja, a quantidade de caracteres que poder armazenar; O campo Descricao do tipo VARCHAR e seu comprimento mximo ser de 50 caracteres; este campo poder conter um texto longo, cujo limite foi denido em 50 caracteres alfanumricos (incluindo os espaos); O campo Data, destinado a armazenar a data de cada operao bancria, do tipo DATETIME (data/hora) e no preciso especicar um tamanho; O campo Valor foi denido como DECIMAL e os dados entre parnteses indicam a quantidade mxima de caracteres que esse campo ir hospedar (8) e a quantidade de casas decimais a ser apresentada, ou seja, quantos nmeros devero aparecer depois

Trabalhando com o SQL (Parte 2)


69

da vrgula (neste caso, dois). Para exemplicar, os valores desse campo tero o formato 12345678,00; Todos os campos, com exceo de Codigo e Valor, aceitaro valores nulos. Para denirmos algumas caractersticas adicionais da nossa tabela, precisamos utilizar as seguintes palavras-chave e clusulas:
Palavra-Chave / Clusula NOT NULL O que significa

Um campo com essa caracterstica no admite valores nulos (vazio). Na tabela do nosso exemplo, os campos Codigo e Valor no podero estar em branco. usada para de nir um campo (coluna) como chave primria da tabela, ou seja, um valor do registro que jamais poder ser repetido na mesma coluna e que servir para identi car cada entrada da tabela de maneira unvoca. Falamos sobre esse assunto no tpico Chaves primrias e univocidade dos dados, no Captulo 1 deste livro. Dando essa instruo como argumento para um campo de uma tabela, o contedo do campo (numrico) ser preenchido automaticamente com um valor numrico nico todas as vezes que um novo registro adicionado tabela. No nosso exemplo, denimos esta caracterstica para o campo Codigo, que tambm a chave primria da tabela Movimentacao; trata-se de uma medida preventiva que evita a insero de valores repetidos nesse campo, o que proibido por se tratar de uma chave primria. Tabela 2.1: Palavra-chave.

PRIMARY KEY

AUTO _ INCREMENT

Agora, vamos tentar inserir o primeiro registro da tabela, informando uma srie de valores (um para cada campo). Como j foi visto, para isso usado o comando INSERT. Portanto, realize os procedimentos descritos a seguir:

Crie Banco de Dados em MySQL


70

1. Digite a seguinte linha de comando, exatamente como apresentada:


mysql> INSERT Movimentacao VALUES (1, Bradesco, 12444-8, Dep, 019, 2007/1/12, 1587.24, Pgto aluguel sala); [Enter]

2. Verique a correta insero dos dados; caso no haja erros na sintaxe, o MySQL mostrar a mensagem:
Query OK, 1 row affected (0.05 sec)

H algumas consideraes a serem feitas sobre a insero de dados em tabelas com campos de tipos diferentes: O contedo dos campos do tipo CHAR ou VARCHAR, deve ser especicado entre aspas simples ou duplas; Os valores numricos, sejam do tipo INT ou DECIMAL, devem ser digitados sem as aspas. O separador de casas decimais em SQL sempre o ponto, independentemente das conguraes regionais do sistema operacional em uso (como vimos, a vrgula em SQL um elemento de sintaxe usado para separar valores e no casas decimais); Os valores do tipo DATETIME devem ser informados entre aspas (simples ou duplas) e sempre no formato AAAA/MM/DD (ano com quatro dgitos / ms com dois dgitos / dia com dois dgitos), independentemente das conguraes regionais do sistema operacional em uso. Note no enunciado que formulamos que apenas os valores dos campos Codigo e Valor foram inseridos sem as aspas, pois so os nicos dois campos numricos da tabela. 3. Para conferir se tudo est de acordo como planejado, utilize o comando SELECT para visualizar o contedo da nova tabela; para isso, basta digitar a seguinte instruo no prompt do MySQL:
mysql> SELECT * FROM Movimentacao; [Enter]

Veja como ser o resultado na tela do computador:

Trabalhando com o SQL (Parte 2)


71

+--------+ +-----------+ +--------+ | Codigo | | Banco | | Conta | +--------+ +-----------+ +--------+ | 1 | | Bradesco | | 12444-8 | | || || | +--------+ +-----------+ +--------+ 1 row in set (0.02 sec)

+-------+ | Tipo | +-------+ | Dep | | | +-------+

+--------+ | Numero | +--------+ | 019 | | | +--------+

+--------------+ +---------+ | Data | | Valor | +--------------+ +---------+ | 2007-1-12 | 1587.24 | | 00:00:00 || | +--------------+ +---------+

+-------------+ | Descricao | +-------------+ | Pgto aluguel | sala | +-------------+

Observando os resultados, podemos notar alguns detalhes: Os valores do tipo CHAR e VARCHAR, que digitamos entre aspas, so armazenados sem elas. Na verdade, as aspas so apenas um cdigo que informa ao SQL que se trata de texto; A data sofreu uma alterao signicativa desde quando a digitamos: as barras (/) foram substitudas por traos (-) e, visto que no especicamos uma hora, pois o tipo de campo DATETIME a prev, o SQL introduziu a hora zero (00:00:00). Os trs pares de zeros representam a hora no formato hh:mm:ss, ou seja, horas, minutos e segundos. Neste ponto, cou evidente uma escolha incorreta para o tipo de dados do campo Data: de fato, ao inserir a data de certa movimentao da conta bancria no indispensvel saber a hora exata. Mas isto no chega a ser um problema srio, pois podemos alterar a qualquer momento o tipo de dados, usando o comando ALTER TABLE (alterar tabela, em portugus). Para o nosso exemplo, usaremos esse comando para alterar o tipo de dados do campo Data de DATETIME para DATE (apenas data, sem a hora). Veja: No prompt do MySQL, digite essa linha de comando:
myslq> ALTER TABLE Movimentacao MODIFY Data DATE; [Enter]

Ao teclarmos Enter, a seguinte mensagem exibida:


Query OK, 1 row affected (0.22 sec) Records: 1 Duplicates: 0 Warnings: 0

Isto signica que o nosso pedido deu certo (Query OK), que uma linha da tabela foi afetada (1 row affected), que o comando levou 0,22 segundos para ser executado (0.22 sec), que nossa tabela possui 1 registro (Records: 1), nenhum duplicado (Duplicates: 0) e nenhum aviso foi gerado (Warnings: 0). Para conferir, vejamos primeiro a estrutura da tabela, mais especicamente a linha que se refere ao campo Data, e vericamos a alterao feita. Ento, digite:

Crie Banco de Dados em MySQL


72

mysql> DESCRIBE Movimentacao;

[Enter]

+------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | Codigo | int(11) | NO | PRI | NULL | auto _ increment | | Banco | char(10) | YES | | NULL | | | Conta | char(10) | YES | | NULL | | | Tipo | char(3) | YES | | NULL | | | Numero | char(3 | YES | | NULL | | | Data | date | YES | | NULL | | | Valor | decimal(8,2) | NO | | | | | Descricao | varchar(50) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ 8 rows in set (0.02 sec)

Note como as caractersticas do campo Data foram alteradas de acordo com o especicado por meio do comando ALTER TABLE. Mas o que aconteceu no contedo do campo Data? Antes apresentava a data e a hora, mesmo que esta ltima no tivesse sido digitada. E agora? Vamos visualizar o contedo da tabela para checar. Digite o enunciado:
mysql> SELECT * FROM Movimentacao; +--------+ +-----------+ | | Codigo | | Banco +--------+ +-----------+ | 1 | | Bradesco | | || | +--------+ +-----------+ 1 row in set (0.02 sec) +--------+ | Conta | +--------+ | 12444-8 | | | +--------+ +-------+ | Tipo | +-------+ | Dep | | | +-------+ [Enter] +--------+ +--------------+ +---------+ | Numero | | Data | | Valor | +--------+ +--------------+ +---------+ | 019 | | 2007-1-12 | | 1587.24 | | || || | +--------+ +--------------+ +---------+ +-------------+ | Descricao | +-------------+ | Pgto aluguel | sala | +-------------+

Como podemos observar no exemplo anterior, o contedo do campo Data foi alterado, pois no apresenta mais a hora. O comando ALTER TABLE uma instruo muito poderosa, que no dialeto do MySQL prev o uso de vrias clusulas que no fazem parte do padro SQL99 ANSI/ISO; a clusula MODIFY, por exemplo, existe somente no MySQL e em outro SGBDR muito conhecido e usado, o Oracle.

Inserindo novos dados na tabela


At o momento, criamos uma tabela que contm os dados relativos movimentao de uma conta bancria. Durante os procedimentos realizados nos exemplos anteriores, inserimos um registro nessa tabela, o nico at agora. Ento, vamos adicionar novos dados, usando mais uma vez o comando INSERT, porm, desta vez, com uma sintaxe um pouco mais articulada e complexa. Como sem-

Trabalhando com o SQL (Parte 2)


73

pre, comearemos com um exemplo prtico, portanto, no prompt do MySQL, digite o enunciado apresentado logo a seguir:
mysql> INSERT Movimentacao (Banco, Conta, Tipo, Numero, Data, Valor, Descricao) VALUES (HSBC, 31254-8, Saq, 099, 2007/02/04, -415, Saque); [Enter]

Em seguida, usamos o comando SELECT para visualizar o contedo da tabela e vericar como os dados foram inseridos:
mysql> SELECT * FROM Movimentacao

... e obtemos o seguinte resultado:


+--------+ +-----------+ | Cdigo | | Banco | +--------+ +-----------+ | 1 | | Bradesco | | 2 | | HSBC | +--------+ +-----------+ 2 rows in set (0.03 sec) +--------+ | Conta | +--------+ | 12444-8 | | 31254-8 | +--------+ +-------+ | Tipo | +-------+ | Dep | | Saq | +-------+ +--------+ | Numero | +--------+ | 019 | | 099 | +--------+ +--------------+ | Data | +--------------+ | 2007-01-12 | | 2007-02-04 | +--------------+ +---------+ | Valor | +---------+ | 1587,24 | | -415.00 | +---------+ +------------------+ | Descricao | +------------------+ | Pgto aluguel sala | Saque +------------------+

Veja que toda a tabela est preenchida nos dois registros relativos a duas operaes bancrias (obviamente ctcias). Olhe atentamente para o enunciado do comando INSERT que usamos para inserir os novos dados: em relao aos exemplos anteriores, neste caso usamos uma sintaxe diferente, ou seja:
INSERT nome _ da _ tabela (campo1, campo2, campo3,...) VALUES (valor _ campo1, valor _ campo2, valor _ campo3,...);

Em outras palavras, alm de informar o nome da tabela a ser preenchida, especicamos entre parnteses quais campos daquela tabela deveriam receber os dados (separando-os com vrgulas) e, em seguida, o valor para cada um dos campos (tambm separados por vrgulas). Note que no nosso exemplo no informamos um valor para o campo Codigo, mas mesmo assim ele foi preenchido com o nmero 2. Isto ocorreu porque este campo foi congurado com a opo AUTO _ INCREMENT, assim, uma vez denido o valor para o primeiro registro, todos os demais sero preenchidos automaticamente incrementando de 1 o valor do registro anterior. Para entendermos melhor o funcionamento do sistema de incremento automtico, vamos realizar algumas alteraes na nossa tabela: primeiramente excluiremos o segundo registro (aquele que

Crie Banco de Dados em MySQL


74

inserimos por ltimo), e depois inseriremos novos dados com a ajuda do comando INSERT. Ento... 1. No prompt do MySQL, digite esta linha de comando:
mysql> DELETE FROM Movimentacao WHERE Codigo=2; [Enter]

Em outras palavras, estamos pedindo para excluir (delete) da tabela Movimentacao (from Movimentacao) o registro em que o campo Codigo apresenta o valor 2 (where Codigo=2). 2. O MySQL informar que o comando foi bem-sucedido e que uma linha foi afetada. Agora, insira novamente os mesmo dados, usando o enunciado:
mysql> INSERT Movimentacao (Banco, Conta, Tipo, Numero, Data, Valor, Descricao) VALUES (HSBC, 31254-8, Saq, 099, 2007/02/04, -415, Saque); [Enter]

3. Agora, use o comando SELECT para visualizar o contedo da tabela:


mysql> SELECT * FROM Movimentacao
+--------+ +-----------+ | Codigo | | Banco | +--------+ +-----------+ | 1 | | Bradesco | | 3 | | HSBC | +--------+ +-----------+ 2 rows in set (0.03 sec) +--------+ | Conta | +--------+ | 12444-8 | | 31254-8 | +--------+ +-------+ | Tipo | +-------+ | Dep | | Saq | +-------+ +--------+ | Numero | +--------+ | 019 | | 099 | +--------+ +--------------+ | Data | +--------------+ | 2007-01-12 | | 2007-02-04 | +--------------+ +---------+ | Valor | +---------+ | 1587.24 | | -415.00 | +---------+ +------------------+ | Descricao | +------------------+ | Pgto aluguel sala | | Saque | +------------------+

Observando o resultado, percebemos que o cdigo do segundo registro agora 3 e no mais 2. Mas, por qu? simples. O valor de um campo denido como chave primria (PRIMARY KEY) e AUTO _ INCREMENT, obtido incrementando de uma unidade o valor mximo usado para aquele campo no momento da ltima insero de dados, mesmo que o registro que usou o valor mximo no exista mais. No nosso exemplo, exclumos o registro cujo cdigo era 2, e depois inserimos outro (com os mesmos dados, mas isso irrelevante). Poderamos pensar que o cdigo do novo registro seria 2 (o cdigo do registro anterior mais 1), porm, tratando-se de uma chave primria, o novo cdigo no pode ser igual a um j usado, mesmo que este tenha sido apagado da tabela. Assim, o AUTO _ INCREMENT usa como base o ltimo cdigo utilizado (in-

Trabalhando com o SQL (Parte 2)


75

dependentemente se ainda est na tabela ou no) e cria o prximo somando 1. Por isso, o cdigo do nosso novo registro 3, e no 2. Em uma tabela, pode haver apenas um campo com a caracterstica AUTO _ INCREMENT e deve ser uma chave (externa ou primria).

Configurando chaves primrias compostas


Podem ocorrer situaes em que as informaes que precisamos gerenciar fazendo uso de uma tabela contenham elementos que, se combinados, identiquem um registro de maneira unvoca, constituindo assim uma chave primria composta, ou seja, composta por mais de um campo e no por um s. Em casos como este, torna-se desnecessrio criar um campo separado para servir de chave primria, basta indicar ao SQL quais so os campos que, considerados em conjunto, formam a chave primria. Por exemplo, imagine uma tabela na qual armazenamos os projetos em andamento na nossa empresa estruturada da seguinte forma: cada tipo de projeto possui uma sigla predenida (DE = Desenvolvimento, TR = Treinamento e DI = Divulgao) e, para cada projeto, h um supervisor responsvel, identicado por um cdigo numrico. Associando a sigla do projeto com o cdigo do supervisor responsvel, possvel identicar cada projeto de maneira unvoca. Alm desses dados, nossa tabela conter tambm a data de incio e de m de cada projeto. Para compreender melhor, vamos criar essa tabela. Ento, no prompt do MySQL, digite o enunciado a seguir, que usa o comando CREATE TABLE para criar a tabela Projetos e algumas clusulas que deniro sua estrutura:
mysql> CREATE TABLE Projetos (Tipo CHAR(2) NOT NULL, Cod _ Supervisor INT NOT NULL, PRIMARY KEY (Tipo, Cod _ Supervisor), Descricao VARCHAR(30), Data _ Inicio DATE, Data _ Fim DATE); [Enter]

Nossa tabela foi criada. Como podemos notar, neste exemplo usamos a clusula PRIMARY KEY de maneira bem diferente da tabela Movimentacao. Naquele exemplo, a clusula foi usada para especicar que um determinado campo (Codigo) era a chave primria da tabela. J neste caso, a clusula PRIMARY KEY usada no como

Crie Banco de Dados em MySQL


76

atributo de um campo, mas como comando separado, que usa como parmetros (entre parnteses) os nomes dos campos que, em conjunto, compem a chave primria da tabela. Para que isso funcione, imprescindvel que os campos das quais a chave primria ser composta sejam denidos como NOT NULL, ou seja, estejam congurados para no aceitar o valor vazio, pois a chave primria deve existir e no pode ser omissa. Vamos usar o comando DESCRIBE para ver como cou a estrutura da nossa nova tabela:
mysql> DESCRIBE Projetos; [Enter]

+---------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+----------------+ | Tipo | char(2) | NO | PRI | | | | Cod _ Supervisor| int(11) | NO | PRI | | | | Descricao | varchar(30) | YES | | NULL | | | Data _ Inicio | date | YES | | NULL | | | Data _ Inicio | date | YES | | NULL | | +---------------+--------------+------+-----+---------+----------------+ 5 rows in set (0.02 sec)

Repare que os primeiros dois campos (Tipo e Cod_Supervisor) apresentam a caracterstica NO na coluna Null, o que indica que nenhum dos dois aceita valores nulos; alm disso, ambos so denidos como PRI na coluna Key, ou seja, os dois campos formam a chave primria desta tabela. A clusula PRIMARY KEY pertence ao padro SQL99 ANSI/ISO e encontra-se disponvel em todos os dialetos do SQL no mercado. Todavia, a sintaxe que mostramos nos exemplos anteriores se refere ao seu uso em ambiente MySQL.

Tabelas e ndices
No jargo do SQL, o termo chave ou key sinnimo de ndice e se refere a uma ferramenta interna do SQL. Um ndice pode ser criado e utilizado para agilizar as operaes de seleo dos dados contidos nas tabelas. Neste tpico, veremos como criar e fazer proveito dos ndices; para isso, voltaremos a usar a tabela Movimentacao, criada e modicada no decorrer dos dois tpicos iniciais deste captulo. A tabela em questo possui um campo do tipo DATE, chamado Data, cuja nalidade armazenar a data de cada movimentao da conta bancria. Vamos criar um ndice neste campo usando mais

Trabalhando com o SQL (Parte 2)


77

uma vez o comando ALTER TABLE, porm, com algumas variaes em sua sintaxe. 1. Para criar um ndice no campo Data da tabela Movimentacao, digite a linha de comando a seguir:
mysql> ALTER TABLE Movimentacao ADD INDEX Data (Data); [Enter]

2. Aps executar o comando, visualize a estrutura da tabela utilizando o comando DESCRIBE. O resultado ser como mostrado a seguir:
+------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | Codigo | int(11) | NO | PRI | NULL | auto _ increment | | Banco | char(10) | YES | | NULL | | | Conta | char(10) | YES | | NULL | | | Tipo | char(3) | YES | | NULL | | | Numero | char(3 | YES | | NULL | | | Data | date | YES | MUL | NULL | | | Valor | decimal(8,2) | NO | | | | | Descricao | varchar(50) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+ 8 rows in set (0.01 sec)

Note que, em correspondncia do campo Data, a coluna Key foi preenchida com o valor MUL, que nos informa que neste campo foi denido um ndice. MUL abreviao de MULTIPLE (mltiplo, em portugus) e se refere caracterstica de um ndice em aceitar valores duplicados, como veremos mais adiante neste tpico. No enunciado anterior, o comando ALTER TABLE foi completado com clusula ADD INDEX (adicionar ndice), cuja sintaxe a seguinte:
ADD INDEX [nome _ do _ ndice] (coluna _ da _ tabela,...);

O parmetro nome_do_ndice no obrigatrio, j coluna_da_tabela o nome da coluna da tabela (mas pode ser mais de uma, como veremos) na qual se deseja criar o ndice e deve ser especicado entre aspas. possvel tambm construir um ndice em mais colunas; para isso, basta especicar seus nomes entre parnteses como parmetro da clusula ADD INDEX, separando os nomes das colunas com vrgulas. Por exemplo, em uma tabela com os campos Nome e Sobrenome

Crie Banco de Dados em MySQL


78

(como a tabela Cadastro, criada no Captulo 2), podemos congurar o ndice em ambos os campos, com a seguinte linha de comando:
mysql> ALTER TABLE Cadastro ADD INDEX NomeCompleto (Nome, Sobrenome); [Enter]

H tambm uma outra maneira de criar ndices em tabelas, usando um comando e no uma clusula. Trata-se da instruo CREATE INDEX (criar ndice, em portugus), cuja sintaxe a seguinte:
CREATE INDEX nome _ do _ ndice ON nome _ da _ tabela (coluna _ da _ tabela,...);

Isto signica que, aps digitar o comando, deveremos especicar como parmetros o nome do ndice, a palavra-chave ON e, em seguida, a tabela em que o ndice deve ser criado e, entre parnteses, os nomes das colunas nas quais o ndice ser construdo com os dados separados por vrgulas. Para exemplicar, a mesma operao do enunciado anterior pode ser realizada usando a seguinte linha de comando:
mysql> CREATE INDEX NomeCompleto ON Cadastro (Nome, Sobrenome); [Enter]

Uma tabela pode conter at 16 ndices e um ndice no pode ultrapassar 256 caracteres. Vimos, ento, como criar um ndice; mas por que faz-lo? Os ndices no so indispensveis para o funcionamento de uma tabela, por isso, seu uso facultativo, porm, eles ajudam muito nas operaes de consulta dos dados armazenados. Quando realizamos uma consulta em SQL (o que feito usando o comando SELECT seguido por um critrio especicado aps a clusula WHERE, como vimos no tpico Visualizando o contedo de uma tabela do Captulo 2), o software analisa todas as tabelas do banco de dados, lendo em seqncia todos os registros e todos os campos, para encontrar aqueles que satisfazem o critrio de busca especicado. Se a tabela contm um ndice e a seleo prev uma comparao no campo indexado, o processo de leitura dos dados das tabelas acontece de maneira muito mais rpida, pois o SQL se posiciona

Trabalhando com o SQL (Parte 2)


79

diretamente no primeiro registro que contm um valor que atende ao critrio denido. Para exemplicar, suponhamos que desejamos extrair da nossa tabela Movimentacao todas as operaes realizadas a partir do dia 15 de abril de 2006, visualizando apenas os campos Codigo, Valor, Data e Descricao. Poderamos fazer isto com o seguinte enunciado:
mysql> SELECT Codigo, Valor, Data, Descricao FROM Movimentacao WHERE Data > 2006-04-14; [Enter]

Como na nossa tabela o campo Data foi denido como ndice, a busca realizada rapidamente, porque o ndice permite ao SQL apontar imediatamente para o primeiro registro do campo Data cujo valor seja maior que 2006-04-14 e extrair todos os registros sucessivos sem ter que ler o contedo dos registros anteriores. Obviamente, este ganho em termos de velocidade de busca sensvel em tabelas com milhares registros, enquanto imperceptvel em tabelas com poucos dados. Em termos estruturais, um ndice , na verdade, uma pequena tabela composta por dois campos: o primeiro contm um valor gerado pelo prprio SQL, que funciona como um cdigo de identicao para cada registro da tabela indexada; o segundo, contm o valor do campo no qual foi denido o ndice. O mecanismo de busca desencadeado pelo comando SELECT verica todos os campos de cada registro do ndice e, quando encontra um valor correspondente na tabela, utiliza o primeiro campo para se posicionar no respectivo registro da tabela indexada. Em funo disso, a criao de um ndice acrescenta no nosso banco de dados uma tabela, cujo tamanho em bytes muito pequeno, o que geralmente no compromete o desempenho da base de dados. importante considerar tambm que quando alteramos uma tabela, adicionando ou excluindo registros, os ndices que porventura foram denidos naquela tabela caro desatualizados e, portanto, devero ser gerados novamente, o que torna mais complexa e demorada a atualizao dos dados da tabela. Por essas duas razes (aumento do tamanho do banco de dados e demora na atualizao), recomendvel criar ndices somente quando sua utilizao traz ganhos signicativos de tempo e produtividade, caso contrrio, esse recurso ir ser uma pedra no sapato e no uma mo na roda.

Crie Banco de Dados em MySQL


80

Uma chave primria tambm um ndice, com a caracterstica de possuir um valor nico para cada registro da tabela. Ao contrrio, os outros ndices podem ter valores duplicados; por exemplo, em um ndice num campo Estado de uma tabela de endereos, possvel que valores como DF, GO, RJ, SP se repitam mais de uma vez ao longo da tabela, porm, se referindo a pessoas ou locais diferentes.

Valores predefinidos para os campos (Default)


No decorrer dos captulos e tpicos anteriores, empregamos vrias vezes o comando DESCRIBE para obter a visualizao da estrutura de uma tabela, ou seja, dos seus campos, tipos de dados, chave primria etc. Vimos que a coluna Default da representao da estrutura da tabela mostra o valor predenido para cada campo, ou seja, o valor que o campo tem por padro antes de ser preenchido. Isto quer dizer que se preenchermos apenas alguns campos de um registro, e deixarmos os outros sem valor, o SQL ir inserir um valor padro nos campos no preenchidos. Para os campos que contm textos (tipos CHAR e VARCHAR) o valor predenido NULL (nenhum), e para os campos numricos no h valor predenido. Para visualizarmos isto na prtica, vamos inserir um novo registro na tabela Movimentacao, porm, preenchendo apenas alguns campos. Ento, digite o enunciado mostrado a seguir:
mysql> INSERT Movimentacao (Banco, Conta) VALUES (Caixa, 3211-5); [Enter]

Receberemos a seguinte mensagem de erro:


ERROR 1364 (HY000): Field Valor doesnt have a default value

O MySQL est nos avisando (em ingls, obviamente) que o campo Valor no possui valor predenido. O que no especicado claramente na mensagem que a incluso do novo registro no foi realizada porque, ao criarmos esta tabela, determinamos que o campo Valor do tipo NOT NULL, ou seja, no pode estar vazio. Assim, por no termos inserido nenhum valor neste campo e por no haver valor predenido para ele, o SQL no concluiu a operao de adio de registro.

Trabalhando com o SQL (Parte 2)


81

Ento, vamos alterar as propriedades do campo Valor da tabela Movimentacao, especicando o valor zero (0) como default (padro) para ele. Isto feito com o enunciado mostrado a seguir:
mysql> ALTER TABLE Movimentacao MODFY Valor DECIMAL(8,2) NOT NULL DEFAULT 0; [Enter]

Veja que a clusula MODIFY (modicar) foi usada para alterar as caractersticas do campo Valor. No nosso exemplo, mantivemos o tipo de dados, ou seja decimal com oito valores antes da vrgula e duas casas decimais, e a caracterstica not null (no vazio), mas denimos como padro (DEFAULT) o valor zero, sem aspas por se tratar de um valor numrico e no de texto. Visualizando a estrutura da tabela com a ajuda do comando DESCRIBE, a alterao feita ca visvel:
+------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+---------+----------------+ | Codigo | int(11) | NO | PRI | NULL | auto _ increment | | Banco | char(10) | YES | | NULL | | | Conta | char(10) | YES | | NULL | | | Tipo | char(3) | YES | | NULL | | | Numero | char(3 | YES | | NULL | | | Data | date | YES | MUL | NULL | | | Valor | decimal(8,2) | NO | | 0,00 | | | Descricao | varchar(50) | YES | | NULL | | +------------+--------------+------+-----+---------+----------------+

Tentemos inserir novamente os dados do exemplo:


mysql> INSERT Movimentacao (Banco, Conta) VALUES (Caixa, 3211-5); [Enter]

Agora recebemos a mensagem de conrmao (Query OK,...), portanto, tudo correu como deveria. Para conrmar, vamos visualizar o contedo da nossa tabela usando o comando SELECT:
mysql> SELECT * FROM Movimentacao; [Enter]

Vejamos como cou preenchida a nossa tabela:


+--------+ +-----------+ | | Codigo | | Banco +--------+ +-----------+ | 1 | | Bradesco | | | 3 | | HSBC | | 4 | | Caixa +--------+ +-----------+ 3 rows in set (0.03 sec) +--------+ | Conta | +--------+ | 12444-8 | | 31254-8 | | 3211-5 | +--------+ +-------+ | Tipo | +-------+ | Dep | | Saq | | NULL | +-------+ +--------+ | Numero | +--------+ | 019 | | 099 | | NULL | +--------+ +--------------+ | Data | +--------------+ | 2007-01-12 | | 2007-02-04 | | NULL | +--------------+ +---------+ | Valor | +---------+ | 1587.24 | | -415.00 | | 0.00 | +---------+ +------------------+ | Descricao | +------------------+ | Pgto aluguel sala | | Saque | | NULL | +------------------+

Crie Banco de Dados em MySQL


82

Como podemos notar, em todos os campos para os quais no denimos o contedo, o SQL inseriu o valor predenido que , respectivamente, Null para os campos Tipo, Numero, Data e Descricao e 0.00 para o campo Valor, como especicamos anteriormente. O comando ALTER TABLE prev o uso de uma clusula chamada SET DEFAULT, muito mais prtica do que clusula MODIFY (que usamos no exemplo anterior). A sintaxe a ser usada a seguinte:
ALTER TABLE nome _ da _ tabela ALTER [COLUMN] coluna _ da _ tabela {SET DEFAULT valor | DROP DEFAULT};

... em que a palavra COLUMN facultativa, o argumento coluna_da_tabela obrigatrio e deve ser seguido por uma das duas clusulas SET DEFAULT (para denir o novo valor predenido) ou DROP DEFAULT (para apagar o valor predenido j existente). Aps a clusula SET DEFAULT, devemos especicar o valor que desejamos congurar como padro para a coluna; j a clusula DROP DEFAULT no necessita de nenhum argumento. Digamos, por exemplo, que desejamos denir para o campo Numero um novo valor padro, que agora NULL, alterando-o para 000. Usando a clusula SET DEFAULT, o enunciado caria assim:
mysql> ALTER TABLE Movimentacao ALTER COLUMN Numero SET DEFAULT 000; [Enter]

Se desejar, use o comando DESCRIBE para vericar se a estrutura da tabela foi alterada como pedimos.

Modificando as tabelas
As tabelas de um banco de dados podem ser alteradas tanto em relao ao seu contedo, adicionando e excluindo registros, quanto no que diz respeito estrutura, inserindo e retirando colunas, criando e removendo ndices, alterando o tipo de dados, e assim por diante. As operaes de insero e remoo de registros no alteram a estrutura da tabela e fazem parte do conjunto de operaes chamado Data Manipulation Language (DML) do SQL. Todas as modicaes feitas na estrutura so realizadas usando os comandos ALTER TABLE e DROP; o primeiro prev o uso de inmeras clusulas, opes e parmetros, j o segundo muito mais simples e direto.

Trabalhando com o SQL (Parte 2)


83

Para a excluso de uma tabela, o SQL disponibiliza a seguinte sintaxe:


DROP TABLE nome _ da _ tabela RESTRICT | CASCADE;

A clusula RESTRICT inibe a execuo do comando caso existam relacionamentos entre a tabela que se deseja excluir e outros elementos do banco de dados; a clusula CASCADE faz com que seja excluda no s a tabela especicada, mas tambm todos os elementos aos quais ela esteja ligada. No todos os dialetos do SQL respeitam este padro, por exemplo, o MySQL, que usamos neste livro, no prev o uso das clusulas RESTRICT ou CASCADE, sendo a sintaxe do comando DROP TABLE bem mais simples:
DROP [TEMPORARY] TABLE [IF EXISTS] nome _ da _ tabela1 [, nome _ da _ tabela2,...];

A clusula IF EXISTS usada para prevenir mensagens de erro derivadas da digitao de nomes de tabela errados ou se tentarmos excluir uma tabela que no existe. A opo TEMPORARY limita a excluso s tabelas temporrias. A variao mais signicativa do MySQL em relao a outros dialetos SQL que, nesse ambiente, possvel excluir de uma s vez vrias tabelas, especicando nos nomes das tabelas a serem excludas um aps o outro, separando-os por vrgulas.

As tabelas no MySQL
Nesta verso do MySQL, para cada tabela so criados trs arquivos fsicos em disco, que se encontram na subpasta com o nome do banco de dados dentro da subpasta Data na pasta especicada na instalao do MySQL. A nossa tabela Movimentacao, por exemplo, gravada em disco sob forma dos trs arquivos a seguir: Movimentacao.frm este arquivo contm informaes sobre o formato da tabela; Movimentacao.myd o arquivo no qual se encontram os dados contidos na tabela; Movimentacao.myi trata-se do arquivo em que o MySQL armazena os ndices criados na tabela.

Crie Banco de Dados em MySQL


84

Quando exclumos uma tabela usando o comando DROP TABLE, todos os arquivos que formam a tabela so apagados do disco rgido do computador. Se quisermos apagar apenas o ndice, mantendo a tabela, dispomos do comando DROP INDEX, que no MySQL apresenta esta sintaxe:
DROP INDEX nome _ do _ indice ON nome _ da _ tabela;

O mesmo comando est disponvel sob forma de clusula do comando ALTER TABLE e deve ser usado da seguinte maneira:
ALTER TABLE nome _ da _ tabela DROP INDEX nome _ do _ indice

Usando mais uma vez o exemplo da tabela Movimentacao, na qual criamos um ndice para o campo Data, para excluir esse ndice poderamos usar um desses dois enunciados:
mysql> DROP INDEX Data ON Movimentacao; [Enter]

ou
mysql> ALTER TABLE Movimentacao DROP INDEX Data; [Enter]

Em outras palavras, podemos dizer que a palavra-chave DROP serve para excluir um elemento qualquer do banco de dados, que pode ser o prprio banco de dados, uma tabela, um ndice etc. A palavra-chave ADD o inverso de DROP e usada como clusula do comando ALTER TABLE para adicionar algo. Aps criarmos uma tabela e inserido registros, pode ser necessrio, por exemplo, adicionar um novo campo, do qual esquecemos na hora de criar a tabela. Para adicionar um campo a uma tabela j existente, basta usar o comando ALTER TABLE com a clusula ADD, seguida pelo nome do campo e o tipo de dados do mesmo. Por exemplo, se desejssemos adicionar o campo Agencia tabela Movimentacao, o enunciado a ser digitado seria o seguinte:
mysql> ALTER TABLE Movimentacao ADD Agencia TEXT; [Enter]

Trabalhando com o SQL (Parte 2)


85

Se, durante o uso da tabela, percebemos que h um ou mais campos desnecessrios, podemos apag-los usando a clusula DROP. Por exemplo, se fosse preciso excluir da tabela um campo de nome Observacoes da tabela Movimentacao, a linha de comando caria assim:
mysql> ALTER TABLE Movimentacao DROP Observacoes; [Enter]

Podemos tambm alterar o nome de uma tabela. Trata-se de uma ao importante quando, por exemplo, percebemos ter cometido um erro na denio do nome da tabela ao cri-la. Isto feito usando o comando ALTER TABLE com a clusula RENAME. Para renomear a tabela Teste para Primeiro_Teste, bastaria usar o enunciado a seguir:
mysql> ALTER TABLE Teste RENAME AS Primeiro _ Teste; [Enter]

Tipos de dados especiais


No exemplo do tpico anterior acrescentamos nossa tabela uma nova coluna do tipo TEXT. Esse tipo de dados pertence a um grupo de tipos chamados BLOB (acrnimo de Bynary Large Object objetos binrios de tamanho grande). Normalmente, esse tipo usado para arquivos grcos (desenhos ou imagens) ou sons. So considerados BLOBs tambm os arquivos de texto muito extensos, que podem ser associados a uma coluna da tabela. No caso do MySQL, dispomos dos tipos TINYTEXT, TEXT, MEDIUMTEXT e LONGTEXT para os documentos de texto e TINYBLOB, BLOB, MEDIUMBLOB e LARGEBLOB para objetos (arquivos) que representam imagens, sons, desenhos etc. A diviso feita de acordo com o tamanho: em ingls, tiny signica pequeno, medium signica mdio e long ou large est por grande; assim, por exemplo, tinytext ou tinyblob so usados, respectivamente, para textos e objetos de tamanho pequeno. Mas como quanticar o que pequeno, mdio ou grande em se tratando de arquivos? Existe uma tabela que traz esses valores, apresentada logo a seguir:

Crie Banco de Dados em MySQL


86

Tipo TinyBlob / TinyText Blob / Text MediumBlob / MediumText LargeBlob / LongText

Tamanho mximo At 28 caracteres At 216 caracteres At 224 caracteres At 232 caracteres

Tabela 3.1: Representao de tamanho de dados.

Considerando que, por exemplo, 216 equivalente a 65.536, escolhendo o tipo TEXT, temos disposio um espao razoavelmente amplo para inserir textos. Um outro tipo de dados peculiar ENUM, usado para limitar a entrada de dados de um campo a determinadas opes. De volta ao exemplo da tabela Movimentacao, suponhamos que o campo Tipo possa conter apenas uma das seguintes opes: Dep para depsito, Saq para saque, Tra para Transferncia e Pgt para pagamento, no poder car vazio nem aceitar qualquer outro valor alm dos citados. Podemos fazer isso com o enunciado a seguir:
Tipo ENUM(Dep, Saq, Tra, Pgt) NOT NULL;

Se inserirmos no campo Tipo um valor diferente dos especicados, o MySQL o desconsiderar e, em seu lugar, inserir um zero, sem exibir qualquer tipo de mensagem de erro. Assim, uma busca por valores zero no campo Tipo caria fcil encontrar todos os registros da tabela em que o campo Tipo apresenta um valor incorreto. O tipo de dados ENUM pertence ao padro SQL99 ANSI/ISO e, portanto, est disponvel em todos os dialetos do SQL.

Trabalhando com o SQL (Parte 2)


87

Captulo 4
Inserindo e modificando dados

Introduo
Nos captulos anteriores aprendemos a criar e excluir tabelas em um banco de dados, bem como visualizar e alterar sua estrutura e seu contedo, com a ajuda do grupo de comandos chamado Data Denition Language (DDL) Linguagem de Denio de Dados. Obviamente, uma tabela em si no de utilidade nenhuma se no contm dados. Para isso, existe um grupo de comandos pelo qual possvel inserir, modicar e excluir dados de uma tabela. Trata-se dos comandos INSERT, UPDATE e DELETE, que, juntamente ao comando SELECT, com o qual extramos do banco de dados as informaes desejadas, formam o componente Data Manipulation Language (DML) Linguagem de Manipulao de Dados. Em exemplos anteriores, j utilizamos os comandos SELECT e INSERT. Neste captulo, iremos aprofundar suas sintaxes e seu uso, utilizando tambm clusulas exclusivas do dialeto MySQL e que no se encontram no padro SQL99, que podem ser extremamente teis para inserir com rapidez grandes quantidades de dados.

Sobre o comando INSERT


O comando INSERT permite inserir dados de duas maneiras diferentes: a primeira, que usaremos nos nossos exemplos, consiste em especicar uma lista de valores a serem inseridos em cada uma das colunas (campos) da tabela; a segunda, um pouco mais complexa, consiste em inserir em uma tabela um conjunto de dados resultado de uma busca em outras tabelas por meio do comando SELECT. O esquema sinttico do comando INSERT basicamente este:
INSERT [INTO] [nome _ do _ bancodedados. [proprietrio.] {nome _ da _ tabela | nome da view} [(coluna1, coluna2,...)] { [DEFAULT] VALUES | VALUES (valor1, valor2,...)] enunciado _ SELECT}

Observao: para entender o signicado da sintaxe deste e de outros comandos, veja o tpico Introduo, no Captulo 2 deste livro. Analisando a sintaxe, notamos que: A palavra-chave INTO facultativa;

Crie Banco de Dados em MySQL


90

Opcionalmente, podemos indicar, antes do nome da tabela, o respectivo proprietrio e o banco de dados qual pertence. Esta opo se torna extremamente til quando temos dois ou mais bancos de dados contendo tabelas com o mesmo nome e queremos ter certeza de que o comando seja aplicado tabela que desejamos; Os parmetros coluna1, coluna2,... referem-se lista de colunas da tabela que iro receber os dados especicados em seguida. Omitindo esse parmetro, o SQL agir em todas as colunas da tabela; Podemos especicar os valores a serem inseridos (VALUES) ou um enunciado com o comando SELECT que retornar valores a serem armazenados; Os parmetros valor1, valor2,... referem-se aos valores (digitados pelo usurio) que devero ser armazenados nos campos da tabela. Quando especicamos o contedo dos campos com a clusula VALUES, seguida pelos valores entre parnteses e separados por vrgulas, o comando INSERT permite a insero de um registro por vez; j se utilizarmos como clusula um enunciado com o comando SELECT, todos os registros extrados sero adicionados tabela de uma s vez.

Inserindo novos registros na tabela


Vejamos como o comando INSERT funciona, recorrendo a alguns exemplos prticos. Para isso, precisaremos criar uma nova tabela que conter dados relativos a algumas pessoas. Esses dados sero: um cdigo (que usaremos como chave primria), o nome, o sobrenome e a data de nascimento, portanto, ser articulada em quatro colunas. Chamaremos essa tabela de Pessoas. Ento comece: 1. Para criar a tabela, use o enunciado mostrado a seguir:
mysql> CREATE TABLE Pessoas (Codigo INT NOT NULL PRIMARY KEY AUTO _ INCREMENT, Nome VARCHAR(45), Sobrenome(55), DataNascimento DATE); [Enter]

Inserindo e modicando dados


91

2. Se tudo correu bem, ou seja, se nenhuma mensagem de erro foi retornada, use o comando DESCRIBE para obter a visualizao da estrutura da tabela recm-criada, que deve ser como esta:
mysql> DESCRIBE pessoas; [Enter] +----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+----------------+ | Codigo | int(11) | NO | PRI | NULL | auto _ increment | | Nome | varchar(45) | YES | | NULL | | | Sobrenome | varchar(55) | YES | | NULL | | | DataNascimento | date | YES | | NULL | | +----------------+--------------+------+-----+---------+----------------+ 4 rows in set (0.01 sec)

3. Vamos agora inserir o primeiro registro na nova tabela que, at o momento, apenas uma caixa vazia. Ento, digite:
mysql> INSERT Pessoas (Codigo, Nome, Sobrenome, DataNascimento) VALUES (1, Fernando Henrique, Dos Reis Couto, 1989/04/05); [Enter]

Desta forma, cada uma das colunas especicadas entre parnteses na primeira parte do enunciado (Nome, Sobrenome etc.) deve necessariamente corresponder a um valor na lista que segue a clusula VALUES, caso contrrio, seria exibida uma mensagem de erro e nenhum dos dados especicados seria inserido. 4. Para vericarmos que os dados foram inseridos corretamente, visualize o contedo da tabela, usando o comando:
mysql> SELECT * FROM Pessoas; [Enter] +---------+-------------------+---------------+----------------+ | Codigo | Nome | Sobrenome | DataNascimento | +---------+-------------------+---------------+----------------+ | 1 | Fernando Henrique | Dos Reis Couto | 1989-04-05 | +---------+-------------------+----------------+----------------+ 1 row in set (0.03 sec)

5. Como podemos notar, cada coluna foi preenchida com o respectivo dado. Vamos inserir um outro registro, desta vez com uma sintaxe mais simples, sem especicar as colunas, e sim, apenas os dados a serem armazenados. Use o enunciado mostrado a seguir:
mysql> INSERT 1976/04/15); Pessoas VALUES (2, Fabrizio, [Enter] Vsica,

Crie Banco de Dados em MySQL


92

6. Visualizando o contedo da tabela, obteremos o seguinte:


mysql> SELECT * FROM Pessoas; [Enter] +---------+-------------------+---------------+----------------+ | Codigo | Nome | Sobrenome | DataNascimento | +---------+-------------------+---------------+----------------+ | 1 | Fernando Henrique | Dos Reis Couto | 1989-04-05 | | 2 | Fabrizio | Vsica | 1976-04-15 | +---------+-------------------+---------------+----------------+ 2 rows in set (0.03 sec)

Repare como mesmo no tendo informado as colunas a serem preenchidas, a insero de dados foi bem-sucedida, pois a quantidade de valores especicado corresponde quantidade de colunas da tabela, por isso, o MySQL no teve dvidas sobre como preencher a tabela, inserindo os dados nas colunas exatamente na mesma ordem em que foram digitados no enunciado. Vejamos agora mais uma maneira de usar o comando INSERT. 1. Digite o enunciado a seguir, no qual especicaremos apenas trs colunas e os respectivos valores:
mysql> INSERT Pessoas (Nome, Sobrenome, DataNascimento) VALUES (Augusto, J. Vsica, 2001/01/12); [Enter]

2. Os dados sero adicionados com sucesso, como podemos conferir, visualizando mais uma vez o contedo da tabela:
mysql> SELECT * FROM Pessoas; [Enter] +---------+-------------------+---------------+----------------+ | Codigo | Nome | Sobrenome | DataNascimento | +---------+-------------------+---------------+----------------+ | 1 | Fernando Henrique | Dos Reis Couto | 1989-04-05 | | 2 | Fabrizio | Vsica | 1976-04-15 | | 3 | Augusto | J. Vsica | 2001-01-12 | +---------+-------------------+---------------+----------------+ 3 rows in set (0.03 sec)

Embora no tenhamos informado nenhum valor para o cdigo, este foi preenchido com o valor 3, por se tratar de um campo AUTO _ INCREMENT.

Atualizando registros da tabela


normal que, durante o uso de uma tabela, se torne necessrio alterar o contedo de um ou mais registros adicionados. Pense-

Inserindo e modicando dados


93

mos em uma tabela de cadastro contendo os nomes, endereos e nmeros de telefone de algumas pessoas: bem provvel que, ao longo do tempo, algum mude de endereo ou de telefone, o que torna necessria a atualizao dos dados do cadastro. J no caso de uma tabela de produtos, podem ocorrer variaes nos preos ou na quantidade em estoque, dados esses que devem ser atualizados para manter em dia o banco de dados. Para modicar o contedo de uma tabela, usamos o comando UPDATE, que faz parte do padro SQL99 e, portanto, se encontra em todos os dialetos, mesmo que com algumas variaes em relao s clusulas e aos parmetros previstos. A sintaxe do comando UPDATE no MySQL a seguinte:
UPDATE nome _ da _ tabela SET coluna = {DEFAULT | expresso}, {...} [WHERE condio];

Em sua verso mais simples, isto , sem o uso da clusula WHERE, o comando UPDATE atribui o valor indicado em expresso a todos os registros da coluna especicada no parmetro coluna. Para exemplicar, veja o enunciado a seguir:
UPDATE Pessoas SET DataNascimento = 1946/06/26;

Se aplicssemos este comando tabela Pessoas (que criamos no tpico anterior) para alterar a data de nascimento de uma das pessoas, todos os registros cariam com o mesmo valor no campo DataNascimento, pois se no se especica em qual registro da tabela a atualizao dever ser realizada, o comando UPDATE denir o mesmo valor para todos os registros da coluna. Para resolver este problema, imprescindvel o uso da clusula WHERE (onde), que torna seletiva aplicao do comando; de fato, com a ajuda desta clusula, podemos informar ao SQL em qual registro queremos aplicar a alterao do campo DataNascimento, como mostrado no exemplo a seguir, no qual o enunciado altera a data de nascimento da pessoa cujo cdigo 2. Ento apliquemos a seguinte instruo:
mysql> UPDATE Pessoas SET DataNascimento = 1946/06/26 WHERE Codigo = 2; [Enter]

Receberemos a seguinte mensagem de conrmao:

Crie Banco de Dados em MySQL


94

Rows matched: 1

Changed: 1

Warnings: 0

O que signica dizer que houve uma alterao em uma linha da tabela. Visualizando novamente o contedo da tabela com o comando SELECT, podemos conrmar a alterao do registro referente pessoa cujo cdigo de identicao 2:
mysql> SELECT * FROM Pessoas; [Enter] +---------+-------------------+---------------+----------------+ | Codigo | Nome | Sobrenome | DataNascimento | +---------+-------------------+---------------+----------------+ | 1 | Fernando Henrique | Dos Reis Couto | 1989-04-05 | | 2 | Fabrizio | Vsica | 1946-06-26 | | 3 | Augusto | J. Vsica | 2001-01-12 | +---------+-------------------+---------------+----------------+ 3 rows in set (0.03 sec)

A clusula SET pode conter tambm uma ou mais expresses aritmticas que realizem clculos com os valores de um determinado campo. Esta caracterstica se demonstra til em tabelas nas quais seja necessrio fazer clculos; por exemplo, imagine uma tabela de produtos na qual o campo Preco_Unitario dever conter, ao invs do valor digitado, o mesmo valor, porm, com acrscimo de 10%. O enunciado do comando UPDATE caria assim:
UPDATE Pessoas SET Ppreco _ Unitario = Preo _ Unitario * 1.1

Em que o asterisco representa, neste caso, o smbolo de multiplicao.

Excluindo registros da tabela


A excluso de registros da tabela uma operao to comum quanto a insero. Para isso, o padro SQL oferece o comando DELETE, cuja sintaxe no MySQL bastante simples:
DELETE FROM nome _ da _ tabela [WHERE condio];

Como se percebe, a condio denida pela clusula WHERE opcional, porm, sem ela o comando DELETE apaga todos os registros da tabela, esvaziando-a, mas no apaga a tabela. Em outras palavras, se digitssemos o enunciado:

Inserindo e modicando dados


95

DELETE FROM Pessoas;

Todos os registros da tabela Pessoas seriam excludos, porm, a tabela e sua estrutura permaneceriam intactas. Se a nossa inteno excluir apenas um registro da tabela, o uso da clusula WHERE indispensvel para especicar qual registro (ou quais registros) desejamos apagar. A seguir, alguns exemplos: Para excluir da tabela Pessoas o registro da pessoa cujo cdigo 1, o enunciado seria o seguinte:
DELETE FROM Pessoas WHERE Codigo = 2;

Se, em uma tabela Cadastro (com nomes, sobrenomes e endereos), quisssemos excluir todos os registros que no campo Estado possuam o valor TO, deveramos digitar uma linha de comando assim estruturada:
DELETE FROM Cadastro WHERE Estado = TO;

Excluindo todos os registros da tabela de uma s vez


O SQL oferece outro comando para excluso, chamado TRUNCATE. A diferena entre DELETE e TRUNCATE que o primeiro, como vimos, permite uso seletivo, especicando quais registros desejamos excluir; j o segundo, usado para esvaziar a tabela de uma s vez. A sua sintaxe :
TRUNCATE TABLE nome _ da _ tabela;

Por exemplo, o enunciado...


TRUNCATE TABLE Pessoas;

... elimina irreversivelmente a tabela Pessoas para, em seguida, crila novamente com as mesmas caractersticas.

Crie Banco de Dados em MySQL


96

Captulo 5
Realizando consultas no SQL

Introduo
O comando principal do SQL , sem dvida alguma, SELECT, que permite realizar consultas no banco de dados e extrair as informaes desejadas. justamente essa operao de consulta (query em ingls) que deu o nome linguagem (Structured Query Language). A sintaxe do comando SELECT muito rica em opes j na verso padro do SQL e, em cada dialeto, apresenta funcionalidades adicionais que a tornam ainda mais verstil e rpida para realizar buscas detalhadas no banco de dados. A sintaxe do comando SELECT no padro SQL a seguinte:
SELECT [ALL | DISTINCT] lista _ de _ seleo [INTO nova _ tabela] FROM tabela _ original [,...] [JOIN condio] [WHERE condio] [GROUP BY expresso _ agrupamento] [HAVING condio _ busca] [ORDER BY critrio [ASC | DESC] ];

Como podemos perceber observando o esquema sinttico anterior, o comando SELECT contempla o uso de sete clusulas, das quais apenas uma (FROM) obrigatria. Para algumas clusulas, existem parmetros especcos expressos por palavras chave (ON, IN e AS). Alm disso, possvel utilizar expresses com operadores aritmticos, lgicos, de concatenao, funes matemticas e estatsticas. No decorrer deste captulo veremos o uso deste poderoso comando.

Uso simples do comando SELECT


Na sua forma mais simples, o comando SELECT, como j visto em alguns exemplos dos captulos anteriores, usado com a sintaxe apresentada a seguir:
SELECT lista _ de _ seleo FROM nome _ da _ tabela;

em que lista_de_seleo uma lista das colunas a serem extradas da tabela especicada no parmetro nome_da_tabela da clusula FROM. Quando se deseja extrair todas as colunas de uma tabela, usamos o caractere asterisco (*), que signica tudo ou todos. Assim, o enunciado:
SELECT * FROM Pessoas;

Crie Banco de Dados em MySQL


98

retorna todos os registros e todas as colunas da tabela Pessoas. Se desejarmos visualizar apenas alguns campos da tabela, devemos especicar os nomes das colunas, separando-os por vrgulas. Por exemplo, para visualizar apenas os campos Nome e DataNascimento da tabela Pessoas, ser preciso digitar este enunciado:
SELECT Nome, DataNascimento FROM Pessoas;

importante ressaltar que a ordem na qual as colunas aparecero ser exatamente a mesma na qual foram especicadas no enunciado. Isto quer dizer que o enunciado:
SELECT DataNascimento, Nome FROM Pessoas;

produzir um resultado diferente do anterior, pois, no primeiro caso, obteremos o seguinte:


+-------------------+----------------+ | Nome | DataNascimento | +-------------------+----------------+ | Fernando Henrique | 1989-04-05 | | Fabrizio | 1946-06-26 | | Augusto | 2001-01-12 | +-------------------+----------------+

J no segundo caso o resultado ser este:


+----------------+-------------------+ | DataNascimento | Nome | +----------------+-------------------+ | 1989-04-05 | Fernando Henrique | | 1946-06-26 | Fabrizio | | 2001-01-12 | Augusto | +----------------+-------------------+

Uso do alias para os campos


Os nomes das colunas apresentados no resultado de uma consulta podem ser diferentes dos rtulos de colunas originais, denidos na fase de criao da tabela na qual a consulta foi realizada. Esses nomes diferentes so chamados de alias, e so gerados usando a palavra chave AS no enunciado que faz a consulta. Vejamos como criar e usar os alias, criando uma nova tabela no nosso banco de dados.

Realizando consultas no SQL


99

A nova tabela, que chamaremos Fornecedores, ser articulada em sete colunas: CodCli para o cdigo do cliente, RagSoc para a razo social, Endereco para o endereo, Cidade, CEP, Estado e CNPJ. O enunciado para a criao da tabela o seguinte:
mysql> CREATE TABLE Fornecedores (CodCli INT NOT NULL PRIMARY KEY AUTO _ INCREMENT, RagSoc VARCHAR(50), Endereco VARCHAR(50), Cidade VARCHAR(30), CEP CHAR(9), Estado CHAR(2), CNPJ CHAR(18));

O resultado ser uma tabela com a seguinte estrutura (que pode ser visualizada usando o comando DESCRIBE):
mysql> DESCRIBE Fornecedores; [Enter] +----------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------------+--------------+------+-----+---------+----------------+ | CodCli | int(11) | NO | PRI | NULL | auto _ increment | | RagSoc | varchar(50) | YES | | NULL | | | Endereco | varchar(50) | YES | | NULL | | | Cidade | varchar(30) | YES | | NULL | | | CEP | char(9) | YES | | NULL | | | Estado | char(2) | YES | | NULL | | | CNPJ | char(18) | YES | | NULL | | +----------------+--------------+------+-----+---------+----------------+ 7 rows in set (0.02 sec)

Repare que, por motivos prticos, os nomes de alguns campos foram abreviados e podem no ser compreensveis para os estranhos ao banco de dados. Alm disso, o campo Endereco teve o c cedilha retirado do seu nome por causa da restrio do SQL quanto ao uso de caracteres acentuados e cedilhas. Graas ao uso dos alias, podemos fazer com que, no resultado da consulta, os rtulos desses campos apaream com um nome diferente do nome do campo da tabela. Para podermos realizar uma consulta nesta tabela, necessrio inserir dados nela. No tpico Inserindo novos registros na tabela, do Captulo 4, vimos como inserir novos registros em uma tabela; portanto, use o comando INSERT com a sintaxe correta para inserir na tabela Fornecedores os seguintes registros:

Crie Banco de Dados em MySQL


100

CodCli Av. C33 n 555 Rua 98 n 211 Av. 65 n 444 Pa V656 Rua H21 n 12 Al. Contorno n 97 Av. Oceano n 166 Tabela 5.1: Fornecedores. Rio de Janeiro So Paulo So Paulo Braslia Goinia Goinia Braslia 12345-678 12345-111 12345-789 12345-888 12345-989 12345-345 12345-111

RagSoc

Endereco

Cidade

CEP

Estado RJ SP SP DF GO GO DF

CNPJ 78945612345654 65498732145654 12365478921123 98745632145687 85214796369851 96325874121114 19875221458478

1 Auto Auto Auto Auto Auto Auto

New-Line Imp.Exp. Ltda. TopTech Ltda. Teratron Ltda. UltraTech Ltda. FV Suprimentos Ltda. Flash Informtica Ltda. Nayfa Desenvolvimento

Realizando consultas no SQL

101

Agora que a nossa tabela contm dados, vejamos como fazer uma consulta usando o alias no lugar dos nomes dos campos, digitando o seguinte enunciado:
mysql> SELECT CodCli AS Cdigo do Cliente, RagSoc AS Razo Social, Endereco AS Endereo, Cidade, CEP, Estado AS UF, CNPJ FROM Fornecedores; [Enter]

O resultado ser uma tela muito similar da tabela, porm, no lugar dos nomes dos campos, apresenta os nomes dos alias que denimos. Algo como o exemplo mostrado a seguir:
Cdigo do Cliente 1 2 3 4 5 6 7 Razo Social New-Line Imp. Exp. Ltda. TopTech Ltda. Teratron Ltda. UltraTech Ltda. FV Suprimentos Ltda. Flash Informtica Ltda. Nayfa Desenvolvimento Endereo Av. C33 n 555 Rua 98 n 211 Av. 65 n 444 Pa V656 Rua H21 n 12 Al. Contorno n 97 Av. Oceano n 166 Cidade Rio de Janeiro So Paulo So Paulo Braslia Goinia Goinia Braslia CEP 12345-678 12345-111 12345-789 12345-888 12345-989 12345-345 12345-111 UF RJ SP SP DF GO GO DF CNPJ 78945612345654 65498732145654 12365478921123 98745632145687 85214796369851 96325874121114 19875221458478

Repare que no enunciado denimos o alias apenas para alguns campos (CodCli, RagSoc, Endereo e Estado), enquanto mantivemos o nome original para os outros. Um alias , de fato, um texto, e por isso no sofre as limitaes de uso de caracteres tpicos dos nomes de campos; isto quer dizer que num alias podemos digitar o nome que quisermos, incluindo espaos, acentos, cedilhas etc. Lembre-se sempre que os nomes denidos como alias so exibidos somente nos resultados das consultas, ou seja, os nomes originais dos campos na tabela no so alterados.

Sobre os qualificadores
A palavra chave AS um qualicador do comando SELECT, e no uma clusula. O comando SELECT possibilita tambm o uso de dois outros qualicadores: ALL e DISTINCT. O primeiro serve para especicar que a consulta dever extrair todos os elementos indicados, mas praticamente intil, pois, por padro, o comando SELECT j faz isso; o segundo serve para instruir o SQL a ignorar valores repetidos na tabela, retornando apenas valores nicos. Como sempre, vejamos um exemplo prtico. A tabela Fornecedores contm diversos registros, alguns dos quais apresentam o mesmo valor no campo Estado, pois, obviamente, possvel que dois ou mais fornecedores residam no mesmo estado (o mesmo vale para

Crie Banco de Dados em MySQL


102

o campo Cidade). Agora, queremos saber quantos e quais estados esto cadastrados em nossa tabela. Podemos obter esta informao com uma consulta que utiliza os qualicador DISTINCT e, para tornar mais claro o resultado, AS, como no exemplo a seguir:
mysql> SELECT DISTINCT Estado AS Estados Cadastrados FROM Fornecedores; [Enter]

e eis a seguir o resultado do nosso enunciado:


+---------------------+ | Estados Cadastrados | +---------------------+ | RJ | | SP | | DF | | GO | +---------------------+

Veja que, graas ao qualicador DISTINCT, cada estado exibido uma s vez, mesmo que na tabela aparea em vrios registros. Repare tambm no rtulo da coluna, diferente do nome do campo da tabela (Estado).

A clusula ORDER BY
A clusula ORDER BY usada para listar os valores do resultado da consulta seguindo uma ordem diferente daquela com a qual so apresentados na tabela. Sua sintaxe :
ORDER BY critrio _ de _ classicao [ASC | DESC];

O critrio_de_classicao constitudo por uma ou vrias colunas da tabela de origem, e pode ser especicado usando os nomes dos campos ou seus respectivos alias. As colunas usadas como critrio de classicao so chamadas de chaves de classicao no jargo dos bancos de dados. As palavras chave ASC e DESC especicam o tipo de classicao e so, respectivamente, abreviaes das palavras em ingls ascending e descending, ou seja, classicao crescente (do menor

Realizando consultas no SQL


103

para o maior) ou decrescente (do maior para o menor); o primeiro tido como padro quando no especicamos nenhum. Voltando ao exemplo do tpico anterior, podemos fazer com que a lista dos estados cadastrados seja exibida em ordem alfabtica decrescente (Z > A). Ento, vamos reformular o enunciado anterior acrescentando a clusula ORDER BY, digitando-o desta forma:
mysql> SELECT DISTINCT Estado AS Estados Cadastrados FROM Fornecedores ORDER BY Estados Cadastrados DESC; [Enter]

O novo resultado ser igual ao mostrado logo a seguir:


+---------------------+ | Estados Cadastrados | +---------------------+ | SP | | RJ | | GO | | DF | +---------------------+

Neste exemplo, usamos o alias do campo Estado para denir o critrio de classicao dos registros. Se tivssemos usado o nome do campo, o resultado teria sido idntico. A nica diferena que o nome do alias deve ser especicado entre aspas (simples ou duplas), j o nome do campo no. Como j foi dito, a clusula ORDER BY pode se referir a mais de uma coluna da tabela de origem. Quando especicamos mais de uma coluna, a primeira chamada chave de classicao primria, a segunda chave de classicao secundria, e assim por diante. No exemplo a seguir, denimos um critrio de classicao baseado em duas colunas: Estado e Cidade; isto quer dizer que a classicao ser feita primeiramente com base nos dados do campo Estado (que usa o alias UF) e depois usando o contedo do campo Cidade. Veja:
mysql> SELECT Estado AS UF, Cidade FROM Fornecedores ORDER BY UF, Cidade; [Enter]

Voc pode estar se perguntando: como feita a classicao com duas colunas? simples: suponhamos que na tabela haja trs fornecedores no estado de Gois, porm, em cidades diferentes: um em Goinia, outro em Anpolis e outro em Catalo. Na classicao

Crie Banco de Dados em MySQL


104

por Estato, os trs aparecero juntos, mas qual deles ser mostrado primeiro? Como o segundo critrio de classicao a cidade, veremos primeiro o fornecedor de Anpolis, depois o de Catalo e, por m, o de Goinia (em ordem alfabtica).

Sobre funes no SQL


O padro SQL disponibiliza algumas funes, cuja sintaxe constituda pelo nome da funo seguido pelos argumentos, entre parnteses. Tais funes retornam um determinado valor realizando uma operao especca (denida pela palavra-chave que identica a prpria funo) com base em um valor indicado como argumento da funo. No necessariamente todas as funes precisam de argumentos; por exemplo, a funo CURRENT _ TIME, que retorna a data e a hora atuais, no precisa de nenhum argumento, pois pega essas informaes no relgio do sistema. O padro SQL oferece muitas funes, classicadas em dois grandes grupos: Funes de agregao: operam em conjuntos de valores (uma coluna inteira, por exemplo) e retornam um nico valor; Funes escalares: trabalham em um s valor (o argumento) e retornam um valor baseado no mesmo. As tabelas a seguir mostram a lista das funes do SQL e a nalidade de cada uma delas.
Funo AVG (expresso) O que faz Calcula o valor mdio de uma coluna, indicada no argumento expresso. Conta as linhas encontradas pela expresso. Conta todas as linhas da tabela especicada. Retorna o valor mnimo encontrado em uma coluna, a qual especicada no argumento expresso. Retorna o valor mximo encontrado em uma coluna, a qual especicada no argumento expresso. Calcula a somatria de todos os valores da coluna indicada no argumento expresso.

COUNT (expresso) COUNT (*) MIN (expresso)

MAX (expresso)

SUM (expresso)

Tabela 5.3: Funes de Agregao.

Realizando consultas no SQL


105

Funo CURRENT_DATE

O que faz

Retorna a data atual, de acordo com o relgio do sistema. Retorna a hora atual, de acordo com o relgio do sistema. Retorna data e hora atuais, de acordo com o relgio do sistema. Retorna o nome do usurio atualmente logado no sistema do banco de dados. Retorna a identicao de autorizao atual, se diferente do usurio. Retorna o nome do usurio ativo no sistema operacional do computador host. Tabela 5.4: Funes Escalares do Sistema.

CURRENT_TIME

CURRENT_TIMESTAMP

CURRENT_USER

SESSION_USER

SYSTEM_USER

Funo BIT_LENGTH (expresso) CHAR_LENGTH (expresso) EXTRACT (parte_data FROM expresso)

O que faz Retorna o valor de um nmero inteiro que representa o nmero de bits contidos em uma expresso. Retorna o valor de um nmero inteiro que representa o nmero de caracteres contidos em uma expresso. Extrai de uma expresso parte de uma data ou hora (YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, TIMEZONE_HOUR ou TIMEZONE_MINUTE).

OCTET_LENGTH (expresso)

Retorna o valor de um nmero inteiro que representa o nmero de octets contidos em uma expresso. O nmero de octets corresponde ao resultado de BIT_LENGTH, dividido por oito.

Crie Banco de Dados em MySQL


106

Funo POSITION (sequncia IN seqncia_da_busca)

O que faz Retorna um nmero inteiro que representa a posio inicial de uma seqncia de caracteres (string) dentro da seqncia na qual feita a busca.

Tabela 5.5: Funes escalares numricas.


Funo O que faz

CONCATENATE (expresso | expresso) CONVERT()

Rene em uma nica seqncia de caracteres uma ou mais seqncias, valores de colunas ou variveis. Converte uma seqncia de caracteres em uma representao diferente dentro do mesmo grupo de caracteres. Converte em letras minsculas todos os caracteres maisculos de uma seqncia de caracteres. Extrai parte de uma seqncia de caracteres. Converte uma seqncia de caracteres de um grupo para outro. Apaga os caracteres iniciais, nais (ou ambos) de uma seqncia de caracteres. Converte em letras maisculas todos os caracteres minsculos de uma seqncia de caracteres.

LOWER()

SUBSTRING() TRANSLATE()

TRIM()

UPPER()

Tabela 5.6: Funes Escalares de Texto.

As funes citadas nas tabelas anteriores so apenas as que encontramos no padro SQL; todavia os demais dialetos do SQL (Oracle, MySQL, Microsoft SQL Server etc.) possuem um nmero considervel de outras funes (no MySQL so mais de cem), especialmente as do tipo matemtico, que proporcionam ao usurio maior exibilidade para obter valores a partir de clculos feitos com o contedo das tabelas.

Realizando consultas no SQL


107

Para realizar clculos matemticos no SQL, so empregados smbolos, denominados operadores. So usados para representar as operaes aritmticas ou lgicas que podem ser executadas. So eles:
Operador + * / = <> ou != < > <= >= Significado Usado para realizar operaes de soma e concatenao Usado para realizar subtraes Usado para realizar multiplicaes Usado para realizar divises Representa igual a... Ambos representam diferente de... Usado em comparaes, est por menor que... Usado em comparaes, est por maior que... Usado em comparaes, est por menor ou igual a... Usado em comparaes, est por maior ou igual a... Tabela 5.7: Operadores.

A clusula GROUP BY
Em muitos casos, as funes de agregao so usadas junto com a clusula GROUP BY do comando SELECT; esta clusula usada para agrupar dados (em ingls, group by signica agrupar por). Quando usamos a clusula GROUP BY, preciso especicar, tanto no comando SELECT quanto na clusula GROUP BY, a mesma coluna, que aquela com base na qual se deseja agrupar o resultado da consulta. Vejamos um exemplo de como usar a clusula GROUP BY para obter a mdia das idades e dos anos de servio de cada um dos funcionrios de uma empresa, agrupando-os por estado. Observao: neste caso, no iremos criar nenhuma nova tabela por razes prticas, porque seria necessrio no s criar a tabela, mas tambm preench-la com uma quantidade consistente de dados; portanto, suponha estarmos trabalhando em uma tabela chamada Funcionarios, que contm dados relativos aos funcionrios de uma empresa qualquer, e na qual temos, entre

Crie Banco de Dados em MySQL


108

outros campos, um Estado, outro com a data de nascimento (DataNascimento) e outro ainda com a data em que cada funcionrio foi contratado (DataContratacao). O enunciado caria assim:
SELECT Estado, ROUND(AVG(YEAR(NOW()) YEAR(DataContratacao))) AS Mdia do tempo de servio, ROUND (AVG(YEAR(NOW()) YEAR(DataNascimento))) AS Mdia das Idades FROM Funcionarios GROUP BY Estado; [Enter]

O enunciado anterior rene muitos conceitos e ferramentas vistas at o momento: o comando SELECT usa como argumento a coluna Estado da tabela Funcionrios, local em que a consulta dever ser feita. No decorrer da consulta, feito um clculo para descobrir a quanto tempo cada funcionrio trabalha na empresa, subtraindo da data atual a data de contratao, calculando a mdia de todos os resultados obtidos na coluna e arredondando o resultado nal. Para realizar este clculo, foram usadas diversas funes (ROUND, AVG,...) e um operador (-). O mesmo foi feito para descobrir a idade de cada funcionrio, subtraindo da data atual a data de nascimento, calculando a mdia de todas as idades e arredondando o resultado nal. Os dois resultados foram armazenados em dois alias, um chamado Mdia do tempo de servio e o outro Mdia das idades. Enm, todos os resultados so agrupados por estado, empregando a clusula GROUP BY. A tabela resultante dessa consulta teria essa estrutura:
+----------------+---------------------------+------------------+ | Estado | Mdia do tempo de servio | Mdia das idades | +----------------+---------------------------+------------------+ | GO | 8 | 37 | | SP | 12 | 44 | | DF | 6 | 39 | | RJ | 9 | 29 | | MG | 10 | 32 | +----------------+---------------------------+------------------+

Na mesma tabela, queremos agora realizar a contagem dos funcionrios por estado, isto , queremos saber quantos funcionrios a empresa tem em cada estado. Trata-se de uma operao bastante simples, que pode ser realizada com o enunciado mostrado a seguir:

Realizando consultas no SQL


109

SELECT Estado, COUNT (*) AS Funcionarios FROM Funcionarios GROUP BY Estado; [Enter]

Eis o resultado do comando exibido na tela do computador:


+-----------| Estado +-----------| GO | SP | DF | RJ | MG +-----------+--------------------+ | Funcionarios | +--------------------+ | 21 | | 19 | | 14 | | 16 | | 9 | +--------------------+

H algo que no podemos esquecer: o SQL no permite selecionar em conjunto as colunas que so resultado da aplicao de uma consulta e colunas reais de uma tabela de origem. Se zermos isto, receberemos uma mensagem de erro assim:
Mixing of GROUP columns (MIN(), MAX(), COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

importante saber tambm que a clusula GROUP BY retorna os seus resultados na mesma ordem em que os dados so apresentados na tabela de origem. Contudo, possvel alterar a ordem de classicao do resultado da consulta recorrendo clusula ORDER BY, vista no tpico A clusula ORDER BY deste captulo. Utilizando as duas clusulas no mesmo enunciado, a sintaxe a ser seguida deve ser igual mostrada no exemplo a seguir:

SELECT Estado, COUNT (*) AS Funcionarios FROM Funcionarios GROUP BY Estado ORDER BY Nome; [Enter]

Observe a linha de comando anterior e repare que a clusula ORDER BY foi digitada depois da clusula GROUP BY e, neste caso, classica o resultado da consulta em ordem crescente de nomes.

Crie Banco de Dados em MySQL


110

Captulo 6
Outros SGBDR

Introduo
Durante os exemplos prticos deste livro, nos baseamos no ambiente de programao MySQL pois, como vimos, este traz a vantagem indiscutvel de ser gratuito e muito vlido. Todavia, como j dissemos, existem outros sistemas de gerenciamento de bancos de dados relacionais que merecem a nossa ateno. Entre eles, o Oracle e o Microsoft SQL Server so os mais conhecidos. Neste captulo, veremos as caractersticas mais marcantes desses dois poderosos SGBDR, amplamente usados a nvel mundial, para a criao e manuteno de bancos de dados extremamente complexos.

O Oracle
O Oracle um SGBD (Sistema Gerenciador de Banco de Dados) que surgiu no nal da dcada de 1970, quando Larry Ellison vislumbrou uma oportunidade, que outras companhias no haviam percebido, ao encontrar uma descrio de um prottipo funcional de um banco de dados relacional. Nenhuma empresa tinha se empenhado em comercializar essa tecnologia. Ellison e os co-fundadores da Oracle Corporation, Bob Miner e Ed Oates, perceberam que havia um tremendo potencial de negcios no modelo de banco de dados relacional e tornaram-se, assim, a maior empresa de software empresarial do mundo. O SGBD da Oracle lder de mercado. O Oracle 9i foi pioneiro no suporte ao modelo Web. O Oracle 10g, mais recente, se baseia na tecnologia de grid. Alm da base de dados, a Oracle desenvolve uma sute de desenvolvimento chamada de Oracle Developer Suite, utilizada na construo de programas de computador que interagem com a sua base de dados. A Oracle tambm criou a linguagem de programao PL/SQL, utilizada no processamento de transaes.

O Oracle XE
O Oracle Database Express Edition (Oracle Database XE) uma edio do banco de dados Oracle gratuita, fcil de instalar e fcil de

Crie Banco de Dados em MySQL


112

gerenciar. Ideal para desenvolvedores estudantes e todos aqueles que pretendem estudar a tecnologia Oracle. O Oracle Database XE permite que voc utilize uma interface intuitiva baseada em navegador Web para as seguintes situaes: Administrar o banco de dados; Criar tabelas, views e outros objetos de banco de dados; Importar, exportar e visualizar dados de tabelas; Executar consultas no SQL; Gerar relatrios. O Oracle Database Express inclui o Oracle Applications Express release 2.21, que uma interface grca para desenvolvimento de aplicaes baseadas na Web. Alm do Oracle Applications Express Release 2.21, voc poder usar as linguagens e ferramentas Oracle ou de terceiros para desenvolvimento de diversas aplicaes, utilizando o Oracle Database Express Edition. No Oracle Database Express Edition, encontramos as seguintes ferramentas de linha de comando: SQL Command Line (SQL Plus): usado para execuo de comandos SQL e PL/SQL e execuo de scripts; SQL Loader: usado para carregar dados em um banco de dados; Data Pump: trata-se de um utilitrio de importao e exportao de dados.

Acessando a Database Home Page


O Oracle Database Express Edition possui uma interface baseada em navegadores Web que permite ao usurio administrar o banco de dados, executar scripts, consultas, criar aplicaes Web e muito mais. O ponto de partida desta ferramenta a Database Home Page. importante ressaltar que, aps a instalao, a Database Home Page estar ativa apenas no computador onde o Oracle Database Express Edition foi instalado, ou seja, o computador local (host). Os cones da Database Home Page tm as seguintes funes: Administration: gerenciar as contas de usurios, gerenciar a memria, capacidade de armazenamento e conexes de rede, monitorar as atividades do banco de dados e visualizar as informaes de congurao; Object Browser: visualizar, criar, modicar e apagar objetos de banco de dados. Usar o PL/SQL editor para editar e compilar pa-

Outros SGBDR
113

cotes, procedures, funes e triggers, com a vantagem de usufruir de um relatrio de erros; SQL: acesso as seguintes ferramentas SQL: SQL Commands: executar comandos SQL e blocos annimos de PL/SQL. Rodar os scripts e salvar as consultas; SQL Scripts: criar, editar, visualizar, executar e apagar arquivos de scripts. Realizar o upload e o download de scripts para o seu sistema de arquivos local; Query Builder: com pouco ou nenhum conhecimento SQL, voc poder criar consultas utilizando uma interface grca, visualizar resultados formatados desta consultas e salv-las. Utilities: carregar e descarregar dados, gerar DDL, visualizar objetos de relatrios e restaurar objetos apagados do banco de dados. Ao realizar o login no Database Home Page com um usurio diferente do SYSTEM, um outro cone chamado Application Builder ser exibido. Ele permite que voc crie aplicaes Oracle no Database Express Edition.

Acessando a Database Home Page da sua rea de trabalho


Para acessar a Database Home Page da sua rea de trabalho (em diferentes sistemas operacionais), execute os seguintes passos: 1. Nos sistemas operacionais: Windows: clique no boto Iniciar > Programas (ou Todos os programas) > Oracle Database 10g Express Edition e selecione Go To Database Home Page; Linux: utilizando o Gnome, clique no menu Applications. Em seguida; em Oracle Database 10g Express Edition e selecione Go To Database Home Page; Linux: utilizando o KDE, clique no cone do K menu. Em seguida, Oracle Database 10g Express Edition e selecione Go To Database Home Page. 2. Quando a pgina de login aparecer, faa sua autenticao no banco de dados utilizando um usurio e senha vlidos. Para autenticar como administrador, utilize o usurio SYSTEM e a senha que voc deniu durante a instalao do Oracle Database Home Express Edition.

Crie Banco de Dados em MySQL


114

Acessando a Database Home Page em seu navegador usurio local


Para acessar o Database Home Page do seu navegador do mesmo computador que voc instalou o Oracle Database Express Edition, siga os passos a seguir: 1. Na linha de endereo do seu navegador, digite o seguinte endereo: http://127.0.0.1:port/apex Em que port o nmero da porta TCP para requisies HTTP. O valor padro 8080. Voc pode trocar este valor durante a instalao. Por exemplo, se voc instalou o Oracle Database Express Edition com porta padro, voc pode acessar a Database Home Page atravs da URL: http://127.0.0.1:8088/apex 2. Quando a pgina de login aparecer, digite um usurio e senha vlidos para acessar o banco de dados. Para autenticar como administrador, utilize o usurio SYSTEM e a senha que voc deniu durante a instalao do Oracle Database Home Express Edition.

Acessando a Database Home Page em seu navegador usurio remoto


Antes de tudo, uma considerao: para acessar o banco de dados remotamente, voc precisa ativar o acesso remoto. Para acessar o Database Home Page remotamente pelo seu navegador, siga os seguintes passos: 1. Digite na barra de endereo do seu navegador a seguinte URL: http://host:port/apex Em que host o nome do servidor ou o endereo IP do computador onde o Oracle Database Express Edition est instalado e port o nmero da porta TCP que recebe a requisio HTTP. O valor padro

Outros SGBDR
115

8080. Voc pode mudar este valor durante a instalao do Oracle Database Express Edition. Por exemplo, se voc instalou o Oracle Database Express Edition em um computador com o nome de myhost. mydomain.com e o fez utilizando a porta padro, o endereo da Database Home Page ser: http://myhost.mydomain.com:8080/apex 2. Quando a pgina de login aparecer, use um usurio vlido e senha para acessar a pgina. Para autenticar como administrador, utilize o usurio SYSTEM e a senha que voc deniu durante a instalao do Oracle Database Home Express Edition.

Buscando ajuda
Voc pode acessar o Help on-line sensitivo ao contexto atravs de uma das seguintes maneiras: Para ajuda sobre a pgina corrente do Database Home Page, clique no cone Help localizado no canto superior direito da pgina; assim, a janela de ajuda ser aberta. Alm da ajuda referente pgina de origem, voc poder navegar pelos tpicos de ajuda no painel do lado esquerdo da janela; Para ajuda sobre um campo individual, posicione o cursor sobre a descrio do campo (rtulo do campo); se a descrio tornar-se vermelha e o cursor mudar para uma mo, h uma ajuda disponvel para aquele campo. Clique sobre a descrio para visualizar a ajuda. Para utilizar a ajuda do Oracle Database Express Edition quando no estiver utilizando a interface grca, faa o seguinte: No Windows: clique no boto Iniciar > Programas (ou em Todos os programas), clique em Oracle Database 10g Express Edition, selecione Get Help e, em seguida, clique em Read Online Help; No Linux, utilizando o Gnome: no menu Applications, clique em Oracle Database 10g Express Edition e selecione Get Help e, em seguida, clique em Read Online Help; No Linux, utilizando o KDE: no menu K, clique em Oracle Database 10g Express Edition e selecione Get Help e, em seguida, clique em Read Online Help.

Crie Banco de Dados em MySQL


116

O Microsoft SQL Server


O MS SQL Server um Gerenciador de Banco de Dados Relacional feito pela Microsoft. um banco de dados muito robusto e usado muito em empresas e por grandes sistemas corporativos. Atualmente, encontra-se na verso 2005. Entre os novos recursos, est a integrao com o Framework.Net, que possibilita construir rotinas utilizando as linguagens do .Net como VB.Net e C#. O MS SQL Server tem verses unicamente para plataformas baseadas no sistema operacional Windows, da Microsoft, ao contrrio de seus grandes concorrentes, o Oracle e o Postgres, que funcionam em diversas plataformas e sistemas operacionais diferentes. Suas ferramentas de gerenciamento so nativas, no necessitando que sejam adquiridas separadamente. So elas: MS SQL Enterprise Manager (Console Central): integra, num nico painel, a maioria das funes que um DBA poder utilizarse para congurar e gerenciar esse RDBMS; Query Analyzer: que permite executar consultas e auxilia o gerenciamento, inclusive em Tunning; Prole: que uma espcie de Trace, descortinando os comandos que o gerenciador est executando, alm de outras ferramentas.

O SQL Server Express


O SQL Server Express uma plataforma de banco de dados baseada nas tecnologias do SQL Server 2005 e substituiu o MSDE 2000. Ele um produto gratuito e possui caractersticas de rede e segurana que o diferenciam das demais edies do SQL Server 2005. Neste tpico, falaremos das suas principais caractersticas e faremos algumas comparaes com o sistema anterior, o MSDE 2000. O SQL Server Express tem como grande promessa uma superior facilidade de utilizao com um processo de instalao simples e robusto, e com uma ferramenta grca (SQL Express Manager), que permitir realizar a administrao do servidor de uma forma simples e prtica. Esta ferramenta grca ainda est em desenvolvimento e ser disponibilizada como um download gratuito no site da Microsoft. O SQL Server Express foi desenvolvido tendo em mente duas utilizaes bsicas: a primeira, como um servidor de produtos, especialmente como Web Server ou Database Server. O segundo,

Outros SGBDR
117

como um cliente standalone, em que a aplicao no precise depender de uma rede para obter acesso aos dados.

O Engine
O SQL Server Express usa o mesmo Engine que as demais edies do SQL Server 2005, mas, por ser uma edio, digamos, light, possui algumas limitaes. O Engine suporta uma CPU, 1 GB de RAM e banco de dados com at 4 GB. Uma mudana signicativa em relao ao MSDE 2000 que o Engine do SQL Express no possui a limitao de usurios concorrentes, conhecida como Concurrent Workload Governor, em que a performance do MSDE 2000 extremamente prejudicada na medida em que as conexes concorrentes de usurios aumentam. O SQL Server Express pode ser instalado tambm em mquinas com processadores mltiplos, mas somente um deles ser utilizado pelo Engine. Como conseqncia, caractersticas como execuo de consultas em paralelo no suportado pelo SQL Server Express. O limite de 1 GB RAM apenas para o buffer pool. O buffer pool usado para o armazenamento de pginas de dados e outras informaes. A memria necessria para o gerenciamento de conexes, locks e outros no est includa neste limite de 1 GB. Sendo assim, o SQL Express pode ser instalado normalmente em mquinas com mais de 1 GB, mas ele nunca usar mais que 1 GB para o buffer pool. AWE ou /3GB no suportado. O limite de 4 GB para o banco de dados aplicado apenas para o arquivo de dados. Entretanto, no existe limite para o nmero de banco de dados que voc pode colocar no servidor. O SQL Server Express suporta instalao side-by-side com outras verses do SQL Server, podendo coexistir na mesma mquina junto com instalaes do SQL Server 2000, SQL Server 2005 ou MSDE 2000. Suporta um nmero mximo de 50 instncias na mesma mquina, desde que cada instncia seja unicamente identicada, ou seja, voc pode realizar at 50 instalaes do SQL Express desde que cada instncia tenha um nome diferente. Por padro, o SQL Server Express instalado com uma named instance chamada SQLEXPRESS.

As ferramentas
Ao contrrio do que acontecia no MSDE 2000, que no possui ferramenta grca, o SQL Server Express possuir uma ferramen-

Crie Banco de Dados em MySQL


118

ta grca chamada SQL Server Express Manager (XM). Esta, ainda em fase de desenvolvimento, permitir uma fcil administrao dos bancos de dados e distribuda separadamente para download. O XM suporta conexes para SQL Server Express e outras edies do SQL Server 2005, SQL Server 2000 e MSDE 2000. Uma janela de conexo guiar o usurio atravs da seleo de uma instncia e o mtodo de autenticao a ser utilizado, suportando conexes locais ou remotas. Diversas funcionalidades de gerenciamento de banco de dados estaro disponveis por meio do menu de contexto (boto direito) e wizards. Entre elas, podemos citar, criar e modicar banco de dados, tabelas, usurios e logins. O Query Editor do XM permitir o desenvolvimento e execuo de instrues T-SQL e scripts. Algumas das ferramentas inclusas no SQL Server Express so o SQL Computer Manager, SQL Command e o utilitrio BCP. O SQL Computer Manager substitui os atuais Service Manager, Client Network Utilities e Server Network Utilities. Ele usado para iniciar e parar os servios do SQL Server e para habilitar e desabilitar os protocolos de rede. O SQL Command (sqlcmd.exe) uma verso OLE DB do osql.exe; ele no somente tenta manter as funcionalidades do SQL, como tambm possui suporte aos novos tipos de dados do SQL Server 2005. SQL Computer Manager e SQL Command so os mesmos em todas as edies do SQL Server 2005.

Suporte a rede
Embora o usurio possa habilitar o suporte a protocolos como TCP/IP e Named Pipes, por padro, o SQL Server Express instalado apenas com suporte a shared memory. Isto faz com que por default o SQL Server Express funcione apenas localmente na mquina onde foi instalado e no suporte conexes de clientes em uma rede. Para suportar conexes de clientes remotos, necessrio habilitar o suporte a rede no SQL Server Express. Para habilitar o suporte rede, voc tem as seguintes opes: Usar o SQL Computer Manager para habilitar os protocolos necessrios (normalmente TCP/IP) e iniciar o servio SQL Browser; Usar a parmetro DISABLENETWORKPROTOCOLS=0 na linha de comando no momento da instalao. O SQL Browser um novo servio do SQL Server 2005 que identica as portas que as named instances esto usando. Este servio

Outros SGBDR
119

vem desativado por default e deve ser ativado para que a comunicao entre um cliente remoto e um servidor SQL Server Express funcione corretamente.

Funes do SQL Server Express


O SQL Server Express suporta a maioria das funcionalidades do SQL Server 2005. A lista a seguir mostra algumas caractersticas e componentes suportados. Stored Procedures; SQL Computer Manager; Views; Replication (as a subscriber only); Triggers; Advanced Query Optimizer; Cursors; SMO / RMO; Sqlcmd and osql utilities; Integration with Visual Studio 2005; Snapshot Isolation Levels; Service Broker (as a client only); Native XML support, including XQuery and XML Schemas; SQL CLR; T-SQL language support; Multiple Active Result Sets (MARS). A seguir, relatamos os principais componentes do SQL Server 2005 que no so suportados nesta verso do SQL Express Edition: Reporting Services; Notication Services; Analysis Services; SQL Agent; Full text search; DTS; OLAP Services / Data Mining; English Query. A seguir, destacamos algumas caractersticas do SQL Server 2005 e do SQL Server 2000 que no so suportadas nesta verso do SQL Express:

Crie Banco de Dados em MySQL


120

Novas caractersticas do SQL Server 2005


SqlMail and SQLiMail; Database mirroring; Distributed partitioned views; Database snapshot; Log shipping; Mirrored media sets; Parallel Create Index; Address Windowing Extensions (AWE); Indexed views (materialized views); Native HTTP.

Caractersticas do SQL Server 2000


Dedicated Administrator Connection; Fail-over clustering; Online restore; VIA protocol support; Parallel index operations; Parallel DBCC; Scale up partitioning; Enhanced Read Ahead and Scan; Hot-add memory; Partitioned .

O SQL Express e o MSDE


O SQL Express Edition o sucessor do MSDE e est baseado nas caractersticas do SQL Server 2005. Este possui caractersticas no presentes no MSDE como um robusto e simples setup GUI, suporte a CLR, ferramentas grcas e integrao com o Visual Studio. Entretanto, algumas caractersticas foram removidas do SQL Server Express como: suporte a DTS, replication publishing e SQL Agent. A limitao de conexes concorrentes do MSDE foi removida e, ao invs disso, o SQL Server Express usa as limitaes de CPU, RAM e banco de dados para se diferenciar das outras edies. Como podemos observar, o SQL Server Express promete, principalmente no que diz respeito s facilidades de uso e administrao. Ele seguro por default, totalmente free, compatvel com outras edi-

Outros SGBDR
121

es do SQL Server 2005 e sua integrao com o Visual Studio 2005 torna mais simples o desenvolvimento de aplicaes que utilizam o SQL Server como repositrio de dados. Entretanto, tambm pudemos notar que muitas caractersticas e componentes existentes hoje no MSDE foram deixados de lado, como, por exemplo, suporte a dois processadores e 2 GB de RAM, SQL Agent e DTS.

O Firebird
O Firebird, conhecido tambm com o nome FirebirdSQL, um Sistema Gerenciador de Bancos de Dados Relacionais multiplataforma, isto , que roda em Linux, Windows, Mac OS e uma variedade de plataformas baseadas em Unix (como o Linux). A Fundao FirebirdSQL coordena a manuteno e desenvolvimento do Firebird, sendo que os cdigos-fonte so disponibilizados sob o CVS em sourceforge.net. Baseado no cdigo do InterBase da Borland, quando da abertura de seu cdigo na verso 6.0 (que saiu em 25 de julho de 2000), alguns programadores, em associao, assumiram o projeto de identicar e corrigir inmeros bugs da verso original, surgindo da o Firebird, e a primeira verso 1.0 se tornou um banco com caractersticas prprias, obtendo uma aceitao imediata no crculo de programadores. Quase que totalmente ainda compatvel com sua origem, est atualmente em sua verso 1.5, com muitas novidades. A verso 2.0, em fase de produo ainda, dever trazer muitas inovaes. J est se falando at em uma verso 3.0, que hoje tem o codinome Vulcan, cujas caractersticas j ento seriam de um super banco de dados. Seu maior diferencial ainda se baseia na gratuidade; o banco free em todos os sentidos: no h limitaes de uso, e seu suporte amplamente discutido em listas na Internet, o que facilita enormemente a obteno de ajuda tcnica. O produto se mostrou bastante seguro, suportando sistemas com dezenas de usurios simultneos e bases de dados acima de 2 GB de tamanho.

Crie Banco de Dados em MySQL


122

A seguir, algumas dicas de sites para encontrar informaes mais detalhadas, tutoriais e exemplos relacionados ao Firebird: http://www.rebase.com.br http://www.rebirdsql.org/ http://www.rebird.com.br http://rebird.sourceforge.net/index.php?op=ffoundation&id =main_pt

Outros SGBDR
123

CONHEA OUTROS TTULOS RELACIONADOS

Treinamento Prossional em C# .net


No livro Treinamento Prossional em C# .net o leitor aprender: | Fundamentos do Visual Studio .Net; | Principais comandos do C#; | Estruturas e variveis de programao; | Manipulao de arrays; | Uso de mltiplos formulrios; | Principais componentes e objetos; | Manipulao de banco de dados; | Criao de wizards para instalao. Alm disso, o livro ensina tambm: | Passo a passo tudo o que voc precisa para criar aplicaes Windows e compilar seus programas; | Como utilizar os comandos bsicos, as estruturas de deciso e repetio no C#; | Como declarar e manipular variveis e arrays; | Como montar setups para instalao dos seus aplicativos; | Tudo o que voc precisa saber para construir aplicativos que manipulem diferentes tipos de banco de dados; E muito mais.

Treinamento Prtico em UML


Desenvolva e gerencie seus projetos com essa sensacional ferramenta Aprenda a trabalhar com UML e cada um de seus componentes: | Principais pacotes e ferramentas da linguagem | Mecanismos de extenso | Elementos de modelagem | Administrao de processos | Elementos para modelar distribuio e concorrncia | Padres de projeto e colaboraes | Diagramas de atividades | Renamento e nveis de abstrao de um projeto | Inferfaces e componentes | Linguagem de restries (Object Contraint Language) Diagramas Aprenda passo a passo a modelar e representar projetos e situaes utilizando: | Modelagem estruturada | Modelagem comportamental | Diagramas de casos de uso | Diagramas de classes e de objetos | Diagramas de comportamento | Diagramas de estados (statechart) Entre outros...

Entendendo e Dominando o PHP


O Entendendo e Dominando o PHP um livro indicado para todos aqueles que pretendem desenvolver websites usando a linguagem PHP a partir da verso 5.0, que traz como grande inovao o fato de permitir o uso de todo o potencial da orientao a objetos. Entre os tpicos abordados no livro esto: orientao a objetos, classes, objetos e mtodos; argumentos e tipos de dados; uso de herana; construo de interfaces; manipulao de excees; interceptadores; denio do projeto do cdigo; programao procedural e orientada a objetos; polimorsmo e encapsulamento; uso da UML para construir diagramas de classes; padres de projeto; executao e representao de tarefas; documentao com o phpDocumentor; controle de verses com CVS; construo automtica com Phing; reusabilidade e muito mais...

Treinamento Avanado em .NET


Orientao a objetos Conhea todos os truques de programao e orientao a objetos na plataforma .NET: | Uso do Framework .NET | Bibliotecas de classes e atributos | Programao com ActiveX | Desenvolvimento em XML | Programao em C# | VB.NET | ASP.NET

Entendendo e Dominando o Java para Internet


De alguns anos para c, o Java se consolidou como a linguagem mais usada por programadores e grandes corporaes em todo o mundo. Somado a esse sucesso do Java, vem a crescente demanda por aplicativos que estejam totalmente integrados ao ambiente Web. Essa demanda veio acompanhada de aumento no grau de exigncia para o prossional, que precisa ter alto nvel de conhecimento, ser extremamente capacitado e possuir experincia e slidos conhecimentos na linguagem. Para atender a essas demandas paralelas, Entendendo e Dominando o Java para Internet traz explicaes e exemplos completos que facilitam o aprendizado dos sosticados recursos do Java e ensinam a combin-los para desenvolver aplicativos on-line. A estrutura do livro foi projetada com base em um mtodo de ensino de eccia comprovada, desenvolvida em anos de execuo de treinamentos intensivos e semi-intensivos em faculdades e empresas, para os mais diversos tipos de alunos, com os mais diferentes nveis de conhecimento em programao. Com isso, temos certeza de que o Entendendo e Dominando o Java para Internet ajudar o leitor em sua busca por informao e especializao.

Visite nossa loja virtual em www.universodoslivros.com.br e conra nossas promoes.