Você está na página 1de 47

INFORMTICA

BANCO DE DADOS II
VOLUME 2
Governador | Eduardo Campos

Vice-Governador | Joo Soares Lyra Neto

Secretrio de Educao | Anderson Stevens Lenidas Gomes

Secretrio Executivo de Educao Profissional | Paulo Dutra

Gerente Geral da Educao Profissional | Luciane Pula

Gestor de Educao a Distncia | Marcos Paulo de Assis Castro

Coordenador do Curso | Almir Pires

Professor Conteudista | Eduardo Arruda

Equipe Central de Educao a Distncia


Andria Guerra | Augusto Andrade | Eber Gomes | George Bento |
Jannine Moreno | Marcos Vincius Clemente | Maria de Lourdes Cordeiro
Marques | Maria Helena Cavalcanti | Mauro de Pinho Vieira | Pedro Luna

Imagem da capa: http://www.imagemativa.com.br/


SUMRIO

UNIDADE 4 .................................................................................................. 5
1. CONSULTAS AVANADAS ................................................................... 5
1.1 INNER JOIN ......................................................................................... 6
1.2 Croos Join ........................................................................................... 11
1.3 OUTER JOIN ...................................................................................... 13
1.4 Sub-Queries (Sub-Consultas).......................................................... 18
1.5 Operaes sobre Conjuntos ............................................................ 20
UNIDADE 5 ................................................................................................ 23
2. DCL Data Control Language & DTL Linguagem de Transao de
Dados ........................................................................................................ 23
UNIDADE 6 ................................................................................................ 28
3. EXERCCIOS DE APRENDIZAGEM ..................................................... 28
REFERNCIA ............................................................................................ 46

4 Informtica | Banco de Dados II | Volume 2


UNIDADE 4

1. CONSULTAS AVANADAS

Entrando em mais detalhes nas consultas mais avanadas vamos perceber


que podemos extrair todo tipo de informao de um banco de dados,
independente do SGBD, desde que seja relacional claro, com o poder da SQL
vamos obter sempre o que desejar obviamente que teremos que pensar mais
e utilizar mais comandos para isto.

C
onsultas Avanadas
Fonte: www.admin-blog.com

Informtica | Banco de Dados II | Volume 2 5


Com esta figura acima conseguimos visualizar facilmente o conceito de Joins,
ou seja, relacionamento entre dados efetivamente estruturados via comandos
de SQL, vamos discutir sobre cada um destes comandos usando outro
modelo de dados, que ser descrito logo mais e que mais uma vez, todos
poderemos implementar e testar os recursos em nossos computadores e em
nossas lan-houses. Vamos em frente.

1.1 INNER JOIN


Para trabalharmos nas consultas avanadas vamos utilizar como havia
dito antes um novo modelo de dados, sendo assim, um novo banco de dados,
lembrando que este o modelo conceitual e que precisamos gerar o modelo
lgico e implementar o modelo fsico igual fizemos anteriormente, portanto
como j sabemos fazer isto, mo a obra ok.

Modelo Conceitual para Consultas Avanadas


Fonte: Autor

6 Informtica | Banco de Dados II | Volume 2


Existem consultas que necessitam realizar uma juno (JOIN) entre
tabelas, para extrair dessa juno as informaes necessrias para a
consulta formulada. Vamos verificar as sintaxes do SQL ANSI(Padro) e no
nosso SGBD MySQL listadas abaixo:

ANSI SQL

SELECT <nome_da_tabela.nome_da_coluna

[nome_da_tabela.nome_da_coluna... . . ]>

