Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
SQL Avanado
u n e s p
Exemplo de Modelo de Dados
u n e s p
Tabelas
Tabela Cliente
Ronaldo Celso Messias Correia ronaldo@fct.unesp.br
u n e s p
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:
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
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
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
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
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
*=
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
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
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)?
u n e s p
OUTER JOIN
Diagrama grfico:
CLIENTE Cdigo_do_cliente Nome_do_cliente Endereo Cidade CEP UF CGC IE PEDIDO
> 15
IN (SP, RJ)
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
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
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
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;
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
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:
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
u n e s p
Sintaxe
SELECT descrio FROM produto WHERE cod_produto IN (SELECT cod_produto FROM item_pedido WHERE quantidade = 10)
u n e s p
Resultado:
DESCRIO Queijo Vinho Linho
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:
u n e s p
Sintaxe
INSERT into produto VALUES (108, Parafuso, Kg, 1.25);
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>;
u n e s p
Adicionando Registro Tabela
Diagrama grfico:
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
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