Buscar

FBD 08 SQL Avancado

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 120 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 120 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 120 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

SQL Avançado 
 
 
Regis Pires Magalhães 
regispires@lia.ufc.br 
Renomeação de atributos e relações 
• Acrescentar o qualificador AS seguindo pelo 
novo nome desejado. 
• AS é usado para apelidar os nomes tanto do 
atributo, quanto da relação. 
Comparações envolvendo NULL 
• Significados de NULL 
▫ Valor desconhecido. 
▫ Valor indisponível ou retido. 
▫ Atributo não aplicável. 
• Ao usar NULL em uma comparação, SQL usa 
uma lógica de três valores para determinar se 
uma expressão envolvendo AND, OR e NOT é 
verdadeira ou falsa. 
Conectivos lógicos na lógica de três 
valores 
Comparações envolvendo NULL 
• Consultas podem checar se um atributo é NULL: 
▫ IS NULL 
▫ IS NOT NULL 
 
Consultas 
• Checando valores nulos 
▫ Predicado IS [NOT] NULL 
▫ Exemplo 
select * from Empregado 
where dt-nasc is null 
 
select * from Empregado 
where dt-nasc is not null 
 
Consultas 
• Predicado [NOT] IN 
 Verifica a pertinência de elementos em um conjunto 
 Exemplo 
select nome 
from Empregado 
where matr in (1,5,8,9); 
 
select nome 
from Empregado 
where matr not in (1,5,8,9) 
 
 
8 
SQL 
• Funções Agregadas 
▫ Funções embutidas (built-in) aplicadas sobre uma coleção 
de valores (colunas) do banco de dados 
▫ sum 
 Retorna o somatório dos valores de uma coleção 
▫ avg 
 Retorna a média dos valores de uma coleção 
▫ max 
 Retorna o maior valor de uma coleção de valores 
▫ min 
 Retorna o menor valor de uma coleção 
▫ count 
 Retorna o número de elementos de uma coleção 
▫ Sintaxe 
 nome-da-função (ALL | DISTINCT nome-coluna) | count(*) 
 Não podem ser utilizados na cláusula WHERE 
SQL – Funções de agregação 
• COUNT 
▫ Retorna o número de tuplas ou valores. 
• SUM, MAX, MIN e AVG 
▫ Retornam, respectivamente, a soma, o valor 
máximo, o valor mínimo e a média desses valores. 
• Essas funções podem ser usadas nas cláusulas 
SELECT ou HAVING. 
SQL – Funções agregadas 
select pnome funcionario, count(*) numero_depend 
from funcionario, dependente 
where cpf=fcpf 
group by pnome; 
SQL – Funções agregadas 
• Achar a soma dos salários de todos os 
funcionários, o salário máximo, o salário 
mínimo e a média dos salários. 
SQL – Funções agregadas 
• Achar a soma dos salários de todos os funcionários do 
departamento ‘Pesquisa’, bem como o salário máximo, o 
salário mínimo e a média dos salários nesse departamento. 
SQL – Funções agregadas 
• Recuperar o número total de funcionários na 
empresa. 
SQL – Funções agregadas 
• Recuperar o número de funcionários no 
departamento ‘Pesquisa’. 
SQL – Funções agregadas 
• Contar o número de valores de salário distintos no 
banco de dados. 
16 
SQL 
• Exercícios 
▫ Encontre o número de empregados lotados no 
departamento de Informática 
 
 
 
▫ Encontre o montante da folha de pagamento da 
empresa 
 
 
▫ Encontre o salário médio pago pela empresa 
 
 
 
select count(*) 
from Empregados as e, Departamentos as d 
where e.id_dept=d.id and d.nome = ‘Informática’; 
select sum(salario) 
from Empregado 
select avg(salario) 
from Empregado 
17 
SQL 
• Agrupando tuplas no SQL 
▫ Aplicar funções agregadas a diferentes grupos de tuplas 
▫ Exemplo 
 Listar a quantidade de empregados por departamento 
▫ Cláusula 
 GROUP BY 
▫ Exemplo 
select id_dept, count(*) as quantidade_empregados 
from Empregados 
group by id_dept 
id_dept quantidade_empregados 
----------- -------------------- 
1 4 
2 2 
A função count é aplicada 
para o conjunto de tuplas 
de cada grupo 
SQL 
• Agrupando tuplas no SQL (cont.) 
▫ Todas colunas que aparecem na cláusula select têm 
que aparecer na cláusula group by 
 Exceto os argumentos da funções agregadas 
▫ Exemplo de sintaxe incorreta 
select lotacao, matr, count(*) from empregado 
group by lotacao 
▫ Exemplos 
 Lista de todos empregados e a quantidade de dependentes que 
cada um deles possui. 
 