FROM {nome_da_tabela [tipo de join]

nome_da_tabela ON condio de pesquisa

WHERE [condio de pesquisa... . . ]

MySQL

SELECT <nome_da_tabela.nome_da_coluna

[nome_da_tabela.nome_da_coluna... . . ]>

FROM <nome_da_tabela, nome_da_tabela>

WHERE <nome_da_tabela.nome_da_coluna [operador de


join] nome_da_tabela.nome_da_coluna

Informtica | Banco de Dados II | Volume 2 7


Agora que observamos a sintaxe dos comandos de Join vamos
execut-los, utilizando o INNER JOIN, para iniciar as atividades, vamos
juntos:

Consultas Avanadas INNER JOIN


Fonte: Autor

Nada melhor do que um exemplo prtico demonstrando como funciona


o comando para que vocs testem tambm seus resultados, obviamente que
depende tambm do contedo que existe cadastrado em sua base de dados.

Neste captulo sero sempre mostrados o exemplo na SQL padro e no


MySQL, para dirimir qualquer tipo e dvida, forando a todos praticarem e
aprenderem, no vai quem no quer. Aos exemplos:

8 Informtica | Banco de Dados II | Volume 2


ANSI SQL

SELECT Cliente.nome.cliente,

pedido.cod_cliente,

pedido.num_pedido

FROM cliente INNER JOIN pedido

ON cliente.codigo_do_cliente = pedido.codigo_do_cliente

MySQL

SELECT Cliente.nome_cliente,

pedido.cod_cliente,

pedido.num_pedido

FROM cliente, pedido

WHERE cliente.codigo_do_cliente = pedido.codigo_do_cliente

Observando o resultado das consultas de exemplo:

Informtica | Banco de Dados II | Volume 2 9


Figura Resultado INNER JOIN
Fonte: Autor

10 Informtica | Banco de Dados II | Volume 2


1.2 Croos Join

Figura CROSS JOIN


Fonte: Autor

A prpria imagem auto-explicativa, mas precisamos ver exemplos


mais contextualizados, para isto vamos usar nosso modelo proposto neste
captulo 4.

ANSI SQL

SELECT nome_cliente,
pedido.cod_cliente,
num_pedido
FROM cliente CROSS JOIN pedido

MySQL
Informtica | Banco de Dados II | Volume 2 11
SELECT nome_cliente,
pedido.cod_cliente,
num_pedido
FROM cliente, pedido

Observando o resultado das consultas de exemplo:

Figura Resultado CROSS JOIN


Fonte: Autor

12 Informtica | Banco de Dados II | Volume 2


1.3 OUTER JOIN

Seleo em que so restritas as linhas que interessam em uma tabela,


mas so consideradas todas as linhas de outra tabela.

Exemplo: Verificar quais clientes tem pedidos e quais no tm nenhum


pedido.

Pode ser utilizado s entre duas tabelas.

Possui trs tipos de qualificadores:

LEFT OUTER JOIN inclui todas as linhas da tabela do


primeiro nome de tabela (tabela mais esquerda da
expresso).

RIGHT OUTER JOIN inclui todas as linhas da tabela do


segundo nome de tabela da expresso.

FULL OUTER JOIN inclui as linhas que no satisfazem a


expresso tanto da primeira tabela quanto da segunda tabela.

Informtica | Banco de Dados II | Volume 2 13


Exemplo:

ANSI SQL

SELECT nome_cliente,

pedido.cod_cliente,

num_pedido

FROM cliente LEFT OUTER JOIN pedido

ON cliente.codigo_do_cliente = Pedido.codigo_do_cliente

Observando o resultado das consultas de exemplo:

Resultado OUTER JOIN


Fonte: Autor

14 Informtica | Banco de Dados II | Volume 2


Podemos utilizar as clusulas LIKE, NOT LIKE, IN, NOT IN, NULL,
NOT NULL e mistur-las com os operadores AND, OR e NOT, dentro de uma
clusula WHERE na juno entre tabelas.

Problema: Quais clientes tm prazo de entrega superior a 15 dias e


pertencem aos estados de So Paulo (SP) ou Rio de Janeiro (RJ)?

Figura OUTER JOIN - 2


Fonte: Autor

Executando os comandos em SQL, para validar o apresentado, vamos testar juntos:

ANSI SQL

SELECT Cliente.nome_cliente,

pedido.cod_cliente,

pedido.num_pedido

FROM cliente INNER JOIN pedido ON


cliente.codigo_do_cliente
Informtica | Banco de Dados II | Volume 2 15
= Pedido.codigo_do_cliente

WHERE UF IN (SP, RJ) AND prazo_entrega > 15

Figura Resultado OUTER JOIN


Fonte: Autor

Em outro exemplo podemos analisar as seguintes informaes:

Figura OUTER JOIN - 3


Fonte: Autor

16 Informtica | Banco de Dados II | Volume 2


Resultado em SQL, da proposio, uma consulta avanada:

SELECT nome_cliente, prazo_entrega

FROM cliente, pedido ON cliente.cod_cliente = pedido.cod_cliente

ORDER BY prazo_entrega desc;

Observe a Tabela resultante:

Figura Resultado - OUTER JOIN - 3


Fonte: Autor

Informtica | Banco de Dados II | Volume 2 17


1.4 Sub-Queries (Sub-Consultas)

As sub-consultas podem retornar um valor simples, ou um conjunto de


valores. Vamos iniciar os estudos com as Sub-consultas que retornam um
valor simples usadas para fazer comparao elemento-elemento, com a
expresso:
WHERE expresso {= | <> | > | >= | < | <=} (Sub-Consulta)
Vamos analisar a imagem abaixo:

Figura Sub-Consultas
Fonte: Autor

18 Informtica | Banco de Dados II | Volume 2


Solucionando a proposio teremos: Ao lado o Resultado do Comando:

SELECT descrio
FROM produto
WHERE cod_produto IN
(SELECT cod_produto
FROM item_pedido
WHERE quantidade = 10)

Figura Sub-Consulta
Fonte: Autor

Caractersticas extras das Sub-Consulta (Sub-Queries)

Existem Sub-consultas que retornam um conjunto de valores, usadas para


fazer comparao elemento-conjunto. Podem ser definidas atravs das
clusulas IN, ANY, ALL e EXISTS, usando a expresso:
WHERE expresso [NOT] IN (Sub-Consulta)
Obs: Estabelece uma relao de pertinncia () entre elementos e
conjuntos (tabelas). Sua avaliao retorna um valor booleano.

As Sub-consultas que retornam um conjunto de valores, verificam se a


condio verdadeira para pelo menos um dos valores retornados pela sub-

Informtica | Banco de Dados II | Volume 2 19


consulta e permite outras formas de comparao elemento-conjunto, usando
a expresso:
WHERE expresso { = | <> | > | >= | < | <= } ANY (Sub-consulta)

As Sub-consultas que retornam um conjunto de valores verificando a


existncia de dados numa lista de valores de outra subconsulta Retorna
VERDADE ou FALSIDADE, conforme a sub-consulta executada, com a
clusula:
WHERE expresso [NOT] EXISTE (Sub-consulta)

1.5 Operaes sobre Conjuntos

Para fechar o capitulo vamos estudar mais opes de se obter


informaes atravs da relao mais uma vez de teoria dos conjuntos,
vejamos os comandos e os exemplos.

Aplicveis apenas em tabelas compatveis para ser trabalhadas nestes


tios de comandos, ou seja, as tabelas devero conter os mesmos campos, ou
alguns campos em comum com os mesmos tipos de dados, caso contrrio
no funcionar, pois tudo nesta fase comparao entre colunas e linhas de
dados, vamos aos exemplos. As clusulas so as seguintes:

UNION () - Faz a unio, eliminando linhas repetidas.

Acrescenta-se ALL para manter as linhas repetidas

INTERSECT () - Retorna apenas as linhas que pertencem s duas


tabelas

20 Informtica | Banco de Dados II | Volume 2


EXCEPT () - Retorna apenas as linhas que pertencem primeira
tabela, com exceo das que aparecem na segunda.

Os exemplos sero os citados abaixo:


Considere as tabelas Abaixo definidas no Modelo Lgico Acadmico:
MEDICO (CodMedico, Nome, CRM) e
PACIENTE (CodPaciente, Nome);
DEPOSITANTE (CPF, Nome, Agencia, Conta) e
DEVEDOR (CPF, Nome, Agencia, Conta).

CLUSULA UNION
/* Projetar o nome de todas as pessoas cadastradas no hospital */
(SELECT Nome FROM MEDICO)
UNION
(SELECT Nome FROM PACIENTE);

/* Projetar todos os clientes da agncia A1com emprstimo ou depsito */


(SELECT * FROM DEPOSITANTE
WHERE Agencia = A1)
UNION ALL
(SELECT * FROM DEVEDOR
WHERE Agencia = A1);

Informtica | Banco de Dados II | Volume 2 21


Observao Final do Captulo: Todos os comando vistos at agora,
podero ser utilizados juntos, dentro de uma consulta(query), para
obteno de dados, incluindo as SUB-CONSULTAS, dependendo do
objetivo do relatrio. Existem consultas que necessitam realizar uma
juno (JOIN) entre tabelas, para extrair dessa juno as informaes
necessrias para a consulta formulada.

22 Informtica | Banco de Dados II | Volume 2


UNIDADE 5

2. DCL Data Control Language & DTL Linguagem de


Transao de Dados

Nestas duas ltimas classes no iremos especificamente disponibilizar


exemplos de criao de objetos apenas para no sair do foco da disciplina
que trabalhar os comandos SQL de forma avanada, mas no na parte de
gerenciamento e administrao de recursos do SGBD e sim na obteno das
informaes e criao de objetos especficos para que acontea a primeira
premissa.

DCL o grupo de comandos que permitem ao administrador de banco


de dados gerenciarem os aspectos de autorizao de dados e licenas de
usurios para controlar quem tem acesso para ver ou manipular dados dentro
do banco de dados. Controla os aspectos de autorizao de dados e licenas
de usurios para controlar quem tem acesso para ver ou manipular dados
dentro do banco de dados.

Alguns exemplos de comandos DCL so:

GRANT: concede privilgios a um ou mais usurios para acessar ou


realizar determinadas operaes em objetos de dados.
REVOKE: revoga (remove) ou restringe a capacidade de um usurio
de executar operaes.
SET: Define parmetros em tempo de execuo, como por exemplo,
o tipo de codificao do cliente e o estilo de representao de data e hora.

Informtica | Banco de Dados II | Volume 2 23


LOCK: Bloqueia explicitamente uma tabela fazendo o controle de
acessos concorrente.

DTL - Linguagem de Transao de Dados

Caro aluno esta ltima classe dos comandos de SQL define ou controla
as transaes entre processos que ocorrem entre o SGBD e o sistema
operacional que est instalado o banco de dados. Bem como o controle e
validao das entradas dos demais comandos, nem todos os SGBDs
possuem este recurso, alm disto, importante salientar que os que contm
tais recursos, funcionam todos a sua maneira, ou seja, como
DBA(Administrador de Banco de Dados) devo conhecer o SGBD que estarei
atuando como a palma da minha mo. Vejamos os comandos mais
conhecidos trabalhados nesta classe bem especial, porm restrita alguns
SGBDS.

BEGIN WORK (ou START TRANSACTION, dependendo do


dialeto SQL) pode ser usado para marcar o comeo de uma
transao de banco de dados que pode ser completada ou
no.

COMMIT envia todos os dados das mudanas


permanentemente.

ROLLBACK faz com que as mudanas nos dados existentes


desde que o ltimo COMMIT ou ROLLBACK sejam
descartadas.

24 Informtica | Banco de Dados II | Volume 2


Segue a descrio completa dos comandos Commit e Rollback:

COMANDO COMMIT
Name
COMMIT -- efetiva a transao corrente
Synopsis
COMMIT [ WORK | TRANSACTION ]

Entradas
WORK
TRANSACTION

Palavras chave opcionais. No produzem nenhum efeito.

Sadas
COMMIT

Mensagem retornada se a transao for efetivada com


sucesso.

NOTICE: COMMIT: no transaction in progress

Se no houver nenhuma transao sendo executada.

Descrio

O comando COMMIT efetiva a transao sendo executada. Todas as


modificaes efetuadas pela transao se tornam visveis para os
outros, e existe a garantia de permanecerem se uma falha ocorrer.

Notas

Informtica | Banco de Dados II | Volume 2 25


As palavras chave WORK e TRANSACTION so informativas podendo
ser omitidas.

Use o ROLLBACK para desfazer a transao.

Utilizao

Para tornar todas as modificaes permanentes:

COMMIT WORK;

COMANDO ROLLBACK
Name
ROLLBACK -- aborta a transao corrente
Synopsis
ROLLBACK [ WORK | TRANSACTION ]

Entradas

Nenhuma.

Sadas
ABORT

Mensagem retornada se o comando for executado com sucesso.

NOTICE: ROLLBACK: no transaction in progress

Se no houver nenhuma transao sendo executada.

26 Informtica | Banco de Dados II | Volume 2


Descrio

O comando ROLLBACK desfaz a transao corrente, fazendo com que todas as


modificaes realizadas pela transao sejam rejeitadas.

Notas

Use o comando COMMIT para terminar uma transao com sucesso. O


comando ABORT um sinnimo para o comando ROLLBACK.

Utilizao

Para abortar todas as modificaes:

ROLLBACK WORK;

Informtica | Banco de Dados II | Volume 2 27


UNIDADE 6

3. EXERCCIOS DE APRENDIZAGEM

Este captulo ser dedicado a exerccios, para que possamos desenvolver


mais e mais a prtica de SQL, que poder ser aplicada em qualquer SGBD a
sua escolha, independente da disciplina.
Vamos iniciar praticando sobre a linguagem SQL, usando o mesmo Banco de
Dados de Exemplo, o Northwind, que uma empresa distribuidora de
alimentos mundial. Portanto vamos analisar o que se pede nas questes
tentar resolver e conferir as respostas, desta vez com um diferencial de
dificuldade.

Modelo de Dados para Atividade


Fonte: Autor

28 Informtica | Banco de Dados II | Volume 2


1. Qual o Produto mais caro?
SELECT *
FROM Produtos
WHERE PreoUnitrio=(SELECT MAX(PreoUnitrio) FROM
Produtos);

2. Quais os produtos que so da mesma categoria do produto


TOFU?
SELECT [CdigoDoProduto]
FROM Produtos
WHERE CdigoDaCategoria =
(SELECT CdigoDaCategoria
FROM Produtos
WHERE
NomeDoProduto='TOFU');

3. Todos os produtos da categoria TOFU menos ele.


SELECT [CdigoDoProduto], [NomeDoProduto]
FROM Produtos
WHERE CdigoDaCategoria =
(SELECT CdigoDaCategoria
FROM Produtos
WHERE
NomeDoProduto='TOFU')
AND NomeDoProduto <>
'TOFU';

4. A quantidade de itens e o valor de cada pedido e quem pediu.


SELECT NmeroDoPedido,
COUNT(*) AS QuantidadeDeItens,
SUM(PreoUnitrio*Quantidade*(1-Desconto))

Informtica | Banco de Dados II | Volume 2 29


AS ValorTotal
FROM [Detalhes do Pedido]
GROUP BY NmeroDoPedido;
5. Os produtos que tem o Preo Unitrio maior que o Preo
Mdio.
SELECT [NomeDoProduto], [PreoUnitrio]
FROM Produtos
WHERE PreoUnitrio>(SELECT AVG(PreoUnitrio) FROM
Produtos);

6. Todos os produtos cujo Preo Unitrio seja maior que o Preo


Mdio da categoria do produto mais caro.
SELECT NomeDoProduto, PreoUnitrio
FROM Produtos
WHERE PreoUnitrio>
(SELECT AVG(PreoUnitrio) FROM Produtos
WHERE CdigoDaCategoria=
(SELECT MAX(PreoUnitrio)
FROM Produtos));

7. Todos os pedidos de clientes de pas de origem BRASIL.


SELECT *
FROM Pedidos
WHERE CdigoDoCliente IN(SELECT CdigoDoCliente
FROM Clientes
WHERE PasDeDestino='Brasil');

8. Qual o produto mais caro enviado para o BRASIL?


SELECT *
FROM Produtos
WHERE PreoUnitrio=
(SELECT MAX(PreoUnitrio)

30 Informtica | Banco de Dados II | Volume 2


FROM [Detalhes do Pedido]
WHERE NmeroDoPedido IN
(SELECT NmeroDoPedido
FROM Pedidos
WHERE
PasDeDestino='Brasil'));

9. Liste as categorias que tenham mais produtos do que a


categoria do produto mais barato.

SELECT [CdigoDaCategoria], COUNT(*) AS Quantidade


FROM Produtos
GROUP BY [CdigoDaCategoria]
HAVING COUNT(*)>
(SELECT COUNT(*)
FROM Produtos
WHERE CdigoDaCategoria=
(SELECT CdigoDaCategoria FROM Produtos WHERE
PreoUnitrio=
(SELECT MIN(PreoUnitrio) FROM Produtos)));

10. Listar o nome do funcionrio que tenha o mesmo supervisor


que o funcionrio 6.
SELECT Nome, Sobrenome
FROM Funcionrios
WHERE Supervisor=
(SELECT Supervisor
FROM Funcionrios
WHERE CdigoDoFuncionrio=6);

Informtica | Banco de Dados II | Volume 2 31


11. Listar o nome do supervisor do funcionrio 6.
SELECT Nome
FROM Funcionrios
WHERE CdigoDoFuncionrio=
(SELECT Supervisor
FROM Funcionrios
WHERE CdigoDoFuncionrio=6);
12. Liste o cdigo da categoria, o nome da categoria e a
quantidade de produtos na categoria.
SELECT Produtos.CdigoDaCategoria, NomeDaCategoria,
COUNT(*) AS QuantidadeDeProdutosNaCategoria
FROM Categorias, Produtos
WHERE
Categorias.CdigoDaCategoria=Produtos.CdigoDaCategoria
GROUP BY Produtos.CdigoDaCategoria, NomeDaCategoria;

13. Listar o nome do cliente e o nome dos produtos que ele


comprou, classificado por nome do cliente e nome do produto.
O uso da clusula DISTINCT no SELECT faz com que as
linhas exatamente iguais no sejam repetidas.
SELECT DISTINCT [NomeDaEmpresa],
[NomeDoProduto]
FROM Clientes AS CL, Produtos AS PD,
Pedidos AS PE, [Detalhes do Pedido] AS DT
WHERE CL.CdigoDoCliente=PE.CdigoDoCliente
And DT.NmeroDoPedido=PE.NmeroDoPedido
And DT.CdigoDoProduto=PD.CdigoDoProduto
ORDER BY 1, 2;

32 Informtica | Banco de Dados II | Volume 2


14. Listar o nome do funcionrio, seu sobrenome e o nome e
sobrenome do seu chefe.
SELECT DISTINCT FUN.Nome, FUN.Sobrenome,
SUP.Nome, SUP.Sobrenome
FROM Funcionrios AS FUN, Funcionrios AS SUP
WHERE FUN.Supervisor=SUP.CdigoDoFuncionrio;

15. Listar o nome do funcionrio, seu sobrenome e o nome e


sobrenome do seu chefe, inclusive o nome do chefe como
funcionrio.
SELECT FUN.Nome, FUN.Sobrenome, SUP.Nome,
SUP.Sobrenome
From Funcionrios FUN, Funcionrios SUP
WHERE FUN.Supervisor=SUP.CdigoDoFuncionrio;
UNION
SELECT FUN.Nome, FUN.Sobrenome,"",""
FROM Funcionrios FUN
WHERE FUN.Supervisor IS NULL;

16. Qual o produto mais caro?


SELECT NomeDoProduto, PreoUnitrio
FROM Produtos
WHERE PreoUnitrio = (SELECT MAX(PreoUnitrio) FROM
Produtos);

17. Quais os 2 produtos mais caros?


SELECT [NomeDoProduto], [PreoUnitrio]
FROM Produtos
WHERE PreoUnitrio =
(SELECT MAX(PreoUnitrio)
FROM Produtos
WHERE PreoUnitrio<>
(SELECT MAX(PreoUnitrio) FROM Produtos))
Informtica | Banco de Dados II | Volume 2 33
UNION SELECT NomeDoProduto, PreoUnitrio
FROM Produtos
WHERE PreoUnitrio = (SELECT MAX(PreoUnitrio) FROM
Produtos);

18. Quais os produtos mais caros que a mdia de sua categoria?


SELECT PROD.NomeDoProduto,
PROD.PreoUnitrio
FROM Produtos AS PROD
WHERE PreoUnitrio >
(SELECT AVG(PreoUnitrio
)FROM Produtos PROD1
WHERE PROD1.CdigoDaCategoria=
PROD.CdigoDaCategoria);

19. Listar nome do cliente, nome do produto, nome categoria,


nome da transportadora e nome do funcionrio que vendeu
produtos pedidos em outubro de 2008, comeando com a letra
A.
SELECT CLI.NomeDaEmpresa, PRD.NomeDoProduto,
CAT.NomeDaCategoria, TRA.NomeDaEmpresa,
FUN.Nome
FROM Clientes AS CLI, Produtos AS PRD, Categorias AS
CAT, Transportadoras AS TRA, Funcionrios AS FUN,
Pedidos AS PED, [Detalhes do Pedido] AS DET
WHERE PED.CdigoDoCliente=CLI.CdigoDoCliente
And PED.NmeroDoPedido=DET.NmeroDoPedido
And DET.CdigoDoProduto=PRD.CdigoDoProduto
And PRD.CdigoDaCategoria=CAT.CdigoDaCategoria
And PED.Via=TRA.CdigoDaTransportadora
And
PED.CdigoDoFuncionrio=FUN.CdigoDoFuncionrio
And ped.nomedoproduto like a* and ;

34 Informtica | Banco de Dados II | Volume 2


20. Quantos pedidos cada transportadora transportou Nome da
transportadora e N de Pedidos.
SELECT TRANS.NomeDaEmpresa AS NomeDaTransportadora,
COUNT(*) AS NmeroDePedidos
FROM Transportadoras AS TRANS,
Pedidos AS PED
WHERE TRANS.CdigoDaTransportadora=PED.Via
GROUP BY TRANS.NomeDaEmpresa;

21. Listar todos os pedidos cujo destinatrio seja diferente do


cliente.
SELECT PED.NmeroDoPedido, CLI.NomeDaEmpresa,
PED.NomeDoDestinatrio
FROM Clientes AS CLI, Pedidos AS PED
WHERE PED.CdigoDoCliente=CLI.CdigoDoCliente
And CLI.NomeDaEmpresa <> (
PED.NomeDoDestinatrio);

22. Listar a quantidade de clientes no Brasil.


SELECT COUNT(*) AS ClientesNoBrasil
FROM Clientes
WHERE Pas='Brasil';

23. Quantos produtos tm o nome terminado com X?


SELECT COUNT(*) AS ProdutosTerminadosComX
FROM Produtos
WHERE NomeDoProduto LIKE '*x';

Informtica | Banco de Dados II | Volume 2 35


24. Quais os fornecedores que fornecem produtos com
exatamente 4 letras?
SELECT NomeDaEmpresa
FROM Fornecedores
WHERE CdigoDoFornecedor IN
(SELECT CdigoDoFornecedor
FROM Produtos
WHERE NomeDoProduto LIKE '????');

25. Listar os funcionrios com data de admisso maior que a data


de admisso de seu chefe.
SELECT DISTINCT FUN.Nome, FUN.DataDeContratao
AS DataDeContrataoFuncionrio,
SUP.DataDeContratao AS DataDeContrataoSupervisor
FROM Funcionrios AS FUN, Funcionrios AS SUP
WHERE FUN.DataDeContratao>SUP.DataDeContratao
AND FUN.Supervisor = SUP.CdigoDoFuncionrio;

26. Listar os produtos que a transportadora Federal Shipping


ainda no entregou.
SELECT DISTINCT DET.CdigoDoProduto
FROM Pedidos AS PED, [Detalhes do Pedido] AS DET,
Transportadoras AS TRN, Produtos AS PRO
WHERE PED.DataDeEnvio Is Null
And TRN.NomeDaEmpresa='Federal Shipping'
And PED.NmeroDoPedido=DET.NmeroDoPedido
And PED.Via=TRN.CdigoDaTransportadora
And DET.CdigoDoProduto=PRO.CdigoDoProduto;

27. Listar o nome dos clientes e o nome das categorias que ele
comprou.
SELECT DISTINCT CLI.NomeDaEmpresa,
CAT.NomeDaCategoria

36 Informtica | Banco de Dados II | Volume 2


FROM Clientes AS CLI, Categorias AS CAT, Produtos AS
PRO, Pedidos AS PED, [Detalhes do Pedido] AS DET
WHERE PED.CdigoDoCliente=CLI.CdigoDoCliente
And PED.NmeroDoPedido=DET.NmeroDoPedido
And PRO.CdigoDaCategoria=CAT.CdigoDaCategoria
And PRO.CdigoDoProduto=DET.CdigoDoProduto;

28. Listar os pases com mais de 5 clientes.


SELECT Pas, COUNT(*) AS NmeroDeClientes
FROM Clientes
GROUP BY Pas
HAVING COUNT(*)>5;

29. Listar os produtos com necessidade de pedidos ao fornecedor:


(UNIDADES EMESTOQUE + UNIDADESPEDIDAS)
< NVELDEREPOSIO.
SELECT CdigoDoProduto, NomeDoProduto
FROM Produtos
WHERE (UnidadesEmEstoque+UnidadesPedidas)<
NvelDeReposio;

30. Qual o pedido que teve a maior quantidade de um mesmo


item?
SELECT [NmeroDoPedido]
FROM [Detalhes do Pedido]
WHERE Quantidade=
(SELECT MAX(Quantidade) FROM [Detalhes do Pedido]);

31. Quais so os pedidos com date de entrega 30 dias depois da


data do pedido?
SELECT [NmeroDoPedido]
FROM Pedidos
WHERE DataDeEntrega-DataDoPedido=30;
Informtica | Banco de Dados II | Volume 2 37
32. Para emitir Nota Fiscal so necessrios o Cliente, o endereo,
o cdigo do produto, o nome do produto, a quantidade, o preo
unitrio, o desconto e o total.
SELECT CLI.NomeDaEmpresa, CLI.Endereo,
PRO.CdigoDoProduto, PRO.NomeDoProduto,
DET.Quantidade, DET.PreoUnitrio, DET.Desconto,
(DET.PreoUnitrio*DET.Quantidade)*(1-DET.Desconto)
AS Total
FROM Clientes AS CLI, Produtos AS PRO, [Detalhes do
Pedido] AS DET, Pedidos AS PED
WHERE PED.NmeroDoPedido=DET.NmeroDoPedido
And PED.CdigoDoCliente=CLI.CdigoDoCliente And
DET.CdigoDoProduto=PRO.CdigoDoProduto
ORDER BY 1;
33. Liste Cliente, pedido, produto, valor de venda (quantidade *
preo)-desconto, valor real (quantidade * preo).
SELECT CLI.NomeDaEmpresa, PED.NmeroDoPedido,
PRO.NomeDoProduto,
(DET.PreoUnitrio*DET.Quantidade)*(1-DET.Desconto)
AS ValorVenda, (DET.PreoUnitrio*DET.Quantidade) AS
ValorReal
FROM Clientes AS CLI, Produtos AS PRO, [Detalhes do
Pedido] AS DET, Pedidos AS PED
WHERE
(((PED.NmeroDoPedido)=[DET].[NmeroDoPedido]) AND
((PED.CdigoDoCliente)=[CLI].[CdigoDoCliente]) AND
((DET.CdigoDoProduto)=[PRO].[CdigoDoProduto]))
ORDER BY 2;

34. Calcule, por Pas de venda, o total de perda financeira com


descontos.
SELECT [Pas], SUM(([PreoUnitrio]*[Quantidade])-
[PreoUnitrio]*[Quantidade]*(1-[Desconto]))
AS PerdasFinanceiras

38 Informtica | Banco de Dados II | Volume 2


FROM Clientes AS CLI, Pedidos AS PED,
[Detalhes do Pedido] AS DET
WHERE CLI.CdigoDoCliente=PED.CdigoDoCliente And
PED.NmeroDoPedido=DET.NmeroDoPedido
GROUP BY [Pas];

35. Liste os pedidos que foram atendidos por um supervisor.


SELECT *
FROM Pedidos
WHERE CdigoDoFuncionrio IN(SELECT Supervisor FROM
Funcionrios);

36. Liste a categoria, o produto, quantidade em estoque,


quantidade pedida, nvel de reposio e fornecedor.
SELECT NomeDaCategoria, NomeDoProduto,
UnidadesEmEstoque, UnidadesPedidas, NvelDeReposio,
NomeDaEmpresa
FROM Categorias AS CAT, Produtos AS PRO, Fornecedores
AS FORN
WHERE PRO.CdigoDaCategoria =
CAT.CdigoDaCategoria
AND PRO.CdigoDoFornecedor =
FORN.CdigoDoFornecedor;

37. Quais as transportadoras que tem pedidos no enviados?


SELECT NomeDaEmpresa
FROM Transportadoras
WHERE CdigoDaTransportadora IN
(SELECT Via FROM Pedidos WHERE DataDeEnvio IS NULL);

Informtica | Banco de Dados II | Volume 2 39


38. Qual o pedido que est a mais tempo sem ser enviado?
SELECT *
FROM Pedidos
WHERE DataDoPedido =
(SELECT MIN(DataDoPedido)
FROM Pedidos WHERE DataDeEnvio IS NULL)
AND DataDeEnvio IS NULL;

39. Quem fez o primeiro pedido (menor numero do pedido) e qual


o funcionrio que atendeu?
SELECT [NomeDaEmpresa], [Nome], [Sobrenome]
FROM Funcionrios AS FUN, Clientes AS CLI, Pedidos AS
PED
WHERE CLI.CdigoDoCliente = PED.CdigoDoCliente AND
PED.CdigoDoFuncionrio = FUN.CdigoDoFuncionrio
AND NmeroDoPedido=(SELECT MIN(NmeroDoPedido)
FROM Pedidos);

40. Quantos pedidos cada transportadora transportou?


SELECT NomeDaEmpresa, COUNT(*) AS
NmeroDePedidosTransportados
FROM Transportadoras, Pedidos
WHERE CdigoDaTransportadora = Via
GROUP BY NomeDaEmpresa;

41. Faa uma agenda contendo: Pas, Cidade, Empresa, Contato,


Endereo, (Cliente ou Fornecedor) conforme o caso,
classificada por Pas, Cidade, Empresa.
SELECT Pas, Cidade, NomeDaEmpresa, NomeDoContato,
Endereo,
"Cliente" AS Status
FROM Clientes
UNION

40 Informtica | Banco de Dados II | Volume 2


SELECT Pas, Cidade, NomeDaEmpresa, NomeDoContato,
Endereo, "Fornecedor" AS Status
FROM Fornecedores
ORDER BY 1, 2, 3;

42. D uma reduo de 20% para todos os produtos que foram


enviados ao Brasil.
UPDATE Produtos SET PreoUnitrio = PreoUnitrio*0.8
WHERE CdigoDoProduto IN(SELECT DET.CdigoDoProduto
FROM Pedidos PED, [Detalhes do Pedido]
DET
WHERE DET.NmeroDoPedido =

PED.NmeroDoPedido
AND PasDeDestino='Brasil');
43. Delete todos os detalhes e, posteriormente, todos os pedidos
feitos entre maio e junho de 1996.
DELETE *
FROM [Detalhes do Pedido]
WHERE NmeroDoPedido IN(SELECT NmeroDoPedido FROM
Pedidos
WHERE DataDoPedido >=#05/01/96#
AND DataDoPedido
<=#06/30/96#);

44. Liste os pedidos sem itens.


SELECT PED.NmeroDoPedido
FROM Pedidos AS PED
WHERE PED.NmeroDoPedido NOT IN
(SELECT NmeroDoPedido FROM [Detalhes do Pedido]);

Informtica | Banco de Dados II | Volume 2 41


45. Deletar os pedidos sem itens.
DELETE *
FROM Pedidos
WHERE NmeroDoPedido IN
(SELECT PED.NmeroDoPedido FROM Pedidos
PED
WHERE PED.NmeroDoPedido NOT IN(SELECT
NmeroDoPedido FROM [Detalhes
do Pedido]));

46. Dentro do pedido 10491 foi esquecido de colocar uma compra de 10


Tofus (cdigo 14), vendidos ao preo de R$ 15,00, com 5% de
desconto. Inclua esse item no Pedido 10491.
INSERT INTO [Detalhes do Pedido]
VALUES (10491, 14, 15, 10, 0.05);

47. Altere todos os funcionrios sob a superviso de Fuller para o


funcionrio 7.
UPDATE Funcionrios SET Supervisor = 7
WHERE CdigoDoFuncionrio = (SELECT
CdigoDoFuncionrio FROM Funcionrios WHERE
Sobrenome='Fuller');

48. Quais os produtos que no foram vendidos?


SELECT CdigoDoProduto, NomeDoProduto
FROM Produtos
WHERE CdigoDoProduto NOT IN
(SELECT CdigoDoProduto
FROM [Detalhes do Pedido]);

42 Informtica | Banco de Dados II | Volume 2


49. Retire do detalhe dos pedidos todas as vendas de Tofu.
DELETE *
FROM [Detalhes do Pedido]
WHERE CdigoDoProduto =
(SELECT CdigoDoProduto
FROM Produtos
WHERE NomeDoProduto LIKE 'Tofu');

50. Delete todos os pedidos transportados pela Federal


Shipping.
DELETE *
FROM Pedidos
WHERE Via=(SELECT CdigoDaTransportadora
FROM Transportadoras
WHERE NomeDaEmpresa LIKE 'Federal Shipping');

51. Criar uma tabela contendo: NMERO DO PEDIDO, VLR


TOTAL DO PEDIDO, NOME DA EMPRESA, sendo que o
nmero do pedido inteiro, o nome da empresa uma string
de tamanho 40 e a chave ser o nmero do pedido.
CREATE TABLE TotalDosPedidos
(NmeroDoPedido Numeric PRIMARY KEY,
ValorTotalPedido Numeric,
NomeDaEmpresa Varchar(40));

52. Criar uma chave primria no nmero do pedido.


CREATE TABLE TotalDosPedidos(NmeroDoPedido
Numeric PRIMARY KEY, ValorTotalPedido Numeric,
NomeDaEmpresa Varchar(40));

Informtica | Banco de Dados II | Volume 2 43


53. Criar um relacionamento entre a tabela Total dos Pedidos e a
tabela Pedidos.

54. Carregue a tabela Total dos Pedidos com os dados do


sistema.
INSERT INTO TotalDosPedidos
SELECT NmeroDoPedido AS NmeroDoPedido
FROM [Detalhes do Pedido];

INSERT INTO TotalDosPedidos


SELECT NomeDaEmpresa AS NomeDaEmpresa
FROM Clientes
WHERE NomeDaEmpresa = NomeDaEmpresa;

INSERT INTO TotalDosPedidos


SELECT ([PreoUnitrio]*[Quantidade])*(1-[Desconto]) AS
ValorTotalPedido
FROM [Detalhes do Pedido];

55. Criar uma tabela (CHEFES) contendo: Cdigo do


Funcionrio (inteiro), Nome do Funcionrio (caractere com 10)
e Sobrenome do Funcionrio (caractere com 20). Todos os
campos so obrigatrios.
CREATE TABLE Chefes (CdigoDoFuncionrio NUMBER
NOT NULL, Nome VARCHAR(10) NOT NULL, Sobrenome
VARCHAR(20) NOT NULL)

56. Carregue a tabela CHEFES com todos os supervisores.


INSERT INTO Chefes ( CdigoDoFuncionrio, Nome,
Sobrenome )
SELECT CdigoDoFuncionrio, Nome, Sobrenome
FROM Funcionrios;

44 Informtica | Banco de Dados II | Volume 2


57. Liste todos os produtos das categorias com mais de 5
fornecedores.
SELECT *
FROM Produtos
WHERE CdigoDaCategoria IN(SELECT CdigoDaCategoria
FROM Produtos PROD1 WHERE (SELECT COUNT(*)
FROM Produtos PROD2
WHERE PROD1.CdigoDaCategoria=PROD2.CdigoDaCategoria)
>5);

Informtica | Banco de Dados II | Volume 2 45


REFERNCIA

ELMASRI, Ramez E., NAVATHE, Shamkant B. Sistemas de Banco de


Dados, Pearson Addison-Wesley, 4a Edio, 2008.
DATE, Christopher J. Introduo a Sistemas de Bancos de Dados,
Campus, 1a Edio, 2004.
OPPEL, Andy. Banco de Dados Desmistificado, Alta Books, 1a Edio,
2004.
Monteiro, Emiliano Soares. Projetos de Sistemas e Bancos de Dados,
Edt Brasport 2004
SILBERSCHATZ, Abraham, KORTH, Henry F., SUDARSHAN, S.
Sistema de Banco de Dados, Campus, 5a Edio, 2006
ALMEIDA, Fabio. Mentesan. Introduo ao MySQL. Disponvel em:
<http://www.mentesan.com/mysql.html>. Acesso em: 10 maro 2011.
MYSQL. MySQL.com. Benchmarks. Disponvel em:
<http://www.mysql.com/why-mysql/benchmarks/>. Acesso em: 1 15
maro de 2011.
SQL MAGAZINE. Home devmedia. MySQL Quem voc?. Disponvel
em:
<http://www.sqlmagazine.com.br/Colunistas/AdrianoSantos/02_MYSQL.a
sp> . Acesso em:
WIKIPEDIA. A enciclopdia livre. Artigo. MySQL. Disponvel em:
<http://pt.wikipedia.org/wiki/MySQL>. Acesso em 15 de maro 2011.
NOVATEC. Livros. MySQL Completo. Disponvel em:
<http://www.novateceditora.com.br/livros/mysqlcompleto/capitulo8575221
035.pdf>. Acesso em: 14 maro 2011.

46 Informtica | Banco de Dados II | Volume 2

Você também pode gostar