Sei sulla pagina 1di 36

u n e s p

SQL Avanado

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br


Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Exemplo de Modelo de Dados

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Tabelas

Tabela Cliente
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Joins (Recuperando dados de vrias tabelas)
Existem consultas que necessitam realizar
uma juno (JOIN) entre tabelas, para extrair dessa juno as informaes necessrias para a consulta formulada. Qualificador de Nome:

Consiste no nome da tabela seguido de um ponto e o nome da coluna na tabela.


Exemplo: Produto.descrio

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
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

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
INNER JOIN
Com o INNER JOIN sero includas somente as linhas
que satisfazem a condio do join. Problema: Ver os pedidos de cada cliente. Diagrama grfico:
CLIENTE Cdigo_do_cliente Nome_do_cliente Endereo Cidade CEP UF CGC IE PEDIDO Nmero_do_pedido Prazo_de_entrega Cdigo_do_cliente Cdigo_do_vendedor

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
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
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
Nome_Cliente Ana Ana Ana Ana Flvio Jorge Maurcio Rodolfo Rodolfo Rodolfo Beth Lvio Pedido.Codigo_do_cliente 720 720 720 720 870 110 830 410 410 410 20 180 Pedido.num_pedido 97 101 137 148 189 104 203 121 98 127 143 105

Susana
Susana Susana Susana

260
260 260 260
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

111
103 91 138

u n e s p
CROSS JOIN ou Produto Cartesiano
Com o CROSS JOIN sero includas cada uma das
combinaes de todas as linhas entre as tabelas. Problema: Juntar Clientes com Pedidos. Diagrama grfico:
CLIENTE Cdigo_do_cliente Nome_do_cliente Endereo Cidade CEP UF CGC IE = PEDIDO Nmero_do_pedido Prazo_de_entrega Cdigo_do_cliente Cdigo_do_vendedor

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
ANSI SQL
SELECT nome_cliente, pedido.cod_cliente, num_pedido FROM cliente CROSS JOIN pedido

MySQL
SELECT nome_cliente, pedido.cod_cliente, num_pedido FROM cliente, pedido

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
Nome_Cliente Ana Ana Pedido.Codigo_do_cliente 720 260 Pedido.num_pedido 97 111

Ana
Ana Flvio Flvio Flvio Flvio Jorge Jorge Jorge

870
390 720 260 870 390 720 260 870

54
119 97 111 54 119 97 111 54

Jorge
Lcia Lcia Lcia

390
720 260 870

119
97 111 54

Observa-se que no existe muito proveito do resultado desse tipo de JOIN, excetuando-se quando queremos fazer referncia cruzada entre duas tabelas e todas as suas linhas. Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
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 (tabela mais direita da expresso).. FULL OUTER JOIN inclui as linhas que no satisfazem a expresso tanto da primeira tabela quanto da segunda tabela. Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
OUTER JOIN
Problema: Quais so os clientes que tm pedido e os que
no tm pedido. Diagrama grfico:
CLIENTE Cdigo_do_cliente Nome_do_cliente Endereo Cidade CEP UF CGC IE PEDIDO

*=

Nmero_do_pedido Prazo_de_entrega Cdigo_do_cliente Cdigo_do_vendedor

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL

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

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
Nome_Cliente Ana Ana Pedido.Codigo_do_cliente 720 720 Pedido.num_pedido 97 101

Ana
Ana Flvio Jorge Maurcio Rodolfo Rodolfo Rodolfo Beth

720
720 870 110 830 410 410 410 20

137
148 189 104 203 121 98 127 143

Lcia
Edmar Paulo Jos

NULL
NULL NULL NULL

NULL
NULL NULL NULL

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
OUTER JOIN
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)?

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
OUTER JOIN
Diagrama grfico:
CLIENTE Cdigo_do_cliente Nome_do_cliente Endereo Cidade CEP UF CGC IE PEDIDO

Nmero_do_pedido Prazo_de_entrega Cdigo_do_cliente Cdigo_do_vendedor

> 15

IN (SP, RJ)

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
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 WHERE UF IN (SP, RJ) AND prazo_entrega > 15

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
NOME CLIENTE Ana Maurcio Rodolfo Beth Susana UF RJ SP RJ SP RJ PRAZO ENTREGA 20 30 20 30 20

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
OUTER JOIN
Problema: Mostrar os clientes e seus respectivos prazos
de entrega, ordenados do maior para o menor. Diagrama grfico:
CLIENTE Cdigo_do_cliente Nome_do_cliente Endereo Cidade CEP UF CGC IE PEDIDO Nmero_do_pedido Prazo_de_entrega Cdigo_do_cliente Cdigo_do_vendedor
ORDER BY prazo_entrega DESC

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
ANSI SQL
SELECT nome_cliente, prazo_entrega FROM cliente, pedido ON cliente.cod_cliente = pedido.cod_cliente ORDER BY prazo_entrega desc;

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
NOME CLIENTE Jorge Maurcio Beth PRAZO ENTREGA 30 30 30

Sebastio
Rodolfo Ana Susana Ana Flvio Lvio Renato

30
20 20 20 15 15 15 15

Rodolfo