SQL- Funções agregadas 
• Para cada departamento, recuperar o número do 
departamento, o número de funcionários no 
departamento e seu salário médio. 
SQL – Funções agregadas 
Agrupamento de tuplas FUNCIONARIO pelo valor de Dnr: 
SQL- Funções agregadas 
• Para cada projeto, recuperar o número do projeto, o 
nome do projeto e o número de funcionários que 
trabalham nesse projeto. 
SQL- Funções agregadas 
• Para cada projeto em que mais de dois funcionários 
trabalham, recupere o número e o nome do projeto e o 
número de funcionários que trabalham no projeto. 
Após aplicar a cláusula WHERE, mas 
antes de aplicar HAVING 
Grupos não 
selecionados 
pela condição 
HAVING 
Após aplicar a condição da cláusula 
HAVING 
SQL – Funções agregadas 
• Para cada projeto, recupere o número e o nome do projeto e 
o número de funcionários do departamento 5 que trabalham 
no projeto. 
26 
SQL 
• Agrupando tuplas no SQL (cont.) 
▫ Exemplos (cont.) 
 Listar maiores e menores salários de cada departamento 
 
 
 
 
 Totalizar a quantidade de itens vendidos por vendedor e por item, 
considerando o seguinte esquema 
 Vendedor(matr, nome, salário) 
 Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda) 
 Estoque(cod_item, referência, pr_compra,pr_venda,qtde) 
select d.nome, max(e.salario) as Maior_Salario, min(e.salario) as 
Menor_Salario 
from Departamento d, Empregado e 
where d.cod_dep=e.lotacao 
group by d.nome 
select v.nome, e.referência, sum(d.qtde) as total 
from Estoque e, Vendedor v, Vendas d 
where e.cod_item=d.cod_item and v.matr=d.matr 
group by v.nome, e.referência 
27 
SQL 
• Selecionando grupos 
▫ Listar nome dos departamentos cuja média salarial seja 
maior que 7000 
▫ Cláusula having 
 Filtro de grupos 
 Exemplo 
select d.nome, avg(salario) 
from Departamento d, Empregado e 
where d.cod_depart=e.lotacao 
group by d.nome 
 having avg(e.salario)>7000 
▫ Consulta com where e having 
 predicado da cláusula where é avaliado primeiramente 
 Tuplas que satisfazem o predicado são agrupadas pelo group by 
 Predicado da cláusula having é avaliado 
 Grupos que satisfazem o predicado aparecem no resultado 
28 
SQL 
• Selecionando grupos (cont.) 
▫ Exemplos 
 Listar nome e média salarial dos departamentos que possuem 
mais de 10 empregados lotados 
 
 
 
 
 Listar nome e quantidade de empregados dos departamentos 
cuja média salarial é maior que 5000 
select d.nome, avg(e.salario) as 
Média_Salarial 
from Departamento d, Empregado e 
where d.cod_dep=e.lotacao 
group by d.nome 
 having count(matr)>=11 
select d.nome, count(*) as Número_Empregados 
from Departamento d, Empregado e 
where d.cod_dep=e.lotacao 
group by d.nome 
 having avg(e.salario)>5000 
SQL 
• Selecionando grupos (cont.) 
▫ Exemplos 
 Listar nome de vendedores e quantidade de vendas efetuadas dos 
vendedores com volume de vendas superior a 10000 (classificado 
em ordem decrescente por quantidade de vendas), considerando o 
seguinte esquema: 
 Vendedor(matr, nome, salário) 
 Vendas(matr,cod_item,qtde, pr-venda,dt-hora-venda) 
 Estoque(cod_item, referência, pr_compra,pr_venda,qtde) 
select v.nome, count(*) as total_de_vendas 
from Vendedor v, Vendas d 
where v.matr=d.matr 
group by v.nome 
 having sum(d.qtde*d.pr_venda) > 10000 
order by count(*) 
Forma básica do comando SELECT 
SELECT <lista de atributos e funções> 
FROM <lista de tabelas> 
[ WHERE <condição> ] 
[ GROUP BY <atributos de agrupamento> ] 
[ HAVING <condição de agrupamento> ] 
[ ORDER BY <atributosde ordenação> ]; 
Consultas aninhadas 
• Blocos select-from-where dentro da cláusula 
WHERE de outra consulta (consulta externa). 
 
Consultas aninhadas 
Não aninhada 
Consultas aninhadas 
Aninhada 
Consultas aninhadas 
• Operador de comparação IN 
▫ Compara o valor v com um conjunto de valores V. 
▫ Resulta TRUE se v é um dos elementos em V. 
Consultas aninhadas 
• SQL permite o uso de tuplas de valores em 
comparações. 
▫ Devem ser escritas entre parênteses. 
select distinct Fcpf, pnr, horas 
from trabalha_em 
where (pnr,horas) in ( 
 select pnr,horas 
 from trabalha_em, funcionario 
 where fcpf='12345678966' 
); 
36 
SQL 
• Consulta SQL aninhada (subconsulta) 
▫ Consulta SQL especificada dentro de uma outra 
consulta SQL 
▫ Exemplo 
 Listar todos os empregados que têm salário maior que a 
média salarial da empresa 
 
