Você está na página 1de 60

Curso Tcnico em Informtica

Banco de Dados II

Robson Braga de Andrade


Presidente da Confederao Nacional da Indstria

Rafael Lucchesi
Diretor do Departamento Nacional do SENAI

Regina Maria de Ftima Torres


Diretora de Operaes do Departamento Nacional do SENAI

Alcantaro Corra
Presidente da Federao da Indstria do Estado de Santa Catarina

Srgio Roberto Arruda


Diretor Regional do SENAI/SC

Antnio Jos Carradore


Diretor de Educao e Tecnologia do SENAI/SC

Marco Antnio Dociatti


Diretor de Desenvolvimento Organizacional do SENAI/SC

Confederao Nacional da Indstria


Servio Nacional de Aprendizagem Industrial

Curso Tcnico em Informtica

Banco de Dados II
Silvio Luis de Sousa

Florianpolis/SC
2011

proibida a reproduo total ou parcial deste material por qualquer meio ou sistema sem o prvio consentimento
do editor.

Autor
Silvio Luis de Sousa

Fotografias
Banco de Imagens SENAI/SC
http://www.sxc.hu/
http://office.microsoft.com/en-us/ images/
http://www.morguefile.com/
http://www.bancodemidia.cni.org.br/

Ficha catalogrfica elaborada por Luciana Effting CRB14/937 - Biblioteca do SENAI/SC Florianpolis

S725b

Sousa, Silvio Luis de


Banco de dados II / Silvio Luis de Sousa. Florianpolis : SENAI/SC, 2011.
59 p. : il. color ; 28 cm.
Inclui bibliografias.
1. Banco de dados. 2. Banco de dados relacionais. 3. Sistemas de
recuperao da informao Segurana. 4. SQL (Linguagem de
programao de computadores). I. SENAI. Departamento Regional de Santa
Catarina. II. Ttulo.
CDU 004.65

SENAI/SC Servio Nacional de Aprendizagem Industrial


Rodovia Admar Gonzaga, 2.765 Itacorubi Florianpolis/SC
CEP: 88034-001
Fone: (48) 0800 48 12 12
www.sc.senai.br

Prefcio
Voc faz parte da maior instituio de educao profissional do estado.
Uma rede de Educao e Tecnologia, formada por 35 unidades conectadas e estrategicamente instaladas em todas as regies de Santa Catarina.
No SENAI, o conhecimento a mais realidade. A proximidade com as
necessidades da indstria, a infraestrutura de primeira linha e as aulas
tericas, e realmente prticas, so a essncia de um modelo de Educao
por Competncias que possibilita ao aluno adquirir conhecimentos, desenvolver habilidade e garantir seu espao no mercado de trabalho.
Com acesso livre a uma eficiente estrutura laboratorial, com o que existe
de mais moderno no mundo da tecnologia, voc est construindo o seu
futuro profissional em uma instituio que, desde 1954, se preocupa em
oferecer um modelo de educao atual e de qualidade.
Estruturado com o objetivo de atualizar constantemente os mtodos de
ensino-aprendizagem da instituio, o Programa Educao em Movimento promove a discusso, a reviso e o aprimoramento dos processos
de educao do SENAI. Buscando manter o alinhamento com as necessidades do mercado, ampliar as possibilidades do processo educacional,
oferecer recursos didticos de excelncia e consolidar o modelo de Educao por Competncias, em todos os seus cursos.
nesse contexto que este livro foi produzido e chega s suas mos.
Todos os materiais didticos do SENAI Santa Catarina so produes
colaborativas dos professores mais qualificados e experientes, e contam
com ambiente virtual, mini-aulas e apresentaes, muitas com animaes, tornando a aula mais interativa e atraente.
Mais de 1,6 milhes de alunos j escolheram o SENAI. Voc faz parte
deste universo. Seja bem-vindo e aproveite por completo a Indstria
do Conhecimento.

Sumrio
Contedo Formativo

38 Unidade de estudo 3

Finalizando

55

Referncias

57

Views
Apresentao

11
39 Seo 1 - Abordagem inicial
39 Seo 2 - Manipulando views

12 Unidade de estudo 1
ndice: Heri ou
Vilo?
13

Seo 1 - Conhecendo sobre


ndice

16

Seo 2 - Trabalhando e reconhecendo tipos de ndice

24 Unidade de estudo 2
Avanando em SQL
25

Seo 1 - Abordagem inicial

25

Seo 2 - Clculo em SQL

26

Seo 3 - Funes de agregao sobre conjuntos

28

Seo 4 - Mais recursos SQL

42

Unidade de estudo 4
Trigger

43 Seo 1 - Abordagem inicial


44 Seo 2 - Manipulando
Trigge

48

Unidade de estudo 5
Segurana em Banco de Dados

49 Seo 1 - Abordagem inicial


49 Seo 2 - Abrangncia da segurana em banco de dados
49 Seo 3 - Integridade de
dados
52 Seo 4 - Controle de acesso
a banco de dados

CURSOS TCNICOS SENAI

Contedo Formativo
Carga horria da dedicao
Carga horria: 60 horas

Competncias
Criar e gerenciar sistemas de banco de dados para soluo de problemas

Conhecimentos
ndices,
Integridade de dados,
Junes (join),
Unio (union),
Vises (views),
Triggers (gatilhos),
Redundncia.

Habilidades
Aplicar lgebra de conjuntos.
Interpretar e analisar modelos de dados.
Utilizar a linguagem SQL para manipulao de dados.
Identificar defeitos e falhas em banco de dados.
Aplicar normas de segurana de dados (integridade de dados, backup e restore).

Atitudes
Organizao e zelo na utilizao de equipamentos.
Foco no contedo trabalhado.
Acesso a stios relacionados ao tema trabalhado.
Organizao e limpeza dos ambientes coletivos.
Dedicao e empenho nas atividades curriculares e extracurriculares.
Capacidade de abstrao.
Trabalho em equipe.
Apresentao de novas solues para situaes problemas.
Cumprimento de prazos.
Anlise crtica de suas produes.
Banco de Dados II

Apresentao
Que tal iniciar os estudos da unidade curricular Banco de Dados II
aprendendo a desenvolver competncias voltadas ao desenvolvimento
de atividades relacionadas sua profisso?
Bem, voc deve estar se perguntando: Que competncias so essas?.
So as competncias de criar e gerenciar sistemas de banco de dados
para a soluo de problemas computacionais.
Durante seus estudos, este material poder contribuir para o desenvolvimento de habilidades voltadas para a elaborao de projetos de banco de
dados, utilizando tcnicas eficientes, o que contribui, substancialmente,
para a elaborao e o desenvolvimento de projetos de software.
Esta unidade curricular contempla, ainda, a utilizao correta dos recursos de informtica e de ferramentas garantindo a qualidade para soluo
de problemas. Esses so os requisitos de empresas que atuam em diversos segmentos do mercado de trabalho.
Que voc tenha, a partir de agora, um estudo e um timo aproveitamento deste material!

Silvio Luis de Sousa


Graduado em Processamento
de Dados e Sistemas de Informao. Ps-graduado em Formao Docente para o Ensino
Superior. Scio proprietrio da
LM&SL Treinamento, Desenvolvimento e Consultoria em Informtica, com atuao em Joinville e regio. Atua no SENAI em
Joinville como instrutor de cursos de qualificao e tcnicos,
com experincia profissional em
treinamento e desenvolvimento
de projeto de software.

Banco de Dados II

11

Unidade de
estudo 1
Sees de estudo
Seo 1 Conhecendo sobre ndice
Seo 2 Trabalhando e reconhecendo
tipos de ndice

ndice: Heri ou Vilo?


Seo 1

Conhecendo sobre ndice


Muito se fala sobre ndice em banco de dados. Alguns defendem, de maneira muito entusiasta, seu uso como estrutura indispensvel e obrigatria quando da criao das tabelas do seu banco de dados, outros, apesar
de no serem contrrios ideia, sugerem cautela na sua utilizao e, para
encerrar, existe uma corrente que nem quer ouvir falar sobre ndice,
devido a experincias malsucedidas. Diante disso, voc est convidado a
conhecer sobre ndice, para que possa formar a sua opinio.
Para iniciar a compreenso sobre ndice em sua principal utilidade, confira um exemplo como referncia, adaptado de uma pgina da internet.
Suponha uma tabela de clientes, tendo como campo chave primria o
campo Cdigo do cliente, com a seguinte estrutura fsica:

Campo simples: campo


que no seja chave na tabela, seja ela primria, estrangeira, nica ou full-text, ou seja,
trata-se de um campo de dados
simples ou no chave.

ndices: recurso utilizado


para encontrar registros rapidamente em tabelas de banco
de dados.

Figura 1: Representao da tabela Clientes populada


Fonte: Aquino (2010)

Imagine que nessa estrutura no exista nenhum campo (simples) criado como ndice e que voc queira fazer uma consulta dos dados do
cliente a partir do seu nome, por exemplo, do cliente Silvio Luis:
SELECT Codigo, Nome, Rua, Numero FROM clientes WHERE Nome =
Silvio Luis

Banco de Dados II

13

Instruo SQL:

Figura 2: Consulta da tabela Clientes pelo campo simples Nome

Agora, supondo que a tabela clientes seja modificada com, por exemplo,
a criao de um ndice para o campo Nome e, aps, voc queira novamente fazer a consulta dos dados do cliente Silvio Luis. Confira:
Instruo SQL
SELECT Codigo, Nome, Rua, Numero FROM clientes USE INDEX (index_
Nome) WHERE Nome = Silvio Luis

Figura 3: Consulta da tabela Clientes pelo campo ndice Nome

A sintaxe SQL de criao e a de consultas que envolvem ndices ser explicada em detalhes na prxima seo desta unidade Trabalhando e reconhecendo tipos de ndice.

Fcil de analisar o que ocorreu nas duas situaes, no ? Na primeira


simulao, foi realizada a consulta pelo campo Nome, que na ocasio
tratava-se de um campo simples. Como resultado voc observou que
foi realizada uma varredura na tabela o que chamamos de Table Scan at
encontrar o registro desejado. Isso bom ou ruim? Bem, em tabelas
com poucos registros no muito relevante, mas, ao contrrio, trata-se
de queda de performance em consultas a banco de dados.
Na segunda simulao tambm foi realizada a consulta pelo campo
Nome, porm, nesta ocasio, como ndice da tabela, e no mais como
um campo simples. No resultado voc observou a identificao do valor
do campo de maneira mais rpida em relao primeira simulao, sem
a tal varredura, o que nos isenta da tal perda de performance na consulta
ao banco de dados, logicamente, dependendo da quantidade de registros
na tabela.

14

CURSOS TCNICOS SENAI

Assim, ficou clara a ideia principal


do ndice em um banco de dados,
que se trata de uma estrutura importante no que diz respeito otimizao das consultas realizadas.
Um ndice uma estrutura associada a uma tabela que torna
a pesquisa mais rpida. Deve-se levar em conta o emprego
de ndices em qualquer coluna
frequentemente utilizada na
pesquisa de uma determinada
tabela, pois, com esta opo, a
durao das pesquisas ser consideravelmente diminuda (MACHADO, 2008, p. 381).

Os ndices podem ser criados


para um nico campo, como no
exemplo anterior, ou para mltiplos campos para, por exemplo,
auxiliar na distino dos registros
quando um determinado campo
possui o mesmo valor. Tambm
podem ser atribudos aos campos
chaves primrias e chaves estrangeiras nas tabelas, a temos que
alguns SGBD determinam, automaticamente, como ndices as chaves
primrias (PK) e chaves estrangeiras (FK) de suas tabelas e outros
no, portanto importante verificar isso quando da criao da sua
estrutura de tabelas.