10

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Juntando mais de duas Tabelas
Problema: Mostre os clientes (ordenados) que tm prazo de
entrega maior que 15 dias para o produto QUEIJO e sejam do Rio de Janeiro.. Diagrama grfico:

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
ANSI SQL
SELECT Cliente.nome_cliente, FROM cliente INNER JOIN pedido ON cliente.codigo_do_cliente = pedido.codigo_do_cliente INNER JOIN item_de_pedido ON pedido_num_pedido = item-de_pedido.num_pedido INNER JOIN produto ON item_de_pedido.cod_produto=produto.cod_produto WHERE Pedido.prazo_entrega > 15 AND Produto.Descrio = queijo AND Cliente.UF = RJ ORDER BY Cliente.nome_cliente

MySQL
SELECT nome_cliente FROM cliente, pedido, item_pedido, produto WHERE Cliente.cod_cliente = Pedido.cod_cliente AND Pedido_num_pedido = Item_de_pedido.num_pedido AND Item_de_pedido.cod_produto = Produto.cod_produto AND Pedido.prazo_entrega > 15 AND Produto.Descrio = queijo AND Cliente.UF = RJ ORDER BY Cliente.nome_cliente;
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
NOME CLIENTE Ana Rodolfo Susana

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p Utilizando Consultas Encadeadas


(Subqueries)
Subquery: quando o resultado de uma consulta utilizado por
outra consulta, de forma encadeada e contida no mesmo comando SQL. Problema Utilizando IN - Que produtos participam de qualquer pedido cuja quantidade seja 10? Diagrama grfico:

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe
SELECT descrio FROM produto WHERE cod_produto IN (SELECT cod_produto FROM item_pedido WHERE quantidade = 10)

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Resultado:
DESCRIO Queijo Vinho Linho

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Adicionando Registro Tabela
Forma:
INSERT INTO <nome da tabela> <nome da(s) coluna(s)>) VALUES (<valores>); Problema: Adicionar o produto parafuso tabela produto. Diagrama grfico:

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe
INSERT into produto VALUES (108, Parafuso, Kg, 1.25);

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Adicionando Registros usando SELECT
Formato:
INSERT INTO <nome da tabela> (<nome da(s) coluna(s)>) SELECT <nome da(s) coluna(s)> FROM <nome da tabela> WHERE <condio>;

Problema: Cadastrar como cliente os vendedores que


emitiram mais de 50 pedidos. Usar para cdigo de cliente o mesmo cdigo de vendedor.

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Adicionando Registro Tabela
Diagrama grfico:

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Sintaxe ANSI SQL e MySQL
ANSI SQL
INSERT into cliente (cod_cliente, nome_cliente) SELECT cod_vendedor, nome_vendedor, COUNT(*) FROM vendedor, pedido WHERE Vendedor.cod_vendedor = Pedido.cod_vendedor HAVYNG COUNT(*) > 50

MySQL
INSERT cliente (cod_cliente, nome_cliente) SELECT cod_vendedor, nome_vendedor, COUNT(*) FROM vendedor, pedido WHERE Vendedor.cod_vendedor = Pedido.cod_vendedor HAVYNG COUNT(*) > 50

Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Exerccios
Listar todos os produtos com respectivas descries, unidades e
valores unitrios Listar da tabela CLIENTE o CGC, o nome do cliente e seu endereo Listar o nmero do pedido, o cdigo do produto e a quantidade dos itens do pedido, cuja quantidade seja maior que 25 Quais os clientes que moram em Niteri Listar os produtos que tenham unidade igual a M e valor unitrio igual a R$ 1,05 da tabela produto Liste os clientes e seus respectivos endereos, que moram em SO PAULO ou estejam na faixa de CEP entre 30077000 e 30079000 Mostrar os pedidos que no tenham prazo de entrega igual a 15 dias Listar o cdigo e a descrio dos produros que tenham o valor unitrio na faixa de R$ 0,32 at R$ 2,00. Listar todos os produrtos que tenham o seu nome comeando por Q Listar os vendedores que no comeam por Jo Listar os vendedores que so da faixa de comisso A e B Mostrar os clientes que no tenham inscrio estadual Mostrar em ordem alfabtica a lista de vendedores e seus respectivos salrios fixos Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

u n e s p
Exerccios
Listar os nomes, cidades e estados de todos os clientes, ordenados

por estado e cidade de forma descendente Mostrar a descrio e o valor unitrio de todos os produtos que tenham a unidade KG, em ordem de valor unitrio ascendente Listar o menor e o maior salrio da tabela vendedor Mostrar a quantidade total pedida para o produto VINHO de cdigo 78 na tabela item_de_pedido Qual a mdia dos salrios fixos dos vendedores Quantos vendedores ganham acima de R$ 2.500,00 de salrio fixo Quais as unidades de produtos, diferentes, na tabela produto Listar o nmero de produtos que cada pedido contm Listar os pedidos que tm mais do que trs produtos Alterar o valor unitrio do produto parafuso de R$ 1.25 para R$ 1.62 Atualizar o salrio fixo de todos os vendedores em 27% mais uma bonificao de R$ 100,00 Acrescentar 2,5% ao preo unitrio dos produtos que estejam abaixo da mdia dos preos, para aqueles comprados a Quilo Apagar todos os vendedores com faixa de comisso nula Apagar todos os registros de pedidos realizados por vendedores fantasmas Ronaldo Celso Messias Correia ronaldo@fct.unesp.br

Potrebbero piacerti anche