select pnome,salario 
from funcionario 
where salario > (select avg(salario) from 
funcionario); 
37 
SQL 
• Consulta SQL aninhada (cont.) 
▫ Subconsulta escalar 
 Subconsulta que retorna apenas um valor (uma 
única linha e uma única coluna) 
 Pode aparecer na lista de argumentos da cláusula 
select e na cláusula where 
 Exemplo 
 Listar nome dos empregados com a quantidade de 
dependentes de cada empregado 
 
select pnome, (select count(*) from 
dependente where fcpf=cpf) 
from funcionario; 
38 
SQL 
• Consulta SQL aninhada (cont.) 
▫ Usando o Predicado [NOT] IN 
 Listar os CPFs dos funcionários que trabalham 
em projetos localizados em Maua. 
select distinct fcpf 
from trabalha_em 
where pnr in ( 
 select projnumero 
 from projeto 
 where projlocal='Maua' 
); 
Consultas aninhadas 
• É possível o uso de um conjunto explícito de 
valores na cláusula WHERE. 
Consultas aninhadas 
• Evite erros em ambiguidades criando apelidos (aliases) para 
todas as tabelas referenciadas em uma consulta SQL. 
Consultas aninhadas 
SQL – Funções agregadas 
• Para cada departamento que tem mais de cinco funcionários, 
recuperar o número do departamento e o número de seus 
funcionários que estão ganhando mais de R$ 40.000,00. 
Consultas aninhadas 
• Usar outros operadores de comparação para 
comparar um único valor v. 
• Operador = ANY (ou = SOME) 
▫ Retorna TRUE se o valor v é igual a algum valor no 
conjunto V e, portanto, é equivalente a IN. 
• Outros operadores que podem ser combinados com 
ANY (ou SOME): >, >=, <, <= e <>. 
• ALL também pode ser combinada com cada um 
desses operadores. 
▫ v > ALL V retorna TRUE se o valor v é maior do que 
todos os valores no conjunto V. 
Consultas aninhadas 
select distinct fcpf 
from trabalha_em 
where pnr = any ( 
 select projnumero 
 from projeto 
 where projlocal='Maua' 
); 
select distinct fcpf 
from trabalha_em 
where pnr = some ( 
 select projnumero 
 from projeto 
 where projlocal='Maua' 
); 
select distinct fcpf 
from trabalha_em 
where pnr in ( 
 select projnumero 
 from projeto 
 where projlocal='Maua' 
); 
Consultas aninhadas 
select pnome, salario 
from funcionario 
where salario <= ALL (select salario from 
funcionario); 
select pnome, salario 
from funcionario 
where salario = (select min(salario) from 
funcionario); 
Consultas aninhadas 
select pnome, salario 
from funcionario 
where salario >= ALL (select salario from 
funcionario); 
select pnome, salario 
from funcionario 
where salario = (select max(salario) from 
funcionario); 
Consultas aninhadas 
• Consulta para retornar os nomes dos funcionários 
cujo salário é maior do que o salário de todos os 
funcionários no departamento 5. 
Essa consulta também pode ser especificada usando a 
função de agregação MAX. 
48 
SQL 
• Consulta SQL aninhada (cont.) 
▫ Predicados SOME, ANY e ALL 
 Listar empregados que ganham salários maior ou 
igual a média salarial de um departamento 
 Sintaxe 
 expr  {SOME | ANY | ALL} (subconsulta) 
   {<, <=,>, >=, =, <>} 
 
select nome 
from Empregado 
where salário >=some (select avg(salário) from Empregado 
 group by lotação) 
49 
SQL 
• Consulta SQL aninhada (cont.) 
▫ Predicados SOME, ANY e ALL (cont.) 
 SOME (subconsulta) e ANY (subconsulta) 
 Retornam verdade se e somente se 
▫ Para pelo menos um elemento s retornado pela 
subconsulta, expr  s é verdade 
 São equivalentes 
 ALL (subconsulta) 
 Retorna verdade se e somente se, 
▫ Para todo elemento s retornado pela subconsulta, 
expr  s é verdade 
 Listar funcionários que ganham salários maior ou igual ao 
maior salário pago pela empresa. 
 
select pnome, salario from funcionario where salario >= 
ALL (select salario from funcionario); 
select pnome, salario from funcionario where salario = 
(select max(salario) from funcionario); 
50 
SQL 
• Consulta SQL aninhada (cont.) 
▫ Predicados SOME, ANY e ALL (cont.) 
 Listar o departamento com maior média salarial 
 Não é permitido função agregada composta 
select d.nome 
from Empregado e, Departamento d 
where d.cod_depart=e.lotação 
group by d.nome 
 having avg(salário) >=all (select avg(salário) from Empregado 
 group by lotação) 
