Sei sulla pagina 1di 34

SQL Avanado

Fabiano Santos de Oliveira

Sistemas de Apoio a Deciso Faculdade Alfa

Exemplo de Modelo de Dados

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

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
Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
Nome_Cliente Ana Ana Ana Ana Flvio Jorge Maurcio Rodolfo Rodolfo Rodolfo Beth Lvio Susana Susana Susana Susana Pedido.Codigo_do_cliente 720 720 720 720 870 110 830 410 410 410 20 180 260 260 260 260
Sistemas de Apoio a Deciso Faculdade Alfa

Pedido.num_pedido 97 101 137 148 189 104 203 121 98 127 143 105 111 103 91 138

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

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
Nome_Cliente Ana Ana Ana Ana Flvio Flvio Flvio Flvio Jorge Jorge Jorge Jorge Lcia Lcia Lcia Pedido.Codigo_do_cliente 720 260 870 390 720 260 870 390 720 260 870 390 720 260 870 Pedido.num_pedido 97 111 54 119 97 111 54 119 97 111 54 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. Sistemas de Apoio a Deciso Faculdade Alfa

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.

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
Nome_Cliente Ana Ana Ana Ana Flvio Jorge Maurcio Rodolfo Rodolfo Rodolfo Beth Lcia Edmar Paulo Jos Pedido.Codigo_do_cliente 720 720 720 720 870 110 830 410 410 410 20 NULL NULL NULL NULL Pedido.num_pedido 97 101 137 148 189 104 203 121 98 127 143 NULL NULL NULL NULL

Sistemas de Apoio a Deciso Faculdade Alfa

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)?

Sistemas de Apoio a Deciso Faculdade Alfa

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)

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
NOME CLIENTE Ana Maurcio Rodolfo Beth Susana UF RJ SP RJ SP RJ PRAZO ENTREGA 20 30 20 30 20

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

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;

Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
NOME CLIENTE Jorge Maurcio Beth Sebastio Rodolfo Ana Susana Ana Flvio Lvio Renato Rodolfo PRAZO ENTREGA 30 30 30 30 20 20 20 15 15 15 15 10

Sistemas de Apoio a Deciso Faculdade Alfa

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:

Sistemas de Apoio a Deciso Faculdade Alfa

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;
Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
NOME CLIENTE Ana Rodolfo Susana

Sistemas de Apoio a Deciso Faculdade Alfa

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:

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

Resultado:
DESCRIO Queijo Vinho Linho

Sistemas de Apoio a Deciso Faculdade Alfa

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:

Sistemas de Apoio a Deciso Faculdade Alfa

Sintaxe
INSERT into produto VALUES (108, Parafuso, Kg, 1.25);

Sistemas de Apoio a Deciso Faculdade Alfa

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.

Sistemas de Apoio a Deciso Faculdade Alfa

Adicionando Registro Tabela


Diagrama grfico:

Sistemas de Apoio a Deciso Faculdade Alfa

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

Sistemas de Apoio a Deciso Faculdade Alfa

Exerccios
1. Listar todos os produtos com codigo, descries, nome de categoria e 2. 3. 4. 5. 6. 7. 8. 9.
preo; Listar da tabela USURIOS o nome do cliente e seu endereo; Listar o CDIGO do pedido, o cdigo do produto e a quantidade dos itens do pedido, cuja quantidade seja maior que 25; Quais os usurios que moram em Umuarama; Mostrar os pedidos criados no ms de janeiro de 2011; Listar o cdigo e a descrio dos produtos que tenham o valor unitrio na faixa de R$ 5,00 at R$ 32,00; Listar todos os produtos que tenham o seu nome comeando por Q; Mostrar os usurios com emails com @uol.com.br; Mostrar em ordem alfabtica a lista de usurios;

Sistemas de Apoio a Deciso Faculdade Alfa

Exerccios
1. Listar os nomes, cidades e estados de todos os usurios, ordenados 2. 3. 4. 5. 6.
por estado e cidade de forma descendente Mostrar a quantidade total pedida para o produto VINHO de cdigo 78 na tabela item_de_pedido 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 Acrescentar 2,5% ao preo unitrio dos produtos

Sistemas de Apoio a Deciso Faculdade Alfa

Potrebbero piacerti anche