quinta-feira, 28 de maio de 2009

SQL: Uso do JOIN em cláusulas SELECT

O SQL (Structured Query Language, ou Linguagem de Consulta Estruturada) é a linguagem padrão para recuperação de informações em banco de dados relacionais. Ela é uma linguagem muito fácil de usar e ao mesmo tempo poderosa, já que permite combinar informações obtidas a partir de diversas tabelas e usar uma diversidade muito grande de filtros de seleção.

O funcionamento do SQL é baseado na teoria de conjuntos, ou seja, as tabelas são consideradas conjuntos de dados e o resultado das pesquisas são subconjuntos que podem ser obtidos, por exemplo, através da interseção ou união dos conjuntos originais.

Tendo isso em mente, é fácil usar as cláusulas SQL para realizar pesquisas mais complexas. Para isso, o SQL disponibiliza o comando JOIN, que permite combinar dados de tabelas diferentes.

Para mostrar como o JOIN funciona, eu vou dar um exemplo bem básico, mas, que pode ser facilmente extrapolado para situações mais complexas, desde que se tenha o conceito em mente.

Imagine um banco de dados que possua apenas duas tabelas, cujos layout e conteúdo estão detalhados abaixo:

  • Modelo de dados e conteúdo das tabelas

Pessoa

idPessoa

nomePessoa

5

Cinconegue

10

Dezembrino

12

Dozeario

14

Quatorzeano

15

Quinzenio

17

Dezessetino

Automovel

idAuto

idPessoa

descAuto

B

(null)

Fusca branco

E

14

Opala bege

F

(null)

Passat amarelo

H

(null)

DKW

J

5

Gordini marrom

K

(null)

Brasília branca

M

17

Passat cinza

N

12

Belina verde

P

(null)

Fiat 147

Q

14

Fusca azul

R

12

Brasília preta

T

14

Opala vermelho

Se representarmos o conteúdo deste banco de dados em forma de conjunto, ele ficaria assim:

Feito isso, nós podemos entender melhor o efeito do JOIN quando aplicado a este conjunto de dados. Veja os exemplos abaixo:

  • INNER JOIN

O INNER JOIN retorna o sub-conjunto interseção dos conjuntos envolvidos na pesquisa.

SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa INNER JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;

Pessoa.idPessoa

nomePessoa

idAuto

Automovel.idPessoa

descAuto

5

Cinconegue

J

5

Gordini marrom

12

Dozeario

N

12

Belina verde

12

Dozeario

R

12

Brasília preta

14

Quatorzeano

E

14

Opala bege

14

Quatorzeano

Q

14

Fusca azul

14

Quatorzeano

T

14

Opala vermelho

17

Dezessetino

M

17

Passat cinza

Ou seja só são exibidos elementos que estão nos dois conjuntos. Esta é a utilização mais comum do JOIN nas pesquisas que envolvem mais de uma tabela.

O INNER JOIN pode ser escrito também no formato abaixo (chamado de implícito) e o resultado é exatamente o mesmo:

SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa, Automovel
WHERE Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;

  • LEFT JOIN

O LEFT JOIN retorna todos os elementos que estão no conjunto da esquerda (a primeira tabela), mais os elementos que estão na interseção.

SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa LEFT JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;

Pessoa.idPessoa

nomePessoa

idAuto

Automovel.idPessoa

descAuto

5

Cinconegue

J

5

Gordini marrom

10

Dezembrino

(null)

(null)

(null)

12

Dozeario

N

12

Belina verde

12

Dozeario

R

12

Brasília preta

14

Quatorzeano

E

14

Opala bege

14

Quatorzeano

Q

14

Fusca azul

14

Quatorzeano

T

14

Opala vermelho

15

Quinzenio

(null)

(null)

(null)

17

Dezessetino

M

17

Passat cinza

  • RIGHT JOIN

O RIGHT JOIN, ao contrário, retorna todos os elementos que estão no conjunto da direita (a segunda tabela), mais os elementos que estão na interseção.

SELECT Pessoa.idPessoa, nomePessoa, idAuto, Automovel.idPessoa, descAuto
FROM Pessoa RIGHT JOIN Automovel ON Pessoa.idPessoa = Automovel.idPessoa
ORDER BY 1, 3;

Pessoa.idPessoa

nomePessoa

idAuto

Automovel.idPessoa

descAuto

(null)

(null)

B

(null)

Fusca branco

(null)

(null)

F

(null)

Passat amarelo

(null)

(null)

H

(null)

DKW

(null)

(null)

K

(null)

Brasília branca

(null)

(null)

P

(null)

Fiat 147

5

Cinconegue

J

5

Gordini marrom

12

Dozeario

N

12

Belina verde

12

Dozeario

R

12

Brasília preta

14

Quatorzeano

E

14

Opala bege

14

Quatorzeano

Q

14

Fusca azul

14

Quatorzeano

T

14

Opala vermelho

17

Dezessetino

M

17

Passat cinza

Os exemplos acima, apesar de muito simples, podem ser facilmente extrapolados para a maioria das pesquisas onde é necessária a pesquisa em mais de uma tabela, pois, apesar de ser possível existir mais complexidade nas cláusulas, o raciocínio básico é exatamente o mesmo.

segunda-feira, 18 de maio de 2009

Processos X Projetos

Não é raro que as pessoas confundam essas duas palavras e seus significados: processos e projetos. Mas a distinção dos dois termos é fundamental para quem está inserido numa organização.

Um processo pode ser definido como uma sequência de atividades dinâmicas e contínuas, logicamente relacionadas, executadas para obter um resultado bem definido. Outra definição descreve o processo como uma sequência de passos, tarefas e atividades que convertem entradas em uma saída. Um processo é contínuo e repetitivo.

Já um projeto é um empreendimento temporário com o objetivo de criar um produto ou serviço único. Tem início, meio e fim. O projeto é normalmente autorizado como resultado de uma ou mais considerações estratégicas: pode ser uma demanda de mercado, necessidade organizacional, solicitação de um cliente, avanço tecnológico ou requisito legal. Veja as principais características dos projetos: (1) são temporários, possuem um início e um fim definidos; (2) são planejados, executados e controlados; (3) entregam produtos, serviços ou resultados exclusivos; (4) são realizados por pessoas; e (5) são realizados com recursos limitados.

Ou seja, em geral, os processos estão relacionados ao dia-a-dia das empresas, enquanto os projetos estão mais relacionados à inovação ou novos produtos e serviços.