Consultas aninhadas correlacionadas 
• Ocorre quando uma consulta aninhada referencia 
algum atributo de uma relação declarada na 
consulta externa. 
• Nesse caso, as duas consultas são chamadas 
correlacionadas. 
• A consulta aninhada é avaliada uma vez para cada 
tupla (ou combinação de tuplas) na consulta 
externa. 
Consultas aninhadas correlacionadas 
• EXISTS e NOT EXISTS 
▫ Verifica se o resultado de uma consulta aninhada 
correlacionada é vazio (não contém tuplas) ou não. 
 
Consultas aninhadas correlacionadas 
• EXISTS e NOT EXISTS 
select pnome 
from funcionario 
where exists ( 
 select * 
 from dependente 
 where cpf = fcpf 
); 
select pnome 
from funcionario 
where cpf in ( 
 select fcpf from dependente 
); 
Consultas aninhadas correlacionadas 
• Recuperar os nomes de funcionários que não 
possuem dependentes. 
 
Consultas aninhadas correlacionadas 
• Listar os nomes dos gerentes que possuem pelo 
menos um dependente. 
 
Consultas aninhadas correlacionadas 
• Recuperar o nome de cada funcionário que trabalha 
em todos os projetos controlados pelo departamento 
5. 
 
Consultas aninhadas correlacionadas 
• Recuperar os nomes de todos os funcionários que 
têm dois ou mais dependentes. 
select pnome 
from funcionario 
where ( 
 select count(*) 
 from dependente 
 where cpf = fcpf 
) >= 2; 
58 
SQL 
• Consulta SQL aninhada (cont.) 
• Predicado EXISTS 
• Verifica se o conjunto retornado por uma subconjunto é vazio ou 
não 
• Listar empregados que possuem dependentes 
select pnome 
from funcionario 
where exists ( 
 select * 
 from dependente 
 where cpf=fcpf 
); 
select pnome from funcionario 
where cpf in ( 
 select fcpf from dependente 
); 
59 
SQL 
• Consulta SQL aninhada (cont.) 
▫ Predicado EXISTS (cont.) 
 Sintaxe 
 [NOT] EXISTS (subconsulta) 
 EXISTS (subconsulta) 
 Retorna verdade se e somente se 
▫ O conjunto retornado por subconsulta não é vazio 
 NOT EXISTS (subconsulta) 
 Retorna verdade se e somente se 
▫ O conjunto retornado por subconsulta é vazio 
 Listar nome de departamentos com empregados ganhando 
duas vezes mais que a média do departamento 
select d.nome 
from Departamento d 
where exists (select * from Empregado e 
 where e.lotacao=d.cod_depart and 
 salário > (2*(select avg(salário) from Empregado 
 where lotação=e.lotação)))UNIQUE 
• A função UNIQUE(C) retorna TRUE se não 
houver tuplas duplicadas no resultado da 
consulta C. 
Junções 
• Usuários podem especificar uma tabela 
resultante de uma operação de junção na 
cláusula FROM de uma consulta. 
▫ Consulta a seguir tem uma única tabela de junção. 
Junções 
• Tipos 
▫ NATURAL JOIN 
 Natural JOIN sobre duas relações R e S, nenhuma 
condição de junção é especificada. 
 Cria-se uma condição EQUIJOIN implícita para 
cada par de atributos com o mesmo nome. 
 
 
select pnome, nome_dep 
from funcionario 
 natural join departamento as dep 
 (nome_dep, dnr, cpf_gerente, data_inicio_gerente); 
Junções 
• Tipos 
▫ NATURAL JOIN 
 
 
Junções 
• Inner join 
▫ Tipo padrão de junção em uma tabela de junção. 
▫ A tupla é incluída no resultado somente se uma 
tupla correspondente existir na outra relação. 
select pnome, dnome 
from funcionario 
 inner join departamento 
 on dnr=dnumero; 
select pnome, dnome 
from funcionario, departamento 
 where dnr=dnumero; 
Explícito 
Implícito 
Junções 
• LEFT OUTER JOIN 
▫ Toda tupla na tabela esquerda deve aparecer no 
resultado. 
▫ Se não houver tupla correspondente: 
 Preenchido com valores NULL para atributos da 
tabela da direita. 
select pnome, dnome 
from funcionario 
 left outer join departamento 
 on dnr=dnumero; 
Junções 
Junções 
Junções 
• RIGHT OUTER JOIN 
▫ Toda tupla na tabela direita deve aparecer no 
resultado. 
▫ Se não houver tupla correspondente: 
 Preenchido com valores NULL para atributos da 
tabela da esquerda. 
select pnome, dnome 
from funcionario 
 right outer join departamento 
 on dnr=dnumero; 
Junções 
• FULL OUTER JOIN 
▫ Toda tupla nas tabelas direita e esquerda deve 
aparecer no resultado. 
select pnome, dnome 
from funcionario 
 full outer join departamento 
 on dnr=dnumero; 
Junções 
• Sintaxe do Oracle: 
▫ +=  LEFT OUTER JOIN 
▫ =+  RIGHT OUTER JOIN 
▫ +=+  FULL OUTER JOIN 
Junções 
• Múltiplas junções em uma mesma consulta. 
72 
SQL 
• Formas de Junção em SQL Avançado 
▫ Listar nomes dos empregados e os nomes dos 
seus departamentos. 
 select d.nome 
 from Empregado as e, Departamento as d 
 where d.id =e.id_dept 