Agora que voc conhece um pouco mais sobre ndice em banco


de dados, importante tambm
saber que a escolha pela criao
de ndices, nas respectivas tabelas,
deve ser executada com critrio e
sem exageros, pois, como todo recurso de otimizao existente, os
ndices ocupam espaos em disco
e seu uso exagerado pode diminuir o rendimento nas transaes
de incluso, excluso e alterao
dos registros nas tabelas do banco
de dados.

Quanto criao de ndices, Machado (2008, p. 381) alerta:

SGBD: Sistema Gerenciador de Banco de Dados.

[...] tecnicamente no h limite ao nmero de ndices, mas


quanto maior o nmero deles
mais difcil a sua manuteno.

A determinao para utilizao


de ndices deve obedecer a alguns
critrios. Veja:

faa uma anlise individual por


tabela para verificar, com conscincia, se existem ou no campos
que devem ser ndices. Tabelas que
armazenam poucos registros ou
que apenas servem como auxlio a
outras tabelas normalmente no
requerem campos indexados;
analise as clusulas where e join
que ir utilizar. Os campos envolvidos so candidatos a ndices;
cuidado com o nmero excessivo de campos indexados em
tabelas simples;
cuidado tambm ao criar os
ndices. Evite criar como ndices os
campos que j estejam definidos
como tal, como o caso dos campos chave primria (PK) e campos
chave estrangeira (FK), pois isso
caracteriza sobreposio de ndice.
Esteja atento: uma tabela deve possuir um campo como ndice, pois,
do contrrio, os registros sero armazenados aleatoriamente e, no
caso de qualquer acesso a esta, o
processo torna-se bastante lento.
Cada SGBD possui caractersticas prpria apesar de alguns serem bastante similares em muitas
funcionalidades. Cada banco de
dados apresenta sua uma forma
particular com seus tipos de ndices suportados e como utiliz-los
respectivamente, fica aqui a sugesto de que consulte a documentao deste quando da manipulao
de ndices.

Banco de Dados II

15

SEO 2

Trabalhando e
reconhecendo tipos de ndice
Antes da abordagem deste assunto, vale salientar que a criao de ndices
pode ser executada para cada banco de dados disponvel. Reservadas as
funcionalidades destes, essa tarefa pode ser executada pelos programas
disponibilizados ou tambm de forma manual via instruo SQL. A sintaxe para manipulao dos ndices pode variar de um banco de dados
para outro. No nosso caso, mostraremos exemplos para criao de banco
de dados a partir de instruo SQL com base no banco de dados MySQL
verso 5.2 embarcada no utilitrio phpMyMAdmin 2.11.7. Crie um banco

de dados para os trabalhos.


Criao da tabela clientes:

CREATE TABLE clientes ( codigo INT(4) NOT NULL AUTO_INCREMENT,


nome VARCHAR(50) NOT NULL , rua VARCHAR(40) NOT NULL , numero
INT(4) NOT NULL , PRIMARY KEY (codigo) ) ENGINE = InnoDB

Confira a seguir a representao da estrutura da tabela clientes resultante


da instruo anterior.

Figura 4: Estrutura de ndices tabela clientes pelo campo ndice Nome

Como voc sabe, em um banco de dados possvel contar com um


ou mais campos cujos seus valores determinam uma unicidade para os
registros de uma tabela fazendo com que estes no se repitam so as
chamadas chaves primrias. Estas so identificadas e tratadas automaticamente como ndices nicos do tipo PRIMARY, permitindo, assim,
um acesso rpido aos dados declarados com esse ndice, nesse caso, ao
cdigo do cliente.
Consultar os dados do cliente Carlos Carvalho cujo cdigo 3:

16

CURSOS TCNICOS SENAI

SELECT Codigo, Nome, Rua, Numero FROM clientes WHERE Codigo =3

Resultado:

Figura 5: Resultado da consulta do cliente pelo cdigo

Observe na figura o tempo decorrido da consulta. claro que, em nosso


exemplo, contamos com a tabela populada com poucos registros, mas
importante saber que todas as consultas so executadas a partir do campo cdigo, que, por sua vez, um campo ndice.
Agora veja uma consulta pelo nome do cliente Silvio Luis. Neste caso
interessante que se crie um ndice para o campo Nome, pois ser necessrio utilizar a clusula where, e, tendo este campo como ndice, a consulta tende a ser mais eficiente e rpida.
Criando o ndice para o campo Nome da tabela clientes:
CREATE INDEX index_nome ON clientes (nome(50))

Resultado:

Figura 6: Resultado da criao do ndice contendo o campo Nome

Note que a partir de agora a tabela clientes contm mais um ndice, alm
do campo cdigo (chave primria). Foi criado um novo ndice contendo
o campo Nome para acelerar as consultas dos clientes por meio do seu
Nome. Esse ndice tido como um ndice simples, tambm conhecido
como ndice normal. Esse ndice no contm nenhum tipo de restrio
como, por exemplo, o ndice primrio. Ele criado quando h uma necessidade sistemtica de se fazer uma consulta a um determinado campo
da tabela.

Banco de Dados II

17

Voc pode criar quantos ndices normais forem necessrios, mas fique
atento para a real necessidade da sua criao, pois, do contrrio, voc
pode provocar uma queda de performance no banco.
Para consultar o cliente Silvio Luis a partir do ndice criado, temos:
SELECT Codigo, Nome, Rua, Numero FROM clientes USE INDEX (index_
nome) WHERE Nome = Silvio Luis

Resultado:

Figura 7: Resultado da consulta do cliente pelo ndice Nome

Observe, tambm nesse exemplo, o tempo decorrido da consulta, ressaltando que, diante da consulta do exemplo anterior, ou seja, consulta pelo
cdigo (ndice primrio), esta ocorreu em um tempo maior. Isso porque
executar uma consulta a partir de um campo numrico normalmente
mais rpido do que uma consulta por um campo caracter, como o caso
do campo Nome.
Lembre-se de que, na medida em que a tabela contm um nmero significativo de registros, mais evidente ficar a eficcia da consulta a partir
de campos ndices.
Caso essa mesma consulta seja realizada a partir de um banco de dados
com muitos registros, a partir de um campo da tabela e no tendo criado
esse campo como ndice, a tendncia que a consulta seja mais demorada, pois, para encontrar o registro desejado, ser executada uma varredura (Table Scan) de todos os registros at encontrar aquele solicitado,
conforme mencionado.
Agora voc j sabe como criar e utilizar ndices simples, porm voc
pode se deparar com uma situao em que exista a necessidade de criar e
utilizar ndices compostos. Para no ter dvidas, acompanhe as informaes a seguir, e lembre-se: sempre que precisar, pergunte ao professor.
Suponha que voc necessite obter os dados do cliente Fbio Karnopp
que mora na Rua B. Note que nesse caso ser preciso resgatar informaes de dois campos, e no mais de um campo apenas. Tenho a certeza
de que sua reao seria elaborar a seguinte instruo SQL:
SELECT Codigo,Nome,Rua,Numero FROM clientes WHERE Nome=Fabio
Karnopp AND Rua =Rua B

18

CURSOS TCNICOS SENAI

Com certeza o resultado seria satisfatrio. Voc teria uma tabela


com todos os dados do cliente
solicitado. Tudo certo no fosse
um nico porm: se considerarmos o que foi trabalhado at agora, a esta altura s temos o campo
Nome criado como ndice, e isso
no o suficiente, precisamos de
um ndice com 2 campos Nome
e Rua. O que podemos fazer? As
alternativas so: customizar o ndice do Nome e incluir o campo
Rua ou exclu-lo e criar um novo
ndice com os campos Nomes e
Rua.
Levando-se em conta que o ndice existente possui o nome de
index_nome, caracterizando sua
utilizao para consultas pelo
nome do cliente, e tambm o fato
de que criando um novo ndice
composto com Nome e Rua no
o impediria de realizar tais consultas, e que, como estamos conhecendo sobre ndices, com certeza
vale a pena excluir o ndice index_nome e criar um novo ndice,
s que composto e com um novo
nome. Vamos trabalhar um pouco
mais com ndices?

Excluindo o campo ndice index_nome:


ALTER TABLE clientes DROP INDEX index_nome

Ao executar essa instruo, uma


confirmao dessa operao ser
solicitada:

Figura 8: Confirmao da excluso do ndice index_nome

Como o alerta sugere, caso queira cancelar a operao, clique no boto


Cancelar, e caso queira confirmar a excluso, clique no boto OK. Ao clicar

Como estamos nos baseando no


MySQL, em se tratando de ndices compostos, este, ao realizar
uma consulta, faz uso de um nico ndice. Se tiver de optar por
mais de um ndice, opta pelo mais
restritivo, ou seja, aquele que retorna a menor quantidade de registros.
Analisando nosso exemplo, temos que, quando executarmos a
consulta, o ndice ser utilizado da
seguinte forma:

em OK, o ndice excludo, e voc pode seguir para a prxima etapa.


Criando o ndice composto contendo os campos Nome e Rua:

Criando o ndice composto contendo os campos


Nome e Rua:
ALTER TABLE clientes ADD INDEX index_Nome_Rua (nome ,rua )

Note que novamente utilizamos o comando ALTER TABLE, pois a


tabela clientes est sendo modificada com a implementao de um novo
ndice, e, como tal, deve utilizar tambm o comando ADD para identificar o ndice a ser implementado e os campos que compem esse ndice,
no caso nome e rua.
Como resultado voc ter:

Figura 10: Leitura de um ndice composto

A leitura de um ndice composto


realizada da esquerda para a direita at chegar naquele, que retorna
a menor quantidade de registros.
Criado o ndice composto, ento
possvel realizar a consulta dos
dados do cliente Fbio Karnopp,
que mora na Rua B, a partir da seguinte instruo SQL:
SELECT Codigo, Nome, Rua,
Numero FROM clientes WHERE
Nome = Fbio Karnopp AND
Rua = Rua B

Figura 9: Resultado da criao do ndice contendo os campos Nome e Rua

Observe que agora tem um ndice chamado index_Nome_Rua composto por mais de um campo (nome e rua), por isso o nome do ndice
criado, mas isso no o fato marcante desse tipo de ndice. Durante esse
processo voc entender a sua caracterstica principal.

Banco de Dados II

19

Figura 11: Resultado da consulta dos dados do cliente, pelo ndice Nome, Rua

A partir desse ndice voc pode tambm realizar a seguinte consulta:


SELECT Codigo, Nome, Rua, Numero FROM clientes WHERE Nome =
Silvio Luis

Isso porque o campo Nome faz parte do ndice e trata-se do campo do


ndice que retorna a menor quantidade de registros.
J na instruo SQL a seguir, o ndice criado no utilizado, pois o campo Nome no est presente na condio da sentena. Apesar disso voc
obtm o resultado dos dados do cliente que residem na Rua R, normalmente, mas sem eficincia e rapidez de uma consulta utilizando o ndice.
SELECT Codigo, Nome, Rua, Numero from clientes where Rua = Rua B

Suponha agora que deseje que, em sua tabela de clientes, no sejam salvos clientes com nomes duplicados. Apesar de isso no ser tecnicamente
interessante, tome como exemplo para que se entenda a explicao da
criao e utilizao de ndices nicos.
Lembre-se de que o campo Nome no faz parte de chave primria, isso
significa que at o presente momento voc pode cadastrar clientes com
nomes iguais vontade, mas no isso que a proposta exemplo sugere,
ento a primeira providncia a de criar um ndice nico com o campo
Nome:
ALTER TABLE clientes ADD UNIQUE unico_nome (nome)

Como resultado da criao desse ndice voc ter:

Figura 12: Resultado da criao do ndice nico contendo o campo Nome


20

CURSOS TCNICOS SENAI

