Truques mysql


fonte: https://www.todoespacoonline.com/w/2014/10/join-right-join-e-left-join/

Nossa base de dados de testes

Configure uma base de dados de testes com pelo menos duas tabelas relacionadas por um campo. Em nosso caso, já temos uma base de dados pronta que você pode baixar e importar para seu servidor.

A base de dados acima contém apenas uma tabela chamada “clientes”, então vamos inserir mais uma tabela e alguns valores na mesma. Para criar uma nova tabela na base de dados acima, utilize a seguinte declaração:

CREATE TABLE dados_clientes (
cliente_id_ INT(11) NOT NULL,
cliente_endereco TEXT,
PRIMARY KEY ( cliente_id_ )
);

Vamos relacionar o campo cliente_id da tabela clientes com o campo cliente_id_ da tabela dados clientes. Essa nova tabela terá apenas o endereço do cliente. Os campos cliente_id e cliente_id_ apenas indicarão ao servidor MySQL que é o mesmo cliente nas duas tabelas.

Vamos inserir alguns endereços fictícios para nossos clientes, então execute o seguinte comando:

INSERT INTO dados_clientes 
(cliente_id_, cliente_endereco) 
VALUES
(1, 'Rua Maria de lima, Centro, São Paulo'),
(5, 'Rua Osvaldo Cruz, Maringá, Belo Horizonte'),
(7, 'Rua Rosana, Sinara, Nova Esperança'),
(10, 'Av. Bias Fortes, Centro, Brasília'),
(12, 'Beatles, Santa Cruz, Rio de Janeiro'),
(15, 'Av. Esquerda, Vila Pinheiro, New York');

Pronto, agora temos duas tabelas relacionadas entre si e podemos utilizar JOIN, RIGHT JOIN e LEFT JOIN.

Dados das tabelas

Se você não quer enviar ou criar as tabelas em seu servidor, seguem os dados de ambas:

clientes

dados_clientes

Perceba a identificação dos clientes pelos campos cliente_id e cliente_id_ de ambas as tabelas. Veja também que alguns clientes não tem valores na tabela dados_clientes. Isso é justamente para testarmos nossas consultas.

JOIN

O comando JOIN tem várias variações, sendo a mais utilizada delas INNER JOIN. Mas não se confunda, os únicos comandos que podem fazer alguma diferença para unir duas ou mais tabelas são RIGHT JOIN e LEFT JOIN. O restante serve apenas para mostrar aos desenvolvedores uma melhor escrita de código.

Portanto, o que temos que nos preocupar em nossas consultas MySQL são as declarações JOIN, RIGHT JOIN e LEFT JOIN.

A declaração JOIN indica ao MySQL que ele deve trazer os valores presentes em ambas as tabelas, ou seja, ele deverá verificar se o mesmo valor está presente nas duas tabelas indicadas. Por exemplo:

SELECT clientes.cliente_id, clientes.cliente_nome, dados_clientes.cliente_endereco
FROM clientes
JOIN dados_clientes
ON clientes.cliente_id = dados_clientes.cliente_id_;

Com isso, eliminamos os valores que NÃO estão presentes em ambas as tabelas. Veja o resultado:

Veja que os valores das tabelas foram unidos temporariamente e retornados para nossa visualização. Isso vai funcionar com suas consultas PDO ou qualquer outra linguagem que esteja utilizando.

Você pode utilizar os comandos mais básicos nessa mesma estrutura, como ORDER BY, WHERE e coisas do tipo, veja:

SELECT clientes.cliente_id, clientes.cliente_nome, dados_clientes.cliente_endereco
FROM clientes
JOIN dados_clientes
ON clientes.cliente_id = dados_clientes.cliente_id_
WHERE 
dados_clientes.cliente_endereco LIKE '%Rua%' OR dados_clientes.cliente_endereco LIKE 'Av%'
ORDER BY clientes.cliente_nome ASC;

Veja o retorno da consulta acima:

Na verdade, a declaração WHERE não está fazendo muita diferença, já que eu sabia os valores que seriam retornados, mas ORDER BY modificou completamente a ordem dos valores.

Entendendo os lados RIGHT e LEFT

Antes de passar a declaração RIGHT e LEFT JOIN, é necessário que você compreenda os lados em que as tabelas são apresentadas na consulta.

Quando eu digo o seguinte:

SELECT *
FROM clientes
JOIN dados_clientes
ON cliente_id = cliente_id_;

O MySQL considera o seguinte:

SELECT *
FROM clientes /* LEFT - Tabela da esquerda */
JOIN dados_clientes /* RIGHT - Tabela da direita */
ON cliente_id = cliente_id_;

As palavras RIGHT e LEFT indicam respectivamente direta e esquerda.

Para o comando JOIN isso não fará muita diferença, já que os dados devem estar presentes em ambas as tabelas, porém, para RIGHT JOIN e LEFT JOIN isso pode mudar um pouco.

LEFT JOIN

Quando eu digo LEFT JOIN, quero dizer ao MySQL para comparar os valores da ESQUERDA com os da direita. Seria como falar, compare os valores de “clientes” com os valores de “dados_clientes”.

Neste caso, o MySQL irá analisar TODOS os valores da tabela da esquerda (clientes) e inserir na consulta. Os valores da direita serão apresentados apenas se coincidirem na consulta.

Veja um exemplo:

SELECT *
FROM clientes /* Tabela da esquerda */
LEFT JOIN dados_clientes /* Tabela da direita */
ON cliente_id = cliente_id_;

Agora veja o resultado:

Veja que todos os valores de ambas as tabelas foram unidos temporariamente, porém, agora foram retornados todos os valores da tabela “clientes”, mesmo que os valores da tabela “dados_clientes” não existam.

RIGHT JOIN

RIGHT JOIN é o contrário de LEFT JOIN, ou seja, diz ao MySQL para analisar os valores da DIREITA primeiro e comparar com os valores da esquerda. Isso que dizer que todos os valores da tabela da esquerda serão apresentados, e, para os valores da direita, apenas os que coincidirem com a consulta.

Veja um exemplo:

SELECT *
FROM clientes /* Tabela da esquerda */
RIGHT JOIN dados_clientes /* Tabela da direita */
ON cliente_id = cliente_id_;

Agora veja o resultado:

Viu que agora apenas foram preenchidos os valores que estão presentes na tabela da DIREITA? Isso porque o MySQL analisa todos da direita e só verifica se existe algum valor correspondente na tabela da esquerda.