You are on page 1of 57

1

BANCO DE DADOS 1:
AULA 9
Lizianne P. M. Souto – liziannesouto@recife.ifpe.edu.br
2

OBJETIVOS
• Assimilar os comandos SQL básicos
• Assimilar os comandos SQL mais complexos, a partir do conhecimento dos
comandos básicos
• Entender o que são VIEWS e sua importância prática na montagem de
consultas
3

AGENDA
• Consultas SQL envolvendo NULL
• Consultas Aninhadas IN;
• Funções EXISTS e NOT EXISTS;
• Funções de Agregação:
• GROUP BY, HAVING.
• Junções
• Visões
4

CONSULTAS ANINHADAS
5

EXERCÍCIO
• Crie o esquema de banco de dados:
6

EXERCÍCIO
• Inserir os dados:
insert into cliente (ccodigo, nome, endereco,fone)
values
(1, 'Paulo', 'Av Recife', 7894556123) ,
(2, 'Paulo Henrique', 'Av do Forte', 1111556123),
(3, 'Daniela', 'Av Caxangá', 2222556123),
(4, 'Camila', 'Av Rui Freire', 3333556123),
(5, 'Pedro', 'Av Floriano Peixoto', 8977556123),
(6, 'Mateus', 'Av Recife', 9999556123),
(7, 'Viviane', 'Abolição II', 1000955612)
7

EXERCÍCIO
• Inserir os dados:
insert into pedido(pedcodigo, data, endereco, cliente)
values
(2, '01-03-2017', 'Av Recife', 1 ),
(4, '01-03-2017', 'Av Caxangá', 2 ),
(5, '01-03-2017', 'Av Rui Freire', 3 ),
(6, '01-03-2017', 'Abolição II', 4 ),
(7, '01-03-2017', 'Abolição II', 7 )
8

EXERCÍCIO
Inserir os dados:
insert into pedido(pedcodigo, data, endereco)
values
(3, '01-03-2017', 'Av do Forte'),
(1, '01-03-2017', 'Av Recife')
9

EXERCÍCIO
Inserir os dados:
insert into produto(procodigo, preco, taxa)
values
(1, 50,00),
(2, 60,00),
(3, 55,00),
(4, 70,00),
(5, 80,00),
(6, 500,00),
(7, 10,00);
10

EXERCÍCIO
insert into item (pedido, produto, quantidade)
values
(1, 1, 2),
(2, 2, 5),
(3, 1, 10),
(4, 3, 5),
(5, 7, 2),
(6, 6, 10),
(7, 4, 3);
11

COMPARAÇÕES ENVOLVENDO
NULL
• A SQL permite consultas que chequem se o valor de um atributo é NULL;
• É utilizado IS ou IS NOT para a comparação;
• Exemplos:
• Listar os pedidos que não tem cliente

• Listar todos os clientes que possuem telefone


12

CONSULTAS ANINHADAS
• Uma consulta SQL é aninhada quando ela está dentro de outra consulta
SQL;
• Pode-se utilizar o comparador IN, que compara um valor v com um
conjunto de valores V e evolui para verdadeiro, se v for um dos elementos
de V.
• Exemplo: Listar os pedidos dos clientes do endereço Abolição II.
13

CONSULTAS ANINHADAS

Essa subconculta
Essa consulta retorna todos retorna o código do
os atributos da tabela cliente cujo endereço
Pedido onde o código do é Abolição II
cliente na tabela Pedido
seja igual ao código
retornado na subconsulta. Ou seja,
retorna 7
14

CONSULTAS ANINHADAS
• Mesmo exemplo, porém, utilizando junções:
• Listar os pedidos dos clientes do endereço Abolição II
15

CONSULTAS ANINHADAS
• Exemplo:
• Listar os clientes dos pedidos 2, 4, 5

(2, 4, 5) )
16

CONSULTAS ANINHADAS
• Exemplo:
• Listar os pedidos dos clientes que não moram no Abolição II.
17

CONSULTAS ANINHADAS

Essa subconculta
Essa consulta retorna todos os retorna o código do
registros que satisfazem a cliente cujo endereço
condição definida no where. é Abolição II

Ou seja, retorna todos os


registros da tabela Pedido cujo Ou seja,
o id do cliente seja diferente de retorna 7
7.
18

QUANTIFICADORES
19

QUANTIFICADORES
• ANY (ou SOME) e ALL (ou EVERY) comportam-se como quantificadores
existencial ("ao menos um") e universal, respectivamente.
• São usados com uma cláusula WHERE ou HAVING.
• O operador ANY retorna verdadeiro se algum dos valores de subconsulta
atende a condição.
• O operador ALL retorna verdadeiro se todos os valores de subconsulta
atinjam a condição.
20

EXEMPLO
• A seguinte instrução SQL retorna TRUE e lista os códigos dos produtos se
encontrar QUALQUER registro na tabela Item em que a quantidade = 10:

SELECT procodigo
FROM Produto
WHERE procodigo = ANY (SELECT produto FROM Item WHERE quantidade = 10);

• A seguinte instrução SQL retorna TRUE e lista os códigos dos produtos se


TODOS os registros na tabela Item tiverem quantidade = 10:

SELECT procodigo
FROM Produto
WHERE procodigo = ALL (SELECT produto FROM Item WHERE quantidade = 10);
21

FUNÇÕES DE AGREGAÇÃO
22

FUNÇÕES DE AGREGAÇÃO
• Funções
• COUNT ([DISTINCT] A)
• Número de valores da coluna A
• SUM ([DISTINCT] A)
• Soma dos valores da coluna A
• AVG ([DISTINCT] A)
• Média dos valores da coluna A
• MAX(A)
• Maior valor da coluna A
• MIN(A)
• Menor valor da coluna A
• Observação
• DISTINCT: não considera valores duplicados
• ALL: inclui valores duplicados
23

FUNÇÕES DE AGREGAÇÃO
• Características
• Recebem uma coleção de valores como entrada
• Retornam um único valor
• Entrada
• sum( ) e avg( ): conjunto de números
• demais funções: tipos de dados numéricos e não-numéricos
24

FUNÇÕES DE AGREGAÇÃO
• vinho (vinho_id, nome_vinho, tipo_vinho, preco, vinicola_id)
25

FUNÇÕES DE AGREGAÇÃO
• Qual a média dos preços dos vinhos?
• SELECT AVG (preco) FROM vinho
• R: 217,125

• Qual a soma dos preços dos vinhos?


• SELECT SUM (preco) FROM vinho
• R: 1737,00

• Qual o preço mais baixo do vinho?


• SELECT MIN (preco) FROM vinho
• R: 7,00
26

FUNÇÕES DE AGREGAÇÃO
• Qual o preço mais alto?
• SELECT MAX (preco) FROM vinho
• R: 397,00

• Quantos vinhos existem na relação vinho?


• SELECT COUNT (vinho_id) FROM vinho
• R: 8

• Quantos tipos de vinho diferentes existem na relação vinho?


• SELECT COUNT (DISTINCT tipo_vinho) FROM vinho
• R: 3
27

CLÁUSULA GROUP BY
28

GROUP BY
• Funcionalidade
• Usada para dividir as tuplas de uma tabela em grupos menores. Permite aplicar
uma função de agregação não somente a um conjunto de tuplas, mas
também a um grupo de conjunto de tuplas
• Grupo de conjunto de tuplas
• conjunto de tuplas que possuem o mesmo valor para os atributos de
agrupamento
• Semântica da respostas
• atributos de agrupamento no GROUP BY também devem aparecer no SELECT
29

GROUP BY
• Qual o preço mais alto e a média dos preços por tipo de vinho?

SELECT tipo_vinho,
MAX (preco) AS maior_preco,
AVG (preco) AS preco_medio
FROM vinho
GROUP BY tipo_vinho
30

SOLUÇÃO
• As tuplas da tabela vinho são divididas em grupo, cada grupo contendo o
mesmo tipo de valor para o atributo de agrupamento tipo_vinho
31

SOLUÇÃO
• Considerações adicionais
• a função MAX e a função AVG são aplicadas a cada grupo de tuplas
separadamente
• a cláusula SELECT inclui somente os atributos de agrupamento e as funções
a serem aplicadas a cada grupo de tuplas
• o comando SELECT pode possuir cláusula WHERE de qualquer complexidade
32

SOLUÇÃO
33

CLÁUSULA HAVING
34

HAVING
• A cláusula HAVING foi adicionada ao SQL porque a palavra-chave WHERE
não pode ser usada com funções agregadas.
• Funcionalidade
• permite especificar uma condição de seleção para grupos, melhor do que para
tuplas individuais
• Resposta
• recupera os valores para as funções somente para aqueles grupos que
satisfazem à condição imposta na cláusula HAVING
35

HAVING: EXEMPLO
• Qual o preço mais alto e a média dos preços por tipo de vinho, para
médias de preços superiores a R$200,00

having seleciona as linhas


SELECT tipo_vinho, MAX (preco), AVG (preco) da agregação
FROM vinho where seleciona as linhas
da tabela base
GROUP BY tipo_vinho
HAVING AVG (preco) > 200
36

EXISTS E NOT EXISTS


37

• Considere o banco de dados Empresa


38

FUNÇÕES EXISTS E NOT EXISTS


• O operador EXISTS (e NOT EXISTS) é usado para testar a existência de
qualquer registro em uma subconsulta.
• O operador EXISTS retorna true se a subconsulta retorna um ou mais
registros.
• Sintaxe:
SELECT nome_da(s)_coluna(s)
FROM nome_tabela
WHERE EXISTS
(SELECT nome_coluna FROM nome_tabela WHERE condição);
39