produto cartesiano projeção 
seleção 
d.nome(d.id=e.id_dept(Departamento x Empregado)) 

 
Departamento 
d.id=e.id_dept
Empregado 
73 
SQL 
• Formas de Junção em SQL Avançado (cont.) 
▫ Sintaxe da cláusula FROM 
[ FROM {<tabela_fonte>} [,...n] ] 
<table_fonte> ::= 
 nome_tabela [ [AS] qualificador ] 
 | <tabela_fonte> <tipo_junção> <tabela_fonte> ON 
 <condição_junção> 
 
 <tipo_junção> ::= 
 [ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ] [ <join_hint> ] 
 JOIN 
74 
SQL 
• Formas de Junção em SQL Avançado (cont.) 
▫ Sintaxe da cláusula FROM (cont.) 
 Tipos de junção 
 Junção theta 
▫ INNER JOIN 
 Junção externa à esquerda 
▫ LEFT OUTER JOIN 
 Junção externa à direita 
▫ RIGHT OUTER JOIN 
 Junção externa completa 
▫ FULL OUTER JOIN 
▫ Junção theta 
 Exemplo 
 Listar nome dos empregados com o nome do respectivo 
departamento 
select e.nome, d.nome 
from Empregado as e inner join Departamento as d on e.id_dept = d.id 
75 
SQL 
• Formas de Junção em SQL Avançado (cont.) 
 Junção Externa (OUTER JOIN) 
Adicionar tuplas extras ao resultado de uma 
junção natural 
76 
SQL 
• Formas de Junção em SQL Avançado 
(cont.) 
▫ LEFT OUTER JOIN 
 Calcula o resultado da junção 
 Adiciona ao resultado da junção 
▫ Tuplas da relação à esquerda que não satisfazem a 
condição de junção 
▫ Atribui valores nulos aos atributos não definidos 
para estas tuplas 
 Exemplo 
 Listar nome do empregado e o nome de seu 
dependente. O nome do empregado deve ser 
exibido mesmo que ele não possua dependente. 
 
77 
SQL 
• Formas de Junção em SQL Avançado (cont.) 
▫ RIGHT OUTER JOIN 
 Calcula o resultado da junção 
 Adiciona ao resultado da junção 
▫ Tuplas da relação à direita que não satisfazem a condição 
de junção 
▫ Atribui valores nulos aos atributos não definidos para estas 
tuplas 
 Exemplo 
 Listar nome do empregado e o nome de seu 
dependente. O nome do empregado deve ser exibido 
mesmo que ele não possua dependente. 
78 
SQL 
• Formas de Junção em SQL Avançado (cont.) 
▫ FULL OUTER JOIN 
 Calcula o resultado da junção 
 Adiciona ao resultado da junção 
▫ Tuplas das relações envolvidas na junção que não satisfazem a 
condição de junção 
▫ Atribui valores nulos aos atributos não definidos para estas tuplas 
 Exemplo 
 Listar nome do empregado e o nome de seu departamento. O nome 
do empregado deve ser exibido mesmo que ele não possua 
departamento. Da mesma forma, o nome do departamento deve 
ser exibido mesmo que ele não tenha empregados. 
O MySQL não implementa o FULL OUTER JOIN. A alternativa é fazer 
a união (UNION) dos resultados do LEFT OUTER JOIN com os 
resultados do RIGHT OUTER JOIN. 
Especificando restrições como asserções 
• CREATE ASSERTION 
▫ Especifica tipos adicionais de restrições que estão 
fora do escopo das restrições embutidas do 
modelo relacional (chaves primária e única, 
integridade de entidade e integridade referencial). 
▫ Essas restrições podem ser especificadas dentro 
do comando CREATE TABLE. 
Especificando restrições como asserções 
• CREATE ASSERTION 
▫ Especifica uma consulta que seleciona as tuplas que 
violam a condição desejada. 
▫ Sempre que alguma tupla no BD fizer com que a 
condição de um comando ASSERTION seja avaliada 
como FALSE, a restrição é violada. 
▫ As cláusulas CHECK sobre atributos, domínios e 
tuplas individuais são verificadas somente quando as 
tuplas são inseridas ou atualizadas. 
 A verificação de restrição é mais eficiente nesses casos. 
 Usar CREATE ASSERTION somente nos casos em que 
não seja possível usar CHECK em atributos e domínios. 
O PostgreSQL ainda não implementa CREATE ASSERTION. 
Especificando restrições como asserções 
• O salário de um funcionário não pode ser maior 
que o salário do gerente do departamento para o 
qual o funcionário trabalha. 
Especificando ações como triggers 
• Bancos de dados ativos oferecem funcionalidades para 
especificar regras ativas. 
• Essas regras podem ser disparadas automaticamente por 
eventos e podem iniciar certas ações especificadas na 
declaração da regra para que ocorram se certas condições 
forem atendidas. 
• Funcionalidades fornecidas pelos bancos de dados ativos 
estão disponíveis na forma de triggers (gatilhos), que faz 
parte da SQL-99 e de padrões mais recentes. 
• Triggers (gatilhos) são regras que especificam ações que 
são disparadas automaticamente por certos eventos. 
 
