Você está na página 1de 120

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.

AS seguindo pelo novo nome desejado. • AS é usado para apelidar os nomes tanto do

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

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

Comparações envolvendo NULL • Consultas podem checar se um atributo é NULL: ▫ IS NULL ▫

Consultas

Checando valores nulos

Consultas • Checando valores nulos ▫ Predicado IS [NOT] NULL ▫ Exemplo select * from Empregado

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)

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

8

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.

Achar a soma dos salários de todos os funcionários, o salário máximo, o salário mínimo e

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.

departamento ‘Pesquisa’, bem como o salário máximo, o salário mínimo e a média dos salários nesse

SQL Funções agregadas

Recuperar o número total de funcionários na

empresa.

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 • 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.

SQL – Funções agregadas • Contar o número de valores de salário distintos no banco de

SQL

Exercícios

Encontre o número de empregados lotados no departamento de Informática

de empregados lotados no departamento de Informática select count(*) from Empregados as e, Departamentos as d
select count(*) from Empregados as e, Departamentos as d where e.id_dept=d.id and d.nome = ‘Informática’;
select count(*)
from Empregados as e, Departamentos as d
where e.id_dept=d.id and d.nome = ‘Informática’;

Encontre o montante da folha de pagamento da empresa

select sum(salario) from Empregado
select sum(salario)
from Empregado

Encontre o salário médio pago pela empresa

select avg(salario) from Empregado
select avg(salario)
from Empregado

16

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

-----------

1

2

quantidade_empregados --------------------

4

2

1 2 quantidade_empregados -------------------- 4 2 A função count é aplicada para o conjunto de tuplas
A função count é aplicada para o conjunto de tuplas de cada grupo
A função count é aplicada
para o conjunto de tuplas
de cada grupo

17

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

group by Exceto os argumentos da funções agregadas  ▫ Exemplo de sintaxe incorreta select lotacao,

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.

cada departamento, recuperar o número do departamento, o número de funcionários no departamento e seu salário

SQL Funções agregadas

Agrupamento de tuplas FUNCIONARIO pelo valor de Dnr:

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.

cada projeto, recuperar o número do projeto, o nome do projeto e o número de funcionários

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.

funcionários trabalham, recupere o número e o nome do projeto e o número de funcionários que

Após aplicar a cláusula WHERE, mas antes de aplicar HAVING

Após aplicar a cláusula WHERE, mas antes de aplicar HAVING Grupos não selecionados pela condição HAVING

Grupos não selecionados pela condição HAVING

Após aplicar a condição da cláusula 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.

projeto, recupere o número e o nome do projeto e o número de funcionários do departamento

SQL

Agrupando tuplas no SQL (cont.)

Exemplos (cont.)

Listar maiores e menores salários de cada departamento

select d.nome, max(e.salario) as Maior_Salario, min(e.salario) as Menor_Salario from Departamento d, Empregado e where
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

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 v.nome, e.referência, sum(d.qtde) as total from Estoque e, Vendedor v, Vendas d where e.cod_item=d.cod_item
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

26

SQL

Selecionando grupos

Listar nome dos departamentos cuja média salarial seja maior que 7000

dos departamentos cuja média salarial seja maior que 7000 ▫ Cláusula having Filtro de grupos 

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

27

SQL

Selecionando grupos (cont.)

Exemplos

Listar nome e média salarial dos departamentos que possuem mais de 10 empregados lotados

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

Listar nome e quantidade de empregados dos departamentos

cuja média salarial é maior que 5000

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 <atributos de ordenação> ];

Consultas aninhadas

Blocos select-from-where dentro da cláusula

WHERE de outra consulta (consulta externa).

Consultas aninhadas

Consultas aninhadas Não aninhada

Não aninhada

Consultas aninhadas

Consultas aninhadas Aninhada

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'

);

SQL

SQL • Consulta SQL aninhada (subconsulta) ▫ Consulta SQL especificada dentro de uma outra consulta SQL
• Consulta SQL aninhada (subconsulta) ▫
• 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);

36

SQL

S Q L • Consulta SQL aninhada (cont.) ▫ Subconsulta escalar  Subconsulta que retorna apenas
• Consulta SQL aninhada (cont.) ▫ Subconsulta escalar
• 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;

37

SQL

SQL • Consulta SQL aninhada (cont.) ▫ Usando o Predicado [NOT] IN  Listar os CPFs
• Consulta SQL aninhada (cont.)
• 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'

);

38

Consultas aninhadas

É possível o uso de um conjunto explícito de

valores na cláusula WHERE.

Consultas aninhadas • É possível o uso de um conjunto explícito de valores na cláusula WHERE.
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.

• Evite erros em ambiguidades criando apelidos (aliases) para todas as tabelas referenciadas em uma consulta
• Evite erros em ambiguidades criando apelidos (aliases) para todas as tabelas referenciadas em uma consulta

Consultas aninhadas

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.

recuperar o número do departamento e o número de seus funcionários que estão ganhando mais de

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.

