Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Desempenho do MySQL:Introdução aos JOINs no SQL


Neste artigo, aprenderemos os fundamentos da junção de tabelas em SQL. Aprenderemos sobre os JOINs Esquerdo, Direito, Interno e Externo e daremos exemplos de como usá-los.

Os dados em um RDBMS (Relational Database Management System) são agrupados em tabelas. Essas tabelas possuem uma definição rígida do tipo de dados que podem ser armazenados nelas. Para conectar diferentes tabelas e, portanto, diferentes tipos de dados que podem se relacionar, usaremos a cláusula JOIN.

Tipos de JOINs


Existem quatro tipos básicos de JOINs:INNER, OUTER, LEFT e RIGHT. Ao conectar duas tabelas, cada uma delas retornará um subconjunto diferente das tabelas correspondentes com base na condição da cláusula ON.
  • LEFT e RIGHT JOINs executam uma tarefa semelhante. Ambos retornam a totalidade de uma única tabela com informações relacionadas à segunda tabela.
  • INNER e OUTER JOINs executam tarefas muito diferentes. INNER JOINs produz um resultado muito limitado, enquanto OUTER retorna um conjunto de dados completo.
Nota:No momento da redação deste artigo, MariaDB e MySQL não suportavam OUTER JOINs. No entanto, forneceremos um exemplo de uma maneira de produzir essa saída de uma maneira diferente.
Neste exemplo, estamos usando o exemplo de um departamento de vendas para este tutorial, empregando três tabelas:vendedores, pedidos e clientes.

A tabela de vendedores terá três colunas:id, nome e taxa de comissão.

Em seguida, a tabela de pedidos conterá quatro colunas:o ID do pedido, o custo total do pedido, o cliente e, se disponível, o vendedor.

A tabela de clientes conterá duas colunas:id e informações básicas de contato.

Portanto, agora temos várias tabelas de informações que são úteis para pessoas diferentes de maneiras diferentes. Usando essas três tabelas (vendedores, pedidos e clientes), forneceremos exemplos de como cada um dos JOINs pode ser útil.

LEFT JOIN


Provavelmente o tipo de JOIN mais comumente usado é o LEFT JOIN. Se você pensar nas duas tabelas sendo unidas, a mencionada na cláusula FROM está à esquerda. O mencionado na cláusula JOIN está à direita. Em um LEFT JOIN, cada linha da tabela LEFT (ou FROM) é retornada no resultado e é vinculada às linhas correspondentes da tabela RIGHT (ou JOIN) que corresponde à cláusula ON.

Lembre-se de que algumas linhas à ESQUERDA podem não ter dados correspondentes à DIREITA. Nesse caso, os campos que seriam preenchidos da tabela RIGHT no resultado serão preenchidos por um valor NULL.

Além disso, se várias linhas na tabela RIGHT corresponderem às linhas da tabela LEFT, várias linhas serão incluídas no conjunto de resultados. Um diagrama de Venn mostra como um LEFT JOIN ficaria visualizado:

O Diretor de Marketing solicita um relatório de todos os pedidos discriminados por cliente. Você pode usar um LEFT JOIN para isso:
SELECT *
FROM orders
LEFT JOIN customer
ON orders.customer_id = customer.id;

Essa consulta solicita todos os dados da tabela “orders” vinculados às linhas da tabela “customer”, onde o id do cliente é igual ao customer_id do pedido. O resultado ficaria assim:

Observe que, para o cliente Widgets LLC, há três entradas porque eles tiveram três pedidos. A Jolly Inc. fez dois pedidos e a Acme Inc. fez um. Cheapo não aparece nesta lista porque nenhum pedido foi feito.

JUNÇÃO À DIREITA


O RIGHT JOIN é muito semelhante ao LEFT JOIN, exceto que ele retorna todas as linhas da tabela RIGHT (JOIN) e apenas as linhas correspondentes da tabela LEFT (FROM). Novamente, se não houver dados na tabela LEFT, essas colunas serão preenchidas com valores NULL.

Se houver várias linhas na tabela LEFT, haverá várias linhas no conjunto de resultados. Seu diagrama de Venn ficaria assim:

Se a gestão quer um relatório com TODOS os clientes; mesmo que eles não tenham feito um pedido, poderíamos usar um RIGHT JOIN.
SELECT *
FROM orders
RIGHT JOIN customer
ON orders.customer_id = customer.id;

Novamente, começamos com a tabela de “pedidos” e juntámo-la à tabela de clientes. Como usamos um RIGHT JOIN, obteremos pelo menos uma linha para cada entrada na tabela RIGHT (JOIN), cliente. Quando há uma correspondência entre customer.id e orders.customer_id, as informações são preenchidas.  Os resultados incluem Cheapo Co com valores NULL nas colunas do pedido:

INNER JOIN


Um INNER JOIN retorna apenas as linhas de cada coluna que correspondem à cláusula ON. Se não houver uma correspondência à DIREITA, as linhas da ESQUERDA serão excluídas e vice-versa. O diagrama de Venn para um INNER JOIN é assim:

É dia de pagamento e o departamento de folha de pagamento precisa saber quanta comissão pagar. Para isso, eles precisarão conhecer os pedidos que foram feitos por meio de cada vendedor. Observe que nem todos os pedidos passaram por um vendedor, portanto, não nos importamos com eles. Para isso, podemos usar um INNER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
INNER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Novamente começamos com a tabela de pedidos. Desta vez estamos JUNTOS com a mesa dos vendedores. Se houver uma entrada na tabela de pedidos que corresponda a uma entrada na tabela de vendedores, a linha será incluída. Em vez de preencher linhas sem correspondência com valores NULL, essas linhas são ignoradas nos resultados.

Observe que estamos informando ao banco de dados não apenas para devolver o valor da venda e a taxa de comissão, mas também a comissão calculada. Os resultados ficariam assim:

JUNÇÃO EXTERNA


Um OUTER JOIN retorna tudo, independentemente de haver uma correspondência. Se você combinar os resultados de um LEFT e RIGHT JOIN, você obterá um OUTER JOIN. O diagrama de Venn para um OUTER JOIN é assim:

Agora, é o final do mês e o gerente de vendas quer saber TODAS as vendas, bem como todas as comissões que foram pagas. Para isso, usaremos um OUTER JOIN:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
FULL OUTER JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Assim como o relatório da folha de pagamento, começamos com os pedidos e nos LIGAMOS aos vendedores. A diferença é que com um OUTER JOIN você obterá resultados das tabelas LEFT e RIGHT com NULL preenchido onde não houver uma correspondência correspondente. Os resultados ficam assim:

Agora, lembre-se que dissemos que MariaDB e MySQL não suportam OUTER JOIN. Também dissemos que se você adicionar um LEFT JOIN a um RIGHT JOIN, você obterá um OUTER JOIN. O truque nesses dois sistemas é fazer exatamente isso. Fazemos isso com a cláusula UNION. Ele adiciona os resultados de uma consulta a outra:
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
UNION
SELECT *,cost * commission_rate / 100 AS commission_amount
FROM orders
RIGHT JOIN salespeople
ON orders.salesperson_id = salespeople.id;

Os resultados ficariam assim:

Várias junções


JOIN também permite conectar mais de duas tabelas. Se quisermos um relatório de vendas completo com informações de clientes e vendedores, basta fazer outro JOIN no final.
SELECT *
FROM orders
LEFT JOIN salespeople
ON orders.salesperson_id = salespeople.id
LEFT JOIN customer
ON customer.id = orders.customer_id;

Neste exemplo, começamos com a tabela de pedidos e a conectamos à tabela de vendedores, como fizemos antes. O próximo passo é JOIN a tabela para a tabela do cliente. Isso preencherá todas as informações que podem ser vinculadas à tabela de pedidos.

Este artigo é uma breve introdução e não pretende ser uma discussão exaustiva de como JOIN pode ser usado em SQL.

Clique abaixo para usar este cupom conveniente hoje!


A Liquid Web possui alguns dos servidores de banco de dados mais poderosos do setor. Esses servidores podem ser utilizados para executar desde o menor negócio doméstico até os maiores clusters de vários bancos de dados para corporações em escala empresarial.

Ligue para 800.580.4985, ou abra um chat ou ticket conosco para falar com um de nossos consultores experientes em soluções ou hospedagem para saber como você pode aproveitar essas técnicas hoje mesmo!
Navegação da série<