Especificando ações como triggers 
• Modelo usado para especificar regras de banco de dados ativo é 
conhecido como modelo Evento-Condição-Ação (ECA). 
• Uma regra no modelo ECA tem três componentes: 
1. O(s) evento(s) que dispara(m) a regra. 
 Esses eventos normalmente são operações de atualização do banco de dados que 
são aplicadas explicitamente ao banco de dados. 
2. A condição que determina se ação da regra deve ser executada. 
 Quando o evento que dispara a ação tiver ocorrido, uma condição opcional pode 
ser avaliada. 
 Se nenhuma condição for especificada, a ação será executada quando ocorrer o 
evento. 
 Se uma condição for especificada, ela é primeiro avaliada e, somente se for 
avaliada como verdadeira, a ação da regra será executada. 
 A condição é especificada na cláusula WHEN de um trigger.3. A ação a ser tomada. 
 A ação normalmente é uma sequência de comandos SQL, mas também poderia 
ser uma transação do banco de dados ou um programa externo que será 
executado automaticamente. 
Especificando ações como triggers 
• CREATE TRIGGER 
▫ Especifica ações automáticas que serão realizadas 
quando certos eventos e condições ocorrerem. 
▫ Comando usado para monitorar o banco de dados 
e disparar determinadas ações quando for 
satisfeita. 
▫ Uma trigger típica possui três componentes: 
 Evento(s) 
 Condição 
 Ação 
Especificando ações como triggers 
• A sintaxe geral resumida para criação de um 
trigger no sistema Oracle é a seguinte: 
 CREATE TRIGGER <nome trigger> 
 (AFTER | BEFORE) <evento trigger> ON <nome tabela> 
 [ FOR EACH ROW ] 
 [ WHEN <condição> ] 
 <ações da trigger>; 
Especificando ações como triggers 
• Sintaxe PostgreSQL: 
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } 
{ event [ OR ... ] } 
 ON table 
 [ FROM referenced_table_name ] 
 { NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | 
INITIALLY DEFERRED } } 
 [ FOR [ EACH ] { ROW | STATEMENT } ] 
 [ WHEN ( condition ) ] 
 EXECUTE PROCEDURE function_name ( arguments ) 
event pode ser: 
• INSERT 
• UPDATE [ OF column_name [, ... ] ] 
• DELETE 
• TRUNCATE (remove todas as linhas de uma ou mais tabelas) 
Especificando ações como triggers 
• No PostgreSQL é preciso inicialmente criar uma 
função que retorna uma trigger. 
▫ Essa função será executada pela trigger. 
▫ Exemplo 1: 
create or replace function remove_empr() returns trigger as 
$$ 
begin 
delete from empregado where superv =OLD.cpf; 
delete from departamento where gerente=OLD.cpf; 
delete from dependentes where emp =OLD.cpf; 
delete from trabalha_no where emp =OLD.cpf; 
return null; 
end; 
$$ language plpgsql; 
Especificando ações como triggers 
• Definindo a trigger propriamente dita no 
PostgreSQL: 
create trigger remove_empregado 
after delete on empregado 
for each row execute procedure remove_empr(); 
Especificando ações como triggers 
• Exemplo 2: 
create or replace function insere_depart() returns trigger as $$ 
begin 
if (select count(cpf) from empregado where cpf =NEW.gerente) = 0 
then 
 RAISE EXCEPTION 'Inserção do departamento com gerente % não pode 
ser realizada, pois não existe empregado com esse cpf.', 
NEW.gerente; 
end if; 
return NEW; 
end; 
$$ language plpgsql; 
create trigger insere_departamento 
before insert on departamento 
for each row execute procedure insere_depart(); 
Especificando ações como triggers 
• Exemplo 3: 
create or replace function atualiza_empr() returns trigger as $$ 
begin 
IF NEW.cpf != OLD.cpf then 
 update departamento set gerente=NEW.cpf where gerente=OLD.cpf; 
 update dependentes set emp =NEW.cpf where emp =OLD.cpf; 
 update trabalha_no set emp =NEW.cpf where emp =OLD.cpf; 
 update empregado set superv =NEW.cpf where superv = OLD.cpf; 
end if; 
return NEW; 
end; 
$$ language plpgsql; 
drop trigger if exists atualiza_empregado on empregado; 
create trigger atualiza_empregado 
after update on empregado 
for each row execute procedure atualiza_empr(); 
Especificando ações como triggers 
• CREATE TRIGGER 
▫ A cláusula BEFORE ou AFTER especifica que a regra será disparada 
antes ou depois, respectivamente, que ocorrerem os eventos que 
disparam a regra. 
▫ Os eventos básicos que podem ser definidos para disparar as regras 
são INSERT, DELETE e UPDATE. 
 No caso de UPDATE, podem-se especificar os atributos a serem 