que o salário de todos os funcionários no departamento 5. Essa consulta também pode ser especificada

SQL

SQL • Consulta SQL aninhada (cont.) ▫ Predicados SOME, ANY e ALL  Listar empregados que
• Consulta SQL aninhada (cont.)
• 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)
select nome
from Empregado
where salário >=some (select avg(salário) from Empregado
group by lotação)

48

SQL

SQL • Consulta SQL aninhada (cont.) ▫ Predicados SOME, ANY e ALL (cont.)  SOME (subconsulta)
• Consulta SQL aninhada (cont.)
• 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);

SQL

SQL • Consulta SQL aninhada (cont.) ▫ Predicados SOME, ANY e ALL (cont.)  Listar o
• Consulta SQL aninhada (cont.)
• 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)
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)

50

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.

e NOT EXISTS ▫ Verifica se o resultado de uma consulta aninhada correlacionada é vazio (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 • 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 • 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.

• Recuperar o nome de cada funcionário que trabalha em todos os projetos controlados pelo departamento

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;

SQL

SQL • • Consulta SQL aninhada (cont.) Predicado EXISTS • Verifica se o conjunto retornado por

• Consulta SQL aninhada (cont.)
• 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

);

58

SQL

SQL • Consulta SQL aninhada (cont.) ▫ Predicado EXISTS (cont.)  Sintaxe  [NOT] EXISTS (subconsulta)
• Consulta SQL aninhada (cont.) ▫ Predicado EXISTS (cont.)
• 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
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)))

59

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.

de uma operação de junção na cláusula FROM de uma consulta. ▫ Consulta a seguir tem

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 • 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

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

• Sintaxe do Oracle: ▫ +=  LEFT OUTER JOIN ▫ =+  RIGHT OUTER JOIN

Junções

Múltiplas junções em uma mesma consulta.

SQL

Formas de Junção em SQL Avançado

Listar nomes dos empregados e os nomes dos seus departamentos.

nomes dos empregados e os nomes dos seus departamentos.   projeção   select d.nome   from
 

projeção

 

select d.nome

select d.nome
select d.nome
 

from Empregado as e, Departamento as d where d.id =e.id_dept

 
as e, Departamento as d where d.id =e.id_dept   produto cartesiano seleção  d . n

produto cartesiano

seleção

d.nome (d.id=e.id_dept (Departamento x Empregado))

e . i d _ d e p t ( Departamento x Empregado) ) Departamento d

Departamento

i d _ d e p t ( Departamento x Empregado) ) Departamento d . i

d.id=e.id_dept Empregado

72

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

73

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

 Tipos de junção  Junção theta ▫ INNER JOIN  Junção externa à esquerda ▫

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

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
Adicionar tuplas extras ao resultado de uma
junção natural

75

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.

76

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.

77

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)
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.
78

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.
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.

de um funcionário não pode ser maior que o salário do gerente do departamento para o

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

where superv =OLD.cpf;

delete from departamento where gerente=OLD.cpf;

delete from dependentes where emp

delete from trabalha_no where emp return null; end; $$ language plpgsql;

delete from empregado

=OLD.cpf;

=OLD.cpf;

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 end if; return NEW; end;

$$ language plpgsql;

set superv =NEW.cpf where superv = OLD.cpf;

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

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) 
Visões (views)

Definidas sobre tabelas do banco de dados

Tabelas base

SQL Criando uma visão

create or replace view func_dep as ( select pnome || ' ' || minicial || ' ' || unome as func, dnome as depart

from funcionario f, departamento d

where dnumero = dnr

);

create or replace view func_dep(func,depart) as ( select pnome || ' ' || minicial || ' ' || unome, dnome 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.

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

100

Visões (tabelas virtuais) em SQL

Visões (tabelas virtuais) em SQL
Visões (tabelas virtuais) em SQL

Visões (tabelas virtuais) em SQL

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 para visões definidas por consultas complexas.

da view por uma consulta nas tabelas base.  Desvantagem: Ineficiente para visões definidas por consultas
da view por uma consulta nas tabelas base.  Desvantagem: Ineficiente para visões definidas por consultas
da view por uma consulta nas tabelas base.  Desvantagem: Ineficiente para visões definidas por consultas

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

Atualização de visão Duas atualizações possíveis:

Duas

atualizações

possíveis:

Atualização de visão Duas atualizações possíveis:
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

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

108

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

rebeca

500.0

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 caio rebeca

salário

----------------------------------- ------------------------

600.0

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
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 DROP
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:

Comando ALTER • Exemplos:
Comando ALTER • Exemplos:
Comando ALTER • Exemplos:
Comando ALTER • Exemplos:

Resumo dos comandos SQL

Resumo dos comandos SQL
Resumo dos comandos SQL
Resumo dos comandos SQL

Resumo dos comandos SQL

Resumo dos comandos SQL
Resumo dos comandos SQL
Resumo dos comandos SQL
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
OBS: Os comandos para criar e excluir índices não fazem parte do padrão 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
regispires@lia.ufc.br

regispires@lia.ufc.br