EXEMPLO
• Recupere os nomes dos empregados que não têm dependentes
SELECT f.nome
FROM Funcionario f
WHERE NOT EXISTS (SELECT *
FROM dependente d
WHERE e.cod= d.cod_func)

• Selecione a matrícula de todos os empregados que trabalham nos projetos


10, 20 ou 30

SELECT DISTINCT cod


FROM alocacao
WHERE codigoprojeto in (10, 20, 30)
40

EXEMPLO
• Obter o nome dos empregados que tenham 2 ou mais dependentes
SELECT f.nome
FROM Funcionario f
WHERE (SELECT COUNT(*)
FROM Dependente d
WHERE e.cod= d.cod_func) >= 2)
41

JUNÇÕES
42

TIPOS DE JUNÇÕES
• Existem alguns tipos de junção:
• Junção de produto cartesiano
• Junção Interna
• Junção Externa
43

JUNÇÃO DE PRODUTO
CARTESIANO
• É uma junção entre duas tabelas que origina uma “terceira tabela”
constituída por todos os elementos da primeira combinadas com todos os
elementos da segunda.
44

JUNÇÃO DE PRODUTO
CARTESIANO
Tabela
Funcionário Tabela
Dependente
45

JUNÇÃO INTERNA
• Funciona de forma semelhante à junção de produto cartesiano.
• Porém, utiliza uma sintaxe diferente.
46

JUNÇÃO INTERNA
47

JUNÇÃO EXTERNA
• Retorna um valor nulo (null) para o correspondente que não encontrar.
• Existem vários padrões de junção externa, os principais são:
• LEFT OUTER JOIN (Junção externa esquerda)
• RIGHT OUTER JOIN (Junção externa direita)
48

LEFT OUTER JOIN


49

RIGHT OUTER JOIN


50

VISÕES
51

VISÕES
• Não é desejável que todos os usuários tenham acesso ao
esquema conceitual => visões precisam ser definidas.
• Visão: é uma relação virtual que não faz parte do esquema
conceitual mas que é visível a um grupo de usuários.
• Uma visão consiste de uma tabela derivada de outras tabelas. São
consultas armazenadas em uma estrutura de fácil acesso baseadas num
comando SELECT.
52

VISÕES
• A visão é definida por uma DDL e é computada cada vez que são
realizadas consultas aos dados daquela visão.
• O catálogo do SGBD é o repositório que armazena as definições
das visões.
• Uma visão possui nome, uma lista de atributos e uma query que
computa a visão.
53

VISÕES
• Uma visão é uma tabela virtual que é definida a partir de outras
tabelas, contendo sempre os dados atualizados.
• Visão em SQL:
• Sintaxe:

CREATE VIEW nomeVisão AS expressão_de_consulta

• Exemplo: Cria uma relação virtual Alocacao1( nomeE, nomeP, horas)



CREATE VIEW Alocacao1(nomeF, nomeP, Horas)
AS SELECT F.nome, P.nome, A.horas
FROM Funcionario F, Projeto P, Alocacao A
WHERE F.cod = A.codfuncionario and
P.idProjeto = A.codigoprojeto
54

VISÕES
• Podemos escrever consultas na visão definida.

• Ex.: Criar uma visão que contém informações gerenciais sobre um


departamento, contendo o nome do depto, total de empregados e total
de salários.

CREATE VIEW InfoDepto (nome, totalFuncionarios, totalSalario)


AS SELECT d.nome, COUNT(f.cod), SUM(f.salario)
FROM Departamento d, Funcionario f
WHERE d.coddep = f.depto GROUP BY d.nome
55

VISÕES
• Executar visão:
• Para executar a visão, basta usar a instrução SELECT sobre o nome da visão,
acrescentando ou não a cláusula WHERE se desejar filtrar os resultados
• Eliminando uma visão

• Usamos o comando DROP VIEW

• Sintaxe:

DROP VIEW nomeVisão


56

VISÕES
• Observações
• A utilização de visões permite simplificar e personalizar tabelas no
seu banco de dados.
• Também oferece um mecanismo de segurança (restringindo o
acesso de usuários a campos predeterminados).
• As visões mantêm os dados independentes da estrutura do banco
de dados, garantindo flexibilidade para a análise e manipulação
de dados.
• O SGBD armazena apenas a definição das visões (nome da visão
e o comando SELECT). Quando o usuário chama uma visão, o
sistema de banco de dados associa os dados apropriados a ela.
VISÕES

• Observações:

1) Uma visão definida numa única tabela é atualizável se os atributos da visão


contêm a chave primária.

2) Visões definidas sobre múltiplas tabelas usando junção geralmente não são
atualizáveis

3) Visões usando funções de agrupamento e agregados não são atualizáveis.