Por que eu devo ler este artigo:

O objetivo desse artigo é apresentar a instrução SELECT e seus detalhes de uso, principais características, algumas diferenças na sua implementação entre os diferentes fabricantes de SGBD, assim como suas melhores práticas e, desde o início, como escrevê-la de forma que tenha sempre boa performance.

Nosso foco principal será a preparação de instruções SELECT que tragam o resultado de duas ou mais tabelas, isto é, façam joins entre estas tabelas e retorne seus dados num único comando. Serão apresentados uma série de exemplos para ilustrar e tornar o seu entendimento mais fácil.

Com esses conceitos você descobrirá qual tipo de join se adapta corretamente ao seu problema, como escrevê-lo da forma correta, e também que pode escrever muito menos linhas de código na sua aplicação porque uma instrução SELECT poderá fazer grande parte desse trabalho para você.

Portanto, se você é um desenvolvedor, você já utilizou ou utilizará essa instrução. Assim, nada melhor do que conhecer seus detalhes e como utilizá-la de maneira que torne sua aplicação o mais eficiente possível no acesso aos seus dados.

Em um artigo publicado na edição 129, fizemos uma introdução à instrução SELECT da linguagem SQL. Nele apresentamos sua forma básica de uso de tal modo que você já conseguisse escrever as primeiras instruções, recuperando dados do seu banco de dados, utilizando funções muito úteis no seu dia a dia.

Este artigo avançará mais profundamente nessa mesma instrução SELECT. Vamos colocar seu conhecimento da instrução em seu nível intermediário. Suficiente para utilizá-la em 90% das situações enfrentadas diariamente por um desenvolvedor.

Novamente, utilizaremos as melhores práticas como nossa orientação primordial. Como melhores práticas você poderá entender: instruções simples, escritas de forma clara e correta, e apresentando a melhor performance possível.

O foco nesse artigo será como apresentar os dados de duas ou mais tabelas em uma única instrução, isto é, como montar joins. Vamos apresentar e conceituar os diferentes tipos de joins e suas diferentes formas de escrevê-los.

Modelo de dados de exemplos

O assunto central deste artigo são as várias formas de join, ou combinação de várias tabelas em uma única instrução. Para se combinar tabelas, é primordial conhecer como estas tabelas foram modeladas e se relacionam.

Não conseguiríamos escrever um join sem saber quais são as colunas de duas tabelas que definem o seu relacionamento. Portanto, para termos sucesso e clareza em nossos exemplos, vamos apresentar o modelo de dados que será utilizado para desenvolvermos as instruções SELECT ao longo desse artigo.

Na Figura 1 é possível ver o esquema simplificado dos relacionamentos entre as tabelas. Nosso objetivo aqui não é falar sobre este tipo de esquema, chamado de Modelo de Entidades e Relacionamentos, que tem muito mais símbolos do que os apresentados aqui. Por isso, apresentaremos rapidamente o que ele está descrevendo.

Nesse conjunto de tabelas, temos a listagem dos materiais (tabela Materiais) utilizados por uma empresa fictícia para a qual vamos montar nossos exemplos. Cada um desses materiais é comprado de uma empresa fornecedora (tabela Fornecedores).

Temos também os pedidos de compra que foram feitos para cada fornecedor (tabela Pedidos), com seus respectivos itens (tabela “Itens x Pedidos”), isto é, quais materiais foram solicitados nos pedidos. A última tabela é a tabela de unidades. Nela estão as definições das unidades de medida utilizadas para contar ou medir os itens.

As setas que ligam uma tabela, ou entidade, as outras representam os relacionamentos que existem entre elas. O sentido da seta indica qual tabela é pai e qual é filha nesse relacionamento, estando a filha do lado da seta.

Para ficar mais claro, existe uma seta entre a tabela de Fornecedores e Materiais, apontando para tabela Materiais. Isto indica que existe um relacionamento entre as duas tabelas e que a tabela Materiais é filha da tabela Fornecedores.

Assim, a tabela Materiais deverá possuir uma coluna que identifique qual a empresa fornecedora é a que oferece aquele material. Na lista de atributos, ou colunas, das tabelas apresentadas, é possível notar que existe uma coluna cod_fornecedor na tabela Materiais e este é exatamente o propósito dela, indicar quem é o seu fornecedor.

