Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Banco de Dados
Volume 4
Recife, 2010
Universidade Federal Rural de Pernambuco
Apresentação.................................................................................................................. 4
Álgebra Relacional............................................................................................................7
A SQL..............................................................................................................................26
Considerações Finais..................................................................................................... 75
Conheça a Autora......................................................................................................... 77
Apresentação
Caro(a) cursista,
Seja bem-vindo(a) ao quarto módulo do curso Banco de Dados!
Neste quarto módulo, vamos aprender a manipular um SGBD de forma a criar, manter e consultar o banco
de dados que você antes aprendeu a modelar. Para fazer isso, estudaremos principalmente a linguagem SQL,
presente em todos os banco de dados relacionais e de grande utilidade no acesso a eles.
Adicionalmente, estudaremos um pouco de álgebra relacional e cálculo relacional que são formas de
representar matematicamente as operações que podem ser aplicadas a um Banco de Dados.
Bons estudos!
Sandra de Albuquerque Siebra
Autora
4
Banco de Dados
Conhecendo o Volume 4
Neste quarto volume, você irá encontrar o Módulo 4 da disciplina de Banco de
Dados. Para facilitar seus estudos, veja a organização deste quarto módulo.
» Álgebra Relacional.
» Cálculo Relacional de Tupla e Cálculo Relacional de Domínio.
» SQL – Conceitos básicos, comandos para criação e atualização do banco de dados.
» SQL - Consultas básicas e Consultas Aninhadas.
5
Banco de Dados
Capítulo 10
» Álgebra Relacional.
» Cálculo Relacional de Tupla.
» Cálculo Relacional de Domínio.
Metas
6
Banco de Dados
Até aqui, já estudamos como modelar e otimizar nosso modelo para um banco de
dados relacional. Um modelo relacional representa o banco de dados como um conjunto de
relações. Uma relação pode ser pensada como uma tabela de valores, onde cada linha na
tabela representa uma coleção de valores de dados relacionados. Para acessar e manipular
esses valores, há duas categorias de linguagens que podem ser utilizadas: as linguagens
formais (a álgebra relacional e o cálculo relacional) e as linguagens comerciais, que
são baseadas nas linguagens formais (tal como a SQL – Structured Query Language). As
linguagens formais são justamente as que daremos uma olhada nesse capítulo e uma das
linguagens comerciais mais utilizadas (a SQL) será assunto dos dois capítulos finais desse
volume.
Álgebra Relacional
A Álgebra Relacional é uma linguagem de consulta formal, porém procedimental
(procedural), ou seja, o usuário dá as instruções ao sistema para que o mesmo realize uma
sequência de operações na base de dados para calcular o resultado desejado. Ela consiste
de um conjunto de operações que têm como entrada uma ou duas relações e produzem,
como resultado, uma nova relação.
Os operadores da álgebra relacional podem ser divididos em dois grupos:
Observação
As linguagens disponíveis para acesso a BDs relacionais, inclusive o SQL, não utilizam os mesmos
operadores ou nomes definidos pela álgebra relacional. Entretanto todos, ou quase todos, os
operadores da álgebra relacional podem ser escritos usando estas linguagens.
7
Banco de Dados
» União (R1 ∪ R2) - todas as tuplas de R1 e todas as tuplas de R2, sendo que tuplas
duplicadas são eliminadas.
R1 ∪ R2 = R2 ∪ R1 e R1 ∩ R2 = R2 ∩ R1.
» Já a operação de diferença não é comutativa: R - S ≠ S - R.
» As operações de união e interseção são binárias, mas podem ser aplicadas a
qualquer número de relações e ambas são operações associativas. Assim:
R ∪ (S ∪ T) = (R ∪ S) ∪ T e R ∩ (S ∩ T) = (R ∩ S) ∩ T.
Considere como base para os exemplos das operações as relações Professor e Aluno
representadas pelas Tabelas 1 e 2.
União: A ∪ B
8
Banco de Dados
CPF Nome
1002 João
1003 Pedro
1116 Mércia
1900 Ronaldo
Interseção: A ∩ B
Interseção é a operação entre duas relações “união compatível” que gera uma
relação resultante, contendo todas as tuplas (linhas) presentes em ambas as relações
originais. Ela é denotada pelo símbolo ∩. Por exemplo, a interseção das relações Professor e
Aluno, representadas pelas Tabelas 1 e 2 é a relação representada pela Tabela 4.
CPF Nome
1002 João
Diferença: A – B
Diferença é a operação entre duas relações “união compatível” que gera uma
relação resultante, contendo todas as linhas que estão na primeira relação, e que não
aparecem na segunda. Ela é denotada pelo símbolo –. Por exemplo, a diferença das relações
Professor e Aluno, representadas pelas Tabelas 1 e 2 (Professor – Aluno) é a relação
representada pela Tabela 5, que contém as tuplas das relação Professor que não estão na
relação Aluno.
CPF Nome
1003 Pedro
Para mostrar que a operação de diferença não é comutativa, vamos agora fazer
Aluno – Professor, ou seja, as tuplas que estão na relação Aluno, mas que não estão na
relação Professor. Veja pela relação resultante representada na Tabela 6 que os resultados
da diferença, mudando a ordem das relações, são diferentes.
9
Banco de Dados
CPF Nome
1116 Mércia
1900 Ronaldo
Produto Cartesiano: A x B
O produto cartesiano combina duas relações, gerando uma terceira cujas linhas
representam todas as possíveis combinações das linhas (tuplas) das relações originais. Um
esquema dessa combinação pode ser vista na Figura 1.
1 Recife PB Nordeste
2 Manaus AM Norte
3 João Pessoa
10
Banco de Dados
1 Recife PB Nordeste
2 Natal PB Nordeste
1 Recife AM Norte
2 Natal AM Norte
Renomear para diferenciar: O Produto Cartesiano entre duas relações R1 e R2 (R1 x R2) apresenta
problemas quando:
* O produto cartesiano está envolvido com a relação resultante de expressões (que vamos ver o
que são daqui a pouco).
Isso porque um mesmo nome de atributo pode aparecer tanto em R1 quanto em R2. Por isso, é
preciso estabelecer um modo de diferenciar esses atributos na relação resultante. Para isso, pode-
se anexar ao atributo o nome da relação a qual ele pertença: nome_relacao.nome_atributo. Por
exemplo, se fizéssemos o produto cartesiano entre as relações Professor e Aluno (vide Tabelas 1 e
2), como as duas tabelas possuem atributos de mesmo nome, a relação resultante ficaria com as
seguintes colunas: (Professor.CPF, Professor.Nome, Aluno.CPF, Aluno.Nome)
Seleção
11
Banco de Dados
1 Recife S PE
2 Natal S RN
3 João Pessoa S PB
4 Patos N PB
3 João Pessoa S PB
4 Patos N PB
4 Patos N PB
12
Banco de Dados
Projeção
A operação de projeção é unária e opera sobre uma única relação, gerando outra
relação resultante que conterá todas as linhas da relação original, mas apenas as colunas
(atributos) que se deseja projetar (e que foram especificadas na operação). Ou seja, retorna
parte da relação, deixando de fora os atributos que não foram solicitados. Na relação
resultante, as tuplas (linhas) duplicadas são eliminadas. O formato geral da operação de
projeção é: π A1, A2, …, An (Relação) onde A1, A2, ..., An são nomes de atributos da relação.
Vamos dar um exemplo. Tomando como base a relação Cidade (vide Tabela 10), vamos
supor que queremos selecionar (projetar) apenas os atributos Nome e UF. Daí precisaríamos
da seguinte operação: π Nome, UF (Cidade). A relação resultante dessa projeção seria a
apresentada na Tabela 13. Observe que a relação resultante tem todas as tuplas da relação
original, mas só apresenta os atributos especificados na operação de projeção. Além disso,
observe que estes atributos aparecem na mesma ordem em que foram especificados.
Nome UF
Recife PE
Natal RN
João Pessoa PB
Patos PB
UF
PE
RN
PB
13
Banco de Dados
Combinando Operações
Nome Salario
14
Banco de Dados
Outra forma de combinar operações é aplicar uma única operação por vez e criar
relações intermediárias. Neste caso, é preciso dar nomes às relações intermediárias. Por
exemplo, vamos tomar o exemplo anteriormente visto de tomar a relação Empregado como
base (Tabela 15) e dela recuperar o nome e o salário de todos os empregados que trabalham
no departamento 4. Já apresentamos como fazer isso com uma única expressão. Agora,
alternativamente, seria possível explicitar a sequência de operações, dando um nome para
cada relação intermediária:
Empregados_Dep4 ← ß δ Num_Dep=4(Empregado)
Π nome, salario (Empregados_Dep4)
Junção
1 Recife PE
2 Manaus AM
3 João Pessoa PB
UF Região
PB Nordeste
AM Norte
2 Manaus AM AM Norte
15
Banco de Dados
» EQUIJOIN: junção onde somente operadores de comparação “=“ são utilizados. Gera colunas
idênticas.
» JUNÇÃO NATURAL: requer que os dois atributos de junção tenham o mesmo nome em ambas
as relações. Nesse tipo de join, outras condições podem ser utilizadas além da igualdade. A relação
resultante não gera nenhuma duplicidade.
Cálculo Relacional
16
Banco de Dados
» Se F1 e F2 são fórmulas atômicas, então (F1 AND F2), (F1 OR F2), NOT (F1) e NOT
(F2) também o são, tendo seus valores verdade derivados a partir de F1 e F2.
Relembrando...
(F1 AND F2) será TRUE apenas se ambos, F1 e F2, forem TRUE;
(F1 OR F2) será TRUE quando uma das duas fórmulas F1 e F2, for TRUE;
NOT(F1) será TRUE quando F1 for FALSE;
NOT(F2) será TRUE quando F2 for FALSE.
17
Banco de Dados
Todas as variáveis tuplas abordadas são consideradas variáveis livres (elas aparecem em
uma expressão de cálculo relacional à esquerda da barra |), uma vez que estas não aparecem
quantificadas. Porém, quando quantificadores (universal (∀) ou existencial (Ǝ)) aparecem nas
fórmulas, as variáveis que os sucedem são denominadas variáveis limite.
Cod Descricao
2 Vendas
4 Suporte
5 Gerência
Vamos dar alguns exemplos para ilustrar. Tomando como base a relação Empregado
(vide Tabela 21) e a relação Departamento (vide Tabela 22), suponha as seguintes consultas
e como elas ficariam representadas em cálculo relacional de tupla.
» Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t |
EMPREGADO(t) AND t.SALARIO > 3000 }.
Analisando a expressão, podemos lê-la da seguinte forma: considere uma tupla t,
ela deve ser uma tupla da relação empregado, cujo atributo salário dessa tupla deve
ser maior que 3000. EMPREGADO(t) é o mesmo que dizer que t ∈ EMPREGADO.
A consulta acima resulta em uma relação que contém todas as tuplas t da relação
EMPREGADO que satisfazem a condição (no caso, salário > 3000).
No CRT, especificamos primeiro os atributos desejados. Se for usado apenas o t, sem
especificação de atributos, todos os atributos da tupla são recuperados. Logo, na consulta
acima, seriam recuperados os atributos CPF, Nome, Sexo, Salario e Cod_Depto (vide Tabela
21). Agora, suponha que gostaríamos de recuperar apenas os atributos CPF e Nome das
tuplas que atendessem a condição. Como faríamos?
{ t.CPF, t.Nome | EMPREGADO(t) AND t.SALARIO > 3000 }.
Observe que os atributos desejados são especificados do lado esquerdo da barra
(|).
18
Banco de Dados
a b c d e
19
Banco de Dados
m n
Cod Descricao
2 Vendas
4 Suporte
5 Gerência
» Obtenha todos os empregados cujo salário seja maior que 3000 reais: { t |
1
Observe que as letras EMPREGADO(t) AND t.SALARIO > 3000 }.
à esquerda da barra
(|) representam o { abcde1 | (Ǝ d2) EMPREGADO(abcde) AND d > 3000 }
domíno dos atributos
desejados (vide » Se, na consulta anterior, quiséssemos recuperar apenas o CPF e o nome dos
Tabela 23), como empregados, teríamos:
conseqüência, eles
referenciam as colunas { ab | (Ǝ d) EMPREGADO(abcde) AND d > 3000 }
desejadas.
» Obtenha o nome e o salário dos empregados que trabalham para o departamento
de Suporte.
Comentário { bd | (Ǝ e) (Ǝ m)(Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND
n = ‘Suporte’ AND m = e) }
2
Somente é
necessário quantificar
as variáveis que Considerações Finais
participam de uma
condição.
A álgebra relacional é uma forma de cálculo sobre conjuntos ou relações. Uma
Ou seja, só usamos o aplicação prática da álgebra relacional é na execução de consultas a bancos de dados
operador existencial Ǝ
na variável de domínio
relacionais. A álgebra relacional recebia pouca atenção até a publicação do modelo
d, porque apenas essa relacional de dados de E.F Codd, em 1970. Codd propôs tal álgebra como uma base para
variável é usada na linguagens de consulta em banco de dados. As operações da álgebra relacional podem ser
condição expressa no
resumidas de forma ilustrada na Figura 2.
predicado (d > 3000)
20
Banco de Dados
Conheça Mais
Para obter mais informações sobre o assunto estudado nesse capítulo, você pode
consultar qualquer um dos livros listados a seguir. Todos eles possuem capítulos dedicados a
Álgebra Relacional e o Cálculo Relacional (de Tupla e de Domínio):
21
Banco de Dados
Você Sabia?
O Cálculo relacional, dependendo do autor, pode ter sua notação ligeiramente modificada. A
notação que fizemos uso nesse capítulo é a notação de Navathe (ELMASRI e NAVATHE, 2005).
Porém, existe também a notação de Korth (KORTH, SILBERSCHATZ e SUDARSHAN, 2006). Para
ilustrar as diferenças, vamos repetir a mesma consulta anteriormente realizada:
» Obtenha o nome e o salário dos empregados que trabalham para o departamento de
Suporte. Na notação de Navathe, que já utilizamos, ficaria:
{bd | (Ǝ e) (Ǝ m) (Ǝ n) (EMPREGADO(abcde) AND DEPARTAMENTO(mn) AND n = ‘Suporte’
AND m = e)}
Já na notação de Korth, a mesma sentença ficaria da seguinte forma:
{<b, d> | <b, d> � empregado ∧ departamento(mn) ∧ n = “Suporte” ∧ m = e)}
Veja que o formato geral da expressão muda um pouco, mas o que muda mesmo é a simbologia
dos operadores lógicos: AND (∧), OR (∨), NOT (¬), a forma de expressar as variáveis de tupla
(observe o começo das duas expressões e veja a diferença) e ao invés de aspas simples em
constantes, usa-se aspas duplas.
Aprenda Praticando
Ana Gomes 01 F
Pedro Nunes 03 M
Maria Lima 05 F
3456 01 1500
2123 03 5000
2123 05 2500
22
Banco de Dados
» Mostrar o nome das pessoas que possuem empréstimo acima de três mil reais
na agência 2123. Como o nome da pessoa está na relação devedor e o valor do
empréstimo na relação empréstimo, é necessário fazer a junção dessas duas
relações, para ser possível selecionar o que foi pedido. A junção é feita equiparando
os atributos que as relações têm em comum.
π nome (δ valor > 3000 and agencia = 2123 (Devedor |x| devedor.num_emprestimo
= empréstimo.num_emprestimo Emprestimo))
» Apresentar as pessoas cujo número do empréstimo é igual a 5 e o número da
agência é igual a 2123 ou que o número do empréstimo seja igual a 3 e o valor do
empréstimo maior do que 1000 reais. É um caso de seleção onde é necessário usar
operadores lógicos para montar as condições.
δ (num_emprestimo = 5 and agencia = 2123) or (num_emprestimo = 3 and valor >
1000) (Emprestimo))
Agora vamos exercitar o que foi estudado neste capítulo. Assim sendo, faça as
atividades sugeridas a seguir. Lembre que exercitar vai lhe ajudar a fixar melhor o conteúdo
estudado. Mãos à obra!
3
No Word, a
simbologia usada na
Responda as questões a seguir em um documento de texto (doc)3 e poste as
álgebra relacional
respostas no ambiente virtual, no local indicado. Esse trabalho deve ser feito em DUPLA. pode ser inserida no
documento através
Especifique, usando a álgebra relacional, as consultas a seguir, tomando como base do seguinte caminho:
as relações cujos esquemas estão representados a seguir. Inserir -> Símbolo,
fazendo uso da fonte
Symbol (daí você
EMPREGADO escolhe na tabela
que é apresentada o
CPF (PK) Nome DtNasc Endereco Sexo Salario Cod_Dep (FK) símbolo apropriado)
23
Banco de Dados
DEPARTAMENTO
PROJETO
ALOCACAO
DEPENDENTE
Vamos Revisar?
24
Banco de Dados
Capítulo 11
» A Linguagem SQL.
» Subdivisões da SQL.
» Como criar um Banco de Dados usando SQL.
Metas
25
Banco de Dados
“No capítulo anterior, vimos linguagens formais para consulta a banco de dados
relacionais. Porém, na área comercial, essas linguagens não são muito utilizadas, ao invés
delas, são usadas linguagens comerciais para criação, manutenção e consulta a banco de
dados. Entre essas linguagens, a SQL (Structured Query Language) é a mais utilizada. Por
isso mesmo, a interface SQL é implementada em todos os sistemas de bancos de dados
relacionais existentes. É justamente sobre a SQL que estudaremos nesse capítulo e no
capítulo seguinte.”
A SQL
SQL ou Structured Query Language (Linguagem de Consulta Estruturada) é uma
linguagem de consulta declarativa, não-procedural, fundamentada na álgebra e no cálculo
relacional de tupla. Apesar de ser chamada linguagem de consulta (Query), ela não é apenas
de consulta, ela inclui comandos para definição, manutenção e consulta em bancos de dados
relacionais. Além disso, ela define mecanismos para criação de visões, especificações de
segurança, autorizações, definições de restrições e controle de transações. Adicionalmente,
ela possui regras para embutir os comandos SQL em linguagens de programação genéricas
como Java, PHP, C# ou C/C++.
A SQL foi desenvolvida pelo laboratório da IBM, nos anos 70, como parte do
sistema System R (o primeiro SGBD relacional). Ela foi, inicialmente, chamada de SEQUEL
(Structured English Query Language), mas teve seu nome alterado para SQL por razões
Jurídicas. Em 1986, em um esforço conjunto da ANSI (American Nacional Standars Institute)
e da ISO (International Standards Organization) criou-se a primeira versão padrão da SQL, a
SQL-86 (SQL1), substituída posteriormente pela SQL-92 (SQL2) e depois pela SQL-99 (SQL3).
O atual projeto da SQL é o padrão 200n.
A SQL padrão é suportada por todos os SGBDs relacionais comerciais. Porém,
mesmo padronizada, existem variações, ou seja, cada fornecedor pode incluir comandos
próprios na SQL utilizada pelo seu SGBD. Em outras palavras, cada implementação do SQL
de cada fornecedor possui os comandos do SQL padrão (também chamado SQL ANSI)
e, também, algumas adaptações para resolver certas particularidades. Para conhecer
o conjunto completo de comandos SQL de um determinado fornecedor (ex: Oracle),
recomendamos a leitura do manual do fabricante. A vantagem de fazer uso apenas do SQL
padrão é não ter problemas com migração de SGBD para SGBD. Por exemplo, se você fazia
uso de SQL Server e, depois, migrou para o uso do Oracle, se fez uso apenas do SQL padrão,
26
Banco de Dados
Subdivisão da SQL
Tipos de Dados
Antes de entrar nos comandos propiamente ditos da SQL, vale a pena comentar
sobre tipos de dados. Para definir os atributos das tabelas, precisamos definir os domínios
de cada um deles. Isso é feito através da especificação do tipo do dado. Nesse ponto, é
importante ressaltar que cada SGBD tem um conjunto próprio de tipos de dados. Mas,
podemos dizer que, genericamente, vamos encontrar na maioria dos SGBDs tipos como:
28
Banco de Dados
O comando CREATE TABLE especifica uma nova tabela (relação), dando o seu nome
e especificando as colunas (atributos), cada uma com seu nome, tipo e restrições iniciais.
A forma geral do comando é: create table nome_tabela. Por exemplo: create table
Empregado. Porém, a sintaxe completa do comando é bem mais detalhada:
6
Valor será do tipo CREATE TABLE EDITORA(
DECIMAL, ou seja,
CodEditora INTEGER NOT NULL,
um valor de ponto
flutuante, tendo 3 Razao CHAR(50),
casas na parte inteira e
duas casas decimais. Endereco CHAR(50),
Cidade CHAR(30),
Comentário PRIMARY KEY(CodEditora ));
Agora, podemos partir para a definição da tabela Livro que faz uso das duas tabelas
7
Aqui está sendo
especificado o valor
anteriormente definidas:
default para o atributo
CREATE TABLE LIVRO(
idioma. Se esse campo
não for informado, o Titulo CHAR(50) NOT NULL,
valor “Português” será
assumido. CodAutor INTEGER NOT NULL,
CodEditora INTEGER NOT NULL,
Comentário Valor DECIMAL(3.2)6,
Publicacao DATE,
8
Veja que está
sendo especificada Volume INTEGER,
uma chave primária
composta, uma vez Idioma CHAR (15) DEFAULT = ‘Português’ 7,
que dois atributos
fazem parte da PRIMARY KEY (Titulo, CodAutor8),
especificação.
FOREIGN KEY (CodAutor) REFERENCES AUTOR9,
FOREIGN KEY (CodEditora) REFERENCES EDITORA,
Comentário
CHECK Valor > 10.010);
9
Veja que estamos Só para ilustrar melhor o uso da cláusula CHECK, vamos dar outro exemplo de
espeficifando que criação de tabela, fora do exemplo do modelo base (Figura 4). Suponha que desejamos criar
CodEditora é chave a tabela estudante que contenha os atributos matricula, nome e nivel.
estrangeira na tabela
sendo definida e é um CREATE TABLE estudante (
atributo pertencente
à tabela Autor (sendo matricula char(10) NOT NULL,
chave primária nessa
outra tabela – tabela nome char(15) NOT NULL,
externa)
nivel char(15) NOT NULL,
30
Banco de Dados
O SQL-89 obrigava os atributos da chave primária a serem declarados como NOT NULL e UNIQUE. Comentário
SQL-92 e posteriores já assumem essas condições, assim, sua declaração é redundante.
10
Aqui é especificado
Uma cláusula FOREIGN KEY pode incluir regras de remoção / atualização: que os livros que
forem criados devem
FOREIGN KEY (coluna) REFERENCES tabela ter seu valor maior
que 10. Essa é uma
[ON DELETE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}] validação que será
feita a cada inserção /
[ON UPDATE {RESTRICT | CASCADE | SET NULL | SET DEFAULT}]
alteração de dados na
Suponha que T2 tem uma chave estrangeira para T1, ou seja, tem um atributo que tabela.
é chave primária em T1. Vejamos as cláusulas ON DELETE e ON UPDATE
ON DELETE Comentário
matrícula.
CASCADE: a atualização de atributo em T1 implica que linhas que combinam em T2
também serão atualizadas.
Comentário
SET NULL: a atualização de T1 implica que valores da chave estrangeira em T2, nas
linhas que combinam com a tupla de T1, sendo atualizada, são postos para NULL. 14
Veja que aqui o
atributo da tabela
SET DEFAULT: a atualização de T1 implica que valores da chave estrangeira de T2, sendo definida tem
nas linhas que combinam, terão valores default aplicados. nome diferente do
atributo na sua tabela
Vamos dar um exemplo de uso dessas cláusulas: externa de origem.
Por isso, o nome do
CREATE TABLE empregado (
atributo na tabela
matricula char(10) NOT NULL, externa precisa ser
especificado.
nome char(15) NOT NULL,
cod_depto INT NOT NULL DEFAULT 112, Comentário
PRIMARY KEY(matricula) , 13
15
Aqui é especificado
FOREIGN KEY(supervisor) REFERENCES Empregado(matricula)14
que, se a tupla que
ON DELETE SET NULL15 contém a matrícula
sendo utilizada nesta
ON UPDATE CASCADE16, tabela for deletada, o
atributo SUPERVISOR
FOREIGN KEY (cod_depto) REFERENCES Departamento(codigo) deverá receber o valor
NULL.
ON DELETE SET DEFAULT17
31
Banco de Dados
ON UPDATE CASCADE);
CASCADE: removeria o atributo de todos os lugares onde ele estivesse sendo usado
(outras tabelas como chave estrangeira e em visões).
RESTRICT: não permitiria a remoção do atributo, se este estivesse sendo usado em
uma visão ou como chave estrangeira em outra tabela.
32
Banco de Dados
Observação
Uma consulta que envolva atributos indexados é realizada com um tempo de execução melhor
do que com atributos não-indexados. Agora, cuidado, você também não pode indexar TODOS os
atributos de uma tabela. Você deverá usar o bom-senso para escolher quais aqueles que serão
indexados de acordo com o problema sendo modelado e a freqüência de uso do atributo em
consultas.
33
Banco de Dados
Em geral, os livros de banco de dados trazem um ou mais capítulo sobre SQL. Entre
Comentário esses livros temos:
34
Banco de Dados
Você Sabia?
Além da SQL outra linguage comercial para manipulação de SGBDs é a QBE (Query-by-Example).
A versão experimental da linguagem foi descrita formalmente (publicada) por Moshe Zloof
em 1977. A versão comercial foi descrita em 1978 pela IBM e usada mais tarde na Query
Management Facility (QMF). A QBE tem por base o cálculo relacional de domínio e possui sintaxe
bidimensional: as consultas parecem tabelas. Nesta linguagem as consultas são expressas “por
exemplo”. Em vez de determinar um procedimento para obtenção da resposta desejada, o
usuário dá um exemplo do que é desejado. A partir daí, o sistema generaliza o exemplo para o
Comentário
processamento da resposta da consulta.
26
Você não pode
deixar para especificar
a quantidade de itens
Aprenda Praticando depois. Por isso, NOT
NULL.
Utilize SQL para fazer o que se pede, a partir do modelo relacional a seguir.
29
Aqui é especificado ALTER TABLE VENDA { ALTER TABLE VENDA {
que a quantidade de ADD Dt_Venda DATE NOT MODIFY Nome_Cliente CHAR(50)31
itens deve ser maior NULL30
que zero, conforme
foi especificado no } }
enunciado.
3) Criar um Índice para o atributo nome_cliente da tabela VENDA
CREATE INDEX clienteIDX32 ON VENDA (nome_cliente);
Comentário
30
Adicionamos o Atividades e Orientações de Estudo
atributo à tabela
VENDA.
36
Banco de Dados
Vamos Revisar?
Nos capítulos anteriores a esse, você estudou como fazer a modelagem conceitual
do seu banco de dados e, depois, como projetá-lo segundo o modelo relacional (MR). A
partir do MR gerado, para poder criar fisicamente o banco de dados, você necessitará fazer
uso dos comandos estudados neste capítulo. Esses comandos fazem parte da DDL (Data
Definition Language) da SQL e incluem, entre outros, comandos para criar, alterar e deletar
tabelas, além de comandos para criação e deleção de índices de tabela. Os comandos aqui
estudados poderão ser utilizados em qualquer SGBD, pois fazem parte do SQL ANSI. Uma
vez que seu banco de dados estiver criado, ele poderá ser manipulado e consultado, usando
a DML (Data Manipulation Language) da SQL, este será o assunto do próximo capítulo.
37
Banco de Dados
Capítulo 12
Metas
Após o estudo deste capítulo, esperamos que você saiba utilizar a DML (Data
Manipulation Language) do SQL. Dessa forma, você deverá saber:
38
Banco de Dados
No capítulo anterior, você aprendeu como criar fisicamente o seu banco de dados
através dos comandos da DDL (Data Definition Language) da SQL. Ou seja, você aprendeu
como fazer a criação de tabelas, índices para determinados atributos das tabelas e fazer a
manutenção de tudo que foi criado em termos de esquema (definição da tabela). Agora, que
as tabelas já estão criadas, resta saber como inserir dados nas mesmas, como atualizar ou
deletar esses dados inseridos, além de como fazer para buscar informações em uma ou mais
tabelas através de consultas simples ou aninhadas. É justamente isto que você irá estudar
neste capítulo.
39
Banco de Dados
Vamos aos exemplos. Suponha que você deseje inserir um registro na tabela Autor.
Comentário
Como ficaria?
35
Observe que, como INSERT INTO Autor ( CodAutor, Nome, Nascimento )
mencionado, valores
do tipo caracter e VALUES (112, ‘C. J. Date’, ‘03/12/1941’35);
valores do tipo DATE
Lembrando que a ordem dos valores deve ser a mesma ordem dos atributos para
devem vir entre
apóstrofos. que sejam inseridos nos lugares corretos. Agora, vamos inserir um registro na tabela Editora.
INSERT INTO Editora( CodEditora, Razao, Endereco, Cidade )
VALUES (1, ‘Editora Campus’, ‘R. Sete de Setembro,111’, ‘Rio de Janeiro’);
Depois de preenchida as tabelas base (que não dependem de nenhuma outra),
Comentário
vamos colocar um registro na tabela Livro, que depende de valores cadastrados nas duas
tabelas anteriores
36
Lembre que, quando
não especificamos a INSERT INTO Livro36
ordem dos atributos,
é tomada a ordem de VALUES (‘Introdução a Sistemas de Banco de Dados’, 11237, 138, NULL39, ‘2000’);
criação dos atributos
na tabela. Assim, os Chamamos a atenção para o fato que, na Tabela Livro, o código do autor e o código
valores dos atributos da editora são chaves estrangeiras e, para que tudo dê certo, os valores utilizados, aqui, no
deveriam vir nessa
insert, devem existir anteriormente nas tabelas de origem das chaves estrangeiras, no caso,
mesma ordem de
criação que está nas tabelas Autor e Editora.
especificada no
esquema da tabela
Para finalizar os exemplos, vamos fazer a criação de uma nova tabela no nosso
Livro, do modelo modelo, chamada AUTOR_JOVEM com os mesmos campos da tabela AUTOR. Depois,
relacional exemplo. vamos inserir nesta nova tabela os autores da tabela AUTOR com nascimento posterior a
01/01/1980. Como ficariam os comandos SQL para realizar essas ações? Comecemos pela
Comentário criação da nova tabela.
CREATE TABLE AUTOR_JOVEM (
37
112 é o código do
autor anteriormente CodAutor INTEGER NOT NULL,
cadastrado. Nome CHAR(50) NOT NULL,
Nascimento DATE NOT NULL,
Comentário
PRIMARY KEY (CodAutor),
38
O Valor 1 é o UNIQUE (Nome, Nascimento) );
código da editora
Agora vamos preencher essa tabela com os autores com nascimento posterior a
anteriormente
cadastrada. 01/01/1980.
INSERT INTO AUTOR_JOVEM
40
Banco de Dados
Comentário
Atualizando Dados em Tabelas
39
Como o atributo
Para modificar o valor de atributos de uma ou mais tuplas (linhas), dependendo VALOR pode receber
valores nulos (ele não
dos critérios de seleção de quem será modificado, o comando UPDATE deve ser utilizado. A
é NOT NULL) pela
sintaxe desse comando é: definição feita na
tabela, no capítulo
UPDATE nome_tabela SET lista_atributos com atribuições de valores anterior, podemos
[WHERE condição de seleção das tuplas a serem modificadas] preenchê-lo com o
valor NULL.
Onde: nome_tabela - é a indicação da tabela em que se deseja efetuar a atualização
dos registros;
Comentário
lista_atributos com atribuições de valores – É a indicação de quais atributos
deverão ser atualizados e por qual valor. Esse trecho deve ter o seguinte formato: nome_ 40
Aqui fazemos a
atributo1 [, nome_atributo2, ....] = {valor ou expressão } seleção dos autores
com nascimento maior
A cláusula WHERE especifica quais dados da coluna serão alterados. Quando que 01/01/1980.
a cláusula WHERE (que é opcional) é omitida, o UPDATE deve ser aplicado a todas as Veremos o comando
tuplas da relação. Ou seja, todas as tuplas da relação serão modificadas. Por exemplo: se SELECT , o mais
importante da DML,
desejássemos reajustar o valor de todos os livros em 10%, usaríamos o seguinte comando: em detalhes, mais à
frente.
UPDATE LIVRO SET Valor = Valor * 1.141
Como no comando acima não foi especificada uma cláusula WHERE, todos os livros Comentário
cadastrados na tabela LIVRO seriam atualizados. Agora, vamos supor que desejássemos
alterar o endereço e a cidade da editora com CodEditora = 10. 41
O valor antigo
UPDATE EDITORA SET endereco = ‘Av. N.S. de Fátima, 456’, cidade = ‘João Pessoa42’ de cada livro vai
receber o valor antigo
WHERE CodEditora = 1; aumentado de 10%
Aqui não seriam atualizadas todas as editoras da tabela EDITORA, mas apenas a (representado na
fórmula pelo 1.1)
editora de código 10.
A cláusula WHERE aceita como condição um comando SELECT. Daremos mais detalhes do que pode Comentário
vir em uma cláusula WHERE mais à frente. Aguarde...
42
Veja que apenas
os campos endereço
Exluindo Dados de Tabelas e cidade, como
solicitado, seriam
atualizados. Os
Para excluir linhas (que satisfaçam uma determinada condição) de uma ou mais novos valores para os
tabelas, usa-se o comando DELETE FROM, cuja sintaxe é: atributos vêm entre
apóstrofos porque são
DELETE FROM Nome_Tabela do tipo caracter.
[WHERE Condição43]
Se omitirmos a cláusula WHERE, então o DELETE será aplicado a todas as tuplas Comentário
da relação, ou seja, TODOS os registros da tabela serão deletados (cuidado com esse
comando!). Porém, a tabela permanece no BD como uma tabela vazia. Por exemplo, o 43
A cláusula WHERE
especifica quais
comando: DELETE FROM LIVRO; Deletaria todos os registros da tabela livro, deixando a
linhas da tabela serão
mesma vazia. Vale ressaltar que a tabela (seu esquema) permanece. Logo, esse comando excluídas.
não é equivalente ao DROP TABLE (que apagaria o esquema da tabela do banco de dados e,
por consequência, todos os dados da tabela seriam deletados juntamente).
Quando a cláusula WHERE é especificada, apenas os registros que obedecem a
condição estabelecida são deletados. Por exemplo, excluir os registros da tabela Autor cujo
41
Banco de Dados
Comentário
Consultando Dados em Tabelas
44
Você pode
especificar os atributos Chegamos, agora, no comando mais importante da SQL por ser o utilizado com mais
desejados frequência: o SELECT. Este comando se tornou o mais importante da linguagem SQL devido
ao seu poder de consulta. Pois com ele poderemos realizar, entre outras coisas, consultas
em uma ou mais tabelas, realizar consultas aninhadas, fazer a aplicação de funções pré-
existentes e utilizar operações relacionais (união, diferença, interseção e, obviamente,
seleção) com extrema simplicidade na manipulação das tabelas. A estrutura básica do
Comentário comando SELECT é:
43
Banco de Dados
Outra opção seria selecionar apenas alguns atributos das editoras. Para isso, é
necessário, na cláusula SELECT, especificar os nomes dos atributos que se deseja na tabela
resultante. Por exemplo, selecionar a razão e a cidade de todas as editoras cadastradas.
SELECT razao, cidade FROM Editora;
Esse comando resultaria na Tabela 31, uma vez que apenas os atributos razão e
cidade foram selecionados. Porém, observe que todas as tuplas da tabela aparecem, pois
não há condição de filtragem.
Razao Cidade
Bookman Recife
44
Banco de Dados
Uma coluna (atributo) também pode ser especificada, colocando antes dele o nome
de sua tabela (útil apenas quando existem atributos de nomes iguais em tabelas diferentes
– veremos mais à frente, quando estudarmos a opção de consulta em mais de uma tabela).
Exemplo:
SELECT Editora.razao, Editora.cidade FROM Editora47;
Uma coluna pode ser renomeada durante a consulta usando a cláusula AS, da Comentário
seguinte forma: NomeColuna AS NomeColunaRenomeada. O que mudaria com isso? O
nome da coluna renomeada seria a que iria aparecer na tabela resultante (vide Tabela 32), 47
A relação resultante
seria também a Tabela
ao invés do nome original da coluna. Por exemplo, selecionar a razão de todas as editoras
31.
cadastradas, chamando a razão de nome_empresa.
SELECT razao AS Nome_empresa FROM Editora;
Sextante
48
Observe que na
relação resultante o
Fantasy nome da coluna que
aparece é o nome
Bookman dado a coluna com a
renomeação.
Arquitetura de BD 220,00
O Conhecido 110,00
BD Distribuídos 196,00
Comentário
45
Banco de Dados
O Estranho 40.50
Sucesso 31.50
Arquitetura de BD 99,00
O Conhecido 55,00
Comentário
BD Distribuídos 98,00
51
Como o ALL é o
default, ele não precisa
ser especificado.
Em SQL a eliminação de linhas duplicadas não é feita automaticamente, devendo a
Logo, esse comando mesma ser especificada explicitamente, se desejada. Para isso usamos a cláusula DISTINCT
é equivalente ao no SELECT. Pois, se ela não for especificada, o padrão é ALL, ou seja, selecionar tudo,
anterior.
inclusive valores repetidos. Por exemplo, selecionar todas os anos de publicação de livros
da tabela LIVRO, resultaria na relação da tabela 34, onde podem ser observados valores
reptidos.
SELECT ALL Ano_Publicacao FROM Livro; ou
SELECT Ano_Publicacao51 FROM Livro;
Comentário Ano_Publicacao
2009
52
Com esse comando,
se houvesse , por 2010
exemplo, duas ou
2000
mais cidades RECIFE
cadastradas na tabela 2007
Editora, esse valor
seria apresentado 2009
na tabela resultante
apenas uma única vez. 2010
Na cláusula SELECT, é possível utilizar funções de agregação (vide Tabela 37), para
46
Banco de Dados
Funções de Agregação
AVG Calcula a média dos valores selecionados
MIN Calcula o menor valor entre os selecionados
MAX Calcula o maior valor entre os selecionados
COUNT Conta quantos valores foram selecionados
SUM Calcula o somatório dos valores selecionados
Essas funções são utilizadas logo após o SELECT no local de especificação dos
atributos a serem projetados na seleção. O resultado do uso dessas funções é uma tabela,
contendo apenas o valor calculado. Vamos dar alguns exemplos.
MAX (Valor)
150,00
MIN (Valor)
35,00
3 55
Nessa cláusula, o
COUNT conta quantas
tuplas existem na
tabela AUTOR. O AS
» Somar todos os valores dos livros cadastrados renomeou a coluna
SELECT SUM (Valor) FROM LIVRO; para QUANTIDADE..
SUM (Valor)
493,00
47
Banco de Dados
Comparação
48
Banco de Dados
Se se desejasse os livros fora do intervalo (ou seja, mais baratos que 50 e mais caros
que 100), seria usada a cláusula NOT (Resultado na Tabela 40).
SELECT * FROM LIVRO
WHERE Valor NOT BETWEEN 50.00 AND 100.00;
56
O caracter
especial usado para
WHERE atributo [N OT] LIKE ‘padrão’ representação de
padrões muda de
Esta cláusula busca por padrões em atributos do tipo CHAR. A condição é satisfeita,
SGBD para SGBD.
quando o valor do atributo é igual ao valor do padrão. Caracteres especiais56 são
utilizados para construção do padrão, tais como:
“%” ou “*” → Usados para representar zero ou mais caracteres. Comentário
“_” ou “?” → Usados para representar um único caractere.
57
Observe que o
[a-f]: busca por qualquer caractere entre ´a´ e ´f´ (usado no SQL-Server). padrão vem entre
apóstrofos. Observe
Vamos dar alguns exemplos. Selecionar todos os livros cujo título tenha 7 caracteres também que é usada
e inicie com a letra S (resultado na Tabela 41). uma interrogação (?)
para cada caractere do
SELECT * FROM Livro WHERE TitLivro LIKE ‘S??????’57; nome. Como se deseja
que a letra S seja a
Tabela 41 - Relação Resultante primeira. Ela vem
escrita no padrão.
TitLivro (PK) CodAutor (FK) CodEditora (FK) Valor Ano_Publicacao
49
Banco de Dados
Da mesma forma que se usa o LIKE, também pode ser usado o NOT LIKE. Neste
último caso, é devolvida na consulta os valores que NÃO obedecem ao padrão
especificado. Uma observação importante é que LIKE e NOT LIKE só se aplicam
sobre atributos do tipo CHAR.
» WHERE atributo IS [NOT] NULL
Essa cláusula testa a existência de valores nulos (NULL) ou não nulos (NOT NULL).
Ele faz com que a consulta retorne as tuplas da relação cujo atributo em questão
seja nulo ou não nulo, conforme a cláusula sendo utilizada. Para dar exemplo de
uso dessa cláusula, vamos supor que a relação LIVRO seja a da tabela 43. Assim,
vamos realizar a seguinte consulta: selecionar todos os livros que estão sem preço
definido (resultado na Tabela 44).
50
Banco de Dados
Diz-se que tabelas estão relacionadas se tiverem campos comuns (em uma tabela
chave primária e em outra chave estrangeira). O efeito do JOIN é a criação de uma tabela
temporária em que cada par de linhas (de tabelas diferentes) que satisfaça a condição de
ligação, seja interligada para formar uma única linha.
A ligação é sempre estabelecida na cláusula WHERE, através da igualdade de
campos de tabelas diferentes, tabelas essas que precisam ter sido especificadas na cláusula
FROM. O FROM estabelece o produto cartesiano entre as tabelas listadas e a cláusula WHERE
filtra as linhas úteis, segundo a condição especificada. É possível misturar as cláusulas de
comparação, vistas anteriormente, juntamente com AND, OR e NOT para formar condições
de ligações mais complexas.
Vamos aos exemplos, para deixar tudo mais claro. Selecione todos os títulos dos
livros e o nome de seus respectivos autores. Veja que, para responder a essa consulta, não
seria possível consultar apenas a tabela livro, pois esta não possui o nome do autor, mas
apenas o código do mesmo. Para obter o nome do autor, seria necessário fazer um JOIN das
tabelas LIVRO e AUTOR. Então, como fazer isso? Fazendo a igualdade entre os campos que Comentário
as tabelas possuem em comum:
61
Para cada atributo
SELECT autor.Nome, livro.TitLivro FROM autor, livro61 identificamos a qual
tabela ele pertence.
WHERE autor.Cod_Autor = livro.CodAutor;
Para evitar escrever o nome completo da tabela na frente de cada atributo, para
deixar mais claro a que tabela cada atributo pertence durante o JOIN, podemos dar apelidos
51
Banco de Dados
às tabelas. Para ilustrar, vamos apresentar o mesmo exemplo anterior modificado para usar
os apelidos:
SELECT AU.Nome, LI. TitLivro FROM AUTOR AU, LIVRO LI
WHERE AU.Cod_Autor = LI.CodAutor;
Em ambas as consultas, a relação resultante é a apresentada na Tabela 47.
TitLivro Nome
No JOIN podem ser unidas duas ou mais tabelas. Para se ligar várias tabelas, usa-se
o operador lógico AND entre as condições do JOIN. Vamos dar outro exemplo. Selecionar
todos os nomes de autores, o título dos seus livros e a razão das editoras, considerando
os livros que custem mais de 50 reais e cujas editoras sejam Fantasy ou Bookman. Veja
que, para responder a essa consulta, precisamos fazer um JOIN entre as três tabelas: Livro
(considerar a da Tabela 43), Autor e Editora.
SELECT AU.Nome, LI. TitLivro, ED.Razao
FROM autor AU, livro LI, editora ED
WHERE AU.Cod_Autor = LI.CodAutor AND
LI.CodEditora = ED.Cod_Editora AND
LI.Valor > 50,00 AND
ED.Razao IN (‘Fantasy, ‘Bookman’) ;
O resultado desta consulta pode ser observado na Tabela 48.
Observação
É preciso ter muito cuidado com os JOINs, pois exigem alto custo de execução (implicam
diretamente na performance). Além disso, quando os JOINs forem utilizados, deve-se ter cuidado
para fazer corretamente a montagem da condição de junção.
52
Banco de Dados
Subconsultas (Sub-Queries)
Neste caso, a subconsulta deve retornar uma única tupla. Para isso, podem-se usar
as funções de agregação (AVG,MIN,MAX,...). Esse tipo de subconsulta é utilizado para fazer
a comparação elemento-elemento e tem o seguinte formato:
WHERE expressão {= | <> | > | >= | < | <=} (Subconsulta)
Onde: subconsulta é outra consulta (SELECT) que pode conter qualquer uma das
cláusulas anteriormente estudadas. Por exemplo, selecionar os títulos dos livros mais caros
que a média de preço dos livros. Veja que primeiro precisamos calcular a média de preço
dos livros para depois buscar por aqueles livros que têm seu preço acima da média. Logo, a
maneira de fazer isso é usando uma subconsulta, como veremos a seguir:
SELECT TitLivro FROM Livro
WHERE Valor > (SELECT AVG (Valor) FROM Livro) ;
Na execução da subconsulta, seria calculado o valor da média dos livros (a partir da
Tabela 43), que seria o valor 60. Depois, a mesma tabela seria avaliada pela consulta externa,
para obter os títulos de livros cujos valores fossem maiores do que a média calculada na
subconsulta, resultando na Tabela 49.
TitLivro
Banco de Dados
Arquitetura de BD
53
Banco de Dados
Nome Nascimento
» WHERE expressão { = | <> | > | >= | < | <= } ANY (Sub-consulta) – o ANY verifica se a
condição de comparação é verdadeira para pelo menos um dos valores retornados
pela subconsulta. Por exemplo, selecionar o nome de todos os autores, exceto o do
mais idoso (resultado na Tabela 51).
SELECT Nome FROM Autor
WHERE Nascimento < ANY (SELECT Nascimento FROM Autor)
Nome Nascimento
» WHERE expressão { = | <> | > | >= | < | <= } ALL (Sub-consulta) - verifica se a
condição é verdadeira para todos os valores retornados pela subconsulta. É o
oposto de ANY. Por exemplo, selecionar o titulo dos livros que têm valor maior que
todos os livros da editora Sextante (resultado na Tabela 52).
SELECT TitLivro FROM Livro
WHERE Valor > ALL (SELECT Valor FROM Livro Li, Editora Ed
WHERE Ed.Razao = ‘Sextante’ AND
Li.CodEditora = Ed.Cod_Editora);
TitLivro (PK)
Banco de Dados
Arquitetura de BD
54
Banco de Dados
Quando na comparação é utilizado <> ALL, a cláusula passa a ter o mesmo efeito
que a cláusula NOT IN.
Nome
Pedro Alves
Olívia Duncan
Ordenando Resultados
Para ordenar os resultados das consultas pelos valores de uma ou mais colunas
(atributos), utiliza-se a cláusula ORDER BY. As linhas são ordenadas pela primeira coluna
(atributo) especificada após o ORDER BY. Quando as linhas de uma coluna possuem valores
iguais, estas serão classificadas pelo valor da segunda coluna especificada após o ORDER BY
e assim por diante. Há dois tipos de ordenação:
Nome Nascimento
55
Banco de Dados
Agrupando Resultados
Razao AVG(Livro.Valor)
Sextante 50,00
Fantasy NULL
Bookman 86,66
Observe que a relação resultante (Tabela 55) apresenta cada editora apenas
uma vez e a média dos livros de cada uma delas. Em outras palavras, a relação resultante
apresenta as tuplas da relação Livro separadas em grupos (de acordo com as editoras) e a
função AVG é aplicada a cada grupo separadamente.
Vamos dar outro exemplo. Contar quantos livros foram publicados por ano de
publicação (vide resultado na Tabela 56).
SELECT Ano_Publicacao, COUNT(Ano_Publicacao) FROM Livro
GROUP BY Ano_Publicacao
ORDER BY Ano_Publicacao;
Ano_Publicacao COUNT(Ano_Publicacao)
2000 1
2007 1
2009 2
2010 2
Até agora, usamos funções de agregação. Agora, vamos dar um exemplo de uso do
56
Banco de Dados
GROUP BY sem fazer uso de funções de agregação: Selecionar o nome do autor, o título do
livro e seu valor, organizados de acordo com seu autor. O resultado desta consulta pode ser
visualizado na Tabela 57. Veja que
SELECT Autor.Nome, Livro.TitLivro, Livro.Valor FROM Autor, Livro
WHERE Autor.Cod_Autor=Livro.CodAutor
GROUP BY Autor.Nome;
57
Banco de Dados
restringir as linhas que serão selecionadas para a formação dos grupos. Enquanto a cláusula
HAVING é usada para restringir os grupos já formados, ou seja, ela só é atendida depois do
agrupamento realizado.
A cláusula HAVING só pode ser utilizada em conjunto com a cláusula GROUP BY.
Ou seja, ela só existe se associada à cláusula GROUP BY (mas o oposto não). Assim, ela vem
depois do GROUP BY e antes do ORDER BY. A condição do HAVING só pode envolver os
campos/funções do SELECT. Vamos a um exemplo: Selecione o código das editoras cujo
preço médio dos livros é maior do que 60. Veja que, nesse caso, primeiro tem de ser feito
o agrupamento (para poder calcular o preço médio dos livros por editora) e depois é que
a condição deverá ser aplicada, para indicar quais dos grupos deverão ser apresentados
na relação resultante. Esse é um caso típico de uso do HAVING. A relação resultante da
consulta, sem usar a cláusula HAVING, seria a da Tabela 59. Porém, com o uso do HAVING,
os grupos resultantes seriam restritos aos apresentados na Tabela 60.
SELECT CodEditora, AVG (Valor) AS MediaValor FROM LIVRO
GROUP BY CodEditora
HAVING MediaValor > 60
ORDER BY CodEditora;
CodEditora MediaValor
1 50,00
2 NULL
3 86,66
CodEditora MediaValor
3 86,66
Outro exemplo seria: Selecionar o nome dos autores que publicaram mais de 2
livros. Vide a relação resultante na Tabela 61.
SELECT Autor.Nome, COUNT (DISTINCT Livro.TitLivro) FROM Livro, Autor
WHERE Autor.Cod_Autor = Livro.CodAutor
GROUP BY AUTOR.Nome
HAVING COUNT (DISTINCT LIVRO.Titulo) > 2;
Pedro Alves 3
58
Banco de Dados
Essas operações são úteis em queries que referenciam diferentes tabelas. Essas operações
combinam resultados de dois ou mais comandos select em um único resultado. Por isso, são
também conhecidos como joins verticais.
União (UNION)
59
Banco de Dados
Interseção (INTERSECT)
Retorna apenas as linhas que pertencem às duas relações resultantes, se elas forem
compatíveis, sem repetição. Por exemplo, selecionar o nome de todas as pessoas que são
médicos e pacientes ao mesmo tempo.
(SELECT Nome FROM Medico)
INTERSECT
(SELECT Nome FROM Paciente);
Selecionar todos os clientes da agência A1 com empréstimo e depósito.
(SELECT * FROM Depositante WHERE Agencia = ‘A1’)
INTERSECT
(SELECT * FROM Devedor WHERE Agencia = ‘A1’);
Retorna apenas as linhas que pertencem à primeira tabela, com exceção das que
aparecem na segunda. Em outras palavras, retorna somente as linhas da primeira query
(consulta) que não estão presentes no resultado da segunda query. Por exemplo, selecionar
o nome de todas as pessoas que são médicos e não são pacientes.
(SELECT Nome FROM Medico)
EXCEPT
(SELECT Nome FROM Paciente);
Selecionar todos os clientes da agência A1 que possuem conta, mas não fizeram
empréstimo.
(SELECT * FROM Depositante WHERE Agencia = ‘A1’)
EXCEPT
(SELECT * FROM Devedor WHERE Agencia = ‘A1’);
Manipulando Visões
Visões são tabelas virtuais que não ocupam espaço físico e são criadas a partir de
tabelas reais. Elas permitem criar tabelas personalizadas, de acordo com o perfil do usuário.
Visões são ótimas para substituir consultas frequentemente usadas. Para criar uma visão,
utilizamos o seguinte comando:
CREATE VIEW Nome_Visão [Colunas_visão] AS
(ExpressãoConsultaPreenchimentoVisao)
Por exemplo, criar uma visão com os clientes que têm conta ou empréstimo no
banco.
CREATE VIEW TodosClientes AS
(SELECT * FROM Depositante)
UNION
(SELECT * FROM Devedor);
Outro exemplo: criar uma visão com os livros da editora Bookman com 10% de
desconto.
60
Banco de Dados
A DCL cuida das autorizações de acesso. Isso porque um SGBD Relacional pode ser
acessado por diversos usuários e cada usuário possui um determinado perfil em relação
aos dados das tabelas ou visões. Alguns usuários só podem consultar, outros atualizar e
consultar, outros só inserir, outros podem tudo (por exemplo, o DBA), etc.
O objetivo dos comandos da DCL é proteger os dados do uso indevido de qualquer
usuário através da configuração de privilégios por usuário. Os privilégios garantem
segurança e integridade dos dados, bem como a responsabilidade de cada usuário sobre
seus dados específicos. Dois comandos fazem parte da DCL: GRANT e REVOKE.
O comando GRANT atribui privilégios de utilização de tabelas ou visões de uma
base de dados. A sintaxe desse comando é:
GRANT Privilégios ON Tabelas/Visões TO LoginUsuários
Os privilégios podem ser:
Considerações Finais
Pronto! Agora você tem o poder de criar, manipular, deletar e consultar o seu banco
de dados. Porém, para que o SQL se torne mais familiar para você e você consiga utilizar com
mais facilidade os comandos e realizar consultas simples e aninhadas, você precisa praticar
bastante. Por isso, é importante a escolha de um SGBD onde você possa implementar o
banco de dados modelado em capítulos anteriores e possa inserir, atualizar e consultar os
dados desse banco de dados. A prática é a chave para o sucesso, não esqueça disso!
Conheça Mais
BEIGHLEY, Lynn. Use a Cabeça SQL. Starlin Alta Consult, 1ª Edição, 2008
KLINE, Daniel; KLINE, Kelvin E. Sql - O Guia Essencial - Manual de Referência
Profissional. Alta Books, 2010.
SHELDON, Robert; OPPEL, Andy. SQL – Um Guia para Iniciantes. Editora Ciência
Moderna, 3ª Edição, 2009.
62
Banco de Dados
DAMAS, Luís. Sql - Structured Query Language. Editora LTC, 6ª edição, 2007.
Aprenda Praticando
Tomando como base as tabelas abaixo, vamos executar algumas consultas SQ.
PRODUTO
PRODUTOS_PEDIDO
111 001 02
111 002 03
111 003 02
222 002 03
222 003 05
222 004 10
333 004 03
PEDIDO
111 10/02/2010 F1
222 23/03/2010 F2
333 20/05/2010 F1
63
Banco de Dados
FORNECEDOR
F1 InfoSoft R. Flor, 25
Junções (JOINS) são usadas em boa parte das consultas reais. Por isso, vamos
ilustrar alguns casos de junção.
a) Apresentar o número do pedido e o total a pagar por ele para todos os pedidos
realizados.
SELECT PP.Numero, SUM(P.Valor * PP.Qtd) AS Valor_Total FROM Produto P,
Produtos_Pedido PP GROUP BY PP.Numero;
o) Selecione o nome dos produtos que estão fazendo parte de pelo menos um pedido.
SELECT P.Nm_prod FROM Produto P WHERE P.Cod_Prod IN (SELECT DISTINCT
PP.Cod_Prod FROM Produtos_Pedido PP);
65
Banco de Dados
Você Sabia?
Você sabia que a ordem em que as consultas SQL são construídas pode influenciar no desempenho
do SGBD? Pois é! Influencia sim. Para ter consultas mais otimizadas, seguem alguns conselhos:
» No tocante à modelagem e projeto do BD (Se não for muito tarde): Uma má performance
pode também ser resultado de uma modelagem ruim. É importante se preocupar com a
modelagem correta do problema e em realizar a normalização do modelo relacional produzido
pelo menos até a 3FN (Terceira Forma Normal).
» Use índices, mas não os crie em demasia. Muitos índices podem resultar em um efeito
adverso no desempenho.
» Procure no SELECT selecionar, exclusivamente, os atributos de que você necessita na
consulta. Procure não utilizar SELECT * porque o gerenciador de consultas deve ler primeiro a
estrutura da tabela antes de executar a sentença.
» Se utilizar várias tabelas na consulta (JOINs), especifique sempre a que tabela pertence cada
campo (atributo). Isso fará o gerenciador de consultas economizar o tempo de localizar a que
tabela pertence o campo. Por exemplo, ao invés de:
› SELECT Nome, Fatura FROM Cliente, Faturamento WHERE IdCliente = IdClienteFaturado,
procure sempre utilizar:
› SELECT Cliente.Nome, Faturamento.Fatura FROM Cliente, Faturamento WHERE
Cliente.IdCliente = Faturamento.IdClienteFaturado.
» Sempre que possível, procure usar nas condições da cláusula WHERE aqueles campos que
fazem parte da chave da relação ou relações sendo consultada(s).
» Quando for usar operadores de comparação, evite usar NOT em condições de pesquisa. Eles
podem diminuir a velocidade de recuperação de dados porque todos os registros em uma tabela
são avaliados. Sempre use condições de pesquisa positivas ao invés de negativas. As condições
de pesquisa negativas, tais como NOT BETWEEN, NOT IN e IS NOT NULL, atrasam as consultas.
» Utilize ORDER BY, GROUP BY e HAVING apenas se necessário, pois um tempo a mais é gasto
para organizar os dados da tabela resultante.
» Ao fazer a montagem da cláusula WHERE, é interessante que a condição mais restritiva
seja avaliada em 1º lugar, uma vez que será retornado um subconjunto menor de dados.
Principalmente, se for haver um JOIN, já restringir a quantidade de dados antes do JOIN pode
garantir uma melhora no desempenho. A maioria dos otimizadores lê uma consulta da parte
inferior da clausula WHERE para cima. Nesse caso, a condição mais restritiva deve ficar por
último na clausula WHERE. Adicionalmente, quando se utilizam várias tabelas dentro da consulta
há que ter cuidado com a ordem das tabelas na cláusula FROM. Se desejarmos saber quantos
alunos se matricularam no ano 1996 e escrevermos:
› FROM Aluno, Matricula WHERE Aluno.IdAluno = Matricula.IdAluno AND Matricula.
Ano = 1996 - o gerenciador percorrerá todos os alunos para buscar suas matrículas e
devolver as correspondentes. Porém, se escrevermos:
› FROM Matricula, Aluno WHERE Matricula.Ano = 1996 AND Matricula.IdAluno = Aluno.
IdAluno - o gerenciador filtra as matrículas e depois seleciona os alunos, desta forma tem
que percorrer menos registros, melhorando o desempenho.
Nem sempre lembramos dessas recomendações, quando estamos montando os SQLs. Porém, é
recomendado que você procure otimizar, pelo menos, os SQL mais críticos (mais utilizados ou
que envolvam mais tabelas). Por exemplo, revisando os SQLs montados em um programa antes
dele ir para produção.
Agora é a sua vez de fazer as atividades! Lembre que praticar é muito importante
para fixar o conteúdo estudado! SQL, tal como qualquer linguagem de programação, só se
aprende exercitando!
66
Banco de Dados
Simulado:
67
Banco de Dados
1 1 1
1 2 2
1 3
1 4
2 1
2 2
3 2
4 2
4 4
1 1 1 1 1
2 1 2 2 1
2 1 3 3 1
2 2 3 3 2
4 2 4 4 3
4 3 4 4 4
4 4 4
69
Banco de Dados
Sobrenome
Francisco
Inácio
TABELA CAMPOS
Há uma chave estrangeira de VENDA para CLIENTE com base nos campos CODIGO_C
e de VENDA para PRODUTO com base nos campos CODIGO_P. O campo CPF é chave
candidata para CLIENTE e também é armazenado na tabela VENDA. Os campos
NOME e DESCRICAO também são chaves candidatas de suas respectivas tabelas.
Os campos CIDADE, PRECO, DATA e QUANTIDADE admitem valores repetidos.
Considere o comando em SQL apresentado a seguir.
SELECT C.CIDADE, AVG(P.PRECO) FROM CLIENTE C, PRODUTO P, VENDA V
WHERE C.CODIGO_C = V.CODIGO_C AND
P.CODIGO_P = V.CODIGO_P AND
P.PRECO > 100
GROUP BY C.CIDADE
HAVING AVG(P.PRECO) < 200
a) Para cada cidade, a média de preço de produtos vendidos a clientes da cidade
com valores acima de 100, se a média for menor que 200.
b) Para cada cidade, a média de preço dos produtos vendidos a clientes da cidade
com valores entre 100 e 200.
c) Para cada cidade, a quantidade de produtos vendidos com valores entre 100 e
200.
d) Para cada cidade, a média de preço dos produtos vendidos a clientes da cidade
que compraram produtos de valores maiores do que 100 e cuja média de
compra é menor do que 200.
e) Apenas a cidade cuja média de preço dos produtos vendidos é a mais alta
dentre as que tiveram média menor do que 200 e produtos vendidos com
valores acima de 100.
12) (Analista Judiciário – Análise de Sistemas - Suporte /TJ-PA/FCC/2009) Dada uma
linha de tabela relacional:
TABELA: Turma_Alunos
Num_Aluno Number 16
71
Banco de Dados
Empresa Faturamento
Anabiotíca 190.044,09
Petrobana 234.511,23
Canalservice 123.387,34
Anablematica 734.576,00
72
Banco de Dados
73
Banco de Dados
Vamos Revisar?
Neste capítulo, foi estudada a DML (Data Manipulation Language), que é a parte da
linguagem SQL que possui comandos para manipulação de dados. Ou seja, possui comandos
para inserção (INSERT), atualização (UPDATE), deleção (DELETE) e consulta (SELECT) aos
dados. Adicionalmente, neste capítulo, também foram vistas operações com conjuntos de
dados, tais como união (UNION), interseção (INTERSECT) e exceção (EXCEPT) e, brevemente,
a DCL (Data Control Language), que contém comandos para autorizar ou não o acesso aos
dados (GRANT e REVOKE, respectivamente).
74
Banco de Dados
Considerações Finais
Olá, cursista!
Esperamos que você tenha aproveitado este quarto e último módulo da disciplina
Banco de Dados, assim como a disciplina como um todo.
Com tudo que foi estudado nesta disciplina, você já tem o conhecimento necessário
para modelar, projetar, criar o seu banco de dados e trabalhar com ele, armazenando,
alterando, deletando e consultado os dados armazenados. Claro que o aprimoramento
desse conhecimento adquirido recentemente só virá com a prática e com leituras adicionais
para aprofundamento. Assim sendo, quem quiser saber mais sobre banco de dados ou
quiser trabalhar com os mesmos, aproveite as referências indicadas em cada capítulo e
bons estudos! Adicionalmente, procure fazer uso de algum SGBD para praticar o uso de SQL
e divirta-se!
Foi um prazer ter estado com vocês nessa jornada de conhecimento!
Até mais!
Sandra de Albuquerque Siebra
Autora
75
Banco de Dados
Referências
76
Banco de Dados
Conheça a Autora
77