atualizados. 
▫ A cláusula ON determina a relação em que a regra é especificada. 
▫ A cláusula FOR EACH ROW especifica que a regra será disparada uma 
vez para cada linha que é afetada pelo evento de disparo. 
 Isso é conhecido como trigger de nível de linha. 
▫ A cláusula FOR EACH STATEMENT indica o uso de uma trigger em 
nível de comando que dispara a regra apenas uma vez, mesmo que 
várias tuplas sejam afetadas pelo evento de disparo. 
Especificando ações como triggers 
• CREATE TRIGGER 
▫ A trigger pode especificar nomes de variável de tupla em 
particular para as tuplas antigas e novas. 
 Dentro da cláusula REFERENCING, nomeamos variáveis de 
tupla (apelidos) para nos referirmos à(s) tupla(s) OLD (antes 
da modificação) e à(s) tupla(s) NEW (após a modificação), 
respectivamente. 
▫ A cláusula WHEN é usada para especificar quaisquer 
condições que precisam ser verificadas após a regra ser 
disparada, mas antes que a ação seja executada. 
 A ação especificada após a condição pode ser um comando 
SQL ou uma sequência de comandos SQL delimitados por 
BEGIN e END. 
Especificando ações como triggers 
• Usando SQL99, atualizar o total salarial de um 
departamento a cada atualização de salário de 
um funcionário desse departamento: 
CREATE TRIGGER salario_total1 
 AFTER UPDATE OF salario ON FUNCIONARIO 
 REFERENCING OLD ROW AS O, NEW ROW AS N 
 FOR EACH ROW 
 WHEN (N.id_dept IS NOT NULL) 
 UPDATE DEPARTAMENTO 
 SET salario_total = salario_total + N.salario – O.salario 
 WHERE id_dept = N.id_dept; 
 
Especificando ações como triggers 
Comandos de controle de transação 
• SQL também possui comandos de controle de transação. 
• Estes são usados para especificar unidades de 
processamento de banco de dados para fins de controle de 
concorrência e recuperação. 
• Comandos: 
▫ BEGIN 
 Inicia um bloco de transação. 
▫ COMMIT 
 Confirma a transação corrente. 
▫ ROLLBACK 
 Aborta e desfaz as operações realizadas na transação corrente. 
SQL – Visões 
• Acesso a um banco de dados 
▫ Requer conhecimento do esquema 
 Indesejável 
 Para usuários inexperientes 
 Desenvolvedores de aplicativos que acessam o BD 
▫ Por questões de segurança e privacidade 
 Grupos de usuários devem ter acesso a dados de interesse 
 O acesso a todo o banco de dados é perigoso 
• Janelas sobre o banco de dados 
▫ Cada janela mostra parte do banco de dados 
 Diferentes visões 
▫ Visões (views) 
 Definidas sobre tabelas do banco de dados 
 Tabelas base 
SQL – Criando uma visão 
create or replace view func_dep(func,depart) as ( 
 select pnome || ' ' || minicial || ' ' || unome, 
dnome 
 from funcionario f, departamento d 
 where dnumero = dnr 
); 
create or replace view func_dep as ( 
 select pnome || ' ' || minicial || ' ' || unome 
as func, dnome as depart 
 from funcionario f, departamento d 
 where dnumero = dnr 
); 
SQL – Consultando uma visão 
select funcionario 
from func_dep 
where funcionario like 'J%' 
order by funcionario; 
Visões (tabelas virtuais) em SQL 
• Conceito de uma visão em SQL: 
▫ Tabela única geralmente derivada de outras tabelas. 
▫ Considerada como uma tabela virtual. 
• Usos 
▫ Simplifica a especificação de certas consultas. 
▫ Mecanismo de segurança e autorização. 
• Comando CREATE VIEW 
▫ Define um nome de tabela, uma lista de nomes de 
atributos e uma consulta para especificar o conteúdo da 
visão. 
▫ A visão está sempre atualizada. 
▫ O comando DROP VIEW elimina uma visão. 
100 
SQL – Visões 
• Definição de visões em SQL 
 CREATE VIEW nome_da_visão 
 [(nome_coluna {, nome_coluna …})] 
 AS 
 subquery [WITH CHECK OPTION] 
 
 WITH CHECK OPTION 
 Especifica que atualizações (INSERT ou UPDATE) 
na tabela base só serão permitidas se 
▫ resultam em tuplas visíveis para a visão 
Visões (tabelas virtuais) em SQL 
Visões (tabelas virtuais) em SQL 
Implementação e atualização de view 
• Técnicas principais 
1. Modificação de consulta 
 Modifica a consulta da view por uma consulta nas 
tabelas base. 
 Desvantagem: Ineficiente paravisões definidas por 