A intenção deste pequeno modelo não é sermos exaustivos em todas as possibilidades de negócio que poderiam ser definidas nesse conjunto de tabelas, mas apenas utilizá-las como exemplo. Só para exemplificar uma regra de negócio que não é atendida por este modelo, um Material só pode ser fornecido por uma empresa fornecedora. Não existe aqui como armazenar ou representar um material oferecido por mais de um fornecedor. A seguir são apresentados os atributos de cada tabela:

  • Fornecedores: cod_fornecedor, nome, cidade_sede, grupo_cod_fornecedor;
  • Materiais: cod_material, cod_fornecedor, nome, descricao, quant_estoque, quant_estoque_min, cod_unidade;
  • Pedidos: num_pedido, cod_fornecedor, data_pedido, data_recebimento, quant_itens, valor_total;
  • Itens_Pedidos: num_pedido, cod_material, quant_pedida, valor_unitario;
  • Unidades: cod_unidade, nome_unidade.
Modelo de relacionamento das tabelas dos exemplos desse artigo
Figura 1. Modelo de relacionamento das tabelas dos exemplos desse artigo

Note que na lista de colunas de cada tabela uma ou mais colunas ou atributos estão destacadas em negrito. Elas são as colunas chamadas de chave primária de cada tabela, isto é, as colunas que identificarão unicamente cada linha de dados de cada tabela. A coluna destacada na tabela Fornecedores é a cod_fornecedor. Isto significa que cada fornecedor deverá ter um código único, representado nessa coluna, e esse código identificará apenas um fornecedor.

A coluna cod_fornecedor aparece também na tabela Materiais. Isto serve para identificarmos que aquele material é oferecido pelo fornecedor que aparecer com o código ao lado. A coluna cod_fornecedor, quando aparece na tabela Materiais para definir o relacionamento, é chamada de chave estrangeira. A Listagem 1 apresenta os dados de exemplo desse conjunto de tabelas.

  select * from fornecedores;
  +-----------+-------------------------------------------+----------------+----------------------+
  | cod_forne | nome                                      | cidade_sede    | grupo_cod_fornecedor |
  +-----------+-------------------------------------------+----------------+----------------------+
  | ABC       | ABC Materiais Eletricos                   | Vitoria        | NULL                 |
  | XYZ       | XYZ Materiais de Escritorio               | Rio de Janeiro | HiX                  |
  | Hidra     | Hidra Materiais Hidraulicos               | Sao Paulo      | HiX                  |
  | HiX       | HidraX Materiais ElÈtricos e Hidraulicos  | Sao Paulo      | NULL                 |
  +-----------+-------------------------------------------+----------------+----------------------+
   
  select cod_material, cod_fornecedor, nome, descricao from materiais order by cod_material;
  +--------------+----------------+----------------------------+---------------------------------+
  | cod_material | cod_fornecedor | nome                       | descricao                       |
  +--------------+----------------+----------------------------+---------------------------------+
  |          123 | ABC            | Tomada eletrica 10A Nova   | Tomada eletrica 10A padrao novo |
  |          234 | ABC            | Disjuntor 25A              | Disjuntor eletrico 25A          |
  |          345 | XYZ            | Resma Papel A4             | Resma papel branco A4           |
  |          456 | XYZ            | Toner Imp HR5522           | Toner impressora HR5522         |
  |          678 | Hidra          | Cano PVC 1/2               | Cano PVC 1/2 pol                |
  |          679 | Hidra          | Cano PVC 3/4               | Cano PVC 3/4 pol                |
  |          680 | Hidra          | Medidor hidr 1/2           | Medidor hidraulico 1/2 pol      |
  |          681 | Hidra          | Joelho 1/2                 | Conector Joelho 1/2 pol         |
  |          682 | Hidra          | Junta 1/2                  | Cano PVC 1/2 pol                |
  |         1234 | ABC            | Tomada eletrica 20A Nova   | Tomada eletrica 20A padrao novo |
  |         2345 | XYZ            | Caneta Azul                | Caneta esferografica azul       |
  |         4567 | XYZ            | Grapeador                  | Grampeador mesa pequeno         |
  |         4568 | XYZ            | Can ... 

Quer ler esse conteúdo completo? Seja um assinante e descubra as vantagens.
  • 473 Cursos
  • 10K Artigos
  • 100 DevCasts
  • 30 Projetos
  • 80 Guias
Tenha acesso completo