Documente Academic
Documente Profesional
Documente Cultură
Programador
Bancos de Dados
DADOS E BANCOS DE DADOS
SISTEMAS GERENCIADORES DE BANCOS DE DADOS
MODELAGEM DE DADOS PARA BANCOS DE DADOS RELACIONAIS
ACESSO A BANCOS DE DADOS
A LINGUAGEM SQL
COMANDOS DDL
COMANDOS DQL
COMANDOS DML
COMANDOS DCL
FUNES DE SQL
CONSULTA A VRIAS TABELAS COM JOINS
USO DE OPERADORES EM CONSULTAS
Apostila 2 de 5
89 pginas
www.divus.com.br
Pgina 2
1.1.1
1.1.2
2.2
2.3
2.4
3.2
A linguagem SQL.................................................................................................................. 25
4.1
4.2
4.3
4.4
4.5
4.5.1
4.5.2
4.5.3
4.5.4
4.5.5
4.5.6
4.5.7
4.5.8
4.6
4.6.1
4.6.2
4.6.3
5.2
www.divus.com.br
Pgina 3
5.4
5.4.1
5.4.2
5.5
5.6
5.6.1
7.1
Firebird ........................................................................................................................ 79
7.2
Sql Server..................................................................................................................... 80
7.3
Oracle .......................................................................................................................... 80
7.4
PostgreSQL .................................................................................................................. 81
7.5
www.divus.com.br
Pgina 4
Captulo 1
Definies e conceitos
Tipos de Bancos de Dados
Elementos de Bancos de Dados
www.divus.com.br
Pgina 5
www.divus.com.br
Pgina 6
www.divus.com.br
Pgina 7
www.divus.com.br
Pgina 8
Note, no conjunto de tabelas acima, que todos os clientes tem valores no campo cli_bairro,
coincidentes com os valores do campo bai_id, da tabela de bairros.
Tambm possvel observar que todos os bairros tem um nmero no campo bai_cidade,
coincidente com valores encontrados no campo cid_id , da tabela de cidades.
Neste curso, vamos concentrar nossos esforos no aprendizado dos bancos de dados
relacionais, portanto, voltaremos a este assunto mais tarde, nesta apostila.
www.divus.com.br
Pgina 9
www.divus.com.br
Pgina 10
Captulo 2
Modelagem
Tipos de Dados
Relacionamentos Entre Tabelas
www.divus.com.br
Pgina 11
www.divus.com.br
Pgina 12
www.divus.com.br
Pgina 13
www.divus.com.br
Pgina 14
www.divus.com.br
Pgina 15
www.divus.com.br
Pgina 16
Captulo 3
Credenciais
Ferramentas Grficas
Conexes
www.divus.com.br
Pgina 17
www.divus.com.br
Pgina 18
Pgina 19
Uma GUI no um SGBD. Estas ferramentas so apenas um meio de acesso mais amigvel,
mas no so mais que isso.
Usurio e senhas so uma preocupao a parte e devem ser tratados com a gravidade que
merecem. A segurana bem estabelecida previne no somente invases mal intencionadas,
mas tambm danos causados por impercia, sendo estes menos criminosos que os primeiros,
mas no menos danosos.
www.divus.com.br
Pgina 20
Clique no retngulo cinza (local instance wampmysqlId) e a seguinte tela ser apresentada:
O painel da esquerda exibe os vrios bancos de dados geridos pelo MySql, o painel da direita
permite que sejam digitados os comandos que aprenderemos a seguir, para interao com os
dados e com suas estruturas.
www.divus.com.br
Pgina 21
Atravs desta tela possvel conectar-se a um banco de dados do servidor local (computador
atual) ou a um banco de dados gerenciado por outro SGBD, situado em outro computador.
Para isso basta fornecer as informaes relativas ao computador servidor de dados e as
credenciais do usurio. Alm do nome do computador, tambm possvel digitar o endereo
IP do servidor.
Dica: Experimente realizar conexes externas ao seu
computador com a ajuda do seu professor
www.divus.com.br
Pgina 22
Captulo 4
LINGUAGEM SQL
DDL
DML
DCL
www.divus.com.br
Pgina 23
www.divus.com.br
Pgina 24
4 A linguagem SQL
A linguagem SQL define uma serie de instrues que so agrupados em categorias de acordo
com seu objetivo. Algumas variaes da linguagem padro podem ser encontradas nos
diversos SGBDs existentes, mas h um ncleo comum mantido por um conselho internacional
e obedecido pela maioria dos SGBDs. A seguir vamos apresentar uma viso geral sobre as
diversas categorias existentes e seus principais comandos. A sequncia em que os grupos de
comandos aparecero nesta apostila determinada pela lgica intrnseca ao uso dos bancos
de dados: primeiro preciso criar as estruturas e definir a maneira como os dados sero
armazenados e como se relacionaro, depois preciso inserir dados em quantidade e
qualidade adequadas aos testes, a sim, podemos fazer selees de dados e observar o
resultado que cada uma delas produz.
Pgina 25
Uma vez criado o banco, podemos comear a inserir nele elementos necessrios ao
armazenamento dos dados.
As expresses em negrito so literais e devem ser escritas como constam acima, as outras
devem ser substitudas de acordo com o que se deseja definir. Os campos a serem criados e
suas caractersticas so separados uns dos outros por vrgulas sendo que aps o ltimo campo
s haver vrgula se uma foreign key for criada.
www.divus.com.br
Pgina 26
Criando a tabela de clientes, denominada cliente, com duas chaves estrangeiras, uma das
chaves relacionando o campo bairro com o campo id da tabela bairro e outra relacionando o
campo cidade com o campo id da tabela cidade.
create table cliente(
id int(11) not null primary key auto_increment,
nome char(250) not null,
bairro int(11) not null,
cidade int(11) not null,
cpf char(14) not null,
constraint cli_bai_fk foreign key (bairro) references bairro (id),
constraint cli_cid_fk foreign key (cidade) references cidade (id)
) engine=InnoDB;
www.divus.com.br
Pgina 27
Criando a tabela de pedidos dos clientes, denominada pedido, com chave estrangeira
relacionando o campo cliente com o campo id da tabela cliente:
create table pedido(
id int(11) not null primary key auto_increment,
data datetime not null,
cliente int(11) not null,
constraint cli_ped_fk foreign key (cliente) references cliente (id)
) engine=InnoDB;
Criando a tabela de produtos, denominada produto, com duas chaves estrangeiras, uma
relacionando o campo fornecedor com o campo id da tabela fornecedor e outra relacionando
o campo tipo com o campo id da tabela tipo_produto:
create table produto (
id int(11) not null primary key auto_increment,
nome char(250) not null,
valor_entrada double not null,
valor_saida double not null,
tipo int(11) not null,
fornecedor int(11) not null,
estoque int(11) not null,
constraint
prod_for_fk
foreign
key
(fornecedor)
references
fornecedor (id),
constraint prod_tipo_fk foreign key (tipo) references tipo_produto
(id)
) engine=InnoDB;
www.divus.com.br
Pgina 28
Criando uma tabela apenas para ser renomeada e depois excluda em nossos exerccios,
denominada tabela_para_alterar, sem chaves estrangeiras.
create table renomeie_depois_exclua (
id int(11) not null primary key auto_increment,
nome int(11) not null
) engine=InnoDB;
A expresso engine =InnoDB, colocada ao final das instrues de criao de tabela indica que
a tabela criada suporta a criao de foreign Keys.
Quando uma tabela serve de referncia para uma chave estrangeira contida em outra tabela,
ela deve ser criada antes, como fizemos, quando criamos tipo_produto antes de produto, j
que produto tem uma chave estrangeira, relacionando seu campo tipo com o campo id da
tabela tipo_produto.
O ponto-e-vrgula colocado ao final de cada instruo no faz parte da instruo, mas til em
certas ferramentas de interface grfica como o MySql Workbench, para delimitar o fim de cada
instruo, j que vrias instrues podem ser escritas na mesma janela e serem executas
individualmente.
Adicionamos tabela cliente um campo chamado idade para armazenar dados do tipo inteiro
e que pode ficar nulo quando no se desejar inserir informao.
alter table cliente add column idade int null;
www.divus.com.br
Pgina 29
A seguir, alteramos a tabela cliente para que o campo nome tenha sua capacidade de
armazenar caracteres, diminuda dos 250 anteriores, para 150.
alter table cliente change column nome nome char(150) not null;
Repare que, mesmo quando no desejamos modificar nome do campo, o tipo de dado ou se
ele suporta nulo, temos que fornecer estas informaes,
www.divus.com.br
Pgina 30
Criamos uma foreign key na tabela cliente limitando a entrada de dados no campo tipo a
valores que j existam na tabela tipos_cliente.
alter table cliente add constraint
references tipo_cliente(id);
cli_tipo_fk
foreign
key
(tipo)
www.divus.com.br
Pgina 31
tipo de dado
int
char(250)
int
char(14)
Aluno
permite nulo
no
no
sim
no
chave primria
sim
no
no
no
auto numerao
Sim
No
No
No
tipo de dado
int
char(250)
int
Curso
permite nulo
no
no
no
chave primria
sim
no
no
auto numerao
Sim
No
No
nome da tabela
Turma
nome do campo tipo de dado
permite nulo
chave primria
auto numerao
id
int
no
sim
Sim
nome
char(250)
no
no
No
curso
int
no
no
No
incluir chave estrangeira entre o campo curso desta tabela e o campo id da tabela curso.
nome da tabela
nome do campo
id
nome
tipo de dado
int
char(250)
tipo_curso
permite nulo
no
no
chave primria
sim
no
auto numerao
Sim
No
Curso
incluso de campo
permite nulo
chave primria
sim
no
auto numerao
No
nome da tabela
tipo de alterao
nome do campo tipo de dado
valor
double
Curso
modificao de campo
permite nulo
chave primria
no
no
auto numerao
No
www.divus.com.br
Pgina 32
nome da tabela
tipo de alterao
nome do campo
Valor
curso
remoo de campo
nome da tabela
tipo de alterao
nome do campo tipo de dado
tipo
int
nome da tabela
tipo de alterao
nome do campo nome da chave
tipo
tipo_curso_fk
nome da tabela
tipo de alterao
nome do campo tipo de dado
Turma
int
nome da tabela
tipo de alterao
nome do campo nome da chave
turma
aluno_turma_fk
curso
incluso de campo
permite nulo
chave primria
no
no
auto numerao
no
curso
incluso de chave estrangeira
tabela referncia campo
referncia
tipo_curso
Id
Aluno
incluso de campo
permite nulo
chave primria
no
no
auto numerao
no
aluno
incluso de chave estrangeira
tabela referncia campo referncia
turma
id
www.divus.com.br
Pgina 33
Observe que a quantidade de campos deve ser coincidente com o nmero de valores da lista
de valores. Se no houver coincidncia o comando falhar. Tambm importante notar que os
valores a serem inseridos nos campos cujo dado texto, estaro entre aspas simples. Esta
tambm uma exigncia para que o comando funcione. Veja um exemplo de incluso de 4
registros na tabela cidade:
Mais um exemplo de insero de dados na tabela cidade, desta vez inserimos um registro
apenas:
insert into cidade
(
nome,
estado
)
values
('Manaus', 'AM'),
('So Paulo', 'SP'),
('Tucurui', 'PA'),
('Rio de Janeiro', 'RJ');
www.divus.com.br
Pgina 34
Agora vamos inserir um registro na tabela cliente, para demonstrar o cuidado que se deve ter
ao inserir dados em campos para os quais tenha sido definida uma chave primria:
insert into cliente
(
nome,
bairro,
cidade,
cpf,
tipo
)
values
(
'Joo Ubaldo Ribeiro',
1,
1,
'123.456.789-10',
1
),
Observe que o nmero 1 que estamos prestes a inserir no campo cidade da tabela cliente
corresponde ao id de um dos registros da tabela cidade.
Lembre-se que durante o estudo dos comandos DDL, estabelecemos uma chave estrangeira na
tabela cliente, definindo que no campo cidade, somente sero aceitos valores coincidentes
com os que j existirem no campo id ta tabela cidade.
Pode parecer (e de fato ) muito maante definir o valor nos campo que so chaves
estrangeiras, quando se insere registros em uma tabela. Se um cliente do tipo ouro, por
exemplo, na tabela de cliente, a informao que dever constar o id do tipo ouro na tabela
de tipos de clientes. Mas quando se est escrevendo uma instruo SQL, como possvel
lembrar que nmero corresponde ao nome que se tem em mente? A resposta : exercite a
memria ou alterne entre janelas para consultar as tabelas de referncia para compor o
registro que pretende inserir.
www.divus.com.br
Pgina 35
Veja que atualizamos o valor do campo nome do registro cujo valor do campo id igual a 1, na
tabela bairro. uma prtica quase unnime estabelecer um critrio para restringir os registros
que sofrero alterao. Quando os valores de mais de um campo vo ser alterados na mesma
ocasio, os pares campo/valor so separados por vrgulas. Veja o exemplo a seguir:
update
fornecedor
set
nome = 'Comida Farjuta S.A.',
bairro = 1,
cpf = '999.901.109-35'
where
id = 6;
Pgina 36
Note que apenas um registro ser excludo, aquele coincidente com o valor definido no
critrio, atravs da clusula where.
www.divus.com.br
Pgina 37
nome
Gesto
Programao
Automao
nome da tabela
id
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Nome
Academia do Programador
Academia Java
Academia Android
Scrum
Robtica para Iniciantes
nome da tabela
id
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Nome
AP26
AP27
AD18
SC06
AP28
nome da tabela
id
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
Num. Automtica
www.divus.com.br
tipo_curso
Nome
Tales de Mileto
Digenes de Apolnia
Pitgoras de Samos
Parmniedes de Eleia
Rene Descartes
Albert Camus
Immanuel Kant
curso
durao
80
120
60
20
20
tipo
2
2
2
1
3
turma
Curso
1
1
3
4
1
Aluno
idade
18
40
36
44
50
12
30
cpf
789.456.789-25
654.456.789-12
422.456.789-63
123.456.758-78
123.999.789-45
121.350.789-98
414.453.789-01
turma
1
1
1
1
2
2
3
Pgina 38
Captulo 5
www.divus.com.br
Pgina 39
www.divus.com.br
Pgina 40
www.divus.com.br
Pgina 41
www.divus.com.br
Pgina 42
Todas essas relaes de dependncia foram estabelecidas atravs da criao das chaves
estrangeiras nas tabelas que so dependentes de outras.
A seguir, todo os comandos Sql utilizados para a criao do nosso banco de dados para testes:
Cidades
create table cidades
(
cid_id int not null primary key auto_increment,
cid_nome char(250) not null,
cid_estado char(2) not null
);
Bairros
create table bairros
(
bai_id int not null primary key auto_increment,
bai_nome char(250) not null,
bai_cidade int not null,
constraint
foreign
key
bairro_cidade(bai_cidade)
cidades(cid_id)
);
www.divus.com.br
references
Pgina 43
references
Clientes
create table clientes
(
cli_id int not null primary key auto_increment,
cli_nome char(250) not null,
cli_bairro int not null,
cli_cpf char(14) not null,
constraint
foreign key cliente_bairro(cli_bairro)
bairros(bai_id)
);
references
Tipos de Produtos
create table tipos_produtos
(
tip_id int not null primary key auto_increment,
tip_nome char(250) not null
);
Produtos
create table produtos
(
pdt_id int not null primary key auto_increment,
pdt_nome char(250) not null,
pdt_valor_entrada double not null,
pdt_valor_saida double not null,
pdt_tipo int not null,
pdt_fornecedor int not null,
pdt_estoque int not null,
constraint
foreign
key
produto_tipo(pdt_tipo)
references
tipos_produtos(tip_id),
constraint
foreign
key
produto_fornecedor(pdt_fornecedor)
references fornecedores(for_id)
);
Pedidos
create table pedidos
(
ped_id int not null primary key auto_increment,
ped_data datetime not null,
ped_cliente int not null,
constraint
foreign key pedido_cliente(ped_cliente)
clientes(cli_id)
);
www.divus.com.br
references
Pgina 44
references
references
Nas pginas seguintes temos uma lista dos registros existentes em cada tabela do banco de
dados, para que voc possa confrontar o resultado das suas consultas:
select * from bairro;
www.divus.com.br
Pgina 45
www.divus.com.br
Pgina 46
www.divus.com.br
Pgina 47
www.divus.com.br
Pgina 48
www.divus.com.br
Pgina 49
www.divus.com.br
Pgina 50
from pedido
WHERE
Use a clusula WHERE para obter apenas os registros que preencha os critrios especificados.
Por exemplo, filtrando os pedidos por cliente. possvel retornar apenas os pedido para
efetuados por determinado cliente. Lembre que o campo cliente na tabela pedido chave
estrangeira e guarda no os nomes dos clientes, mas o seu id (relacionado com o campo id da
tabela cliente)
select *
Operadores OR e AND
Os operadores AND e OR so utilizados para combinar critrios e seu uso est sujeito s regras
da lgica booleana. O uso de AND restring o retorno de registros queles que satisfaam tanto
uma quanto outra caracterstica. O uso de OR retorna registros que satisfaam a pelo menos
uma das caractersticas utilizada para o filtro. Veja uma consulta que retorna os produtos que
tenha tipo igual a 6 e com estoque acima de 1000:
www.divus.com.br
Pgina 51
Agora uma consulta que retorne produtos cujo valor de entrada seja maior que 10 ou ento
tenha mais que 1000 unidades em estoque:
select * from produto where valor_entrada > 10 or estoque > 1000
Agora uma combinao entre o operador OR e AND. Neste exemplo sero retornados
produtos cujo valor de entrada seja maior que 10 ou ento que tenham estoque maior que
1000, mas, mesmo atendendo a uma ou outra dessas especificaes, o produto deve ser do
fornecedor 7. Repare que os critrios relacionados com OR esto entre parntesis, seguidos do
critrio relacionado com AND.
select * from produto where (valor_entrada > 10 or estoque > 1000) and
fornecedor = 7
Operador BETWEEN
O operador BETWEEN utilizado na clusula WHERE em combinao com o operador AND e
retorna valores que estiverem dentro de uma faixa especificada. Na instruo a seguir, os
produtos retornados sero aqueles cuja quantidade em estoque esteja entre 10 e 200.
select * from produto where estoque between 10 and 200
Operador LIKE
Este operador usado dentro da clusula WHERE para coincidir o valor do campo com um
padro estabelecido. Embora seja possvel utilizar LIKE para encontrar uma sequncia exata,
seu uso mais comum em combinao com os caracteres curinga. Tambm chamados de
wildcards. No exemplo seguinte vamos selecionar produtos cujo nome comece com a letra a:
select * from produto where nome like 'a%'
WILDCARDS
Os WILDCARDS combinados com a o operador LIKE podem ser repetidos no padro de busca,
combinados uns com os outros e posicionados em diferentes locais do padro. Veja alguns
exemplos:
Selecionando produtos cujo nome tenha a sequncia ce em qualquer parte do seu nome. O
caractere percentual ( % ) utilizado em substituio a qualquer quantidade de qualquer
caractere antes de ce e tambm depois.
select * from produto where nome like '%ce%'
Nome do produto pode ter qualquer caractere (mas apenas um!) antes da expresso e e
qualquer quantidade de caracteres aps o e.
select * from produto where nome like '_e%'
www.divus.com.br
Pgina 52
Retornando registros da tabela de cidades que no possuam valor algum no campo nome, ou
seja, o campo nome est nulo.
select * from cidade where nome is null
Pgina 53
ORDER BY ordena, por padro, na ordem natural, ou seja, do menor valor para o maior, ou em
ordem alfabtica crescente, caso o campo contenha valores literais. Tambm possvel
especificar ordenao inversa, veja o exemplo seguinte, onde acrescentamos a expresso desc
aps o nome do campo de ordenao.
select * from produto order by estoque desc
Tambm possvel especificar diversas colunas para ordenao, neste caso as colunas devem
ser separadas por vrgulas. Veja mais um exemplo, onde ordenamos os registros por
fornecedor de forma ascendente e por quantidade em estoque, de forma descendente. As
colunas pelas quais se deseja ordenar os dados devem aparece na consulta na ordem de
prioridade que se deseja. No nosso exemplo, definimos que a coluna fornecedor tem
prioridade sobre a coluna estoque.
select * from produto order by fornecedor asc, estoque desc
www.divus.com.br
Pgina 54
Funo FIRST
Usamos esta funo para retornar o primeiro registro de um conjunto. Aqui tambm vamos
encontrar diferentes implementaes desta funcionalidade entre os SGBD. Vejamos algumas:
No Ms Access, para retornar o primeiro da tabela de produtos, faa assim:
select first(id) AS idProduto FROM Produto
Funo LAST
Muito semelhante funo FIRST, a funo LAST usada para retornar o ltimo registro de um
conjunto. Vejamos as diferentes implementaes ou estratgias substitutivas em diferentes
SGBD:
No Ms Access, para retornar o ltimo registro da tabela de produtos, faa assim:
select last(id) AS idProduto FROM produto
www.divus.com.br
Pgina 55
Funo MIN
Semelhante funo MAX, difere por retornar o menor valor. Veja
select min(valor_entrada) as maiorpreco from produto;
Funo SUM
Retorna a soma dos valores de um dos campos da tabela, dentro do universo de registros
especificado. Veja alguns usos:
Retorna a soma dos valores de todos os itens de todos os pedidos
select sum(valor_total) as total from item_pedido
Funo
AVG
COUNT
FIRST
LAST
MAX
MIN
SUM
www.divus.com.br
Retorno
Mdia dos valores contidos em um campo
Quantidade de registros
Primeiro registro
ltimo registro
Valor mximo encontrado em um campo
Valor mnimo encontrado em um campo
Soma dos valores de um campo
Pgina 56
Funo LCASE
Retornando o contedo do campo nome da tabela de clientes formatando os caracteres para
minsculas.
select lcase(nome) from cliente
Funo MID
Retornando 3 caracteres do contedo do campo nome, a partir da segunda posio. Ex.
Marcos retorna arc.
select mid(nome, 2,3) from cliente
Funo LENGTH
A funo LENGTH retorna um nmero inteiro equivalente quantidade de caracteres que
um campo contm. Veja:
select length(nome) as qtd from cliente
Funo ROUND
Retorna o valor do campo arredondado para um nmero determinado de casas decimais.
select round(valor_entrada,1) as ve from produto
www.divus.com.br
Pgina 57
No Sql Server
select
getdate()
Funo FORMAT
Formata o valor de um campo para o nmero especificado de casas decimais
No MySql
select nome, format(valor_entrada,3) from produto;
No Sql Server a funo format tem aplicao mais ampla, podendo formatar nmero, datas e
receber parmetros para formatos especficos e de localidade.
SELECT
SELECT
SELECT
SELECT
FORMAT
FORMAT
FORMAT
FORMAT
(getdate(),
(1253, 'N',
(1253, 'G',
(1253, 'C',
'd', 'pt-BR'
'pt-BR' ) AS
'pt-BR' ) AS
'pt-BR' ) AS
) AS 'Data brasileira'
'formato numrico Nmeric'
'Formato geral "General"'
'formato de moeda "Currency"'
Funo
UCASE
LCASE
MID
LEN
ROUND
NOW
FORMAT
www.divus.com.br
Retorno
Valor do campo convertido para maisculas
Valor do campo convertido para minsculas
Parte dos caracteres de um campo
Quantidade de caracteres de um campo
Valor de um campo arredondado
Data atual do sistema
Contedo formatado do campo
Pgina 58
www.divus.com.br
Pgina 59
auto_increment,
www.divus.com.br
Pgina 60
Em seguida os dados contidos nas tabelas para efetuarmos os testes com joins:
O resultado da consulta:
INNER JOIN
O resultado da consulta anterior apresenta somente nmeros no campo
curso. Estes nmeros so, por deduo, os valores contidos no campo id
da tabela de cursos. Para muitas finalidades este nmero bastante til,
mas para apresentao ao usurio em um relatrio, por exemplo, a
informao no seria esclarecedora. Neste caso preciso relacionar a tabela
aluno com a tabela curso e retornar o valor contido no campo nome da
tabela curso. Vejamos a instruo SQL.
select
a.nome as alu,
c.nome as cur
from aluno a inner join curso c
on a.curso = c.id;
Um relacionamento entre duas tabelas, estabelecido atravs inner join determina que,
para um registro fazer parte do conjunto retornado preciso que haja coincidncia entre
o valor dos campos envolvidos no relacionamento.
www.divus.com.br
Pgina 61
Note que dessa vez foram retornados tanto dados da tabela aluno quanto da tabela
curso, mas os alunos para os quais no foi definido um curso no aparecerem no
resultado da consulta. Desta vez as alunas Amanda e Maria foram omitidas. Isso
ocorreu devido imposio da condio de que, para fazer parte do conjunto de
resultados, os valores dos campos mencionados no join devem ser coincidentes em
AMBAS as tabelas.
LEFT JOIN
Imagine que seja necessrio retornar dados de ambas as tabelas, mas queremos priorizar
os dados de uma delas. Queremos, por exemplo, visualizar os alunos e o curso em que
cada um est matriculado, mas, quanto um aluno no estiver relacionado a nenhum
curso, ele tambm deva ser includo entre os resultados, ou seja, os dados da tabela de
cursos tem que encontrar coincidncia com os da tabela de alunos, mas os no o
contrrio. Neste caso a tabela de alunos teria um comportamento mandatrio no
relacionamento.
Neste caso, dependendo da maneira como as tabelas aparecem na consulta, podemos
utilizar left ou right join. Primeiramente vamos utiliza left join. Veja o exemplo a
seguir:
select
a.nome as alu,
c.nome as cur
from aluno a left join curso c
on a.curso = c.id;
Pgina 62
Isso ocorre, porque neste tipo de relao a tabela da esquerda tem seus registros
exibidos, mesmo que no haja coincidncia entre os campos definidos para relacionar as
tabelas. J a exibio dos registros da tabela da direita est condicionada coincidncia.
Esquerda e direita so referncias ordem em que a tabela aparece na clusula from,
Esquerda a tabela que aparece primeiro e direita a posio da prxima tabela em
relao anterior, uma vez que o texto escrito da esquerda para a direita e de cima
para baixo.
RIGHT JOIN
Considerando agora que desejamos ver todos os registros da tabela de cursos e os
registros da tabela de alunos somente quando houver coincidncia. Assim iremos ver
todos os cursos, mesmo aqueles para os quais no haja aluno matriculado. Par obter
esse resultado a tabela curso teria um papel mandatrio no relacionamento.
Agora vamos utilizar right join. Veja o cdigo a seguir:
select
a.nome as alu,
c.nome as cur
from aluno a right join curso c
on a.curso = c.id;
Veja que, usando o right join, foram exibidos todos os registros da tabela de cursos,
mesmo aqueles para os quais no h aluno matriculado, ou seja, foram exibidos at os
cursos cujos valores do campo id no apaream no campo curso da tabela aluno.
Desta vez, os registros cuja exibio est sujeita existncia de coincidncia entre os
campos relacionados so os da tabela aluno. Todos os registros da tabela curso sero
exibidos, enquanto que apenas alunos com valores no campo curso, coincidentes com
valores do campo id da tabela curso sero exibidos. Note que Amanda e Maria
ficaram fora dos resultados.
No right join a tabela da direita mandatria no relacionamento.
www.divus.com.br
Pgina 63
CROSS JOIN
Este um tipo especial de join que no exige a definio de uma relao entre campos
das duas tabelas. A palavra on, utilizada para introduzir o tipo de amarrao que
fazemos entre os dados das tabelas no aparece aqui. Diferentemente do inner join, os
dados agora no so combinados: para cada linha de uma tabela, todas as linhas da outra
tabela so retornadas, de maneira que a quantidade de registros retornados um produto
entre as quantidades de registros de cada uma delas. O resultado de um cross join entre
uma tabela com 30 registros e outra com 10 registros ser um conjunto de 300 registros.
Agora vamos utilizar cross join. Veja o cdigo a seguir:
select
a.nome as alu,
c.nome as cur
from aluno a cross join curso c
Usando o cross join, foram exibidos todos os registros da tabela de cursos, e todos os
registros da tabela de alunos. Para cada registro em uma h todos os registros da outra
so exibidos. No ouve nenhum tipo especial de combinao.
www.divus.com.br
Pgina 64
2. Faa download do script para gerao dos objetos do banco de dados loja, do local
especificado pelo instrutor e rode o script utilizando a interface grfica de sua preferncia.
Aps rodar o script, seu banco de dados vai contar no apenas com as tabelas e suas
chaves estrangeiras, mas tambm com os dados para servirem de para as consultas.
www.divus.com.br
Pgina 65
www.divus.com.br
Pgina 66
www.divus.com.br
Pgina 67
Veja em seguida a construo dessa consulta passo a passo, uma expresso de cada vez
e, finalmente, todas as expresses juntas para obteno de resultado nico:
Vejamos o valor de cada produto sem o
aumento:
Select valor_saida
produto;
Select valor_saida *
estoque from produto;
www.divus.com.br
1.10
1.10
from
Pgina 68
sum(estoque)
sum(estoque)
sum(estoque)
sum(estoque)
from
from
from
from
produto
produto
produto
produto
where
where
where
where
fornecedor
fornecedor
fornecedor
fornecedor
=
=
=
=
1;
2;
3;
n;
Esta estratgia, embora com muito esforo funcionasse, muito ruim, por dois motivos:
o primeiro que cada consulta teria que ser efetuada separadamente e o resultado
anotado para tabulao posterior o segundo que seria necessrio conhecer cada
fornecedor do banco de dados para alterar o filtro em cada execuo. Teramos que
contar com a disciplina e a memria do usurio. Estratgia descartada. Vejamos uma
alternativa, com o uso do GROUP BY.
select fornecedor, sum(estoque) from produto group by fornecedor;
Esta estratgia utiliza o GROUP BY para efetuar somas parciais de cada grupo de
produtos, utilizando o campo fornecedor como critrio de agrupamento. Veja o
resultado:
Pgina 69
www.divus.com.br
Pgina 70
www.divus.com.br
Pgina 71
www.divus.com.br
Pgina 72
Captulo 6
www.divus.com.br
Pgina 73
www.divus.com.br
Pgina 74
Onde 'nomeDoUsuario' deve ser substitudo pelo nome do usurio que se deseja criar.
'SGBD' o nome do servidor de dados, 'senha' a senha para o novo usurio. Vamos criar
um novo usurio no servidor local, denominado Joo, cuja senha seja 123.
CREATE USER 'joao'@'localhost' IDENTIFIED BY '123';
Quando o usurio criado ainda no h privilgios definidos para ele em nenhum dos
bancos de dados. Ser preciso ento conceder privilgios para que ele possa atuar sobre
os objetos contidos nos bancos de dados de interesse. Veja a sintaxe da concesso de
privilgios:
GRANT ALL ON bancoDeDados.objeto TO 'usuario'@'servidor';
www.divus.com.br
Pgina 75
Tambm possvel definir os limites para uso dos recursos do banco de dados para um
determinado usurio. No exemplo seguinte vamos limitar a execuo de consultas
tabela aluno do banco de dados escola para o usurio joao em 100 consultas por hora:
GRANT
USAGE
ON
escola.aluno
MAX_QUERIES_PER_HOUR 90;
TO
'joao'@'localhost'
WITH
Para remover um usurio da lista de usurios do seu SGBD, impedindo que ele efetue
novas conexes use DROP USER da seguinte maneira:
DROP USER joao@'localhost';
At a verso 5.0.2 do MySql o comando DRPO USER removia apenas usurios para os quais
no houvesse nenhum privilgio definido. Para remover um usurio completamente incluindo
seus privilgios, era necessrio remover os privilgios do usurio utilizando REVOKE e, sem
seguida utilizar DROP USER para remover o usurio. Atualmente o comando DROP USER
remove o usurio especificado e todos dos seus privilgios.
www.divus.com.br
Pgina 76
Captulo 7
SGBDs
Ferramentas Grficas
www.divus.com.br
Pgina 77
www.divus.com.br
Pgina 78
7.1 Firebird
Banco de dados relacional amplamente compatvel com ANSI SQL, com rodando em
Linux, Windows e outras plataformas, oferece suporte a stored procedures e triggers
e totalmente grtis para uso comercial inclusive. Conforme a definio do prprio
pessoal responsvel pelo Firebird, ele livre como um pssaro. Eles pretendem
significar que verses podem ser construdas a partir do cdigo fonte
disponibilizado, desde que a nova verso seja disponibilizada segundo os mesmos princpios de
gratuidade da verso original.
Tambm usam a expresso grtis como cerveja grtis, para significar que no sero cobradas
taxas, registros no sero requeridos e nenhum tipo de licena ser necessrio, mesmo que o
Firebird seja includo em uma aplicao comercial e distribudo como parte dela.
Segundo sua documentao, o firebird suporta bancos de dados maiores que 20 terabytes,
alm de contar com as seguintes caractersticas:
www.divus.com.br
Pgina 79
7.3 Oracle
Tecnologia de bancos de dados mais popular (no necessariamente o mais
utilizado) do mundo, assim como seu concorrente mais prximo, o Sql
Server, vem desenvolvendo novas funcionalidades a cada edio e tambm
tem buscado, utlimamente, investir na capacidade de gerencias grandes
massas de dados em nuvem, uma tendncia mundial das aplicaes, motivda
pelo crescimento do volume de dados e pela necessidade de
compartilhamento de informao.
Por se tratar de uma soluo estremanete profissional, alm das melhorias esperadas pra cada
nova verso de um SGBD, como disponibilidade, escalbilidade, gerenciamento de
armazenamento, segurana e reduo de custos de oprao, a verso 12c d ainda uma
ateno especial ao gerenciamento de dados em nuvem, ao atendimento necessidade de
dados muito grandes (big data) e tambm ao trabalho com dados em memria para agilizao
de transaes.
A integrao perfeita entre o software e hardware produzidos pela Oracle, ao lado da
facilidade de integrao com Java, tambm so aspectos a considerar, quanto se dipe de um
oramento capaz de suportar esse tipo despeza.
www.divus.com.br
Pgina 80
7.4 PostgreSQL
Alternativa muito profissional para quem tem ormento baixo e mdias
necessidades. Parece ser muito claro o fato de que algo com amplo padtrocnio,
como so so SGBD da Oracle e da Microsoft, tem condies de investimento
em pesquisa para melhoria e correo de erros muito aumentadas. Isso no
significa, no entanto, que solues baseadas em patrocnio voluntrio, tenham
que deixar a desejar na qualidade. O PostgreSQL, livre para uso, cpia,
modificao e distribuio uma poderosa ferramenta para pequenos e
mdios negcios. Na sua verso beta 2014-07-24, traz as seguintes caractersticas:
www.divus.com.br
Pgina 81
www.divus.com.br
Pgina 82
Captulo 8
www.divus.com.br
Pgina 83
www.divus.com.br
Pgina 84
www.divus.com.br
Pgina 85
Aps clicar no boto Start Export uma tela ser exibida solicitando o fornecimento da senha
com privilgios para fazer a exportao. Digite a senha, caso haje, e prossiga.
www.divus.com.br
Pgina 86
www.divus.com.br
Pgina 87
www.divus.com.br
Pgina 88
Aps clicar em Start e digitar a senha, se houver, na janela que exibida, uma barra de
progresso ser mostrada. Quando a barra estiver completa, os dados estaro disponveis no
novo banco de dados. Talvez seja necessrio clicar com o boto direito no navagador ao lado
esquerdo da janela e escolher a opo Refresh All, a fim de que as novas caractersticas do
banco sejam exibidas.
www.divus.com.br
Pgina 89