Observe que foi criado um ndice


nico para o campo Nome, sendo
que esse campo tambm faz parte
de outro ndice, o index_Nome_
Rua. Isso possvel porque os tipos
de ndices so diferentes e so criados para propsitos diferentes.

Agora, teste a utilizao desse ndice inserindo um registro na tabela com o nome de um cliente
j cadastrado, como, por exemplo,
Fbio Karnopp.
Instruo SQL para incluso do
cliente:
INSERT INTO clientes (codigo
,nome ,rua ,numero )VALUES
(NULL ,Fbio Karnopp, Rua C,
111)

Resultado:

Figura 13: Resultado da utilizao da chave nica unico_nome

Note que a mensagem chama a sua ateno informando que voc est
tentando inserir um registro duplicado para o cliente Fbio Karnopp, cujo
cdigo 2.

Nesse exemplo foi criado um ndice nico contendo um nico campo,


ento temos um ndice nico simples.
Agora, suponha que voc concluiu que pessoas possam ter nomes iguais,
os chamados homnimos apenas para exemplificar, meu pai, o Sr. Jos
Manoel de Sousa, tem aqui na cidade de Joinville quatro homnimos, ou
seja, pessoas com o mesmo nome, porm com nmero de CPF, RG e
endereo diferentes.
Voc deve estar se perguntando, mas o que isso tem a ver com nosso
exemplo? Tudo, no acha? Como far para diferenciar um cliente de
outro? Claro que nosso exemplo um tanto limitado, mas, o que acha
de incrementarmos nosso ndice com o campo Rua? Certo, ainda existe
a possibilidade de termos clientes homnimos morando na mesma rua,
ento o que acha de incrementarmos com o campo Rua e Nmero?
Continue preparando o seu banco de dados para que aceite clientes com
nomes iguais, porm residindo em endereos diferentes. Para isso, voc
deve adicionar mais um campo ao ndice nico j existente. Mas como
fazer isso, j que o ndice est com um nome que sugere seu contedo
com o campo Nome e como incrementar esse ndice com o campo Rua?
Da seguinte maneira:
ALTER TABLE clientes DROP INDEX unico_nome , ADD UNIQUE unico_
nome_rua (nome , rua )

Ao executar essa instruo, uma confirmao dessa operao ser solicitada:

Banco de Dados II

21

Figura 14: Confirmao de alterao do ndice unico_nome

Para incrementar o ndice existente nico_nome com o campo Rua, mas


