UC –Projeto de Banco de Dados

Propaganda
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 7 – Comandos SQL Parte 1: Criação e manutenção
de tabelas
Objetivos:
•
•
•
Detalhar características da linguagem SQL;
Explorar o uso da linguagem SQL no banco de dados Mysql;
Manipular a linguagem DDL e DML através da console de comandos;
Este roteiro tem como objetivo explorar o uso da linguagem SQL através do uso da console Mysql serão detalhados comandos
básicos para a criação de tabelas e bancos de dados e também comandos para a manipulação de informações existentes em
tabelas de dados;
Ferramentas necessárias
Navegador, Xampp,Notepad++, Bibliografias de livros da faculdade.
Quando os bancos de dados relacionais estavam sendo desenvolvidos, foram criadas linguagens destinadas à sua
manipulação. O Departamento de Pesquisas da IBM, desenvolveu a Sequel como forma de interface para o sistema de BD
relacional denominado SYSTEM R, no início dos anos 70. Esta linguagem foi evoluindo de nome e seu nome foi mudado para
SQL (Structured Query Language – Linguagem de Consulta Estruturada). Em 1986 o American National Standards Institute
(ANSI) e a International Standards Organization (ISO) publicaram os padrões para o SQL, chamado SQL-86. Em 1989 foi
publicada uma extensão chamada SQL-89. Atualmente os sistemas que dão suporte a SQL estão baseados pelo menos nos
recursos do SQL-89.A versão mais amplamente suportada é a SQL-92. A última publicação define o SQL-3.
O SQL apresenta uma série de comandos que permitem a manipulação de estruturas de dados, manipulação dos dados,
definição de restrições de segurança, são estas partes:
•
•
•
•
•
DDL(Data Definition Language) – Linguagem de Definição de dados
DML (Data Manipulation Language) – Linguagem de Manipulação de Dados
Embedded DML (Incorporação DML) – Comandos SQL para serem usados em linguagens gerais (PHP, JAVA,
Python)
Definição de Views – Definição de visões de dados
Controle de Transações
Para controlar e disponibilizar as informações de bancos de dados será utilizado inicialmente o SBGD Mysql, que está
embutido no aplicativo integrado XAMPP, disponível no endereço http://187.7.106.14/andre/softwares/xampp/xampp-win321.7.4-VC6-installer.exe. Para o banco de dados, o xampp utiliza uma pasta em sua estrutura denominada Mysql, e para o
servidor web utiliza a estrutura contida no Apache, a pasta htdocs.A figura a seguir detalha a estrutura de diretórios utilizada
pelo XAMPP quando é descompactado no disco.
Figura 17 - Estrutura de diretórios do XAMPP
P á g | 39
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Introdução
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Utilizando a console Mysql
Para realizar logar no Mysql via console é necessário possuir um usuário com privilégios de root para realizar as tarefas de
criação, visualização e alteração de bancos de dados, a seguir um exemplo de login utilizando o usuário máster do SGBD
Mysql, o usuário root:
c:\xampp\mysql\bin\mysql -u root –p
O primeiro contato que teremos será o prompt mysql para utilizar nossos comandos:
Geralmente inicia-se a manutenção de bancos de dados com uso dos comandos DDL (data definition language) e DML (Data
Manipulation language), são demonstrados a seguir os comandos mais comuns que podem ser utilizados:
Comando
Função
Executa um arquivo .SQL no formato
Exemplo de uso
SOURCE d:\comandos-SQL.sql
SOURCE
SOURCE caminhoArquivo
SHOW DATABASES;
Visualiza todos os bancos de dados disponíveis
no SGBD;
CREATE DATABASE
nomedb
Cria uma nova base de dados.
USE nomedb
Faz com que seja escolhida uma nova database
nos bancos de dados existentes no servidor
Mysql.
SHOW DATABASES;
CREATE DATABASE ANDRE;
USE ANDRE;
CREATE TABLE SENAC(
CREATE TABLE nometable
(CAMPO1 TIPODADOS,
CAMPO2 TIPODADOS...);
Cria uma nova tabela no servidor de banco de
dados, tem a possibilidade de apenas criar a
tabela e também de inserir valores na mesma.
id int,
nome varchar(30)
);
DROP TABLE nometable
Apaga uma tabela do sgbd.
DROP TABLE SENAC;
DROP DATABASE nomedb
Apaga uma base de dados do sgbd.
DROP DATABASE ANDRE;
DESC nometable
Descreve a estrutura de uma tabela do sgbd.
DESC SENAC;
INSERT INTO nometable
(campo1,campo2) values
(valor1,valor2)
Insere informações em uma tabela na ordem em
que forem definidos.
INSERT INTO SENAC(id,nome)
VALUES(1,’andré moraes’);
P á g | 40
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
COMANDOS DDL/DML
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
SELECT
campos
FROM
nometable
Realiza uma consulta de valores existentes em
uma tabela.
WHERE
condicao
Adiciona na consulta uma condição.
ORDER BY
nomecampo
Adiciona na consulta uma ordenação dos valores
retornados.
SELECT * FROM SENAC ORDER BY
NOME;
Sai da console mysql
EXIT;
EXIT
SELECT * FROM SENAC;
SELECT * FROM SENAC WHERE ID =1;
1)
Realizar
o
download
do
XAMPP
para
o
seu
desktop
a
partir
do
endereço
http://187.7.106.14/andre/softwares/xampp/xampp-win32-1.7.4-VC6-installer.exe, descompactá-lo e iniciar o servidor
de banco de dados e o servidor HTTP Apache server;
2)
Iniciar o prompt de comandos do Windows, acessar o diretório bin do mysql, localizado em xampp\mysql\bin e
realizar o login como usuário root;
3)
Listar todos os bancos de dados existentes no SGBD;
4)
Criar um novo banco de dados com o nome bd_aluno;
5)
Abra o software notepad ++(http://187.7.106.14/andre/softwares/notepad++/npp.5.9.3.bin.zip), modifique a linguagem
utilizada para SQL e utilize-o para criar um script com as tabelas descritas abaixo, salve o script com o nome de
roteiro-7-script1.sql
Tabela: computador
Campo
Tipo
ID
INT
NOME
VARCHAR(50)
MEMORIA
DOUBLE
DISCO
DOUBLE
MONITOR
VARCHAR(15)
6)
Execute o script no console, copiando o script e colando diretamente na console;
7)
Altere o script criado e inclua o comando drop table [nometabela], precedendo cada tabela criada. Rode o script
completo novamente na console.
8)
Altere o script criado e inclua os comandos necessários para inserir 3 computadores, com dados à sua escolha;
9)
Diretamente na console aplique um select para selecionar todos os computadores da tabela computadores;
10) Diretamente na console, aplique um select para selecionar apenas os computadores onde o ID seja 2;
11) Altere o script de criação de tabelas, e inclua mais duas tabelas, descritas a seguir:
Tabela: pessoa
Campo
Tipo
P á g | 41
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Tarefas
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
ID
INT
NOME
VARCHAR(50)
ENDERECO
VARCHAR(70)
CIDADE
VARCHAR(20)
Tabela: cidade
Campo
Tipo
ID
INT
NOME
VARCHAR(50)
ESTADO
VARCHAR(2)
12) Altere o script criado para inserir mais 3 pessoas, 3 cidades e 3 computadores.
13) Aplique um select para selecionar todas as cidades;
15) Descreva a tabela pessoa;
16) Delete cada tabela criada no banco de dados;
17) Visualize as tabelas do banco de dados para confirmar a exclusão das mesmas;
18) Delete o banco de dados;
19) Visualize os bancos de dados existentes para confirmar a exclusão do banco;
Referências
•
Elmasri, Navathe – Sistemas de banco de dados 6ª Edição;
•
“Introdução a Banco de dados”, Osvaldo Kataro Tokai, disponível em http://pt.scribd.com/doc/50780287/BD;
•
“Apache Friends Home page” - http://www.apachefriends.org/pt_br/xampp-windows.html#2287
•
“Notepad++ Home page” - http://notepad-plus-plus.org/
P á g | 42
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
14) Aplique um select para selecionar todas as pessoas;
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 8 – Comandos SQL parte 2: Comandos DDL
Objetivos:
•
•
Adicionar chaves primárias em tabelas de dados;
Utilizar comandos DDL para alteração de estruturas de bancos de dados
Neste roteiro são utilizados comandos para realizar a manipulação nas estruturas de bancos de dados que são importantes
para modificar ou adicionar componentes as tabelas de bancos de dados.
Ferramentas necessárias
Navegador, Xampp,Notepad++,console Mysql, Bibliografias de livros da faculdade.
Introdução
Alterar a estrutura de tabelas é uma tarefa bastante importante na administração de bancos de dados. A estrutura das tabelas
pode ser alterada a qualquer momento que se desejar através dos comandos fornecidos pelo SGBD. Serão exploradas
algumas das tarefas comuns na manipulação de estruturas de tabelas em bancos de dados.
No comando criado, temos de atentar aos itens: NOT NULL, DEFAULT NULL, PRIMARY KEY.
•
•
•
NOT NULL – define que o campo não poderá ser definido com valores vazios;
DEFAULT NULL – define como valor padrão o NULL;
PRIMARY KEY(nome_campo) – Define que o campo mencionado no comando será utilizado como chave primária
dentro da estrutura das tabelas.
P á g | 43
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Adicionando Chaves primárias: Para adicionar uma chave primária na definição de uma tabela de dados é
suficiente a adição do comando primary key(nome-campo). Exemplo de criação de chave primária para uma
tabela contatos:
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
ALTERANDO A ESTRUTURA DE TABELAS
Estruturas de tabelas podem ser alteradas através do comando ALTER TABLE. Este comando, como o nome indica, realiza
uma alteração na tabela para que seja possível inserir, alterar ou remover colunas de dados. A seguir um exemplo de coluna
sendo adicionada:
ALTER TABLE DRINKS
ADD COLUMN ID_DRINK INT NOT NULL AUTO_INCREMENT FIRST;
Indica que a nova coluna a ser inserida ocupará a primeira coluna na tabela de dados a qual estamos inserindo este novo
campo, ou seja, o FIRST é a cláusula que permite realizar esta inclusão em primeiro.
No comando anterior foi feita a inserção de uma nova coluna denominada id_drink com os parâmetros INT, NOT NULL,
AUTO_INCREMENT e FIRST. Sendo que com isso informamos que o campo será do tipo inteiro, não vazio, será incrementado
automaticamente e será posicionado como a primeira coluna da tabela.
EXEMPLO DE ALTERAÇÃO DE COLUNA: Incluir uma coluna em uma tabela DRINKS com o nome de nota. A coluna será
posicionada após a coluna de preço.
RENOMEANDO UMA TABELA CRIADA ANTERIORMENTE: Para renomear uma tabela criada anteriormente é possível
utilizar o comando ALTER TABLE juntamente com o comando RENAME TO
Exemplo de renomeação de tabela BEBIDAS para INGREDIENTES.
ALTERANDO NOMES DE CAMPOS DE UMA TABELA: Para alterarmos um campo podemos utilizar o comando ALTER
TABLE seguido do comando CHANGE COLUMN.
Exemplo de modificação do nome da coluna NOME para DESCRICAO.
P á g | 44
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
ALTERANDO UMA TABELA PARA ADICIONAR UMA CHAVE PRIMÁRIA: É possível que uma tabela seja alterada para
incluir um novo campo e adicionarmos nossa chave primária, para tanto é utilizado o comando ALTER TABLE.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
OBSERVAÇÕES: O cuidado ao alterar colunas de tabelas se deve ao tipo de dados e tamanhos escolhidos. Se alterarmos um
tipo de uma coluna para um tipo que não é compatível com o anterior, os dados serão perdidos. Caso a alteração seja feita
para dados compatíveis, porém de menor tamanho, os dados serão reduzidos para adaptarem-se ao novo tamanho.
ALTERANDO APENAS OS TIPOS DE DADOS DE UM CAMPO: Quando for necessário alterar o tipo de dado de uma coluna
específica, podemos também utilizar o comando MODIFY campo NOVO_TIPO;
EXEMPLO: Modificando o tipo de dados do campo DESCRICAO para VARCHAR(100);
A diferença do comando MODIFY para o comando CHANGE se dá no fato de não estarmos modificando o nome e tipo de
dados da coluna, e sim apenas o tipo de dados.
Tarefas
1)
Preencher a tabela de comandos abaixo com uma descrição, baseado no seu exemplo de uso.
Todos os comandos listados a seguir devem ser executados sempre precedidos do comando ALTER TABLE [NOMETABELA]
Comando
ADD COLUMN [nomecoluna]
[TIPO] [PARÂMETROS]
Função
Exemplo de uso
ALTER TABLE X
ADD COLUMN NOME VARCHAR(30);
ALTER TABLE X
RENAME TO [nometabela]
RENAME TO Y;
ALTER TABLE Y
LAST
ADD COLUMN ZZZ INT LAST;
ALTER TABLE Y
BEFORE
ADD COLUMN AAA INT BEFORE BBB;
ALTER TABLE Y
AFTER
ADD COLUMN CCC INT AFTER BBB;
ALTER TABLE Y
FIRST
ADD COLUMN CHAVE INT FIRST;
ALTER TABLE Y
AUTO_INCREMENT
ADD COLUMN CHAVE2 INT AUTO_INCREMENT;
ALTER TABLE Y
CHANGE COLUMN
CHANGE COLUMN CHAVE2 CHAVEPRINCIPAL INT;
TRUNCATE TABLE
TRUNCATE TABLE Y;
P á g | 45
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Comandos para alteração de estrutura de tabelas
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
2)
3)
Criar um script para gerar a tabela no formato e com as informações a seguir:
COR
ANO
FABRICANTE
MOD_
VALORDECUSTO
Prata
1998
Porsche
Boxter
17992.540
NULL
2000
Jaguar
XJ
15995
Vermelho
2002
Cadillac
Escalade
40215.9
A tabela possui um planejamento pouco eficaz, pois possui várias falhas. Utilizando o comando ALTER TABLE gere o
script para a modificação da tabela acima para que no formato da tabela a seguir:
CARRO_ID
CHASSI
FABRICANTE
MODELO
COR
ANO
VALOR
1
RNKLK66N33G213481
Porsche
Boxter
Prata
1998
17992.54
2
SAEDA44B175B04113
Jaguar
XJ
NULL
2000
15995.00
3
3GYEK63NT2G280668
Cadillac
Escalade
Vermelho
2002
40215.90
•
•
•
•
•
•
•
ALTER TABLE
RENAME TO
ADD COLUMN
ADD PRIMARY KEY
CHANGE COLUMN
MODIFY COLUMN
UPDATE;
RESULTADO FINAL:
4)
Alterar a coluna FABRICANTE para que tenha o tipo varchar(50) e fique em último lugar na tabela;
5)
Criar uma tabela DONO, que representará os donos dos veículos. Nesta tabela inclua os campos cpf, nome, telefone,
cidade.
6)
Insira 3 donos de veículos preenchendo todas as informações da tabela dono;
7)
Adicione outra coluna na tabela dono com o nome ID_DONO para que fique na esquerda da tabela, antes de todas as
colunas, e fique com a propriedade auto_increment e primary key definidas.
8)
Altere o nome da tabela DONO para PESSOA;
9)
Zere todos os registros da tabela PESSOA;
10) Insira novamente os registros que foram excluídos na tabela dono, copiando novamente o seu script na console;
11) Adicione uma nova coluna na tabela PESSOA com o nome ID_VEICULO, e insira 3 novos registros completos de
donos com ID’S de VEICULOS;
P á g | 46
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
COMANDOS SUGERIDOS PARA SEREM UTILIZADOS:
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Referências
Elmasri, Navathe – Sistemas de banco de dados 6ª Edição;
•
“Introdução a Banco de dados”, Osvaldo Kataro Tokai, disponível em http://pt.scribd.com/doc/50780287/BD;
•
“Apache Friends Home page” - http://www.apachefriends.org/pt_br/xampp-windows.html#2287
•
“Notepad++ Home page” - http://notepad-plus-plus.org/
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
•
P á g | 47
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 9: SQL Básico - chave estrangeira, operadores de
comparação e operadores booleanos
Objetivos:
•
•
•
Criar restrições para atributos, chaves primárias e estrangeiras;
Explorar consultas SQL com uso de operadores de comparação;
Explorar consultas SQL com uso de operadores booleanos;
Neste roteiro são explorados comandos para a realização de consultas com uso de operadores de comparação e operadores
booleanos importantes para a realização de consultas mais complexas onde os dados devem ser filtrados de acordo com
critérios específicos do programador.
Ferramentas necessárias
Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade.
Criando Restrições
Restrições de atributo: Como o nome indica, são restrições que podem ser aplicadas aos atributos de uma tabela. Existem
algumas restrições que podem ser aplicadas como valores null (NULL), valores padrão e valores (DEFAULT) de checagem
(CHECK), que são detalhados a seguir na tabela abaixo:
Restrição
Descrição
Exemplo de uso
NOT NULL
Se um valor NULL não for permitido isto pode ser
especificado através do parâmetro NOT NULL na
definição de um campo. Geralmente esta propriedade é
definida para campos de chave primária, mas pode ser
especificado para quaisquer outros atributos cujos
valores não podem ser NULL.
CREATE TABLE X(
NOME VARCHAR(30) NOT NULL
);
DEFAULT
Determina um valor padrão para um atributo. O valor
padrão será incluído em qualquer registro se um valor
explícito não for declarado.
CREATE TABLE Y(
TPAGTO INT DEFAULT 100
);
CHECK
Utilizado para limitar valores de atributo ou domínio.
Pode ser utilizado para expressar que apenas valores
dentro de uma faixa x podem ser utilizados em um
campo.
CREATE TABLE Z(
TPAGTO INT CHECK(TPAGTO > 0 AND
TPAGTO <3)
);
P á g | 48
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Em SQL, restrições podem ser definidas para as tabelas que forem criadas. Existem restrições de chave e integridade
referencial, restrições sobre domínios de atributo e NULLs e restrições sobre tuplas individuais (registros) dentro de uma
relação.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Restrições de chave e integridade referencial: são restrições que podem ser impostas para os atributos para garantir a
integridade da informação que será armazenada. Existem as restrições de chave primária (primary key) e de chave segundária
(foreign key), as duas propriedades são detalhadas na tabela a seguir:
Restrição
Descrição
Exemplo de uso
PRIMARY
KEY
Permite especificar atributos de chave primária em
uma tabela. Se o atributo chave for único a restrição
pode ser incluída diretamente no atributo, caso
contrário deve ser incluído ao final da declaração dos
campos ou após através da alteração da tabela.
CREATE TABLE X(
ID_FUNC INT PRIMARY KEY
);
CREATE TABLE X(
ID_FUNC INT,
PRIMARY KEY(ID_FUNC);
);
PRIMARY KEY(CAMPO1,CAMPO2,CAMPO3);
FOREIGN
KEY
Especifica a criação de uma chave estrangeira. Da
mesma forma que a chave primária, esta propriedade
pode ser inserida na definição da tabela ou
posteriormente através do comando ALTER TABLE.
CREATE TABLE Y(
IDCIDADE INT NOT NULL,
FOREIGN KEY(IDCIDADE) REFERENCES
CIDADE(IDCIDADE)
);
Restrição
Descrição
Exemplo de uso
ON DELETE
Define opções para quando são deletados
registros envolvendo chaves estrangeiras.
ON UPDATE
Define opções para quando são
atualizados registros envolvendo chaves
estrangeiras.
SET NULL
Opção para ON DELETE OU ON UPDATE
que define que ao ser excluído ou alterado
um registro que é referenciado por outras
tabelas como chave estrangeira, estas
são definidas como NULL.
CREATE TABLE X(
...
FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE)
ON DELETE SET NULL
);
CASCADE
Opção para ON DELETE OU ON UPDATE
que define que ao ser alterado um registro
que é referenciado por outras tabelas
como chave estrangeira,
estas são
atualizadas juntamente com o novo valor
definido.
CREATE TABLE X(
...
FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE)
ON UPDATE CASCADE
);
CREATE TABLE X(
...
FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE)
ON DELETE [AÇÃO]
);
CREATE TABLE X(
...
FOREIGN KEY (IDCIDADE) REFERENCES CIDADE(IDCIDADE)
ON UPDATE [AÇÃO]
);
P á g | 49
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Ações de violação de integridade: uma violação ocorre quando alguma informação inserida ou atualizada em um atributo
viola as regras de chave. Quando acontece uma violação de integridade, a ação padrão (default) do SGBD é a de recusar a
operação. Porém é possível adicionar ações de comportamento para que sejam executadas, descritas na tabela a seguir:
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Nomeando Restrições
Uma restrição pode ser nomeada em sua definição com uso da palavra-chave CONSTRAINT. Nomes de restrição precisam ser
exclusivos e são importantes por identificarem diferentes restrições no caso de precisarem ser excluídas ou trocadas por outras
ao longo da definição do banco de dados. Nomear restrições em bancos de dados é uma tarefa opcional, porém as principais
ferramentas CASE de implementação normalmente utilizam nomes em restrições.
Exemplo de criação de restrição com uso de CONSTRAINT
CONSTRAINT PK_FUNCIONARIO
PRIMARY KEY(IDFUNCIONARIO),
CONSTRAINT FK_CIDADE_FUNCIONARIO
FOREIGN KEY(IDCIDADE) REFERENCES CIDADE(IDCIDADE)
ON DELETE SET NULL ON UPDADTE CASCADE;
Operadores de comparação
Operadores de Comparação
Os operadores de comparação a serem utilizados em uma consulta SQL são os mesmos utilizados na maioria das linguagens
de programação, e permitem que uma consulta possa ser executada de forma muito mais poderosa para a seleção de
informações em tabelas. Os operadores de comparação são descritos a seguir:
Comando
SELECT
campos
FROM
tabela
WHERE
argumentos
Função
Exemplo
=
Insere um operador de comparação
“igual a” entre dois campos.
SELECT * FROM dados WHERE
nome = “joão”
<
Insere um operador de comparação
“menor que” entre dois campos ou
expressões.
SELECT * FROM funcionario WHERE
salario < 1000
>
Insere um operador de comparação
“maior que ”entre dois campos ou
expressões.
SELECT * FROM cidade WHERE
populacao > 20000
<=
Insere um operador de comparação
“maior que” entre dois campos ou
expressões.
SELECT * FROM cidade WHERE
populacao >= 20000
>=
Insere um operador de comparação
“menor que ”entre dois campos ou
expressões.
SELECT * FROM aluno WHERE nota
>= 7
<>
Insere um operador de comparação
“diferente de”
SELECT * FROM pessoa WHERE
sexo <> “masculino”
P á g | 50
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
A cláusula WHERE introduz um potencial maior para as buscas de informações. Permite que seja possível escolher quais
linhas são restauradas de uma declaração SELECT. É utilizado para restaurar linhas que combinem uma condição, como ter
um valor de coluna que combine exatamente com uma string, um número maior ou menor que um valor, ou uma string que é o
prefixo de outra. A seguir são demonstrados os operadores de comparação sendo utilizados em conjunto com a cláusula
WHERE.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Operadores Booleanos
Os operadores de condição são úteis para combinar duas ou mais condições utilizando os operadores booleanos AND, OR e
NOT. Permite unir critérios de pesquisa diferentes na mesma consulta, podemos utilizar a conjunção AND e separar critérios
diferentes, por exemplo.
Operadores AND, OR e NOT
Comando
SELECT
campos
FROM
tabela
WHERE argumentos
Função
Exemplo
AND
Restringe os resultados para as linhas que
possuem ambas as condições.
SELECT * FROM dados WHERE nome =
“joão” and salario > 3000
OR
Restringe os resultados para as linha que
atendam pelo menos uma das condições.
SELECT * FROM funcionario WHERE
salario < 1000 or nome >= ‘G’
NOT
Nega uma declaração Booleana.
SELECT * FROM funcionario WHERE NOT
(salario >1000 and salario < 5000)
Tarefas
Utilizando o script de criação disponível em http://187.7.106.14/andre/ads/proj_bd/2012-2/roteiros/roteiro9-chavesrestricoes/roteiro9-definicao-dados.sql, crie o banco de dados em seu servidor Mysql para uso nas tarefas do roteiro.
1)
Crie
as
chaves
estrangeiras
utilizando
uma
CONSTRAINT
FK_TABELAORIGEM_TABELADESTINO para as seguintes tabelas
a.
b.
c.
d.
nomeada
com
o
prefixo
Movimento navio;
Navio;
Porto;
Porto_visitado;
2)
Altere o script de criação e Insira uma restrição de atributo para o campo TIPO_NAVIO.CAPACIDADE_PESO para
que não aceite valores inferiores a 20000. Insira um novo registro de tipo de navio e teste o resultado da restrição
feita.
3)
Insira no script de todas as tabelas criadas, a restrição para a ação de violação de integridade ON UPDATE com
CASCADE e ON DELETE para SET NULL;
4)
Crie uma consulta para selecionar todos os portos Localizados em Salvador;
5)
Crie uma consulta para selecionar todos os tipos de navios com capacidade maior do que 30000 e casco unico;
6)
Crie uma consulta para selecionar todos os navios onde o proprietário seja Sergen & Terres OU o tipo seja
Graneleiro;
7)
Crie uma consulta para selecionar todos os navios onde o proprietário seja Sergen & Terres E o tipo seja Graneleiro;
8)
Crie uma consulta para selecionar os navios onde o proprietário seja Maritimus E o tipo seja Graneleiro OU o tipo
seja Quimico.
9)
Crie uma consulta que liste todos os nomes dos navios que visitaram o porto com o nome de Porto de Santos;
P á g | 51
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
A seguir são detalhados os operadores de combinação que podem ser utilizados em conjunto nas consultas com uso do
SELECT em conjunto com a cláusula WHERE.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
10) Crie uma consulta que liste todos os nomes dos navios e a data de inicio onde a data de inicio seja superior a 13 de
setembro de 2011;
11) Utilizando o operador NOT, crie uma consulta para listar todos os navios que não estiveram no porto de Santos.
Referências
Elmasri, Navathe – Sistemas de banco de dados 6ª Edição;
•
“Introdução a Banco de dados”, Osvaldo Kataro Tokai, disponível em http://pt.scribd.com/doc/50780287/BD;
•
“Apache Friends Home page” - http://www.apachefriends.org/pt_br/xampp-windows.html#2287
•
“Notepad++ Home page” - http://notepad-plus-plus.org/
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
•
P á g | 52
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 10: Consultas com várias tabelas/Operadores de
busca
Objetivos:
•
•
•
•
Criar consultas utilizando várias tabelas;
Explorar as funcionalidades de selects em várias tabelas utilizando a notação tabela.campo e a cláusula AND;
Explorar as funcionalidades de selects em várias tabelas utilizando INNER JOIN;
Fazer uso dos operadores de busca em consultas;
Neste roteiro são explorados comandos para a realização de consultas em várias tabelas, que são importantes para que seja
possível reunir informações onde existam tabelas relacionadas. São explorados os métodos de relacionamento com uso da
cláusula AND e também com o uso do operador INNER JOIN (consulta interna),
Ferramentas necessárias
Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade.
Introdução
Selects em várias tabelas
A forma básica do comando SELECT é também chamada de mapeamento ou bloco select-from-where, onde:
•
SELECT <lista atributos>: lista de nomes de atributo cujos valores devem ser recuperados pela consulta.
•
FROM <lista tabelas>: lista dos nomes de tabelas (relação) exigidos para processar a consulta.
•
WHERE <condição>: expressão condicional (booleana) que identifica as tuplas (linhas) a serem recuperadas pela
consulta.
Os
operadores
possíveis
de
utilizar
em
consultas
são
os
já
vistos
no
roteiro
08
(http://187.7.106.14/andre/ads/proj_bd/aulas/roteiros/ROTEIRO-8/ROTEIRO-8-ADS_PROJ_BD.pdf) e podem ser combinados
de diversas formas para se obter os resultados desejados.
Exemplo de select com três tabelas:
SELECT CAMPO1, CAMPO2, CAMPO3 FROM TABELA_A, TABELA_B, TABELA_C
WHERE
TABELA_A.CAMPO1 = TABELA_B.CAMPO2 AND
TABELA_B.CAMPO10=TABELA_F.CAMPO20 AND
TABELA_C.CAMPO2=TABELA_X.CAMPO30
;
Neste caso o resultado das consultas ficará restrito às condições explicitadas serem TRUE, caso contrário a listagem solicitada
não é exibida.
Consulta Interna (INNER JOIN)
É uma técnica utilizada para realizar a chamada tabela de junção e foi criada para permitir aos usuários especificar uma tabela
resultante de uma operação de junção na cláusula FROM de uma consulta. Geralmente é mais fácil de compreender este tipo
de consulta do que inserir todas as condições de seleção e junção no WHERE, uma vez que fica claro quais critérios estão
realizando junções e quais estão realizando critérios de pesquisa.
Existem alguns tipos de junção que podem ser utilizados, porém o modo padrão de junção de tabelas é chamado de INNER
JOIN, onde a tupla é incluída no resultado somente se uma tupla combinar com os os critérios da outra tabela.
P á g | 53
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Em um banco de dados relacional é comum trabalhar com tabelas diferentes. As consultas SQL podem ser muito simples até
muito complexas, e inicialmente é muito comum utilizar consultas que faça a união entre tabelas diferentes com uso do
SELECT FROM WHERE em sua forma básica.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Exemplo de utilização de consulta com INNER JOIN
SELECT TABELA_A.CAMPO1, TABELA_A.CAMPO2, TABELA_B.CAMPO3 FROM TABELA_A
INNER JOIN TABELA_B
ON TABELA_A.CAMPO1 = TABELA_B.CAMPOX
;
Dica: A ordem em que são feitas as junções não importa nas consultas, o SQL executa a consulta de forma não procedural,
então se for realizar uma consulta onde são realizadas junções com mais de 2 tabelas a ordem das junções não modificará o
resultado final.
Utilizando Operadores de Busca
Os operadores de busca podem ser úteis para que seja possível substituir caracteres ou expressões em uma cláusula
SELECT. Veremos os operadores LIKE, o operador % e o operador BETWEEN, que podem auxiliar um SELECT quando for
necessário.
Utilizando Operadores de Busca Coringa
SELECT
campos
FROM
tabela
WHERE
argumentos
Função
LIKE
Utilizada somente com Strings, permite
representar combinações possíveis da
string que estiver sendo pesquisada.
Normalmente realizada para pesquisa
linhas onde exista a ocorrência de uma
string.
%
Permite representar uma parte da string,
é utilizada em conjunto do comando
LIKE.
BETWEEN
Semelhante ao AND, define um intervalo
de dados definido que pode ser utilizado
em uma consulta.
_
(under
line)
Permite combinar exatamente um
caractere desconhecido utilizado para
representar
qualquer
combinação
possível na cláusula LIKE.
Exemplo
SELECT * FROM dados WHERE
nome LIKE “joão”
SELECT * FROM funcionario
WHERE nome LIKE “%a” AND
nome LIKE “a%”
SELECT * FROM funcionario
WHERE salario BETWEEN
1000 and 5000
SELECT * FROM funcionário
WHERE nome LIKE “R___%”
Alias
Os nomes de campos utilizando a notação de ponto (TABELA.CAMPO1) são utilizados para qualificar um nome completo de
um campo, e pode ser utilizado sempre que quiser para evitar a ambiguidade nos nomes de campos de tabelas diferentes.
Outra forma de resolver este problema é com a implementação de ALIAS (apelidos) que são dados às tabelas quando
necessário.
Exemplo de utilização de alias:
P á g | 54
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Comando
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
SELECT F.ID, F.NOME, E.NOME FROM FUNCIONARIO AS F, EMPRESA AS E
WHERE
F.idEmpresa = E.id
;
Eliminando duplicatas
Como o resultado de consultas é tratado pelo sql como um multiconjunto, desta forma é comum o aparecimento de tuplas
duplicadas, que em muitos casos é necessário eliminá-las com uso do operador DISTINCT.
Exemplo de utilização de distinct:
Selecionando todos valores de salários pagos na empresa
SELECT DISTINCT salario FROM funcionario;
Ordenando consultas
Exemplo de uso do ORDER BY
SELECT nome,endereco,cidade,salario FROM funcionário ORDER BY salario;
Tarefas
Utilizando o arquivo disponível em representado pela modelagem abaixo, execute as seguintes tarefas em SQL:
1)
Utilizando o arquivo da modelagem disponível em http://187.7.106.14/andre/ads/proj_bd/2012-2/roteiros/roteiro10inner-operadores/roteiro-6-bdcinemas.mwb, abra a modelagem no workBench e através da aba Inserts do workBench
insira os dados para as tabelas ator, filme, sessão, cidade, cinema, cinemaPassaFilme, participaFilme. Um exemplo
de alguns dos dados para serem inseridos é demonstrado na figura abaixo:
2)
Aplique as seguintes modificações no modelo do workBench:
P á g | 55
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Ao realizar consultas onde a listagem das tuplas resultantes seja extenso é interessante ordenar os elementos através de uma
das colunas utilizadas, isto pode ser feito através do uso do comando ORDER BY, inserido ao final da seleção dos campos
utilizado na consulta.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Remover as cláusulas NOT NULL para todas as tabelas;
b.
Aplicar o Forward Engineer ativando a geração de INSERT’S nas tabelas;
Realize as seguintes consultas utilizando o INNER JOIN para realizar junções entre tabelas diferentes. Caso alguma
consulta não possa ser realizada adapte a modelagem para atender aos critérios e execute novamente o Forward
Engineer:
a.
Selecionar todos os filmes juntamente com os seus gêneros, ordenando por gênero;
b.
Selecione todos os filmes com duração entre 100 e 190 minutos;
c.
Selecione todos os filmes onde o ator “Chuck Norris” e a atriz “Julia Roberts” estiverem participando;
d.
Selecionar todos os nomes de atores e os nomes dos filmes em que trabalharam ordenando pelo nome dos
filmes;
e.
Selecionar todos os filmes que estão passando em todos os cinemas, organizando pelo título do filme;
f.
Selecione os nomes de filmes que comecem com “O’’ ou “L” e que terminem com “A”.
g.
Selecione o nome, a duração e nome do cinema que estiver passando os filmes que forem do gênero
TERROR e que tenham duração até 120 minutos;
h.
Selecione o nome, o gênero e a duração dos filmes que não tenham o gênero “Terror”;
i.
Selecionar todos os cinemas com o nome de todas as sessões atualmente em cartaz;
j.
Selecionar todos os filmes em que um determinado ator trabalhou;
k.
Selecione todos os nomes, duração e gênero dos filmes brasileiros.
l.
Selecionar todos os nomes e gêneros dos filmes que estão em cartaz atualmente;
m. Selecionar o nome do cinema, título em português, o título original, o gênero, o diretor dos filmes que
estão em cartaz na cidade de pelotas;
n.
Selecione o nome, a duração, e o gênero de todos os filmes exceto os filmes de drama e comédia;
Referências
•
Elmasri, Navathe – Sistemas de banco de dados 6ª Edição;
•
“Introdução a Banco de dados”, Osvaldo Kataro Tokai, disponível em http://pt.scribd.com/doc/50780287/BD;
•
“Apache Friends Home page” - http://www.apachefriends.org/pt_br/xampp-windows.html#2287
•
“Notepad++ Home page” - http://notepad-plus-plus.org/
P á g | 56
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
3)
a.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 11: SubConsultas
Objetivos:
•
•
•
•
Explorar as propriedades de subConsultas;
Explorar propriedades de ordenação de informações;
Atualizar informações de tabelas com uso de operações diversas;
Converter dados de saída com uso do cast;
Neste roteiro são explorados comandos para a realização de subconsultas, que são importantes para criar consultas
avançadas e que possam sanar maiores necessidades de consultas sql. Também são exploradas propriedades de ordenação
e atualização de informações em tabelas que são úteis para a manutenção de bases de dados e tabelas.
Ferramentas necessárias
Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade.
Introdução
Algumas consultas necessitam que os valores existentes no banco de dados sejam buscados e depois utilizados em uma
condição de comparação. Estas consultas podem ser formuladas com o uso de subconsultas ou consultas aninhadas. É
possível utilizar subconsultas quando desejamos buscar valores que não podem ser encontrados apenas com uma única
consulta.
Este tipo de consulta pode ser implementada com o uso de blocos select-from-where completos dentro da cláusula WHERE de
outra consulta. Uma maneira de utilizar uma consulta interna inicialmente é com o uso do operador IN, que compara um valor
com um conjunto de valores ao mesmo tempo.
Exemplo básico de consulta com uso do operador IN:
SELECT filme.tituloOriginalFilme,genero.nomeGenero from filme,genero
WHERE
filme.generoFilme = genero.idGenero AND
genero.nomeGenero IN('Suspense','Comedia',’Drama’,’Terror’,’Acao’)
ORDER BY genero.idGenero;
Neste caso estamos procurando vários gêneros ao mesmo tempo, os que se adaptarem a nossa consulta serão retornados a
tela. Mas a subconsulta, na verdade tem como objetivo principal reduzir o que estamos digitando e unificar uma pesquisa
unindo duas consultas em uma só. Tudo o que temos a fazer é substituir uma parte da consulta anterior pelo que podemos
chamar de subconsulta:
Exemplo melhor elaborado de consulta com operador IN:
SELECT filme.tituloOriginalFilme,genero.nomeGenero from filme,genero
WHERE
filme.generoFilme = genero.idGenero AND
genero.nomeGenero IN(SELECT
genero.nomeGenero,filme.duracaoFilme
genero)
ORDER BY genero.idGenero;
from
É possível ainda combinar vários tipos de consultas internas incluindo a maioria dos operadores utilizados em consultas e
também mais de uma coluna, desde que sejam respeitadas a quantidade de colunas da cláusula e do resultante do que
resultar do select mais interno.
P á g | 57
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Consultas Aninhadas
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Operadores para subconsultas
São operadores que podem ser explicitados nas consultas com subconsultas e consultas onde os argumentos são
relacionados(consultas correlacionadas), a tabela a seguir descreve os operadores mais comuns que podem ser utilizados:
Utilizando Operadores em SubConsultas
Função
IN
SELECT
campos FROM
tabela WHERE
argumentos
Compara um valor v com um
conjunto de valores V e avalia
como TRUE se v for um dos
elementos em V.
Verifica se o resultado de uma
consulta
aninhada
correlacionada é vazio (não
contém registros) ou não.
EXISTS
Exemplo
SELECT filme.tituloOriginalFilme,genero.nomeGenero
from filme,genero
WHERE
filme.generoFilme = genero.idGenero AND
genero.nomeGenero
IN('Suspense','Comedia',’Drama’,’Terror’,’Acao’)
ORDER BY genero.idGenero;
-- seleciona filmes apenas dos gêneros listados
SELECT f.tituloOriginalFilme FROM filme as f
WHERE EXISTS(SELECT
cipf.cinema_idCinema from cinema_passa_filme as
cipf WHERE cipf.filme_idFilme = f.idFilme);
-- seleciona os filmes que já passaram;
Retorna TRUE se o resultado da
consulta aninhada tiver ao
menos um registro e FALSE se
não houverem registros.
OBSERVAÇÕES:
É possível combinar os dois operadores de subconsultas com os demais operadores já
utilizados (NOT, AND), e inclusive com o próprio IN ou EXISTS na mesma consulta.
Ordenando Informações
Em um banco de dados relacional, as linhas de uma tabela formam um grupo, não há ordem intrínseca entre as linhas e então
temos de pedir ao MySQL para classificar os resultados se os desejarmos em uma ordem em particular. A tabela a seguir
demonstra as maneiras de ordenar a informação recuperada em selects.
Ordenando Listagens crescente e decrescente
Alguns comandos utilizados em conjunto com a cláusula ORDER BY podem fazer com que a listagem retornada de uma
consulta possa ser diferente do esperado, para tanto, existem operadores que podem ser combinados para alterar os
resultados obtidos em listagens de dados.
Comando
Função
Exemplo
SELECT
campos
FROM
tabela
WHERE
argumentos
ORDER BY
coluna
DESC
Classifica uma coluna em ordenação
decrescente.
ASC
Classifica uma coluna em ordenação
crescente, é o padrão de um ORDER BY
quando não é informada nenhuma
ordenação.
SELECT nome FROM drinks
ORDER BY nome DESC;
SELECT nome FROM drinks
ORDER BY nome ASC;
P á g | 58
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Comando
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
ATUALIZANDO DADOS EM TABELAS:
Os dados das tabelas existentes no banco de dados podem ser modificados caso necessite. Normalmente são tarefas
rotineiras do banco de dados atualizas as informações existentes em nossas tabelas. Para isso, podemos utilizar o comando
UPDATE (atualizar).
Atualizando dados em tabelas
O UPDATE pode utilizar todos os parâmetros utilizados em consultas comuns no SQL criado. Podendo inclusive realizar a
alteração de várias linhas de tabelas por vez.
Comando
UPDATE tabela SET novo_valor
WHERE condições
Função
Altera dados de uma tabela mediante
condições estipuladas
Exemplo
UPDATE drinks SET quantidade = 10
WHERE igr_secundario LIKE
‘%abacaxi%’
Ao atualizar informações de tabelas é possível combinar também diversas operações, envolvendo operadores de busca e
também operações matemáticas nos valores das colunas, como o exemplo a seguir:
Exemplo de UPDATE envolvendo operações matemáticas
UPDATE filme SET
filme.duracaoFilme = filme.duracaoFilme + 30;
-- atualiza o tempo de todos os filmes cadastrados;
Forçando Classificações com CAST
A classificação da listagem de informações é sempre efetuada como apropriada para o tipo de coluna que está-se utilizando. É
possível forçar colunas para que comportem-se diferente utilizando a função CAST( ) seguida pela palavra chave AS.
Vejamos as principais propriedades:
Propriedade Cast
Comando
SELECT
campos
FROM
tabela
WHERE argumentos
ORDER
BY
CAST(coluna
AS
tipo)
Função
Exemplo
AS CHAR
Para classificar como uma string de
caractere.
SELECT nome FROM drinks
ORDER BY CAST(nome AS
CHAR);
AS SIGNED
Para classificar como um número inteiro
assinado.
SELECT nome, preco FROM drinks
ORDER BY CAST(preco AS
SIGNED);
AS UNSIGNED
Para classificar como um número inteiro
não assinado.
SELECT nome, preco FROM drinks
ORDER BY CAST(preco AS
UNSIGNED);
AS DATE
Para classificar como uma data.
SELECT nome, preco FROM drinks
ORDER BY CAST(preco AS
DATE);
AS DATETIME
Para classificar como uma data e hora.
SELECT nome, preco quant FROM
drinks ORDER BY CAST(quant
AS DATETIME);
Para classificar como uma hora.
SELECT nome, preco quant FROM
drinks ORDER BY CAST(quant
AS TIME);
AS TIME
P á g | 59
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
DICA: Para estes tipos de operações podem ser combinados os operadores lógicos AND e OR;
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
VERIFICANDO COMO A ESTRUTURA DE SUAS TABELAS FOI CRIADA: Podemos também desejar ver a estrutura das
tabelas que foram criadas para testarmos como eles foram projetados. Para isso, podemos utilizar o comando SHOW
organizado da seguinte forma:
SHOW CREATE TABLE DRINKS;
Neste caso, podemos usar o comando para poder visualizar como os dados da sua tabela foram projetados e atendem aos
requisitos para os quais foram projetados.
1)
Crie uma consulta que liste todos nomes dos filmes, gêneros e duração, ordenados por gênero e em seguida em
ordem decrescente de nome de Filme;
2)
Utilizando o operador IN, crie uma consulta para que liste o nome de todos os gêneros menos os gêneros de
suspense, terror e comédia;
3)
Utilizando subconsultas, crie uma consulta que retorne os títulos, gênero e duração de filmes onde o gênero seja
SUSPENSE e a duração esteja entre 70 e 130 minutos;
4)
Crie uma consulta para atualizar o tempo para + 44 minutos em todos os filmes de suspense.
5)
Utilizando o IN, crie uma consulta que selecione o nome dos atores que não participaram de nenhum filme;
6) Atualizar o título em inglês dos filmes para “senac” onde a duração seja maior do que 120min e o gênero seja
drama, terror, suspense.
7) Utilizando o IN crie uma consulta que retorne o título e o gênero de todos os filmes que não passaram ainda em
cinema algum;
Referências
•
Elmasri, Navathe – Sistemas de banco de dados 6ª Edição;
•
“Introdução a Banco de dados”, Osvaldo Kataro Tokai, disponível em http://pt.scribd.com/doc/50780287/BD;
•
“Aprendendo SQL”, Alan Beaulieu, O’Reilly, Editora Novate, São Paulo, 2010;
P á g | 60
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Tarefas(Se for necessário crie os registros de inserção para testar as consultas solicitadas)
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 12: Funções de Agregação/ Manipulação de Strings
Objetivos:
•
•
Explorar funções de Agregação para atingir totais calculados;
Explorar comandos para trabalhar com Strings;
Ferramentas necessárias
Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade.
Funções de Agregação
Funções de agregação podem executar cálculos em conjuntos de registros em tabelas de bancos de dados. A principal função
que desempenha a tarefa de agrupar dados é a função GROUP BY( ). Na tabela a seguir são detalhadas as principais funções
de comandos de agregação que podem ser utilizadas com o Mysql:
Funções de agregação
A seguir são detalhados os comandos comuns a serem utilizados em funções de agregação. Todos os comandos a seguir
são comumente utilizados em combinação do comando GROUP BY.
Função
Exemplo
SELECT NOME,CARGO FROM PESSOA
GROUP BY CARGO;
-- agrupa os nomes de pessoas por cargo;
SELECT SUM(SALARIO) FROM PESSOA;
-- calcula o somatórios de salários das
pessoas cadastradas.
SELECT AVG(SALARIO) FROM PESSOA;
-- calcula a média dos salários dos
funcionários.
SELECT NOME, MAX(SALARIO) FROM
PESSOA;
-- calcula o maior salário das pessoas
cadastradas.
SELECT NOME, MIN(SALARIO) FROM
PESSOA;
-- calcula o menor salário das pessoas
cadastradas.
GROUP BY COLUNA
Agrupa os resultados por uma
coluna selecionada
SUM(COLUNA)
Realiza um somatório dos valores
agrupados na coluna.
AVG(COLUNA)
Realiza o cálculo da média dos
valores agrupados na coluna.
MAX(COLUNA)
Determina o maior valor dos
valores agrupados.
MIN(COLUNA)
Determina o menor valor dos
valores agrupados.
LIMIT NUMERO
Restringe os resultados de uma
consulta para uma quantidade de
valores explícita no argumento
numero.
SELECT * FROM CIDADE LIMIT 10;
-- limita o resultado da consulta a apenas
10 resultados;
COUNT(COLUNA)
Realiza a contagem de itens
listados em um Group By.
SELECT COUNT(SALARIO) FROM
PESSOA;
-- calcula a contagem de salários
existentes em pesoa.
Trabalhando com Strings
Quando nos deparamos com bancos de dados que possuem dados formatados ou inseridos de maneira consistente, é fácil de
realizarmos alterações nas suas informações. Normalmente é recomendado para a inserção de informações em um banco, que
usuários padronizem a forma como digitam as informações.
Por exemplo Imagine inserindo um conjunto de endereços para clientes, automaticamente fazemos um certo padrão de
inserção, dividindo o nome da rua, separando com vírgula o número e o bairro. Estes padrões, quando encontrados, podem ser
P á g | 61
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Comando
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
utilizados para que possamos aplicar funções de texto através do SQL. A seguir veremos algumas funções bastante úteis e
que podem ser utilizadas pelo MYSQL também.
Comandos para manipulação de Strings
A seguir são detalhados os comandos comuns a serem utilizados na manipulação de Strings.
Função
RIGHT(CAMPO,QUANT)
LEFT(CAMPO,QUANT)
Seleciona uma quantidade
específica de caracteres de uma
coluna.
SUBSTRING_INDEX(CAMPO,CARACT
ERE,QUANT)
Seleciona caracteres avaliando a
ocorrência de algum caractere
específico.
UPPER(CAMPO)
Aplica caixa alta nos caracteres de
um campo.
LOWER(CAMPO)
Aplica caixa baixa nos caracteres
de um campo.
REVERSE(CAMPO)
Inverte o texto do campo
selecionado na consulta.
LTRIM(CAMPO)
RTRIM(CAMPO)
Remove espaços em branco à
esquerda ou à direita do campo
selecionado.
LENGTH(CAMPO)
Retorna a quantidade de
caracteres do campo selecionado.
Exemplo
SELECT RIGHT(NOME,2) FROM
CONTATO;
-- seleciona os dois caracteres à direita da
coluna nome.
SELECT SUBSTRING_INDEX(NOME,’-’,3)
FROM PESSOA;
-- seleciona os caracteres após o a terceira
ocorrência de hífen no campo nome.
SELECT UPPER(NOME) FROM PESSOA;
-- aplica caixa alta em todos os registros
selecionados no campo nome;
SELECT LOWER(PROFISSAO) FROM
PESSOA;
-- aplica caixa baixa em todos os registros
selecionados no campo profissão;
SELECT REVERSE(NOME) FROM
CIDADE;
-- Inverte o texto contido no campo
selecionado;
SELECT LTRIM(NOME) FROM PESSOA
-- remove espaços à esquerda no nome
das pessoas cadastradas.
SELECT LENGTH(NOME) FROM
PESSOA;
-- retorna a quantidade de caracteres do
nome cadastrado;
É possível também realizar alterações nos dados das colunas através da manipulação de Strings utilizando o UPDATE em e
envolvendo outra coluna internamente no comando utilizado.
P á g | 62
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Comando
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Tarefas
Adaptar as seguintes alterações no script de criação do banco de dados utilizado no roteiro 11:
a. Renomear a base de dados que será criada para roteiro12bdcinema;
b.
Criar uma nova tabela CIDADE, contendo os campos idCidade, nomeCidade, estado;
c.
Criar uma nova tabela USUARIO, contendo os campos idUsuario, nomeUsuario, emailUsuario,
idCidadeUsuario.
d.
Criar a tabela VENDA, relacionar esta tabela com sessão determinando o tipo de relacionamento para
possibilitar a venda de ingressos para as sessões disponíveis no cinema. Em seguida criar um
relacionamento entre usuário e venda, determinando a cardinalidade do relacionamento.
e.
Criar todos os insert’s de dados necessários no próprio workbench;
2)
Cadastrar 5 usuários, em seguida cadastrar 10 vendas de ingressos;
3)
Criar as seguintes consultas:
a.
Criar uma consulta para visualizar todas as compras de ingressos para todos os filmes, listando a data, a
hora, o e-mail do usuário, e o nome do filme ordenando por filme;
b.
Criar uma consulta para listar os títulos em Inglês e português dos filmes que ainda não possuem
ingressos vendidos;
c.
Criar uma consulta para contabilizar o total dos valores de ingressos vendidos por filme, liste o nome do
filme e a quantidade de ingressos;
d.
Criar uma consulta para contabilizar o total de valores de ingressos vendidos por cinema, liste o nome do
cinema e a quantidade de ingressos;
P á g | 63
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
1)
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
e.
Criar uma consulta que contabilize quantos ingressos foram vendidos por cidade, liste o nome da cidade
e a quantidade. Em seguida limite para que sejam listados apenas 2 resultados desta consulta;
f.
Criar uma consulta que contabilize quantos ingressos foram vendidos por filme, liste o nome do filme e a
quantidade, liste apenas os 5 primeiros caracteres do nome do filme e a quantidade de ingressos;
g.
Criar uma consulta que liste o nome de todos os usuários que compraram ingressos. Liste o nome do
usuário e o nome do filme ao lado.
h.
Modifique a consulta 3.g para que apresente o nome do usuário invertido e em letras maiúsculas.
i.
Criar uma consulta que liste todos os nomes dos cinemas e a quantidade de caracteres de cada nome
de cinema;
j.
Modificar a consulta anterior para que liste apenas os 5 primeiros caracteres do nome do cinema listado;
k.
Modificar a consulta anterior para remover os espaços em branco dos nomes dos cinemas listados;
l.
Criar uma consulta para listar a quantidade de atores que trabalharam em cada filme. Listar o nome do
filme e a quantidade de atores.
m. Criar uma consulta para listar a média de valores de ingressos vendidos por filme. (esta consulta exigirá
um número alto de ingressos vendidos por filme)
Criar uma consulta que some a quantidade em minutos de cada filme que já teve ingressos vendidos;
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
n.
Referências
W3Schools – “Funções de Agregação SQL” em http://www.w3schools.com/sql/sql_functions.asp;
Elmasri, Navathe – Sistemas de banco de dados 6ª Edição;
P á g | 64
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 13: Stored Procedures /Functions e uso do Having
Objetivos:
•
•
•
Criar e utilizar stored procedures utilizando linguagem SQL;
Criar e utilizar functions utilizando linguagem SQL;
Aplicar a restrição HAVING em conjunto de funções de agregação.
Ferramentas necessárias
Navegador, Xampp,Notepad++, console Mysql, Bibliografias de livros da faculdade.
Stored Procedures
Uma stored procedure consiste em um repositório para um conjunto de declarações SQL. Stored Procedures podem conter
declarações adicionais e processamento lógico que normalmente estaria indisponível em uma declaração SQL tradicional
gerada dinamicamente. Elas podem conter comandos de desvios condicionais e repetição como if e while. O principal comando
para criar uma stored procedure é o comando CREATE PROCEDURE.
Exemplo de criação de stored procedure em Mysql:
DELIMITER $$
CREATE PROCEDURE nome(num INT(4))
BEGIN
SELECT filme.tituloOriginalFilme from FILME
LIMIT num
;
END $$
As stored procedures permitem também que códigos de desvios e loops de execução possam ser armazenados, na tabela a
seguir são descritos os principais componentes que podem ser utilizados:
Componentes da criação de Stored Procedures
A seguir são detalhados os comandos comuns a serem utilizados na manipulação de Stored Procedures.
Comando
CALL NOMEPROCEDURE
SHOW PROCEDURE
STATUS
DELIMITER caractere
Função
Realiza a execução de uma stored
procedure através da console Mysql;
Mostra as procedures que foram criadas no
SGBD;
Define um novo delimitador de código, ou
seja, o Mysql irá encerrar grupos de
comandos através do caracter que for
inserido.
CREATE PROCEDURE
nomeProcedure
Realiza a criação de uma nova stored
procedure, seu uso é obrigatório.
DROP PROCEDURE
nomeProcedure
Elimina a procedure do SGBD;
Exemplo
CALL listaDados(100);
SHOW PROCEDURE STATUS;
DELIMITER %
-- faz com que o delimitador seja o
caracter %
CREATE PROCEDURE teste(num INT(3))
-- cria um procedimento chamado
teste com uma variável como
parâmetro
DROP PROCEDURE teste;
-- elimina a procedure teste
P á g | 65
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
As stored Procedures são importantes para tarefas que devam ser realizadas de forma mais automatizada como atualizações
que possam ser chamadas via SQL ou controles de dados que devam ser verificados em registros que manipulam informações
de estado ou status de algum item contido no banco de dados, além de permitirem o armazenamento permanente de blocos de
códigos a serem úteis posteriormente como funções criadas em linguagens de programação. Fazer uso de stored procedures
possibilita à aplicação minimizar a quantidade de código fonte da aplicação e coloca estes códigos sob o controle da camada
do banco de dados. Isto faz com que o projeto da aplicação fique mais claro e deixa as páginas de código fonte da aplicação
livres de códigos SQL dinâmicos.
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
IF condicao
THEN
ELSE
END IF
DECLARE nomevariavel
TIPO DEFAULT valor;
SET nomevariavel = valor
Cria um bloco com instruções IF. Podem
ser utilizados comandos de seleção,
inclusão, e demais comandos aceitos pela
sintaxe Mysql.
Encerra um bloco completo IF, seu uso é
obrigatório.
Realiza uma declaração de variável na
stored procedure.
Associa um novo valor a uma variável
declarada;
INCREMENT: LOOP
Comandos
Define a inicialização de um bloco de
repetição e finaliza o bloco;
END LOOP INCREMENT;
LEAVE INCREMENT
Realiza a saída de um bloco de repetição,
utilizado em conjunto com INCREMENT:
LOOP
ITERATE INCREMENT
Realiza o incremento de uma repetição,
utilizado em conjunto com INCREMENT:
LOOP
CREATE PROCEDURE teste(num INT(3))
BEGIN
-- comandos
END
IF contador > 10 THEN
SELECT ‘entrou no if’;
ELSE
SELECT ‘entrou no else’;
END IF;
DELIMITER $$
DECLARE contador INT DEFAULT 0;
INCREMENT: LOOP
SET contador = contador + 1;
IF contador =10 THEN
LEAVE INCREMENT;
ELSE
ITERATE INCREMENT;
END IF;
END LOOP INCREMENT;
$$
Functions
As functions são bastante semelhantes às Stored Procedures, com a diferença que para cria-las são utilizados os comandos
CREATE FUNCTION e que podem retornar valores de saída através de variáveis e também podem ser chamadas dentro de
outras funções. A chamada a funções criadas é feita através do comando SELECT nomeFunction(). Os comandos utilizados
pelas funções são os mesmos utilizados pelas procedures, uma definição de função é demonstrada a seguir:
Exemplo de criação de função em Mysql:
DELIMITER $$
DROP FUNCTION IF EXISTS minhaFuncao1;
$$
CREATE FUNCTION minhaFuncao1() RETURNS VARCHAR(50) DETERMINISTIC
BEGIN
DECLARE msg VARCHAR(50) DEFAULT ' ';
SET msg = 'Projeto de Banco de Dados!!!';
RETURN msg;
END
$$
Exemplo de chamada de função em Mysql:
SELECT minhaFuncao1();
$$
P á g | 66
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
BEGIN – END
Define o corpo da stored procedure, o
código da função será inserido entre os
blocos BEGIN-END
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Complemento de Funções de agregação: uso da função Having
Em muitos casos é necessário aplicar as funções de agregação a subgrupos de registros em consultas. Foi explorado o
comando GROUP BY, que permite que os grupos resultantes de uma consulta sejam particionados em subgrupos com a
finalidade de separar estes grupos de informações para que possam ser feitos somatórios, percentuais, ou qualquer tipo de
cálculo envolvendo grupos.
Exemplo de uso do HAVING
SELECT Projnumero,Projnome, COUNT(*)
FROM projeto,trabalha_em
WHERE projNumero = pnr
GROUP BY projNumero,projNome
HAVING COUNT(*) > 2;
No argumento da função COUNT é possível incluir qualquer nome de campo que possa ser envolvido nos grupos resultantes
da consulta de agregação.
Tarefas
1)
Realize as seguinte alterações na estrutura do banco de dados cinema para resultar no seguinte esquema ilustrado no
diagrama E-R (altere no script de criação das tabelas), criando as tabelas necessárias e as modificações nos campos
necessários.
2)
Ajuste os INSERTS realizados para que se adaptem às novas tabelas
P á g | 67
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
REALIZE AS SEGUINTES ADAPTAÇÕES
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
CRIE AS SEGUINTES CONSULTAS
3)
Crie uma consulta para listar o somatório de ingressos vendidos para cada filme onde o tipo de pagamento foi
parcelado. Liste o nome do filme e o somatório de valor de ingressos.
4)
Altere a consulta anterior para que, utilizando a propriedade HAVING, a consulta que liste somente os filmes com mais
de 3 ingressos vendidos (cadastre mais vendas se necessário);
5)
Crie uma consulta para listar quantos usuários efetuaram compras à vista.
6)
Altere a consulta anterior para listar o nome do usuário que fez a compra e a quantidade de compras à vista;
7)
Crie uma stored procedure alteraValorIngresso(valor) que defina um novo valor aos ingressos já vendidos por um
valor informado na chamada da procedure, listando os ingressos em seguida na própria procedure;
8)
Crie uma function alteraParcela(idUsuario) que altere a situação das parcelas de um usuário específico para pagas.
A função deve receber como entrada o id de um usuário qualquer e realizar a alteração de todas as parcelas do
usuário.
9) Crie uma stored procedure relVendas(Usuario), onde receba o id de algum usuário do sistema e liste todas as
parcelas de um usuário específico juntamente com a situação de pagamento das mesmas
10) Crie uma stored procedure visualizaVendas(tipoVenda) onde deve receber como argumento um inteiro 1 para listar
o somatório de vendas à vista ou 2 para o somatório de vendas à prazo.
Material disponibilizado em aula em Roteiro 11,12 e 13;
java2S - “Procedures e Functions” em http://www.java2s.com/Tutorial/MySQL/0201__ProcedureFunction/Catalog0201__Procedure-Function.htm
Mysql online – “Editing Stored Procedures e Funções ” em http://docs.oracle.com/cd/E17952_01/refman-5.1-en/connectornet-visual-studio-editing-stored-procedures-and-functions.html
Dev Mysql - Flow control Statements, disponível em http://dev.mysql.com/doc/refman/5.1/en/flow-control-statements.html
P á g | 68
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Referências
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Roteiro 14: Criando e manipulando View’s
Objetivos:
o
Criar e utilizar View’s com uso do Mysql;
Ferramentas necessárias
Navegador, Xampp,Notepad++, console Mysql, WorkBench, Bibliografias recomendadas.
View’s
Uma view consiste em uma consulta armazenada acessível como uma tabela virtual composta pelo resultado de um conjunto
de consultas (queries). Ao contrário de uma tabela comum em um banco de dados, uma view não faz parte do esquema físico,
ela é uma tabela dinâmica e virtual computada ou colada a partir de dados existentes no banco de dados. Ao alterar os dados
em uma tabela, os dados exibidos por uma view serão alterados automaticamente.
Views podem prover algumas vantagens ao ser comparadas com tabelas:
•
Podem representar um subconjunto de dados contidos em tabelas;
•
Podem criar junções, cálculos e simplificar as consultas posteriores para recuperação de informações na camada de
aplicativo;
•
Podem ocultar informações pouco relevantes para diferentes tipos de usuários que interagem com o banco de dados;
CREATE VIEW vw_filme_genero
AS SELECT filme.tituloOriginalFilme,genero.nomeGenero FROM filme,genero
WHERE
filme.generoFilme = genero.idGenero
ORDER BY genero.nomeGenero;
As view’s são simples de criar e podem ser manipuladas como consultas comuns e são tratadas pelo banco de dados como se
fossem realmente tabelas. Para visualizar uma view basta utilizar o mesmo comando utilizado para visualizar as tabelas do
banco de dados: show tables.
OBSERVAÇÃO:
Utilizar padrões de nome ao criar uma view é interessante! Utilize sempre o prefixo vw precedendo o nome de uma view para
que não haja confusão ao listar tabelas e views e tentar diferenciá-las em sua manutenção.
Somente view’s que reúnam informações diretas de tabelas podem sofrer operações de insert, delete e update. View’s que
resultem em cálculos de agregação ou somatórios não podem receber atualizações devido a não conseguirem definir quais
serão os dados que sofrerão alteração nas tabelas de origem.
P á g | 69
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
Exemplo de criação de uma View:
UC –
Projeto de Banco de Dados
Docente: André Luiz Silva de Moraes
4º sem– Análise e Desenvolvimento de Sistemas
Tarefas
1)
Utilizando o esquema de banco de dados do roteiro 13, renomeie o arquivo da modelagem para roteiro14bdCinema e
realize o forward engineer para a criação do banco de dados e de seus insert’s:
2)
Através do workbench, crie uma nova tabela chamada de log com os campos idLog e acao, em seguida relacione a
tabela com usuário para que tenha o campo idUsuario na mesma.
3)
Criar as seguintes view’s:
4)
a.
Uma view vwAtorFilme para listar os nomes dos atores e o nome do filme em que estão atuando;
b.
Uma view vwCinemaFilme para listar os nomes dos cinemas, nomes dos filmes que estão passando, o
horário da sessão que o filme passou ou está passando e a data;
c.
Uma view vwUsuarioIngresso para listar os nomes dos usuários que compraram ingressos, o nome do
filme, a data da compra, a data da sessão e o nome do cinema que passou a sessão.
d.
Uma view vwUsuarioParcela para listar os nomes dos usuários, a data da venda, o valor da parcela e a
situação de suas parcelas;
e.
Uma view vwLogAcao para listar todas as ações realizadas no sistema, o nome do usuário que realizou a
ação e a data a realização.
Criar consultas para realizar as seguintes tarefas com as view’s:
a.
Alterar na view vwAtorFilme o nome do ator para ‘Senac’ em todos os filmes que iniciarem por ‘a’;
b.
Alterar na view vwCinemaFilme todas as datas para 2012-11-06;
c.
Alterar na view vwUsuarioIngresso o nome dos usuários que comprar ingressos para ‘Usuário X’;
d.
Alterar o valor das parcelas na view vwUsuarioParcela para R$1000.00 e a situação de pagamento para
“Quitada”;
Referências
Material disponibilizado em aula e em Roteiros 13,14;
‘Trabalhando com View’s’, disponível em http://www.devmedia.com.br/mysql-trabalhando-com-views-parte-01/8724
“Introdução as view’s”, disponível em http://www.devmedia.com.br/introducao-a-views/1614
P á g | 70
Faculdade de Tecnologia SENAC PELOTAS - Credenciado pela Portaria nº. 3.071, de 01 de outubro de 2004.
REALIZE AS SEGUINTES ADAPTAÇÕES
Download