consultas complexas. 
Implementação e atualização de view 
• Técnicas principais 
2. Materialização de view 
 Cria fisicamente uma tabela de view temporária quando a 
view for consultada pela primeira vez. 
 Mantém essa tabela na suposição de que outras consultas 
à view acontecerão em seguida. 
 Requer uma estratégia eficiente para atualizar 
automaticamente a tabela de visão quando as tabelas base 
são atualizadas. 
 Estratégias de atualização incremental 
▫ O SGBD determina que tuplas novas devem ser inseridas, 
removidas ou modificadas em uma tabela de visão 
materializada. 
Implementação e atualização de view 
• Atualização de visão é complicada e pode ser 
ambígua. 
• Atualização em uma visão definida sobre uma única 
tabela sem funções agregadas. 
▫ Pode ser mapeada para uma atualização na tabela 
base. 
• Visões envolvendo junções 
▫ Frequentemente não é possível o SGBD determinar 
qual das atualizações é pretendida. 
• Cláusula WITH CHECK OPTION 
▫ Precisa ser acrescentada ao final da definição da visão, 
se uma visão tiver de ser atualizada. 
 
Atualização de visão 
Duas 
atualizações 
possíveis: 
SQL – Visões 
• Tipos de visões 
▫ Visão virtual 
 A definição da visão é armazenada 
 Dados da visão não são persistentes 
 Sempre que referenciada 
 Os dados são materializados 
▫ Custo praticamente igual a cada materialização 
 Quanto ao acesso 
 Somente leitura 
▫ Visões que só permitem acesso de leitura 
 Permitem atualização 
▫ Visões que permitem atualizações nas tabelas base 
108 
SQL – Visões 
• Tipos de visões (cont.) 
▫ Visão materializada 
 Dados e definição são persistentes 
 Problema de atualização dos dados da visão 
 Sempre que há uma atualização nas tabelas base da 
visão 
 Recalculada 
 Atualizada 
▫ Com intervenção humana 
▫ Automática 
 Reduz custos de materialização de resultado 
 Visões somente para leitura 
 Aplicações 
 Implementação Data Warehouse 
 Integração de fontes de dados heterogêneas 
SQL – Visões 
• Exemplos 
▫ Definindo visões 
create view V1 (nome_departamento, nome_empregado) 
as select d.nome,e.nome 
 from Departamento d inner join Empregado e 
 on d.id=e.id_dept 
 
create view V2 (nome_empregado, número_de_dependentes) 
as select e.nome, (select count(*) from Dependente 
where matr_resp=e.matr) 
 from Empregado e 
 
create view V3 (matrícula, salário) 
as select nome,salário 
 from Empregado 
 where salário<700 with check option 
SQL – Visões 
• Exemplos 
▫ Acessando o banco de dados através de visões 
select * from V1 
select * from V2 where número_de_dependentes>2 
select * from V3 
matrícula salário 
----------------------------------- ------------------------ 
caio 500.0 
rebeca 500.0 
 
▫ Atualizando o banco de dados através de visões 
update v3 set salário=salário+100 
select * from V3 
matrícula salário 
----------------------------------- ------------------------ 
caio 600.0 
rebeca 600.0 
update v3 set salário=salário+150 Erro, pois as tuplas a serem 
alteradas vão deixar de ser 
visíveis para V3 
Instruções de alteração de esquema 
• Comandos de evolução de esquema 
▫ Podem ser executados enquanto o banco de dados 
está em operação. 
• Não requerem recompilação do esquema. 
Comando DROP 
• Usado para remover elementos nomeados do 
esquema, como tabelas, domínios ou restrições. 
• Também é possível remover um esquema. 
• Opções de comportament de DROP: 
▫ CASCADE  capaz de remover o esquema e todas 
as suas tabelas, domínios e outros elementos. 
▫ RESTRICT  o esquema é removido somente se 
ele não tiver elementos. 
 O usuário deve remover individualmente cada 
elemento no esquema, para depois remover o 
próprio esquema. 
Comando DROP 
Comando ALTER 
• Permite a alteração da definição de uma tabela 
da base ou de outros elementos de esquema 
nomeados. 
• Ações de alteração de tabela incluem: 
▫ Adicionar ou remover uma coluna (atributo). 
▫ Alterar uma definição de coluna. 
▫ Adicionar ou remover restrições de tabela. 
Comando ALTER 
• Exemplos: 
Resumo dos comandos SQL 
Resumo dos comandos SQL 
Resumo dos comandos SQL 
OBS: Os comandos para criar e excluir índices não fazem parte 
do padrão SQL. 
Referências 
• Elsmari, R., Navathe, Shamkant B. “Sistemas 
de Banco de Dados”. 6ª Edição, Pearson 
Brasil, 2011.  Capítulo 5 
• Silberschatz, A., Korth, H., Sudarshan, S. 
“Sistema de Banco de Dados”. 5ª Edição, 
Editora Campus, 2006. 
• Slides Prof. José Maria (UFC). 
regispires@lia.ufc.br

Outros materiais