Google
 
Mostrando postagens com marcador SQL. Mostrar todas as postagens
Mostrando postagens com marcador SQL. Mostrar todas as postagens

terça-feira, 25 de setembro de 2007

SELECT usando INNER JOIN, LEFT e RIGHT


Muita gente usa ainda um forma normal de SELECT entre tabelas que se torna lerda e que pode ganhar mais performance se usarmos INNER, LEFT e RIGHT JOIN, vamos imaginar a seguinte situação você tenha duas tabelas: Clientes e Vendas, relacionadas entre si. Na tabela de Clientes, você tem o cadastro de todos os clientes da loja. Na tabela de Vendas, você tem as vendas que foram realizadas pelos clientes da loja, agora suponha ainda que não é obrigado o cliente ser cadastrado para efetuar uma venda.

Neste cenário, podemos ter três situações:

1 - Existem clientes que ainda não fizeram nenhuma compra na loja.
2 - Existem vendas que foram efetuadas por clientes não cadastrados no sistema.
3 - Existem vendas que foram realizadas por clientes cadastrados.

INNER JOIN: O Inner Join é utilizado nas situações em que você quer selecionar registros das duas tabelas, desde que as mesmas possuam informações cruzadas (relacionadas). No exemplo abaixo a consulta vai retornar os clientes cadastrados que efetuaram compras.

SELECT campos FROM Clientes c INNER JOIN Venda v ON c.cod_cliente = v.cod_cliente

LEFT JOIN: O Left Join ele aplica o conceito de Outer Join na tabela que se encontrar à esquerda da relação (ou seja, o resultado vem da tabela à esquerda). No nosso exemplo a consulta retorna apenas os clientes que ainda não efetuaram nenhuma compra na loja.

SELECT campos FROM Clientes c LEFT OUTER JOIN Venda v ON c.cod_cliente = v.cod_cliente WHERE c.cod_cliente IS NULL

RIGHT JOIN: O Right Join aplica o conceito de Outer Join na tabela que se encontrar à direita da relação (ou seja, o resultado vem da tabela à direita). No nosso exemplo a consulta retorna apenas as vendas que foram realizadas por clientes não cadastrados na loja.

SELECT campos FROM Clientes c RIGHT OUTER JOIN Venda v ON c.cod_cliente = v.cod_cliente WHERE v.cod_cliente IS NULL


terça-feira, 4 de setembro de 2007

SELECT dentro de SELECT


Uma coisa muito interessante que a maioria dos SGBDs atuais no mercado tem é uma propriedade que permite realizar um SELECT dentro de outro SELECT. Vamos imaginar a seguinte situação, temos os seguintes registros de uma tabela:

Codigo

Tipo

Status

1

1

1

2

2

3

3

2

4

4

1

2

5

2

5

Agora você deseja agrupar esses itens pelo Tipo exibindo o ultimo registro. Quando usamos o GROUP BY o SELECT agrupa todos os itens mais pegando sempre o primeiro registro.

Ex: SELECT * FROM tabela GROUP BY Tipo

Resultados:

Codigo

Tipo

Status

1

1

1

2

2

3

Mesmo que você utilize o ORDER BY dentro deste SELECT ele não ira funcionar (SELECT * FROM tabela GROUP BY Tipo ORDER BY Codigo).

Como queremos o ultimo registro vamos então usar um SELECT dentro de outro SELECT, vamos preceder da seguinte maneira, primeiro vamos criar um SELECT de maneira que os dados venham em ordem decrescente em seguida utilizando a técnica para criar um SELECT dentro de outro e vamos agrupá-los pelo Tipo.

Ex: SELECT * FROM (SELECT * FROM tabela ORDER BY Código DESC) AS a GROUP BY a.Tipo

Resultados:

Código

Tipo

Status

4

1

2

5

2

5

Podemos usar o SELECT dentro de outro SELECT para inúmeras soluções, basta apenas surgir à oportunidade.


Publicidade