Escolar Documentos
Profissional Documentos
Cultura Documentos
EROS MOURA
LICENCIATURA EM INFORMÁTICA
Bando de Dados
1ª Edição
CACHOEIRO DE ITAPEMIRIM
IFES/CEAD
2011
© Instituto Federal do Espírito Santo
Governo Federal
Ministro de Educação
Fernando Haddad
Instituto Federal do Espírito Santo (Ifes)
Reitor
Dênio Rebello Arantes
Pró-Reitora de Ensino
Cristiane Tenan Schlittler dos Santos
Diretora do CEAD – Centro de Educação a Distância
Yvina Pavan Baldo
Coordenadores da UAB – Universidade Aberta do Brasil
Marize Lyra Silva Passos
José Mario Costa Junior
DIREITOS RESERVADOS
Instituto Federal do Espírito Santo (Ifes)
Avenida Rio Branco, nº 50 Santa Lúcia - CEP. 29056-255 – Vitória – ES - Telefone: 3227-5564
Créditos de autoria da editoração
Capa: Juliana Cristina da Silva
Projeto gráfico: Juliana Cristina e Nelson Torres
Iconografia: Nelson Torres
Editoração eletrônica: Gráfica Editora Fátima
Revisão de texto:
Esther Orlieb Faria de Almeida
COPYRIGHT – É proibida a reprodução, mesmo que parcial, por qualquer meio, sem autorização escrita dos
autores e do detentor dos direitos autorais.
Olá, Aluno(a)!
É importante que você conheça toda a equipe envolvida neste curso: co-
ordenadores, professores especialistas, tutores a distância e tutores presen-
ciais, porque, quando precisar de algum tipo de ajuda, saberá a quem
recorrer.
Equipe do Ifes
ICONOGRAFIA
Veja, abaixo, alguns símbolos utilizados neste material para guiá-lo em seus estudos
Fala do Professor
Olá!
A fim de que ele seja aproveitado ao máximo por você, seguem algumas
orientações:
Após ser feita esta introdução a Banco de Dados, nos demais capítulos
serão vistas as linguagem SQL, que podem ser divididas em: DDL,
estudada no quarto capítulo; DML, estudada no quinto capítulo; e, no
sexto, estaremos vendo o comando Select.
Meus votos são de que Deus o abençoe, permitindo que você tenha um
ótimo desempenho acadêmico e que aproveite ao máximo em sua vida
profissional as competências desenvolvidas nesta disciplina.
Bons estudos!
Cap.1 MODELAGEM DE DADOS: CONCEITUAL 11
1.1. Níveis de abstração: Dado x Informação 11
1.2. Conceitos básicos em modelagem conceitual 12
1.2.1. Definição de modelo 12
1.2.2. O papel do objeto observado 13
1.2.3. O processo de modelagem 14
1.2.4. Tipos de modelos 14
1.2.5. Execução da modelagem de dados 15
1.2.6. Os níveis de modelagem de dados 17
1.3. Modelo Conceitual de Dados (MCD) 18
1.3.1. Entidades 20
1.3.2. Relacionamentos 20
1.3.3. Atributo 26
1.3.4. Criando o modelo de dados conceitual 32
REFERÊNCIAS 123
MODELAGEM DE DADOS:
CONCEITUAL
Olá, Turma!
Neste capítulo, apresentaremos a modelagem de dados, conteúdo
que é fundamental para o desenvolvimento de sistemas. A ideia
é que você consiga, ao final deste capítulo, desenhar um modelo
que demonstre os aspectos importantes do ambiente onde você vai
desenvolver um sistema.
Os objetivos deste capítulo são:
• conhecer os conceitos básicos em Modelagem conceitual;
• compreender o conceito de informação e dado;
• conhecer os tipos de modelos de dados;
• compreender o modelo conceitual;
• compreender o que é atributo e o seu valor;
• compreender o que é atributo composto, multivalorado e
determinante;
• reconhecer o relacionamento existente entre entidades;
• definir o grau em um relacionamento;
• conhecer relacionamento parcial e total;
• conhecer a entidade associativa ou de agregação;
• conhecer o auto-relacionamento ou exclusivo.
Para Rob e Coronel (2011), os dados são fatos brutos. A palavra bruto
indica que os fatos ainda não foram processados para revelar seu
12
EROS MOURA
não tem janela, ou que o banheiro não tem báscula. Você, através da
maquete ou da planta, será capaz de avaliar se você gosta, ou não, destas
coisas.
Logo, o modelo não é uma estrutura real, mas algo que a representa , com
maior ou menor nível de detalhes. E isso faz com que, pela observação
deste modelo, possamos ter nossas necessidades de informação
satisfeitas.
• o manequim da vitrine;
Assim como esses, vários outros exemplos poderiam ser dados para
demonstrar o uso de modelos em nosso dia a dia. O que é importante
é perceber que, através de algum meio, seja uma maquete, uma planta,
um desenho, etc., podemos antecipar ou substituir a existência de uma
realidade qualquer. Ou seja, por meio de um elemento semelhante, em
escala ou não, representamos um objeto desejado e, assim, podemos
percebê-lo e entendê-lo.
Em relação aos exemplos que foram dados até agora, sempre tivemos
modelos de algum objeto que, em um determinado momento, serviram
como uma referência para suas criações. Por exemplo: a maquete teve
como referência um apartamento (a maquete era de um apartamento),
o manequim teve como referência um ser humano, a foto do conjunto
estofado teve como referência o estofado.
• Hierárquico;
• Redes;
• Relacional;
• Orientado a Objetos;
15
BANCO DE DADOS
Não imagine você que, uma vez definida a abrangência, todos os objetos
que lhe serão apresentados pelos processos de levantamento de dados
pertencerão ao escopo predefinido. Você, conforme sua habilidade em
levantar dados, poderá escolher caminhos que o levem para mais perto
do resultado esperado, mas, certamente, muito “ruído”, ou “lixo” virá
junto à massa de dados obtida, por qualquer que seja o processo.
➢ Identificá-lo
➢ Conceituá-lo
➢ Entendê-lo
➢ Assimilá-lo
16
EROS MOURA
Essa sequência de fases faz com que algo, que até certo instante era
desconhecido para nós, passe a fazer parte de nosso conhecimento e
seja incorporado ao conjunto de objetos de nosso domínio.
{
Análise de
requisitos { Entrevista
Necessidade do negócio
{
Modelo Modelagem de dados
Conceitual Definição: entidade, atributo,
(DER) relacionamentos
As etapas não consideram
ainda nehuma característica
{
específica de um SGBD, apenas
o tipo Modelo Definição do tipo
Lógico SGBD
{
Construção do BD
Modelo Linguagem SQL
Físico Dicionário de dados
Definição do SGBD
Matrícula
(0,N) (1,1)
Alunos Lotação Cursos
Nome Código Nome
AnoIngresso
1.3.1. Entidades
MATERIAL MEIO DE
TRANSPORTE
1.3.2. Relacionamentos
(0, )
Uma pessoa pode não ser
autor de um livro
FUNÇÃO
(0,N )
(0,N ) (0,N )
PROJETO EQUIPE FUNCIONÁRIO
Entidade Associativa
N N
Médico Consulta Paciente
N N
Médico Consulta Paciente
preescreve
Medicamento
Entidade Fraca
num_item
num_pedido
num_pedido
(0,n) (1,1)
FUNCIONÁRIO trabalha como FUNÇÃO
25
BANCO DE DADOS
Autorrelacionamento
matrícula
FUNCIONÁRIO nome_funcionário
matrícula_gerente
(1,n ) (1,1)
GERÊNCIA
Generalização / Especialização
código
CLIENTE
nome
PESSOA PESSOA
FÍSICA JURÍDICA
CPF CNPJ
Indica que
Indica que nem todo
o cliente é empregado
CLIENTE PF ou PJ EMPREGADO é motorista
ou secretária
t p
1.3.3. Atributo
num_pedido num_item
num_pedido
PILOTO CIRCUITO
Felipe Massa 1
Brasil 1
Neste caso, chegamos à conclusão que o atributo posição não pode ficar
nem na entidade Piloto e nem na Entidade Circuito. Assim, só resta o
relacionamento.
29
BANCO DE DADOS
CLASSIFICAÇÃO
Cardinalidade do atributo
(1,1) nome
(0,n)
FUNCIONÁRIO telefone
Identificador Simples
matrícula
FUNCIONÁRIO
nome
Identificador Composto
número da linha
número da coluna
MATRIZ
valor
31
BANCO DE DADOS
Identificador Interno
Identificador Externo
Identificador de Relacionamento
ano classificação
(0, n) (0, n)
Piloto Corrida CircuitoO
CIRCUIT
data_jogo
JOGO nome_estadio
duração
código participa
nome
(1,n)
(1,1) (0,n) código
EQUIPE pertence nome
JOGADOR data_nasc
(0, n) altura
peso
(0, n)
é de é de
(1,1) (1,1)
PAÍS
nome_hino nacional
nome
sigla
Olá, Turma!
Neste capítulo, daremos prosseguimento ao nosso trabalho de
modelar o negócio para o qual estaremos desenvolvendo um sistema.
Quando vamos trabalhar com o modelo lógico, já deveremos ter o
modelo conceitual finalizado. Estaremos, então, aplicando certas
restrições técnicas ao modelo conceitual para que seja possível
implementar este modelo em um tipo de SGBD escolhido. No final,
veremos o modelo físico e, nessa parte, iremos inserir características
de um específico SGBD.
Os objetivos deste capítulo são:
• entender o que é um projeto lógico;
• saber utilizar as regras de integridade;
• conhecer a primeira, segunda e terceira forma normal e
saber colocar o modelo na terceira forma normal;
• conhecer o modelo físico.
(0,n) (1,1)
Empregado Trabalha Departamento
EMPREGADO DEPARTAMENTO
= muitos
= um
= a ocorrência do relacionamento é opcional
= a ocorrência do relacionamento é obrigatória
Para cada tipo de entidade fraca “F” no modelo conceitual: com tipo
de entidade proprietária forte “E”, crie uma tabela “T” e inclua todos os
atributos simples (ou componentes simples dos atributos compostos)
de “F” como atributos de “T”. Além disso, inclua como atributos
chave estrangeira de “T” os atributos de chave primária da tabela que
correspondem aos de entidade proprietária “E”. Isso consegue mapear
o tipo de relacionamento de identificação de “F”. A chave primária de
“T” é a combinação das chaves primárias do proprietário “E” e a chave
parcial do tipo de entidade fraca “F”, se houver.
Complementando:
Complementando:
Para cada tipo de relacionamento “R” binário N:N, crie uma nova tabela
“S” para representar “R”. Inclua como atributos de chave estrangeira em
“S” as chaves primárias das tabelas que representam os tipos de entidade
participantes; sua combinação formará a chave primária de “S”. Inclua,
também, quaisquer atributos simples do tipo de relacionamento N:N
(ou componentes simples dos atributos compostos) como atributos de
“S”. Observe que não podemos representar um tipo de relacionamento
N:N por um único atributo de chave estrangeira em uma das tabelas
participantes (como fizemos para os tipos de relacionamento 1:1 ou
1:N) devido à razão de cardinalidade, por isso temos de criar uma tabela
de relacionamento “S” separada.
Complementando:
Para cada atributo multivalorado “A” na tabela “S”, crie uma tabela “T”.
Essa tabela “T“ incluirá um atributo correspondente a “A”, mais o atributo
da chave primária da tabela “S”. A chave primária de “T” é a combinação
do atributo da chave primária da tabela “S” (esse atributo também será
chave estrangeira) e o atributo “A”. Se o atributo multivalorado for
composto, incluímos seus componentes simples.
Complementando:
matrícula
FUNCIONÁRIO nome_funcionário
matrícula_gerente
(1,n) (1,1)
GERÊNCIA
43
BANCO DE DADOS
cod_disciplina
DISCIPLINA nome_disciplina
carga_horária
(0,n) (0,n)
Para cada tipo de relacionamento n-ário R, onde n > 2, crie uma tabela T
para representar R. Inclua como atributos de chave estrangeira em T as
chaves primárias das tabelas que representam as entidade participantes.
44
EROS MOURA
Complementando:
código
CLIENTE
nome
PESSOA PESSOA
FÍSICA JURÍDICA
CPF CNPJ
Lembre-se de que:
A coluna cod_cliente na tabela FISICA deverá ter chave estrangeira
para CLIENTE.
A coluna cod_cliente na tabela JURIDICA deverá ter chave
estrangeira para CLIENTE.
2.2. Normalização
V
CÓDIGO NOME GERENTE DEP. LOCALIZAÇÕES DO DEPARTAMENTO
➢ está em 1NF. e
*A *B C D
➢ está em 2NF. e
*A B C
TIPO CLIENTE
cod_tipo_cliente: INTEGER
descricao_tipo_cliente: VARCHAR(20)
UF CIDADE
sigla_uf: CHAR(2) sigla_uf: CHAR(2)
nome_uf: VARCHAR(25) nome_cidade: VARCHAR(40)
sigla_uf: CHAR(2) (FK)
CLIENTE
CTRC
cod_cliente: INTEGER
ITENS_MANIFESTO num_ctrc: CHAR (6)
nome_cliente: VARCHAR(40)
num_manifesto: CHAR (6) (FK) cliente_remetente: INTEGER (FK)
Remetente rua_cliente: VARCHAR(40)
num_ctrc: CHAR(6) (FK) cliente_destinatario: INTEGER (FK)
bairro_cliente: VARCHAR(40)
posicao_ctrc: INTEGER bairro_cliente: VARCHAR(40)
cidade_cliente: INTEGER (FK)
data_emissão: CHAR (10) Destinatário
cep_cliente: VARCHAR(8)
peso_ctrc: NUMERIC (8,2)
documento_cliente: VARCHAR (20)
frete_ctrc: NUMERIC (10,2)
cod_tipo_cliente: INTEGER (FK)
VEICULO
Origem Destino
placa_veiculo: CHAR (7)
descricao_veiculo: VARCHAR (FK)
UF AJUDANTE
sigla_uf: CHAR(2) cod_ajudante: INTEGER (7)
nome_uf: VARCHAR(25) nome_ajudante: VARCHAR (35)
cod_cidade
(0, n) (1,1) sigla_uf
nome_cidade CIDADE Está localizada UF nome_uf
sigla_uf
(1,1)
Mora
(1,n)
cod_cliente
bairro
nome_cliente cod_cidade cod_técnico
rua CLIENTE cep TÉCNICO nome_técnico
telefones )(0,n
numero sexo (M,F
) terceitos) (S,N
(1,1) (1,1)
pede faz
(1,n) (1,n)
número_oe número_os
data_os cod_serviço
hora_os cod_técnico
cod_cliente Ordem data_inicial_serviço
(1,1) (1,n)
matrícula_atendente de Possui Serviço Executado hora_inicial_serviço
descrição_problema Serviço data_final_serviço
descrição_fechamento hora_final_serviço
posição_os (A,F, P) valor_cobrado_serviço
valor_total_os
(0,n) (0,n) (0,n)
Cadastra data_uso
usa é feito
hora_uso
quantidade_uso
(1,1)
cod_serviço
matrícula_atendente
ATENDENTE ESTOQUE SERVIÇO
nome_serviço
nome_atendente estimativa_tempo
valor_serviço
(1,1)
quantidade_estoque
valor_compra
desc_estoque
cod_estoque
52
EROS MOURA
INTRODUÇÃO A BANCO DE
DADOS
Vamos lá!
Agora vamos conhecer a teoria sobre banco de dados, assim
podermos usá-lo de uma forma melhor.
Os objetivos deste capítulo são:
• conhecer os conceitos básicos de banco de dados;
• conhecer um SGBD;
• conhecer os principais componentes de um SGBD;
• saber definir as principais vantagens e desvantagens do
SGBD;
• compreender a tecnologia Cliente/Servidor aplicada a
Banco de Dados.
Solicitações de Solicitações de
Fonte de esquemas DML não-planejadas
e mapeamento DML planejadas
(ocasionais)
Processadores
Processadores Processadores
da linguagem
de DDL de DDL
de consulta
Solicitações
compiladas
Fonte e objeto
de esquemas Otimizador
e mapeamento
Solicitações
otimizadas
Gerenciador
em tempo Metadados
de execução
Banco
de dados
Dados
Metadados
(dicionários de dados)
3.3.7. Desempenho
Usuários finais
APLICAÇÕES Clientes
SGBD Servidor
Banco de dados
Uma outra coisa que deve ficar claro: o servidor e cliente apresentado
a Figura 3 não é necessariamente física, ou seja, não obrigatoriamente
está se falando em um computador servidor e outro computador cliente
(embora em empresas médias e grandes seja assim mesmo). Em alguns
casos (aplicativos menores) estes dois, cliente e servidor, podem estar na
mesma máquina. Mesmo neste caso, tudo o que foi falado está valendo.
Em geral, os SGBD gratuitos são uma boa opção para projetos pequenos
e médios. Algumas das desvantagens comentadas no item anterior não
fariam sentido para SGBD gratuitos, mas outras deveriam ser levadas
em conta como, por exemplo, o suporte, a possibilidade de continuidade
do projeto, a possibilidade do projeto passar a ser pago, etc.
Oi, pessoal!
Neste capítulo, começaremos a conhecer a linguagem que vai
possibilitar o uso do banco de dados. Será através dela faremos tudo
com o banco de dados.
Os objetivos deste capítulo são:
• conhecer o que é SQL;
• compreender o que é DDL;
• conhecer os principais comandos DDL;
• compreender quais são os tipos de dados mais utilizados;
• entender a utilização das restrições de integridade;
• compreender o que é índice e quando utilizá-lo;
• entender como se cria usuários;
• saber utilizar os comandos Grant e Remove.
Por este motivo, vou dedicar um tempo em nossa disciplina para falar
sobre uma coisa básica para profissionais de informática: saber ler um
manual.
Símbolo Descrição
Indica que começa aqui uma parte que é opcional. Então,
[ sabemos que o que vem à frente, até que seja encontrado
o símbolo ] correspondente a este, será tudo opcional.
68
EROS MOURA
Então, vamos fazer uma “tradução” para ver se ficou bem entendido.
( [
{ column_namedata_type [ DEFAULT default_expr ] [
column_constraint [ ... ] ]
| table_constraint
| LIKE parent_table[ { INCLUDING | EXCLUDING }
DEFAULTS ] }
[, ... ]
] )
4.3. CREATE
Exemplos:
70
EROS MOURA
CREATE TABLE
CREATE INDEX
CREATE VIEW
Sintaxe:
Exemplo:
OBSERVAÇÕES:
Ainda há outro tipo que é importante, mas neste caso não existe
um padrão entre os SGBD. Este tipo possibilita que a coluna seja
incrementada automaticamente a cada nova linha. O valor está com 1
depois vai para 2, e assim por diante. No caso do PostgreSQL, que é o
SGBD que estaremos utilizando, o tipo é o SERIAL. Ao informar serial,
o PostgreSQL já sabe que ele será também NOT NULL.
Devemos sempre dar nomes às restrições para que seja mais fácil
identificar a razão pela qual a inserção de dados falha. Isso também
irá facilitar a exclusão, caso seja for necessário apagar a restrição. As
principais restrições são:
➢ CHECK
Exemplo:
CONSTRAINT salario_positivo
CHECK (salario > 550)
CONSTRAINT valida_sexo
CHECK (sexo = ‘M’ OR sexo = ‘F’)
➢ NOT-NULL
Para garantir que uma coluna não vai possuir valores nulos, podemos
usar uma restrição do tipo NOT NULL.
Exemplo:
➢ UNIQUE
Exemplo:
CONSTRAINT un_empregado_cpf
UNIQUE (cpf)
➢ CHAVE PRIMÁRIA
Exemplo:
➢ CHAVE ESTRANGEIRA
Exemplo:
Exemplo:
Tome muito cuidado com estas opções que fazem as operações de forma
automática, pois usá-las pode não ser a melhor saída.
Você pode definir um valor padrão que será colocado sempre quando
houver uma inclusão na tabela e o valor da coluna não for especificado.
Exemplo:
Exemplo:
CREATE INDEX ind_medico_1
ON medico (nome_medico);
4.6. Domains
Criando o domain:
Usando o domain:
4.7. ALTER
Exemplos:
ALTER TABLE
ALTER INDEX
ALTER VIEW
4.8. DROP
Exemplos:
DROP TABLE
DROP INDEX
DROP VIEW
Remove uma tabela com todos os seus registros, mas não remove tabelas
referenciadas por outras tabelas.
Sintaxe:
Exemplo:
Sintaxe:
drop index <nome_índice>;
Exemplo:
drop index i_empregado_nome;
4.9. Esquema
Sintaxe:
➢ nome_do_esquema
➢ nome_do_usuário
➢ elemento_do_esquema
Exemplo:
Criar um esquema:
CREATE SCHEMA meu_esquema;
4.10. Usuários
Sintaxe:
CREATE USER <nome_do_usuário>;
Exemplo:
CREATE USER eros;
Sintaxe:
DROP USER <nome_do_usuário>;
4.11. Grupos
Sintaxe:
CREATE GROUP <nomedogrupo>;
Exemplo:
CREATE GROUP adm;
4.12. Privilégios
O privilégio ALL (todos) é uma cláusula que pode ser utilizada quando
se deseja dar todos os privilégios.
Exemplos:
Cidade
cod_cidade: INTERGER UF
nome:cidade: VARCHAR(30) sigla_uf: CHAIR(2)
sigla_uf: CHAR(2) (FK) nome_uf: VARCHAR(30)
TELEFONE
cod_cliente: INTEGER (FK)
numero_telefone: CHAR(12)
Cliente
cod_cliente: INTERGER Tecnico
ATENDENTE nome_cliente: VARCHAR(40) cod_servico: INTEGER
matricula_atendente: CHAR(6) rua: VARCHAR(35) nome_tecnico: VARCHAR(35)
nome_atendente: VARCHAR(30) numero: CHAR(6) terceiro: CHAIR(1)
bairro: VARCHAR(25)
cod_cidade: INTERGER(FK)
cep: CHAR(8)
sexo: CHAR(1)
Ordem_Servico
numero_os: CHAR(6)
data_os: DATE
hora_os: TIME Servico_Executado
cod_cliente: INTEGER (FK) numero_os: CHAR(6) (FK) Servico
matricula_atendente: CHAR(6) (FK) cod_servico: INTERGER (FK) cod_servico: INTEGER
descricao_problema: VARCHAR(200) cod_tecnico: INTERGER (FK) nome_servico: VARCHAR(30)
descricao_fechamento: VARCHAR(200) data_inicial_servico: DATE estimativa_tempo: INTERGER
posicao_os: CHAR(1) hora_inicial_servico: TIME valor_servico: NUMERIC(9,2)
valor_total_os: NUMERIC(9,2) data_final_servico: DATE
hora_final_servico: TIME
valor_cobrado_servico: NUMERIC(9,2)
Servico_Executad_Estoque
ESTOQUE
numero_os: CHAR(6) (FK)
cod_estoque: INTEGER cod_servico: INTERGER (FK)
desc_estoque: VARCHAR(30) cod_estoque: INTERGER (FK)
valor_compra: NUMERIC(9,2) data_uso: DATE
quantidade_estoque: NUMERIC(8,2) hora_uso: TIME
quantidade_uso: NUMERIC(8,2)
A LINGUAGEM SQL - DML
Oi, pessoal!
Neste capítulo, continuaremos a ver a linguagem SQL, e a parte
que aprenderemos agora faz a manipulação dos dados. No último
capítulo, vimos como criar a estrutura do banco de dados, por
exemplo, criando uma tabela. Agora, vamos inserir, alterar e tirar
dados dessa tabela. Quase todos os sistemas que existem fazem estas
operações internamente, e você irá aprender os comandos que mais
tarde irá inserir em seus programas.
Os objetivos deste capítulo são:
• compreender o que é DML;
• conhecer os comandos DML;
• conhecer a utilização dos principais operadores.
Onde:
Caso a tabela em que você quer incluir um dado tenha uma chave
estrangeira (FOREIGN KEY) com outra tabela, lembre-se de que
o valor informado em seu INSERT deverá existir antes na tabela
referenciada em sua chave estrangeira.
87
BANCO DE DADOS
Exemplo:
Observações:
UPDATE aluno
SET nome_aluno = ‘MARIA’
WHERE matricula_aluno = 1;
UPDATE aluno
SET media = 100;
UPDATE aluno
SET turma = ‘INF2’
WHERE nome_aluno LIKE ‘A%’ AND
matricula_aluno < 1000;
89
BANCO DE DADOS
UPDATE produto
SET valor_produto = 100
WHERE valor_produto BETWEEN 2.00 AND 50.00;
UPDATE aluno
SET cpf = ‘00000000000’
WHERE cpf IS NULL;
UPDATE aluno
SET media = 0
WHERE nome_aluno LIKE ‘E%’;
91
BANCO DE DADOS
UPDATE aluno
SET media = 0
WHERE nome_aluno LIKE ‘MA%’;
Quero alterar a média de todos os alunos cujos nomes terminem com
a letra E.
UPDATE aluno
SET media = 0
WHERE nome_aluno LIKE ‘%E’;
Quero alterar a média de todos os alunos cujos nomes contenham CH
em qualquer parte.
UPDATE aluno
SET media = 0
WHERE nome_aluno LIKE ‘%CH%’;
UPDATE aluno
SET media = 0
WHERE nome_aluno = ‘João’ OR
nome_aluno = ‘Maria’ OR
nome_aluno = ‘José’;
Mas com o uso do operador IN, este mesmo comando ficaria assim:
UPDATE aluno
SET media = 0
WHERE nome_aluno IN (‘João’, ‘Maria’, ‘José’);
92
EROS MOURA
UPDATE fornecedor
SET tipo_fornecedor = ‘Ativo’
WHERE codigo_fornecedor IN (SELECT codigo_forne-
cedor FROM produto);
UPDATE fornecedor
SET tipo_fornecedor = ‘Compra’
WHERE EXISTS (SELECT * FROM produto WHERE estoque
<= estoque_minimo);
Excluir uma linha ou várias linhas de uma tabela se faz com a utilização
do comando DELETE. A sintaxe desse comando é:
Por exemplo: caso queira excluir da tabela aluno o aluno com a matricula
21, deve ser usado:
0SELECT *
FROM aluno;
Sintaxe:
COUNT(campo ou *)
Onde:
Campo: campo por onde se deseja contar. Não será feita a contagem da
linha que tiver o campo indicado com o valor NULL.
Exemplos:
SELECT COUNT(cod_fornecedor)
FROM produto;
SELECT COUNT(cod_produto)
FROM produto;
SELECT COUNT(*)
FROM produto;
SELECT COUNT(1)
FROM produto;
Sintaxe:
SUM(coluna)
Onde:
Exemplo:
SELECT SUM(p.valor_venda)
FROM produto p;
Sintaxe:
AVG(coluna)
Onde:
Exemplo:
SELECT AVG(p.valor_venda)
FROM produto p;
Sintaxe:
MIN(coluna)
Onde:
101
BANCO DE DADOS
Exemplo:
SELECT MIN(p.valor_venda)
FROM produto p;
Sintaxe:
MAX(coluna)
Onde:
Exemplo:
SELECT MAX(p.valor_venda)
FROM produto p;
6.2.6. Agrupamentos
Até aqui, todos os nossos resultados foram feitos para toda a tabela,
por exemplo, a média aritmética do valor de venda do produto. Vamos
imaginar que nos foi pedido a média aritmética do valor de venda do
produto, mas não de todos, e sim destes em relação a cada fornecedor.
Em outras palavras, deseja-se saber qual é o valor médio de venda de
cada fornecedor.
Para se possível isto, precisamos entender que teremos que pegar todos os
registros da tabela e dividi-los (quebrá-los) em grupos de fornecedores.
Assim, eu teria um grupo de produtos de cada fornecedor. Na SQL, isso
é feito com o GROUP BY.
102
EROS MOURA
SELECT p.cod_fornecedor,
COUNT(*)
FROM produto p
GROUP BY p.cod_fornecedor;
Fornecedor Quantidade
1 1000
2 1500
3 2000
4 1100
Você deve ter observado que dividimos os dados da tabela por cada
fornecedor com o GROUP BY.
SELECT COUNT(*)
FROM produto p;
Quantidade
5600
Informação CódigoNome1Empresa
12Empresa
Analítica
23Empresa 3...
SELECT p.cod_fornecedor,
COUNT(*)
FROM produto p
GROUP BY p.cod_fornecedor; Informação
Sintética.
Total: 1.100,00
Se é possível juntar ‘
(analítico com sintético) com
o uso do GROUP BY
103
BANCO DE DADOS
SELECT COUNT(*)
FROM produto p
HAVING COUNT(*) > 20;
SELECT p.cod_fornecedor,
COUNT(*)
FROM produto p,
fornecedor f
GROUP BY p.cod_fornecedor
HAVING COUNT(*) > 10;
6.2.8. Ordenação
SELECT p.cod_produto,
p.nome_produto
FROM produto p
ORDER BY p.nome_produto;
Você ainda pode escolher que saia do maior para o menor com a opção
DESC. Veja o exemplo:
SELECT p.cod_produto,
p.nome_produto
FROM produto p
ORDER BY p.nome_produto DESC;
SELECT p.tipo_produto,
p.nome_produto
FROM produto p
ORDER BY p.tipo_produto,
p.nome_produto;
104
EROS MOURA
SELECT *
FROM aluno
WHERE nome_aluno LIKE ‘A%’;
Quero listar apenas o nome e o sexo dos alunos, cujas datas de nascimento
estejam entre 01/01/1980 a 31/12/1990.
SELECT nome_aluno,
sexo
FROM aluno
WHERE data_nascimento BETWEEN ‘01/01/1980’ AND
‘31/12/1900’;
SELECT matricula
FROM aluno
WHERE naturalidade IN (‘RJ’,’ES’);
Produto Fornecedor
cod_produto (PK) cod_fornecedor (PK)
nome_produto nome_fornecedor
cod_fornecedor (FK) ...
....
Sei que o
cod_fornecedor
é da tabela
fornecedor
porque o
apelido (alias)
é f
ELECT p.cod_produto,
p.nome_produto,
f.cod_fornecedor, O apelido
f.nome_fornecedor (alias)
FROM produto p, criado p e Aqui foi
fornecedor f
feito a
WHERE p.cod_fornecedor = f.cod_fornecedor; junção
106
EROS MOURA
sessão
cod_cinema: CHAR(14) (FK) cinema
cod_filme: INTEGER(5) (FK) cnpj_cinema:CHAR(14
data_sessao: DATE nome_cinema: VARCHAR(35)
hora_sessao: TIME lotacao_cinema: INTEGER(3)
quantidade_pessoas: INTERGER(3)
filme
cod_servico: INTERGER(5)
genero
cod_genero: INTERGER(2) (FK)
titulo_filme: VARCHAR(40) cod_genero: INTEGER(2)
duracao_filme: INTEGER(3) descricao_genero: VARCHAR(30)
censura_filme: INTEGER(2)
107
BANCO DE DADOS
SELECT s.data_sessao,
s.hora_sessao,
f.titulo_filme,
c.nome_cinema
FROM sessao s,
filme f,
cinema c
WHERE s.cod_file = f.cod_filme AND
s.cod_cinema = c.cnpj_cinema;
Será que posso, neste mesmo comando, inserir a informação da
descrição do gênero?
Quando fiz o join entre sessão e filme, como já vimos, passei a ter acesso
a todas as colunas da tabela filme. Se tenho este acesso, posso utilizar
a coluna cod_genero. Se posso utilizar a coluna cod_genero da tabela
filme, posso fazer o join entre as tabelas filme e gênero.
SELECT s.data_sessao,
s.hora_sessao,
f.titulo_filme,
c.nome_cinema,
g.descricao_genero
FROM sessao s,
filme f,
cinema c,
genero g
WHERE s.cod_file = f.cod_filme AND
s.cod_cinema = c.cnpj_cinema AND
f.cod_genero = g.cod_genero;
Espero que tenha dado para perceber que, havendo uma ligação
entre as tabelas, é possível “navegar” no modelo escolhendo as
colunas que forem necessárias. Isso é um SGBD Relacional!
Ordem_Servico Servico_Executado
numero_os: CHAR(6) numero_os: CHAR(6) (FK)
data_os: DATE cod_servico: INTERGER (FK)
hora_os: TIME data_inicial_servico: DATE
descricao_problema: VARCHAR(200) hora_inicial_servico: TIME
descricao_fechamento: VARCHAR(200) data_final_servico: DATE
posicao_os: CHAR(1) hora_final_servico: TIME
valor_total_os: NUMERIC(9,2) valor_cobrado_servico: NUMERIC(9,2)
Estoque
cod_servico: INTEGER
nome_servico: VARCHAR(30)
estimativa_tempo: INTERGER
valor_servico: NUMERIC(9,2)
Estoque Servico_Executado_Estoque
cod_servico: INTEGER numero_os: CHAR(6) (FK)
desc_estoque: VARCHAR(30) cod_servico: INTERGER (FK)
valor_compra: NUMERIC(9,2) cod_estoque: INTERGER (FK)
quantidade_estoque: NUMERIC(8,2) data_uso: DATE
hora_uso: TIME
quantidade_uso: NUMERIC(8,2)
SELECT os.descricao_problema,
s.nome_servico
FROM ordem_servico os,
servico_executado se,
servico s
WHERE os.numero_os = se.numero_os AND
se.cod_servico = s.cod_servico;
Por fim, tenha cuidado para não criar condições de junções circulares.
Por exemplo: se a Tabela A for relacionada com a Tabela B, a Tabela B
com a Tabela C e a Tabela C com a Tabela A, crie apenas duas condições
de junção: una A com B e B com C. Não una C com A!
Até aqui, utilizamos o estilo mais antigo de fazer os joins. Este estilo é
muito bom para as junções internas (as que vimos até agora) e cruzadas
(que retornam o produto cartesiano entre as duas tabelas, e equivale
a indicar as tabelas no FROM e não colocar a regra do join na clásula
WHERE). Mas, para as junções externas, este estilo não possui um
padrão em todos os SGBD. Para resolver este problema, vamos conhecer
um outro estilo de fazer nossos joins.
109
BANCO DE DADOS
Por exemplo,
SELECT *
FROM fatura CROSS JOIN linha;
SELECT f.numero_fatura,
f.cod_cliente,
f.data_fatura,
l.cod_linha
FROM fatura f CROSS JOIN linha l;
SELECT f.numero_fatura,
f.cod_cliente,
f.data_fatura,
l.cod_linha
FROM fatura f,
linha l;
SELECT p.cod_produto,
p.nome_produto,
f.cod_fornecedor,
f.nome_fornecedor
FROM produto p NATURAL JOIN fornecedor f;
Veja o exemplo:
SELECT p.cod_produto,
p.nome_produto,
f.cod_fornecedor,
f.nome_fornecedor
FROM produto p JOIN fornecedor f USING
(cod_fornecedor);
111
BANCO DE DADOS
Exemplo:
SELECT p.cod_produto,
p.nome_produto,
f.cod_fornecedor,
f.nome_fornecedor
FROM produto p JOIN fornecedor f
ON p.cod_fornecedor = f. cod_fornecedor;
Até aqui, todos os tipos de joins vistos poderiam ser feitos do modo
tradicional, sem nenhum problema. Há uma situação em que é necessário
retornar não apenas as linhas que atendam à condição de junção (ou
seja, aquelas com valores correspondentes nas colunas comuns), mas
também as linhas sem valores correspondentes, e, neste caso, você irá
utilizar a junção externa. O padrão ANSI define três tipos de junções
externas: à esquerda, à direita e completa.
112
EROS MOURA
SELECTlista de colunas
FROM tabela1 LEFT OUTER JOIN tabela2 ON condição
de junção;
SELECT p.cod_produto,
p.nome_produto,
f.cod_fornecedor,
f.nome_fornecedor
FROM produto p LEFT OUTER JOIN fornecedor f
ON p.cod_fornecedor = f. cod_fornecedor;
SELECT f.cod_fornecedor,
f.nome_fornecedor,
p.cod_produto,
p.nome_produto
FROM produto p RIGHT OUTER JOIN fornecedor f
ON p.cod_fornecedor = f. cod_fornecedor;
113
BANCO DE DADOS
SELECT p.cod_produto,
p.nome_produto,
f.cod_fornecedor,
f.nome_fornecedor
FROM produto p FULL OUTER JOIN fornecedor f
ON p.cod_fornecedor = f. cod_fornecedor;
Em vez de digitar a mesma consulta no fim de cada dia, não seria melhor
salvar essa consulta de forma permanente no banco de dados? Essa é a
função de uma visualização relacional.
Exemplo:
Você pode utilizar a view para queries mais complicadas, para relatórios
ou, por questões de segurança, liberado apenas as informações a que um
determinado usuário possa ter acesso.
6.6.1. UNION
Consulta
UNION
consulta
115
BANCO DE DADOS
Por exemplo:
SELECT nome_cliente,
cpf_cliente
FROM cliente
UNION
SELECT nome_cliente,
cpf_cliente
FROM cliente2;
O comando UNION pode ser utilizado para unir mais do que apenas
duas consultas. Por exemplo: assuma que se tenham quatro consultas
compatíveis para união chamadas T1, T2, T3 e T4. Com o comando
UNION, é possível combinar a saída das quatro em um único conjunto
de resultados. O comando de SQL será similar ao seguinte:
SELECT nome_cliente,
cpf_cliente
FROM cliente
UNION ALL
116
EROS MOURA
SELECT nome_cliente,
cpf_cliente
FROM cliente2;
6.6.3. INTERSECT
consulta
INTERSECT
consulta
SELECT nome_cliente,
cpf_cliente
FROM cliente
INTERSECT
SELECT nome_cliente,
cpf_cliente
FROM cliente2;
UF CIDADE
sigla_uf: CHAR(2) cod_cidade; INTEGER(4)
nome_uf: VARCHAR(25) nome_cidade: VARCHAR(35)
sigla_uf: CHAR(2) (FK)
CLIENTE
CTRC
cod_cliente: INTEGER(8)
ITENS_MANIFESTO num_ctrc: CHAR (6)
nome_cliente: VARCHAR(40)
num_manifesto: CHAR (6) (FK) cliente_remetente: INTEGER(8) (FK)
Remetente tipo_cliente: CHAR(1)
num_ctrc: CHAR(6) (FK) cliente_destinatario: INTEGER(8) (FK)
cpf_cliente: CHAR(11)
posicao_ctrc: INTEGER(2) data_emissão: DATE
cnpj_cliente: CHAR (14)
peso_ctrc: NUMERIC (6,2) Destinatário
rua_cliente: VARCHAR(30)
frete_ctrc: NUMERIC (8,2)
bairro_cliente: VARCHAR (15)
cidade_cliente: INTEGER(4) (FK)
cep_cliente: CHAR(8)
MANIFESTO CTRC_NF
num_manifesto: CHAR (6) CLIENTE_TELEFONE
num_ctrc: CHAR(6) (FK)
cod_motorista: INTEGER(4) (FK) num_nf: CHAR(6) cod_cliente: INTEGER (FK)
filial_origem_manifesto: CHAR(3) (FK) telefone_cliente: CHAR(12)
final_destino_manifesto: CHAR(3) (FK)
placa_veiculo_manifesto: CHAR(7) (FK)
data_emissao_manifesto: DATE
data_chegada_manifesto: DATE VEICULO
MODELO VEICULO
placa_veiculo: CHAR (7)
cod_modelo_veiculo: INTEGER(2)
descricao_veiculo: VARCHAR (40)
Origem Destino
desc_modelo_veiculo: VARCHAR(30)
cod_modelo_veiculo: INTEGER(2) (FK)
UF MOTORISTA
sigla_filial: CHAR(3) cod_motorista: INTEGER (4)
nome_filial: VARCHAR(30) nome_motorista: VARCHAR (45)
categoria_motorista: CHAR(1)
UPDATE ctrc c
SET frete_ctrc = c.frete_ctrc * 1.15
FROM cliente cl,
cidade ci,
uf u
WHERE c.cliente_destinatario = cl.cod_cliente AND
cl.cod_cidade = ci.cod_cidade AND
ci.sigla_uf = u.sigla_uf AND
u.nome_uf = ‘São Paulo’;
No item 5.5 vimos como é feita a exclusão de uma linha em uma tabela;
porém, há situações em que, para excluir de uma tabela A, eu vou
precisar de dados da tabela B. Isso é possível? Sim, e você já sabe como
fazer esta ligação (join) entre as tabelas, só precisamos saber como é
feito na exclusão. Vamos dar uma olhada:
CONSTRAINT fk_itens_de_comanda_produto
FOREIGN KEY(cod_produto)
REFERENCES produto(cod_produto)
);
Date, C. J. Introdução a Sistemas de Banco de Dados. 7. ed. Rio de Janeiro: Elsevier, 2003.
Elmasri, R.; Navathe, S. B. Sistemas de Banco de Dados. 6. ed. São Paulo: Person Addison
Wesley, 2011.