deve-se eliminar o ndice existente (DROP INDEX nico_nome) e em seguida
proceder a adio do novo ndice com os respectivos campos (ADD UNIQUE
nico_nome_rua (nome,rua).

Ao confirmar a operao, o novo ndice ser criado, porm uma situao


lhe ser alertada:

Figura 15: Resultado da criao do ndice nico contendo os campos Nome e Rua

Como o alerta esclarece, existem ndices idnticos e, apesar de serem


de tipos diferentes, possuem os mesmos campos, por isso o banco de
dados sugere que elimine um deles para que o espao no banco de dados
no seja utilizado com recursos em duplicidade.
Mesmo tendo essa duplicidade, os dois ndices continuam servindo aos
seus propsitos, porm no se aconselha a mant-los em duplicidade.

Voc dever optar pela eliminao de um dos ndices: ou o ndice composto tipo INDEX, que permite a consulta dos clientes e residncia
sem a preocupao de registros duplicados, ou o ndice tambm composto do tipo UNIQUE, que permite a realizao da consulta a exemplo do seu concorrente, mas com o adicional de no permitir registros
duplicados com as informaes dos campos desse ndice.
A diferena entre esses ndices encontra-se apenas na permisso ou no
de inserir registros duplicados para os campos do ndice, ou seja, possvel consultar os dados dos clientes a partir do nome e da rua sem mais
problemas. Assim, a melhor opo excluir o ndice do tipo INDEX. Se
estiver em dvidas de como fazer a excluso, reveja o exemplo onde o
ndice index_nome foi excludo anteriormente, e lembre-se tambm de
consultar o professor sempre que achar necessrio. Feito isso, insira um
registro para o cliente, Fbio Karnopp em uma rua diferente daquela do
Fbio Karnopp j cadastrado (Rua A e/ou Rua C).
Perceba que o seu banco de dados permite essa operao porque, apesar
de j existir um cliente com esse nome, a rua diferente daquela j cadastrada para esse cliente, ou seja,agora, para que o cliente seja impedido

22

CURSOS TCNICOS SENAI

de ser cadastrado, tanto o valor do


campo nome do cliente como o
da rua devem ser iguais aqueles j
registrados para o cliente.
Que tal testar isso agora? Insira
um registro para o cliente Fbio
Karnopp na Rua B. Provavelmente voc receber como retorno
uma mensagem de que o cliente j
se encontra cadastrado.
Voc conheceu at aqui os ndices
do tipo primrio, simples, compostos e nicos. Agora conhecer o ndice do tipo Full-text, ou
texto completo. Trata-se de um
ndice para realizar consultas a
campos de texto de uma tabela.
No MySQL esses tipos de ndice
so utilizados em tabelas do tipo
MyISAM e para os campos do
tipo CHAR, VARCHAR e TEXT.
Para trabalhar esse contedo, seguiremos com o exemplo da tabela de clientes e, por ser tratar de
um tipo especial de ndice, criaremos uma nova tabela para estud-lo de forma individualizada.
Para comear, voc pode criar
a estrutura da tabela no mesmo
banco de dados onde se encontra
a tabela clientes, para uma melhor
organizao. D a essa tabela o
nome de artigos, como se voc
fosse armazenar informaes sobre artigos em um site para web,
por exemplo.
CREATE TABLE artigos (
id int(10) unsigned NOT NULL
auto_increment, titulo varchar(200) default NULL, texto
text, PRIMARY KEY (id), FULLTEXT KEY titulo (titulo,texto)
) ENGINE=MyISAM

Resultado:

Tal valor do argumento procurado nos campos do ndice ttulo


e texto e, quando encontrado, devolve o resultado. Para se certificar disso, escreva e teste a seguinte instruo SQL:
SELECT * FROM artigos WHERE
MATCH (titulo, texto) AGAINST
(Otimizando)

Figura 16: Estrutura da tabela e de ndices de artigos

Note que esse ndice tambm composto e, neste caso, pelos campos
ttulo e texto, ser preciso popular a tabela para em seguida aprender a
executar consultas FULL-TEXT.
Para popular a tabela artigos, utilize o cdigo a seguir.
INSERT INTO artigos (id, titulo, texto) VALUES (NULL, Banco de Dados
II, Uma viso prtica),(NULL, Como trabalhar com ndices, Conhea
tudo sobre ndices),(NULL, Otimizando suas consultas, Otimize suas
consultas utilizando....),(NULL, Dicas para criar ndices, 1. Analise as
clusulas where e join 2. ...),(NULL, Criando ndices full-text, Como
trabalhar ...)

Como resultado da tabela artigos populada, tem-se:

Figura 17: Tabela artigos populada

Agora a consulta FULL-TEXT pode iniciar, ento vamos direto ao assunto. Vamos supor que voc queira capturar o texto referente ao id 3:
Otimize suas consultas utilizando...
SELECT * FROM artigos WHERE MATCH (titulo, texto) AGAINST (Otimize)

Entendendo a instruo SQL: observe que a funo MATCH (ttulo,


texto) utilizada para repassar parmetros como ttulo e texto. Isso faz
com que a busca de uma string seja realizada a partir dos campos do
ndice FULL-TEXT. J o argumento AGAINST (Otimize) solicita a
descrio de um trecho com o texto que deseja capturar.

Para finalizar, escreva a prxima


instruo SQL e teste tambm
para ver o resultado:
SELECT * FROM artigos WHERE
MATCH (titulo, texto) AGAINST
(Trabalhar)

O resultado traz os registros correspondentes aos id 2 e 5, que so


os registros que contm a palavra
Trabalhar. Perceba que nos dois
registros as palavras encontram-se salvas em minsculo, porm a
pesquisa foi realizada com caixa-alta e caixa-baixa, o que quer
dizer que esse tipo de busca no
faz diferenciao entre letras maisculas e minsculas, ou seja, no
case sensitive.

Saiba mais
Na prxima unidade, avanaremos em SQL, por isso importante que voc no fique com
dvidas sobre o que j estudou
at aqui. Para mais informaes e/ou detalhes sobre o uso
de ndices, lembre-se de consultar o manual e/ou tutorial
do SGBD que voc est trabalhando (neste caso, o MySQL).

Banco de Dados II

23

Unidade de
estudo 2
Sees de estudo
Seo 1 Abordagem inicial
Seo 2 Clculo em SQL
Seo 3 Funes de agregao sobre
conjuntos
Seo 4 Mais recursos SQL

Avanando em SQL
SEO 1

Abordagem inicial
Voc j conhece o conceito, a estrutura e a importncia da SQL
para o ambiente de banco de dados relacional. Tambm conhece
as transaes que podem ser executadas a partir dessa linguagem
e sabe que serve de base para os
SGBDs encontrados no mercado.
Sabe que, apesar da universalidade, a linguagem possui adaptaes
dos seus recursos de acordo com
o SGBD utilizado, e isso sugere
que, ao trabalhar com a linguagem, preciso ficar atento documentao do banco de dados
para que ele possa ser utilizado
com eficincia.
Criar banco de dados e tabelas ou
exclu-las no deve ser mais novidade para voc, assim como incluir, alterar e pesquisar registros
em uma tabela.
Alm desses conhecimentos especficos em SQL, voc j deve
tambm dominar a elaborao
de projetos de banco de dados a
partir dos conhecimentos de modelagem de dados, no mesmo?
Ento, voc j deve ter percebido
o quanto complexa a estrutura
de um banco de dados bem modelada. So tabelas criadas com
seus respectivos campos, que por
sua vez so de um determinado
tipo e tamanho, podendo estes ser
chave primria ou estrangeira, ou
simplesmente campos simples.

Ainda sobre projeto de banco


de dados, voc deve ter percebido tambm que, de acordo com
a necessidade, tais tabelas devem
estar relacionadas segundo regras
preestabelecidas, a fim de o banco
de dados garantir que seu usurio obtenha o mximo de informaes que garantam boas aes
para o seu negcio, de forma eficiente e rpida.
Diante de toda essa complexidade que o projeto de banco de dados nos remete, existem situaes
que exige um conhecimento mais
aprofundado em SQL para garantir bons resultados a partir da estrutura projetada, situaes como
realizar clculos com informaes
selecionadas, utilizar funes de
agregao sobre conjuntos, agrupar informaes selecionadas,
acessar dados de vrias tabelas e
utilizar consultas avanas so importantes.
isso que esta unidade se prope: repassar alguns dos conhecimentos avanados em SQL
necessrios, para que voc possa
implementar com eficincia seu
projeto de banco de dados.
Nota

SEO 2

Clculo em SQL
Apenas para relembrar, campo
calculado um campo que no
pertence fisicamente a uma tabela
(no um campo de dado), mas
armazena o resultado do clculo
proveniente de alguns campos
(campos de dados) destas, objetivando a exibio de seu contedo
quando da apresentao do resultado de uma consulta.
Situao: Mostrar o novo valor
dos produtos de um minimercado, identificados com tarja verde, com desconto de 10%. Ordenar pelo nome do produto.

Figura 18: Diagrama de entidade e


relacionamentos produtos

Aps criar e popular a tabela


produtos, tem-se:

Sero abordados nesta unidade recursos da SQL baseados


no SGBD MySQL, que uma
linguagem universal, e tudo o
que apresentado existe na
maioria dos bancos de dados.
Caso voc no utilize MySQL,
verifique qual a sintaxe que
este utiliza para o recurso apresentado neste livro.
Banco de Dados II

25

Funo AVG ( )
Situao: Qual ser a mdia
dos preos dos produtos?
SELECT AVG (valor_venda) AS
Mdia_Valores_Produtos from
produtos

Figura 19: Tabela produtos populada

Resultado:

Calcular o desconto de 10% para os produtos com tarja verde:

SELECT Nome, (valor_venda (


(valor_venda * 1.10) valor_
venda )) AS Valor FROM produtos WHERE tarja = Verde
ORDER BY nome

Note que temos ORDER BY


nome, indicando que se deseja que
o resultado da consulta seja ordenado pelo nome do produto em
ordem ascendente. Sempre que a
ordenao omitida, assume-se a
ordem ASC (ascendente). Caso se
prefira a ordenao descendente,
insere-se a informao ORDER
BY nome DESC.

Para aplicar as funes de agregao, utilizaremos a tabela produtos, j trabalhada anteriormente.


Confira as funes a seguir.

Funes Max ( ) e
Min ( )
Situao: Mostrar o menor e o
maior valor dos produtos da tabela produtos.
SELECT MIN ( valor_venda )
AS Valor_Mnimo, MAX( valor_venda ) AS Valor_Mximo
FROM produtos

Resultado:

Resultado:

Figura 20: Resultado da consulta

Figura 21: Resultado menor e maior do


valor dos produtos

Figura 22: Resultado da mdia dos valores dos produtos

A funo executa a mdia aritmtica simples de um conjunto de


valores, no caso do exemplo, dos
preos dos produtos.

Funo Count ( )
Situao 1: Quantos registros
existem na tabela produtos?
SELECT count (*) AS Total_Registros FROM produtos

A informao Total_Registros
na instruo captura a quantidade total de registros existentes na tabela produtos. Resultado:

SEO 3

Funes de agregao
sobre conjuntos
um recurso bastante parecido
com o trabalhado na seo anterior. As funes de agregao
existem para gerar novas colunas.

26

CURSOS TCNICOS SENAI

Figura 23: Resultado quantidade de


registros na tabela produtos

Situao 2: Quantos produtos


possuem o valor de venda superior a R$ 5,00?

SELECT count ( * ) AS Total_Registros FROM produtos WHERE


valor_venda > 5.00

Neste caso, a resposta a quantidade total de registros com valor


de venda superior a R$ 5,00 na
tabela produtos. Perceba tambm
a presena do operador relacional
> (maior). Esses operadores
podem ser utilizados em instrues SQL.

Figura 25: Diagrama de entidade e relacionamentos orcamento-pecas

Resultado:

Aps criar e popular a tabela orcamento_pecas, tem-se:

Figura 24: Resultado da quantidade de


registros com valor do produto acima
de R$5,00

Funo SUM()
Para exemplificar o uso da funo
SUM ( ), crie e popule a tabela orcamento_pecas, conforme diagrama e tabela a seguir.

Figura 26: Tabela oramento_pecas populada

Situao: Mostrar a somatria da quantidade de peas oradas para a


pea cujo cdigo de identificao 8901.
SELECT SUM(qtdepeca ) AS Somatria FROM orcamento_peca WHERE
peca_idpeca =8901

Resultado:

Figura 27: Resultado da somatria da quantidade orada para a pea 8901

Banco de Dados II

27

SEO 4

Resultado:

Mais recursos SQL


Nesta seo voc conhecer outros recursos da SQL, como a utilizao
da clusula DISTINCT, agrupamento de informaes selecionadas, recuperao dos dados de vrias tabelas e utilizao de consultas avanadas. Confira!

Clusula DISTINCT
comum ter registros em tabela contendo valores repetidos, como:

Figura 29: Resultado da consulta das


unidades de medida

Esse um exemplo que representa a aplicao da clusula DISTINCT que, segundo Machado
(2008, p. 349)
[...] foi criada para no permitir
que certas redundncias, obviamente necessrias, causem
problemas. A clusula DISTINCT
elimina repeties de valores
em relao a uma coluna.

Figura 28: Tabela de produtos populada acrescida do registro Feijo preto

Note que foi inserido registro Feijo preto e sua unidade de medida
kg, como a do Arroz branco, repetindo assim o valor kg na tabela.
Esse apenas um exemplo de ocorrncia entre vrias que podem ser
encontradas (e normalmente so encontradas) em tabelas de banco de
dados.
Situao: Suponha que voc deseja fazer uma consulta das unidades
de medidas, mas no gostaria que estas se repetissem, ou seja, no deseja que o registro kg seja repetido, como normalmente aconteceria ao
executar uma instruo bsica SQL. Para isso, implemente a seguinte
instruo SQL:
SELECT DISTINCT Unidademedida from produtos

28

CURSOS TCNICOS SENAI

Clusulas GROUP BY e
HAVING
O exemplo para essa clusula baseia-se na tabela orcamento_peca,
utilizada na explicao da funo
SUM ( ).
Situao: Digamos que voc precise emitir a listagem do nmero de peas que cada oramento
possui, agrupados pelo id do oramento.
Se voc verificar a Tabela orcamento_pecas populada, pode
conferir que para o oramento
cujo id 12 existem duas peas,
a de cdigo 12 e a de cdigo 8901,
j para o oramento cujo id 13
existe uma pea a de cdigo 12 e,
por fim, para o oramento cujo
id 15 existem duas peas, a
de cdigo 12 e a de cdigo 8901.
Conseguiu visualizar? Se realizar

uma consulta simples nesta tabela,


o resultado ser o mesmo visualizado na da Tabela 10, mas no
assim que desejamos o resultado,
mas sim o dos oramentos agrupados com o total de peas que
possui.
SELECT
orcamento_idorcamento, count( * ) AS Total_Peas FROM orcamento_peca
GROUP BY orcamento_idorcamento

Resultado:

Figura 30: Resultado da consulta do


nmero de peas por oramento

Sentiu o poder desta clusula?


Nesse caso mostrado o resultado para todos os oramentos da
tabela. Se quiser, pode filtrar os
oramentos que deseja visualizar
de forma agrupada, como, por
exemplo:
SELECT orcamento_idorcamento, count ( * ) AS Total_Peas
FROM orcamento_peca
WHERE
orcamento_idorcamento > 12 GROUP BY orcamento_idorcamento

Como voc viu, estamos realizando a mesma consulta, s que


desejamos visualizar o resultado
para os oramentos cujo id superior a 12.

Resultado:

Figura 31: Resultado da consulta oramentos com id superior a 12

O exemplo anterior mostra a utilizao da clusula GROUP BY


com a clusula WHERE.
Segundo Machado (2008, p. 350),
Geralmente, a clusula GROUP
BY utilizada em conjunto com
as operaes COUNT e AVG.
Agora, imagine uma consulta para
os oramentos com o total de peas superior a 1:
SELECT orcamento_idorcamento, count( * ) AS Total_Peas
FROM orcamento_peca
GROUP BY orcamento_idorcamento
HAVING COUNT( * ) >1

Resultado:

Figura 32: Resultado da consulta do


total de peas superior a 1

Note que agora foi utilizada a


clusula HAVING para fazer o filtro (restrio) da sentena, determinando que s sejam mostrados
os oramentos cujos totais sejam
superior a 1. semelhante clusula WHERE em um SELECT.
A clusula HAVING trabalha em
parceria com GROUP BY.
Perceba que existe uma interao
da clusula GROUP BY com outras clusulas SQL, possibilitando
consultas refinadas e eficientes.

Ainda sobre essa integrao, tem-se que GROUP BY pode ser


aplicada com qualquer outra clusula trabalhada em nosso estudo.

Acessar dados de duas


tabelas
Ao desenvolver a modelagem de
dados, est-se elaborando o projeto de banco de dados para uma
soluo que servir a um sistema
de informao para que possa
inserir, atualizar, excluir e principalmente acessar as informaes
para que o usurio deste possa
gerir seu negcio. Por menor que
seja seu projeto de banco de dados, sempre haver tabelas de diferentes natureza e caractersticas,
porm algumas se relacionam pela
necessidade de se obter informaes.
Mas como acessar as informaes
de duas tabelas? o que voc vai
saber a partir de agora.
A linguagem SQL nos fornece
tambm recursos para o acesso
simultneo a tabelas que encontram-se relacionadas, visando
extrair informaes encontradas
nelas. Esse recurso identificado
como juno ou JOIN entre tabelas.
Para ilustrar nosso estudo, vamos
utilizar as tabelas clientes e carros,
que se referem respectivamente a
informaes dos clientes de uma
oficina mecnica e tambm aos
carros pertencentes a esses clientes.

Banco de Dados II

29

Representando essas tabelas populadas, voc verifica:

Figura 33: Tabela clientes oficina mecnica populada

Figura 34: Tabela carros oficina mecnica populada

Observe o relacionamento entre as tabelas a partir do cdigo do cliente


inserido na tabela carros, identificando a quem o veculo pertence. Porm, observe tambm que se trata do cdigo do cliente, e no seu nome.
Isso faz parte das regras de relacionamento entre tabelas, como voc j
estudou.

INNER JOIN
Agora suponha que necessite fazer uma consulta em que tenha que visualizar os carros, identificados por suas placas, com os seus respectivos
donos (clientes), sendo, neste caso, necessrio visualizar o nome e o cdigo. A SQL disponibiliza o recurso de juno para resolver essa e outras
situaes, veja:
SELECT clientes.nome,carros.cliente_idcliente,carros.placa FROM clientes INNER JOIN carros
ON clientes.idcliente = carros.cliente_idcliente

Entendendo a instruo:
Note que estamos selecionando os campos que sero visualizados na
consulta fazendo referncia tabela onde ele se encontra seguido do seu
nome, clientes.nome, carros.cliente, carros.placa, isso porque a consulta
envolve duas tabelas clientes e carros.
30

CURSOS TCNICOS SENAI

Observe na sequncia FROM clientes INNER JOIN carros que estamos estabelecendo a juno entre as tabelas, do tipo INNER JOIN que,
por sua vez, fora com que os registros resultantes da consulta sejam
aqueles que satisfazem a condio do JOIN.
Finalizando, temos ON clientes.idcliente=carros.cliente_idcliente, na
qual estamos determinando a condio do JOIN para que s inclua,
na consulta, os registros que existam tanto na tabela clientes quanto na
tabela carros, ou seja, aquele registro que no se encontra em ambas as
tabelas no aparecer no resultado dessa consulta. Com isso sabemos, de
antemo, que o registro do cliente Silvio Luis no aparecer no resultado
dessa consulta.
Resultado:

Figura 35: esultado da consulta cliente/carros INNER JOIN

Devido juno entre as tabelas cliente e carros, agora possvel ver,


alm dos cdigos, os nomes dos clientes, podendo assim identificar com
maior clareza os proprietrios dos veculos.

CROSS JOIN
O CROSS JOIN outro tipo de JOIN, em que cada registro de uma das
tabelas combinada com todos os registros da outra tabela relacionada.
Veja como utilizar, ainda tomando como exemplo as tabelas relacionadas clientes e carros:
SELECT nome, carro.cliente_idcliente, carro.placa FROM clientes CROSS
JOIN carros

Banco de Dados II

31

Resultado:

Figura 36: Resultado da consulta clientes/carros CROSS JOIN

Note que cada registro de cliente da tabela clientes relaciona-se com


todos os registros encontrados na tabela carros, formando assim um
relacionamento cruzado relativamente grande e tambm sem muita utilidade na maioria dos casos. Esse tipo de JOIN tambm conhecido
como produto cartesiano em lgebra relacional.

OUTER JOIN
Neste outro tipo de JOIN voc encontra trs tipos de qualificao:

LEFT OUTER JOIN

Suponha que queira saber quais so os clientes que tm veculos cadastrados em carros e tambm queira saber os clientes que ainda no tm
veculos cadastros em carros.
SELECT clientes.nome,carros.cliente_idcliente,carros.placa from clientes LEFT OUTER JOIN carros ON clientes.idcliente = carros.cliente_
idcliente

32

CURSOS TCNICOS SENAI

FULL OUTER JOIN

Resultado:

Figura 37: Resultado da consulta clientes/carros LEFT OUTER JOIN

Nessa consulta so considerados todos os registros encontrados na tabela de clientes, ou seja, a tabela esquerda (LEFT) na condio ON
cliente.idcliente = carro.cliente_idcliente, segue fazendo a varredura em
carros dos clientes que tambm existem em ambas as tabelas.
Note tambm que o cliente Silvio Luis, como no tem nenhum carro
cadastrado, apresenta o resultado NULL nas colunas cliente_idcliente
e placa.
Conforme Machado (2008, p. 357) [...] no devemos utilizar NULL na
condio de seleo, pois teremos de utilizar os resultados mais imprevisveis e imaginveis possveis.

Nesse caso obtm-se como resultado os registros que no satisfazem a condio tanto da primeira
como da segunda tabela envolvidas no relacionamento.
Vale ainda salientar que voc pode
utilizar vrias clusulas misturada
com operadores na juno de tabelas, como nos explica Machado
(2008, p. 357): Podemos utilizar
as clusulas LIKE, NOT LIKE,
IN, NOT IN, NULL, NOT
NULL e mistur-las com os operadores AND, OR e NOT, dentro
de uma clusula WHERE na juno de tabelas.
Exemplo: suponha que deseja obter os clientes que tm veculos
cadastrados na oficina com a cor
cinza:
SELECT clientes.nome,carros.
cliente_idcliente,carros.placa
FROM clientes INNER JOIN carros ON clientes.idcliente = carros.cliente_idcliente WHERE
carros,cor = cinza

RIGHT OUTER JOIN

Agora, para saber quais so os proprietrios dos veculos (clientes) cadastrados na tabela carros, utilize a seguinte sintaxe:
SELECT clientes.nome,carros.cliente_idcliente,carros.placa from clientes RIGHT OUTER JOIN carros ON clientes.idcliente = carros.cliente_
idcliente

Resultado:
Tabela 1: Resultado da consulta clientes/carros RIGHT OUTER JOIN

nome

cliente idcliente

placa

Luciene Mrcia

ABC 000

Fbio Karnopp

DEF 111

Carlos Carvalho

GHI 222

Nessa consulta so considerados todos os registros encontrados na tabela de carros, ou seja, a tabela direita (RIGHT) na condio ON
cliente.idcliente = carro.cliente_idcliente, segue fazendo a varredura em
clientes dos clientes que tambm existem na tabela carros.
Banco de Dados II

33

Resultado:

Figura 38: Resultado da consulta clientes/carros FULL OUTER JOIN

Utilizar apelidos em JOINS


As instrues JOIN permitem a simplificao em sua escrita, por exemplo, verifique a instruo a seguir:
SELECT clientes.nome,carros.cliente_idcliente,carros.placa from clientes INNER JOIN carros
ON clientes.idcliente = carros.cliente_idcliente

Note que na frente dos campos das tabelas voc identifica o nome da
tabela para depois informar o nome do campo (clientes.nome). Isso
necessrio porque existem campos de tabelas diferentes.
SELECT cl.nome,ca.cliente_idcliente,ca.placa FROM cliente cl INNER
JOIN carro ca
ON cl.idcliente = ca.cliente_idcliente

Agora perceba que os nomes das tabelas no so escritos por inteiro


antes dos nomes dos campos (cl.nome, ca.cliente). Para simplificar, utiliza-se somente as iniciais, e isso s possvel porque em FROM voc
informa que cliente poderia ser entendido como cl (FROM cliente cl).
Esses nomes de tabelas simplificados so chamados de ALIASES ou
APELIDO, e isso facilita bastante quando temos de manusear consultas
em tabelas com muitos campos, por exemplo.

Acessar dados de vrias tabelas


Observe a seguir a representao de uma nova estrutura. Veja que agora
ela apresenta mais de duas tabelas.
34

CURSOS TCNICOS SENAI

Figura 39: Diagrama de entidades e relacionamentos bairros/clientes/carros

A representao das tabelas clientes e carros populadas voc j


conhece, falta agora conhecer a
representao da tabela bairros
populada. Veja a seguir.

Note que houve uma mexida na disposio das colunas (campos) das
tabelas, mas apenas por uma questo de esttica, nada por questes tcnicas. Onde antes mostrava o cdigo do cliente, proveniente da tabela
carros e com o nome de coluna alterado de cliente_idcliente mudou para
cdigo, a seguir o campo nome do cliente, proveniente da tabela clientes,
na sequncia o campo nome do bairro, proveniente da tabela bairros e
com o nome de coluna alterado de nome para bairro e, por fim, o campo placa, proveniente da tabela carros com o nome de coluna tambm
alterado de placa para placa_veculo.
Resultado:

Figura 40: Tabela bairros oficina mecnica populada

Suponha agora que em uma consulta seja necessrio visualizar os


carros, identificados por suas placas, com os seus respectivos proprietrios (clientes) e tambm o
nome do bairro em que residem.
Como voc pode imaginar, para
realizar essa pesquisa voc ter de
trabalhar com trs tabelas bairros, clientes e carros. Note que
elas j esto relacionadas, ento,
s utilizar os recursos para extrair
as informaes desejadas. Ento:
SELECT carros.cliente_idcliente AS cdigo, clientes.nome,
bairros.nome AS bairro, carros.placa AS placa_veiculo
FROM clientes INNER JOIN
carros ON clientes.idcliente = carros.cliente_idcliente
INNER JOIN bairros ON clientes.bairro_idbairro = bairros.
idbairro

Figura 41: Resultado da consulta clientes/carros/bairros

Verifique a tabela referente aos dados populados de clientes e l voc


identificar os cdigos dos bairros para os clientes. Foi com base nesses
cdigos que foram extrados seus respectivos nomes. Perceba que naquela tabela a cliente Luciene Mrcia est associada ao bairro 1 - Costa e
Silva; o cliente Fbio Karnopp est associado ao bairro 2 - Vila Nova; e
o cliente Carlos Carvalho est associado ao bairro 3 - Bom Retiro.

Banco de Dados II

35

Sabe por que s apareceram esses trs nomes no resultado dessa consulta?
Porque somente esses clientes que tm cadastro na tabela de carros.

Como todo conhecimento aprendizado, e em se tratando de banco


de dados quanto mais, melhor, vamos seguir utilizando a estrutura do
projeto de banco de dados da oficina mecnica, incrementando-o com
mais duas tabelas.
Representao da nova estrutura:

Figura 42: Diagrama de entidades e relacionamentos bairros/clientes/carros/oramentos/atendentes

A representao das tabelas clientes, carros e bairros populadas voc j


conhece. Veja agora a representao das tabelas atendentes e oramentos, populadas.

36

CURSOS TCNICOS SENAI

Figura 43: Tabela atendentes oficina


mecnica populada

Figura 44: Tabela oramentos oficina mecnica populada

Com relao tabela oramentos, cabe explicar que os dados do campo


data so armazenados no formato ano-ms-dia e referem-se data, propriamente dita. J o campo execuo refere-se ao tempo de execuo do
servio orado, e o campo situacao, refere-se situao do oramento
(confirmado ou aguardando confirmao).
Essas consultas esto ficando cada vez mais interessantes, no mesmo?
Continuando, ento, suponha que queira fazer uma consulta dos clientes cujos veculos esto cadastrados e que j possuem oramento com
previso de execuo de servio menor que 10 dias, e que tenham sido
atendidos pelo atendente de cdigo 1 (Joo), em que o resultado dever
ser mostrado por ordem crescente do nome do cliente:
SELECT carros.cliente_idcliente AS cdigo, clientes.nome AS clientes,
carros.placa AS placa_veculo, orcamentos.execucao AS execuo,
atendentes.nome AS atendente
FROM clientes
INNER JOIN carros ON clientes.idcliente = carros.cliente_idcliente
INNER JOIN orcamentos ON carros.placa = orcamentos.carros_placa
INNER JOIN atendentes ON orcamentos.atendente_idatendente =
idatendente
WHERE orcamentos.execucao < 10
AND orcamentos.atendente_idatendente=1
ORDER BY clientes.nome

Se voc parar para observar o


resultado da consulta, ver que
os cdigos aparecem em ordem
decrescente. Parece estar errado,
no mesmo? Porm, a letra F
vem antes da letra L e voc solicitou que o resultado fosse ordenado pelo nome do cliente, ento o
resultado da pesquisa est correto.
Note que as quatro tabelas mencionadas encontram-se presentes
no resultado dessa consulta, porque foi solicitado a partir da instruo SQL que voc implementou anteriormente.
Os conhecimentos a serem passados por esta unidade encerram-se
aqui, mas lembre-se que importante praticar, pr a mo na massa,
pois s assim voc vai esclarecer
muitas dvidas que certamente
persistem. A prtica tudo em
um processo tcnico de aprendizagem. Na prxima unidade voc
conhecer mais um recurso importante para a sua formao em
banco de dados. Bom estudo!

Da mesma forma que no exemplo anterior, perceba que a sequncia dos


campos, bem como o nome de algumas colunas, foram alterados. Note
tambm que agora manipulamos quatro tabelas clientes, carros, oramentos e atendentes , utilizamos a clusula WHERE para os filtros da
consulta e a clusula ORDER BY para mostrar o resultado por ordem
crescente do nome do cliente.
Resultado:

Figura 45: Resultado consulta clientes/carros/oramentos/atendentes

Banco de Dados II

37

Unidade de
estudo 3
Sees de estudo
Seo 1 Abordagem inicial
Seo 2 Manipulando views

Views
SEO 1

Abordagem inicial
Do comeo do curso at aqui
voc j conheceu vrios recursos
de banco de dados implementados a partir da SQL. Agora,
voc est convidado a conhecer
as views, ou vises. So recursos
disponibilizados por alguns SGBDs e implementados a partir de
instrues SQL que permitem a
criao de vises personalizadas
das informaes de suas tabelas.
Machado (2008, p. 373) fala o seguinte sobre a utilizao de views :
[...] so utilizadas para se ter
uma particular viso de uma
tabela, para que no seja necessria a utilizao do conjunto
como todo.

Imagine que, ao desenvolver o seu


projeto de banco de dados, voc
j previu que para a tabela produtos precisar de uma consulta dos
produtos com unidade de medida
em quilogramas, isso sugere que
voc crie uma viso, ou view, para
essa consulta. Dessa forma, toda
vez que necessitar dessa medida
basta acionar a view criada.
A exemplo das tabelas, as views
tambm devem ser criadas e, aps
sua criao, tambm apresentam
uma estrutura bem definida.

DICA
Quando for utilizar uma
View, fique atento para algumas restries. Neste aspecto, Machado (2008, p. 374)
nos d a seguinte orientao: No utilize SELECT
INTO, ORDER BY, COMPUT,
COMPUTE BY OU UNION.

Na prxima seo voc acompanhar as views na prtica. Siga em


frente!

SEO 2

Manipulando views
Para este estudo ser utilizado o
banco de dados de um minimercado e manteremos a tabela produtos que j tem uma estrutura
pronta e, inclusive, j foi utilizada nos exemplos anteriores, est
lembrado dela?
Acompanhe ento os passos para
criar uma view para a consulta dos
produtos com a unidade de medida quilogramas.

Criando a view
Em primeiro lugar, acesse o banco de dados onde deseja criar a
view, e no seu editor SQL escreva
a seguinte instruo:

CREATE VIEW prodkg (codigo_


prodkg,nome,descricao,unidad
emedida)AS
SELECT codigo,nome,descricao,
unidademedida from produtos
WHERE unidademedida=Kg

Analisando a instruo, note que


inicia com o comando para a criao da view, seguida pelo nome
que deseja atribuir a sua view (prodkg) e, aps, dentro dos parnteses, o nome dos campos que
deseja que a view contenha, sendo
que esses campos recebero os
valores dos campos da tabela que
est utilizando como parmetro
para a construo da view. Nesse
exemplo estamos criando a view
prodkg, com os campos codigo_
prodkg, nome, descricao e unidademedida, que recebero os
dados dos campos cdigo, nome,
descrio e unidade medida da tabela produtos.
Complementando a anlise da
instruo, essa view s conter os
registros dos produtos cuja unidade de medida for o quilograma
(kg).
Veja como fica a estrutura da view
populada.

Banco de Dados II

39

Figura 46: da criao da view prodkg

Percebeu como o arquivo da view prodkg parecido com uma tabela?


Isso acontece porque criada uma estrutura fsica e a view alimentada
com os registros que a instruo SQL solicita. Depois de criada, a view
est pronta para ser utilizada a qualquer momento.
Agora, vamos para a parte prtica.
Situao: suponha que queira mostrar todos os registros, com todos os
campos da view prodkg.
SELECT * FROM prodkg

Resultado:

Figura 47: Resultado consulta simples view prodkg

Para consultar a view, voc pode fazer uso de tudo o que aprendeu sobre
consultas SQL at o momento. Se voc quiser fazer um filtro, por exemplo, consultar os produtos cujo cdigo seja 1 ou cuja descrio seja Tipo
parboilizado, e assim por diante, nesse aspecto no existem restries.

40

CURSOS TCNICOS SENAI

A view criada permanece em seu


banco de dados at que seja excluda. Uma vantagem do uso de views
a de que voc pode personalizar
suas consultas com estruturas enxutas possibilitando uma melhor
performance quando do acesso s
informaes dessas views.
Voc pode ainda inserir registros
em uma view, assim como faz com
tabelas:
INSERT INTO prodkg VALUES
(5,Arroz integral,Tipo 1,Kg)

Analisando a sintaxe apresentada


para insero de produto na view,
voc pode se perguntar por que
o cdigo do produto 5 se na view
s temos produtos de cdigo 1 e
2? que essa view est associa
quela tabela de produtos que j
temos no nosso banco de dados,
e j existem produtos cadastrados
com os cdigos 3 e 4. Apesar de
no aparecerem na view, seus cdigos no podem ser utilizados,
portanto, neste caso, o prximo
cdigo de produto a inserir na view
deve ser o 5.

Resultado:

Para finalizar, como eliminar


inteiramente uma view?
DROP VIEW prodkg

Figura 48: Resultado da insero de um registro na view prodkg

possvel tambm modificar um registro de uma view como se faz em


uma tabela:
UPDATE prodkg SET descricao = Tipo 2 WHERE codigo_prodkg = 5

Resultado:

Figura 49: Resultado da edio de um registro na view prodkg

J para eliminar um registro de uma view:

Ateno! Cuidado ao utilizar esse


comando. Nenhuma confirmao
solicitada e, ao realizar essa operao, a view excluda imediatamente do banco de dados.

DICA
Analise bem as views que
deseja criar. No saia por a
criando views de qualquer
maneira, de preferncia crie
views para aquelas consultas
que envolvem uma ou mais
tabelas que voc considera
diferenciadas, ou seja, para
aquelas consultas que sero
utilizadas com frequncia
e tambm que agregam resultados importantes para o
usurio final.

Voc est convidado a conhecer, na prxima unidade, um


recurso muito til na gesto de
informaes de banco de dados. At l!

DELETE from prodkg where codigo_prodkg = 5

Resultado:

Figura 50: Resultado da excluso de um registro na view prodkg

Banco de Dados II

41

Unidade de
estudo 4
Sees de estudo
Seo 1 Abordagem inicial
Seo 2 Manipulando Trigger

Trigger
SEO 1

Abordagem inicial
Voc j ouviu falar em Triggers,
ou gatilho? um recurso utilizando quando, ao inserir registros nas
tabelas do seu banco de dados,
voc deseja enviar mensagens
de alerta avisando, por exemplo,
que a incluso foi efetuada com
sucesso, que ocorreu um erro na
incluso, alterao ou excluso.
Em programao estruturada,
comum utilizar funes nesse tipo
de situao, mas esse recurso tambm pode ser utilizado a partir
do banco de dados, por meio da
Trigger. Digamos que voc tenha
implementado integridade referencial em suas tabelas e que deseja fazer validaes dos campos
das tabelas para que, por exemplo,
campo data e hora sejam preenchidos corretamente, evitando
assim inconsistncia de dados.
Isso pode ser trabalhado em programao estrutura com uso de
funo ou igualmente em banco
de dados com Trigger.
Ainda no contexto de que voc tenha implementado integridade referencial em suas tabelas e queira
excluir informaes de um cliente
na tabela clientes, e este cliente
tambm se encontra registrado
na tabela carros, e voc gostaria
de que, ao confirmar a excluso,
os registros desse cliente fossem
excludos em cascata, primeiro
da tabela carros para depois ser
excludo da tabela clientes. Isso
possvel por meio de uma funo
em programao estruturada ou
fazendo uso de Trigger.

Est com dvida se deve usar programao estruturada ou Trigger?


No desanime! Ainda bem que
existem, sua disposio, muitos
meios de viabilizar sua soluo
e, com um conhecimento mais
aprofundado, voc saber discernir qual a melhor implementao
para as situaes que necessitem
de tratamentos.
Outras aplicabilidades de Trigger:
[...]
1. Alertar o usurio se houver
alguma exceo (por exemplo, emitindo um aviso se
a qualidade disponvel de
alguma pea cair abaixo do
nvel de perigo).
2. Depurao (por exemplo,
monitorao de referncias
e/ou mudana de estado de
variveis designadas).
3. Auditoria (por exemplo,
acompanhamento de que realizou quais atualizaes sobre quais eventos do banco
de dados).
4. Medio de desempenho
(por exemplo, temporizao
ou rastreamento de eventos
especficos do banco de dados)[...] (DATE, 2003, p. 240).

Arquitetura
Trigger

de

um

importante voc compreender


a arquitetura de um Trigger para
que possa desenvolver suas estru-

turas com maior eficincia. As explicaes sobre arquitetura de um


Trigger foram baseadas em Eclesiastes (2010):
Sintaxe de criao:
1. CREATE [DEFINER = {
user | CURRENT_USER }]
2. TRIGGER trigger_name trigger_time trigger_event ON
tbl_name
3. FOR EACH ROW trigger_
stmt
A sintaxe apresentada sugere a
criao de um Trigger em uma tabela no banco de dados, lembrando que, ao optar pelo uso desse
recurso, necessrio verificar se o
SGBD que est sendo utilizando
suporta esse recurso , por exemplo, se for criar Trigger em MySQL, ser preciso utilizar a tabela
com o tipo InnoDB.
Sobre essa sintaxe o autor destaca
que o Trigger nomeado objeto
de banco de dados que est associado com uma tabela e ativado
quando um evento em particular
ocorre para essa tabela, e ainda
diz que no se pode associar um
Trigger a uma TEMPORARY
TABLE ou uma view.
Perceba a preocupao do autor
em relacionar um Trigger com
uma tabela de banco de dados e
ainda nos esclarecer que este s
acionado a partir do momento em
que um evento (ao) ocorre para
essa tabela, mas fica uma dvida: a
que evento (ao) se refere? SimBanco de Dados II

43

ples, um Trigger acionado quando


um evento do tipo INSERT, UPDATE
ou DELETE ocorrem para a tabela
em questo.
O autor ainda destaca a funo
de alguns elementos da sintaxe apresentada como a clusula
DEFINER, esclarecendo que no
momento em que um Trigger
acionado, esta determina o privilgio da aplicao, ou seja, o usurio autorizado para fazer uso da
Trigger.
Aqui cabe um detalhamento da
clusula DEFINER: em [DEFINER = { user | CURRENT_
USER }], estamos determinando
a utilizao dos privilgios de usurio. Em user, verificado o nome
de usurio, por exemplo, nome_
de_usuario@localhost, ou CURRENT_USER, onde verificada
sua conta padro. Se essa clusula
for omitida na criao da Trigger,
o valor assumido para essa opo
CURRENT_USER.
J sobre o trigger_event, que indica o tipo de evento que acionar
o Trigger, Eclesiastes (2006) detalha:
NOTA
INSERT:
O Trigger ativado sempre que
uma nova linha inserida na
tabela; por exemplo, atravs
dos comandos INSERT, LOAD
DATA, e REPLACE.
UPDATE:
O Trigger ativado sempre que
uma nova linha modificada;
por exemplo, por meio do comando UPDATE.
DELETE:
O Trigger ativado sempre que
uma nova linha deletada da
tabela; por exemplo, atravs
dos comandos DELETE e REPLACE. Contudo, comandos
DROP TABLE e TRUNCATE no
ativam o Trigger, porque eles
no usam DELETE. Deletando
uma partio tambm no ativa o DELETE Trigger.
44

CURSOS TCNICOS SENAI

Finalizando o detalhamento da
sintaxe de criao de um Trigger,
o autor destaca o elemento trigger_stmt como um comando para
se executar quando o Trigger for
acionado e ainda complementa
Se voc quer executar mltiplos
comandos, use a BEGIN...END
construo composta de comando. Estes tambm habilitados
para voc usar alguns comandos
como tambm permitindo escrever stored routines.

SEO 2

Manipulando Trigger
Para este estudo, sero utilizadas
as tabelas do banco de dados da
oficina mecnica. importante
destacar que os exemplos prticos
apresentados nesta unidade so
adaptados de Bianchi (2010).
Considerando que o banco de dados da oficina mecnica j existe
e, consequentemente, as suas tabelas, voc precisar fazer algumas modificaes que possa visualizar os resultados das prticas
sugeridas.
Ento, inicialmente, verifique na
estrutura dessa tabela se o campo
nome da tabela clientes est configurado para Nulo ou No Nulo.
Se estiver como Nulo, mude para
No Nulo, indicando que no podem ser armazenados valores nulos para ele.
Feito isso, vamos ao exemplo: suponha que voc queira impedir a
insero de registros de clientes
com valores inferiores ou iguais a
zero, e tambm nulos; voc deve
estar pensando, isso pode ser feito facilmente a partir de um tratamento via programa. Voc est
certo, mas veja como fazer via
banco de dados a partir do uso de
Trigger.

Criao da Trigger vertamcampo


Implemente o cdigo a seguinte
no seu editor SQL.
DELIMITER |
CREATE TRIGGER vertamcampo BEFORE INSERT ON clientes
FOR EACH ROW
BEGIN
set @nomecli = new.nome;
IF ((CHAR_LENGTH(@nomecli)<=0)OR (@nomecli=))
THEN
set new.nome = NULL; END IF;
END
| DELIMITER;

A instruo inicia determinando


que o acesso a Trigger pode ser
feito por um usurio que utiliza
um usurio padro, a partir de
DEFINER |.
Logo abaixo voc tem CREATE
TRIGGER vertamcampo BEFORE INSERT ON clientes, que
significa a criao da Trigger de
nome vertamcampo e que ser
acionada antes (BEFORE) da insero de registros na tabela cliente.
Abaixo da instruo que cria a
Trigger, ainda voc v FOR
EACH ROW, que significa que
ao acionar a Trigger cada registro
deve executar os comandos encontrados entre BEGIN e END.
Explicando as instrues de comando encontradas entre BEGIN e END:
A linha set @nomecli = new.
nome; atribui varivel nomecli
o valor do campo nome da tabela
clientes cujo valor foi informado
na insero do registro.
A instruo:
IF ((CHAR_LENGTH(@nomecli)<=0)OR (@nomecli=))
THEN
set new.nome = NULL;
END IF;

Est verificando na varivel nomecli se (IF) o contedo desta menor


ou igual a zero ou tambm se contm espao em branco. Se isso for verdade, atribui ao campo nome da tabela clientes o valor NULL e a seguir
encerra o comando IF.
Para finalizar,
END
|
DELIMITER ;
O END finaliza o BEGIN e, em seguida, finalizado o cdigo todo.
Ao executar essa instruo, voc criar a Trigger vertamcampo como
pode ver na figura a seguir.

Figura 51: Visualizao da Trigger vertcampo criada

Todos os exemplos praticados at aqui foram executados no phpMyAdmin e, portanto, este utilitrio nos fornece algumas visualizaes privilegiadas. Mas se voc no estiver trabalhando com um utilitrio intuitivo e
deseja a Trigger que criou, basta escrever e executar em seu editor SQL
a seguinte instruo: show triggers from nome do banco;
Veja:
SHOW TRIGGERS from mecanica;

Resultado:

Figura 52: Resultado da visualizao de Triggers no banco de dados mecnica

INSERT INTO clientes (idcliente, bairro_idbairro, nome, rua, numero,


fone) VALUES (NULL, 2, , Rua A, 900, (55) 55555555)

Agora chegou o momento de testarmos a nossa Trigger, para isso vamos


inserir um registro em branco:

Banco de Dados II

45

INSERT INTO clientes (idcliente, bairro_idbairro, nome, rua, numero,


fone) VALUES
(NULL, 2, , Rua A, 900, (55) 55555555)

Ao executar essa instruo, a Trigger vertamcampo ser acionada (disparada) e qualquer exceo referente ao campo nome, prevista na Trigger, ser prontamente respondida. Note que, ao inserirmos o registro,
o campo nome fica em branco. Isso significa que, quando a Trigger for
acionada, o valor NULL ser atribudo a esse campo, mas esse campo
havia sido configurado l no incio dos nossos exemplos com o tipo
NOT NULL, um erro ser devolvido pelo banco de dados como mostra
a figura a seguir. Isso acontece porque, como NOT NULL, esse campo
no pode armazenar um valor nulo.

Figura 53: Resultado da insero de um registro cliente com o nome em branco

Para excluir um Trigger, basta escrever e executar a seguinte instruo


SQL em seu editor o comando DROP TRIGGER nomedatrigger; ou
seja:
DROP TRIGGER vertamcampo;

Lembre-se de que, se agora voc solicitar uma visualizao da Trigger no


banco de dados mecnica, nada ser retornado porque voc acabou de
excluir a Trigger e s existia uma.

46

CURSOS TCNICOS SENAI

Saiba mais
Para saber mais sobre Triggers, consulte a documentao do seu SGBD
ou alguns sites sobre o assunto.

DICA
Analise bem a necessidade de uso de Triggers na sua soluo,
utilize somente quando for extremamente necessrio.

Prefira as rotinas mais simples para criar como Triggers.


Triggers complexas podem interferir na performance de suas

transaes no banco de dados.

Viu quanta coisa interessante pode ser feita em um banco de dados?


Mas ser que essas informaes registradas neles esto seguras?
Isso assunto para a prxima unidade de estudo.

Banco de Dados II

47

Unidade de
estudo 5
Sees de estudo
Seo 1 Abordagem inicial
Seo 2 Abrangncia da segurana em
banco de dados
Seo 3 Integridade de dados
Seo 4 Controle de acesso a banco de
dados

Segurana em Banco de Dados


SEO 1

Abordagem inicial
Quando se fala de banco de dados, no se pode dissociar do
elemento segurana, pois existem
vrias questes a considerar.
Nesse contexto, esta unidade
prope que voc conhea alguns
aspectos importantes sobre segurana em banco de dados para
tornar mais confivel a implementao do seu projeto de banco de
dados.
Assim, voc est convidado agora a conhecer alguns aspectos
importantes sobre segurana em
banco de dados. Vamos l!

Aplicao
Projeto de banco de dados

Integridade de dados

Utilizao de um bom SGBD

Quando se desenvolve um projeto de banco de dados, preciso


preocupar-se com alguns aspectos, como:

consistente e de acordo com as


necessidades, do ponto de vista
do negcio, do cliente.
compatvel com a amplitude do
projeto de banco de dados contemplado.

Integridade dos dados.


Controle de acesso ao banco

de dados.

O foco de estudo das questes

SEO 2

de segurana ficaro no aspecto


da aplicao, ou seja, no que se
refere segurana no contexto de
dados. Com relao a isso, Date
(2003, p. 431) observa:

Para garantir a segurana em banco de dados, preciso levar em


conta dois universos:

As questes de segurana de dados esto frequentemente associadas a questes de integridade de dados, mas os conceitos
so na realidade diferentes: segurana se refere proteo de
dados contra acesso no autorizado, enquanto integridade se
refere correo desses dados.

Abrangncia da segurana em banco de


dados

Sistema
Pessoas treinadas e capacitadas
para trabalhar com infraestrutura
e banco de dados.
Integrao total do banco de
dados com o ambiente de infraestrutura (hardware, perifricos,
redes) onde este ser implementado.
Infraestrutura adequada s

polticas de segurana de dados,


contemplando o uso de Firewalls,
privilgios de usurios, backups de
segurana, web e transmisso de
dados.

SEO 3

Diante disso voc conhecer um


pouco mais sobre integridade e
proteo de dados que, como
pode observar, so os elementos
fundamentais para se garantir segurana de dados no seu projeto.

impedir que registros sejam

inseridos em duplicata;

campos no sejam armazenados com valores nulos;


valores de campos sejam pro-

tegidos por criptografia;

campos armazenem valores


vlidos para os tipos que foram
definidos;
garantir e/ou revogar os privilgios de acesso aos dados do
banco;
por exemplo, ao excluir um
cliente, este no fique pendente
em outra tabela;
haja facilidade quando da
recuperao de informaes.
Reforando essa ideia, Date (2003,
p. 431) comenta: [...] integridade
envolve ter certeza de que aquilo
que eles esto tentando fazer est
correto.
Tamanha a importncia da integridade de dados que esta dividida em categorias. Confira a seguir.

Integridade semntica:

quando implementada, permite


que os valores atribudos a um
campo sero aqueles tipos definidos quando o campo foi criado.

Banco de Dados II

49

Integridade de entidade:
quando implementada, permite
que no existam registros duplicados em uma tabela.
Integridade referencial:

quando implementada, permite


que os relacionamentos entre as
tabelas sejam obrigados a serem
cumpridos, por exemplo: supondo que tenha um cliente cadastrado na tabela clientes e o registro
deste encontra-se tambm na
tabela oramentos, imagine que
voc deseja excluir esse cliente da
tabela clientes. Tendo a integridade implementada, esse cliente
no poder ser excludo enquanto
houver registros dele relacionada,
ou seja, na tabela oramentos.

trabalhar esse recurso em outro SGBD, apenas consulte a sintaxe para


o banco de dados que utilizar, pois, como falamos anteriormente, esta
pode, e neste caso realidade, modificar de um SGBD para outro.
Quando se trata de implementar a integridade de banco de dados, seja
ela em qualquer categoria, deve-se familiarizar com alguns termos como
restrio e constraints. Explicando rapidamente esses termos:
Restrio: o ato de voc impedir, para uma ou mais tabelas do banco
de dados, que algumas operaes sejam executadas e que venham a ferir a
integridade dos dados contidos nestas.
Constraints: trata-se de um recurso suportado pelos SGBDs disponveis
no mercado, que permite implementar as restries garantindo assim a
integridade do banco de dados.
Issto significa que, seja qual for o tipo de integridade que voc implementar, ter de trabalhar com constraints.
Para que nosso estudo sobre integridade referencial torne-se interessante
e de fcil compreenso, sugiro que trabalhe com as seguintes tabelas:

Integridade de domnio:
quando implementada, garante
que um campo s deve permitir
valores preestabelecidos para este
campo. Por exemplo, s deve
aceitar os valores Nulos ou A, B
ou C, e mais nada.
Na prtica, a integridade de dados
garante ao banco de dados que suas
informaes permaneam consistentes para que possam servir ao
seu propsito principal, que sua
utilizao pelo usurio final. Assim,
vamos exemplificar alguns casos de
uso de integridade referencial.
De todas as categorias de integridade de banco de dados apresentadas aqui, a que vamos focar
a integridade referencial porque,
como j foi explicado, ela trabalha
justamente com os relacionamentos entre as tabelas, o que caracteriza termos muita ateno para
com a estrutura geral dos dados
do nosso projeto.
Acompanhe algumas situaes
de uso de integridade referencial
entre tabelas, onde, a exemplo de
outras situaes mostradas neste
material, ser feito o uso de instrues SQL baseadas no MySQL, o que no inviabiliza voc de
50

CURSOS TCNICOS SENAI

Figura 54: Diagrama de entidades e relacionamentos

Lembre-se de que as tabelas clientes e bairros j esto populadas e encontram-se na unidade de estudos 2, seo 4.
Se voc j criou, fisicamente, as tabelas cliente e bairros no seu banco de
dados, timo, s seguir praticando o exemplo que ser trabalhado, mas
aqui vai uma observao importante: o MySQL permite que voc crie tabelas de determinados tipos; dependendo do tipo que a tabela criada, garante-se a esta um formato de armazenamento e disponibiliza-se recursos.
Por padro, a maioria das verses do MySQL adota o tipo MyISAM para
as tabelas criadas. Caso voc queira, ao criar suas tabelas pode alterar, individualmente, de acordo com sua necessidade, cada tabela do seu projeto,
mas isso no cabe abordarmos aqui. Para utilizarmos integridade referencial no MySQL, necessrio que as tabelas envolvidas sejam do tipo InnoDB, e no MyISAM, assim, se as tabelas bairros e clientes estiverem no
forma MyISAM, implemente no seu editor SQL as seguintes instrues:

Modificando o tipo da tabela clientes de MyISAM para


InnoDb
ALTER TABLE `bairro` ENGINE = InnoDB

Modificando o tipo da tabela bairros de MyISAM


para InnoDb
ALTER TABLE `bairro` ENGINE = InnoDB

Feito isso, j estamos com meio caminho andado para o nosso trabalho.
Agora, certo de que as tabelas so do tipo InnoDB, vamos criar uma
constraint (restrio) para o campo bairros_idbairros, localizado na tabela
clientes, que uma chave estrangeira (FK), fruto do relacionamento 1
N entre as tabelas bairros e clientes.

Criando a CONSTRAINT bairro:


ALTER TABLE clientes
ADD CONSTRAINT bairro FOREIGN KEY (bairro_idbairro) REFERENCES
bairros (idbairro)

A mensagem de erro alerta que


no foi possvel registrar esse
bairro em clientes porque ele no
foi previamente cadastro em sua
tabela de origem, no caso a tabela
bairros.
Vemos literalmente a integridade
referencial funcionando entre as
tabelas envolvidas. J imaginou se
voc pudesse registrar um bairro na tabela de clientes que no
consta na tabela de bairro? Isso
caracteriza uma inconsistncia no
seu banco de dados, no ? Ento,
a integridade referencial existe
para coibir esse tipo de situao.
Quer ver outra situao decorrente da criao fsica desse relacionamento? Tente, a partir da tabela
bairros, eliminar o bairro de cdigo 3, ou seja, Bom Retiro, e veja o
que acontece:

Analisando a instruo:

ALTER TABLE clientes: modifique a tabela cliente, pois esta j existe;


ADD CONSTRAINT bairro: adicionando a constraint de nome bairro;
FOREIGN KEY (bairro_idbairro): aqui identifica o campo bair-

DELETE FROM bairro WHERE


idbairro =3

ro_idbairro (chave estrangeira) como o valor da constraint bairro, ou seja, a


restrio ser feita a partir deste campo;

REFERENCES bairros (idbairro): identifica a provenincia do


campo participante da constraint, informando sua tabela, bairro, e o seu
nome, idbairro, de origem, respectivamente.
Agora, j temos um relacionamento fisicamente estabelecido entre as tabelas bairros e clientes. Ou seja, caso se tente inserir na tabela cliente um
bairro que ainda no foi cadastrado na tabela bairro, veja o que acontece:
INSERT INTO clientes (bairro_idbairro,nome,rua,numero,fone)
VALUES (5,JOANA,Rua A,123,(44)44444444)

Figura 55: Alerta de erro para incluso de um bairro ainda no cadastrado em


clientes
Banco de Dados II

51

Figura 56: Alerta de erro para excluso de um bairro

A mensagem de erro alerta que


no foi possvel eliminar o registro desse bairro porque ele est
armazenado para algum, ou alguns, clientes na tabela de clientes. Veja que novamente esse procedimento est salvaguardando a
integridade dos dados nas tabelas
relacionadas. J imaginou voc
poder eliminar uma informao
de um bairro que deixou de existir
na sua cidade na sua tabela de origem e este permanecer associado
a um cliente cadastrado? Ruim,
no mesmo? O procedimento
normal nessa situao seria o de
alterar na tabela de clientes todos
os campos que constem com esse
bairro e, em seguida, eliminar esse
bairro da sua tabela de origem.

Eliminando a CONSTRAINTS bairro


ALTER TABLE clientes DROP FOREIGN KEY bairros

Deste momento em diante, se


essa operao for bem-sucedida,
sua tabela fica novamente sem a
restrio do relacionamento fsico, entre as tabelas bairros e
clientes, permitindo assim que
inconsistncias da natureza que
apresentamos possam acontecer
no banco de dados que implementou.

52

CURSOS TCNICOS SENAI

Cabe aqui salientar que, em muitos casos, alguns programadores


optam, por vrios motivos, por no
criarem a integridade referencial no
banco de dados e preferem desenvolver rotinas nos programas para
realizar essa tarefa. Isso totalmente possvel, mas deve ser bem
analisado, cada caso um caso.

Como voc viu, esta seo abordou a integridade de banco de


dados sobre o ponto de vista da
integridade referencial, pelos motivos relatados no incio desta seo, mas voc tambm pode trabalhar, de forma bem semelhante,
a integridade semntica, integridade de entidade e integridade de
domnio, no menos importantes
do que a referencial, porm, em
alguns casos, no to essenciais.
Saiba Mais
Quer saber mais sobre integridade de dados? Consulte a documentao do seu SGBD e/ou
acesse <http://translate.google.com.br/translate?hl=pt-BR&langpair=en|pt&u=http://
msdn.microsoft.com/en-us/
library/ms191447.aspx>.
Esse endereo ir direcion-lo
para um site traduzido para o
portugus, onde voc encontra
informaes adicionais interessantes sobre o assunto.

SEO 4

Controle de acesso a
banco de dados
Sistemas de banco de dados requerem permisses de acesso,
dessa forma garante tambm a
integridade dos dados. Quando
voc desenvolve um projeto de
banco de dados, deve ter em mente que este ser acessado por vrios usurios, cada qual com suas
necessidades e responsabilidades,
assim, os SGBDs devem disponibilizar implementao de privilgios para que se possa garantir a
segurana de acesso aos dados do
sistema.
Quanto a privilgios, Machado
(2008, p. 378) comenta que Os
privilgios garantem a segurana
e a integridade dos dados, bem
como a responsabilidade de cada
usurio sobre seus dados especficos.
Apenas como curiosidade, a maioria dos SGBDs disponibiliza um
utilitrio para garantir e revogar
privilgios a um banco de dados.
No nosso caso, isso est sendo
feito manualmente, via construo SQL.

COMANDO GRANT
Existem aspectos tcnicos sobre tabelas e views que no foram
abordados em nosso estudo, mas
que agora se tornam relevantes,
como quando criamos uma tabela
ou view associ-la ao nome do usurio que os criou.

Se foi criada uma tabela clientes


como usurio Silvio, internamente para o banco de dados, essa
tabela tem a identificao Silvio.
produto, garantindo a este todos
os privilgios de acesso tabela
criada por ele. O mesmo acontece
na criao da view.

Situao: garantir o privilgio de


seleo, insero e atualizao ao
usurio Silvio na tabela de produtos.

Se voc deseja disponibilizar privilgios para outros usurios, isso


possvel por meio do comando
GRANT, que, traduzindo, significa garantir. Nesse caso, garantir o
privilgio de acesso a uma tabela
ou view. Isso depende da verso
SQL que est sendo usada.

Situao: garantir todos os privilgios para todos os usurios da


tabela de produtos.

importante destacar que se


deve disponibilizar uma tabela e view somente por comando GRANT, do contrrio,
corre-se risco de a operao
no dar certo. Outra informao importante que, apesar
de a SQL ser uma linguagem
universal, esta pode apresentar diferenas de acordo com
o SGBD que se est utilizando.
Ou seja, quanto a privilgios
no diferente, consulte o
manual do seu banco de dados para saber quais privilgios este disponibiliza.

Uma coisa certa: seja qual for


o seu SGBD, as operaes SELECT, UPDATE, DELETE e
INSERT so disponibilizados
para todas as verses SQL.
Situao: Garantir o privilgio de
seleo ao usurio Silvio na tabela
de produtos.
GRANT SELECT ON produtos TO
Silvio

GRANT SELECT, INSERT, UPDATE ON produtos TO Silvio

GRANT ALL PRIVILEGES ON produtos to public

Situao: garantir a dois usurios, Silvio e Carlos, os privilgios


de seleo e insero para a tabela
produtos.
GRANT SELECT, INSERT TO ON
produtos TO Silvio,Carlos

Utilizando esta sintaxe


em views
Situao: garantir para todos os
usurios a seleo para a view prodkg.

comando revoke
Ao contrrio de garantir os privilgios, esse comando revoga os
privilgios de acesso a uma tabela
ou view.
Situao: revogar o privilgio de
seleo da tabela produtos para o
usurio Silvio.
REVOKE SELECT ON produtos
FROM Silvio

Situao: revogar todos os privilgios para todos os usurios da


tabela de produtos.
REVOKE ALL PRIVILEGES ON
produtos FROM public

Situao: revogar o privilgio de


seleo, insero e atualizao ao
usurio Silvio na tabela de produtos.
REVOKE
SELECT,
INSERT,UPDATE ON produtos
FROM Silvio

GRANT SELECT ON produtos to


public,

Situao: garantir para todos os


usurios a seleo dos campos
codigo_prodkg, nome e unidademedida.
GRANT
SELECT
(cdigo_
prodkg,nome,unidademedida)
ON produtos TO public

Banco de Dados II

53

Finalizando
Voc finalizou mais uma unidade curricular. No seu decorrer, buscou-se complementar seus conhecimentos em banco de dados
Os conhecimentos de banco de dados so importantes para que voc possa, no contexto de
projeto de software, trabalhar todo o universo das informaes que sero manuseadas na soluo
informatizada proposta.
Em se tratando de uma unidade curricular complementar, buscou-se trabalhar os contedos no
sentido de continuidade do que foi abordado na unidade curricular de Banco de Dados I, onde,
na oportunidade, voc entrou em contato com os principais conceitos, mtodos e tcnicas para
elaborao de um projeto de banco de dados.
Em um projeto de banco de dados, voc precisa agregar alguns conhecimentos para que, j na fase
de elaborao deste, possa contemplar os recursos necessrios para a concepo e a implementao eficiente da sua soluo. Por isso, iniciamos o estudo por ndices. Para que, a partir de critrios
bem definidos e de ferramentas especficas de modelagem, fosse possvel defini-los no projeto.
Na sequncia, voc conheceu alguns recursos avanados da linguagem SQL, pois, conhecendo
seu potencial, voc poder dimensionar em sua estrutura de dados a que nveis seu modelo deve
abranger, para que resultados possam ser extrados com eficincia.
Tambm trabalhamos as questes de segurana em banco de dados porque nada adianta voc desenvolver um bom modelo de dados se no se preocupar com o meio onde sua estrutura de dados
estar instalada, como tambm com a consistncia das informaes constantes nessa estrutura.
Caso algo tenha ficado para trs, volte aos estudos e aperfeioe seus conhecimentos buscando
outras fontes de informao. Como voc bem sabe, em informtica tudo ocorre muito rpido, na
velocidade dos processadores de ltima gerao, por isso voc deve estar sempre frente e atualizado com todo e qualquer conhecimento que venha a fazer de voc competitivo no mercado.
Utilize este material como o incio de um processo de conhecimento importante na sua vida profissional. Boa sorte e sucesso!

Banco de Dados II

55

Referncias

BAQUINO, Quemuel. Otimizao de ndices em MySQL. Disponvel em: <www.webmaster.pt/mysql-otimizacao-indices-5148.html>. Acesso em: 8 nov. 2010.

BEZERRA, Eduardo. Princpios de anlise e projeto de sistemas com UML. Rio de


Janeiro, RJ: Campus, 2002.

BIANCHI, Wagner. MySQL TRIGGERS. Disponvel em: <www.devmedia.com.br/


post-8088-MySQL-TRIGGERS.html>. Acesso em: 26 nov. 2010.

CIDRAL, Alexandre; AUDY, Jorge Luis Nicolas; ANDRADE, Gilberto Keller de. Fundamentos de sistemas de informao. Porto Alegre: Bookman, 2005.

DATE, C. J. Introduo a sistemas de banco de dados. 8. ed. Rio de Janeiro, RJ: Campus/Elsevier, 2003.

ECLESIASTES. Create Trigger (Traduo do manual). Disponvel em: <www.phpavancado.net/node/300>. Acesso em: 10 nov. 2010.

HEUSER, Carlos Alberto. Projeto de banco de dados. 5. ed. Porto Alegre: Sagra Luzzatto, 2004.

MACHADO, Felipe Nery Rodrigues; ABREU, Maurcio Pereira. Projeto de banco de


dados: uma viso prtica. 11. ed. So Paulo, SP: rica, 2004.

MACHADO, Felipe Nery Rodrigues. Banco de dados: projeto e implementao. 2. ed.


So Paulo, SP: rica, 2008.

Banco de Dados II

57

Equipe de Desenvolvimento de Recursos Didticos


Coordenao de Educao a Distncia
Beth Schirmer
Coordenao Projetos EaD
Maristela de Lourdes Alves
Coordenao de Desenvolvimento de Recursos
Didticos
Gisele Umbelino
Projeto Educacional
Angela Maria Mendes
Israel Braglia
Projeto Grfico
Daniela de Oliveira Costa
Jordana Paula Schulka
Juliana Vieira de Lima

Design Educacional
Evelin Lediani Bao
Capa, Ilustraes, Tratamento de Imagens
Dimitre Camargo Martins
Diego Fernandes
Luiz Eduardo Meneghel
Diagramao
Letcia Silva Felini
Reviso e Fechamento de Arquivos
Daniela de Oliveira Costa
Juliana Vieira de Lima
Reviso Ortogrfica e Normatizao
FabriCO

BANCO DE DADOS II

59