TIPOS JOIN

Perguntas principais: Quais são os tipos de join ? Quais os tipos de join SQL? Quais são os tipos de Inner join? Quais são os tipos de JOINS no SQL? Resposta curta: Os principais são INNER, LEFT, RIGTH e FULL JOIN, mas existem outros dependendo do SGBD como NATURAL, CROSS, OUTER, EXCLUDING, Introdução Existem vários tipos de JOIN, que fazem cruzamento de dados das tabelas de formas diferentes. Nesse artigo iremos ver as diferenças entre junções internas e externas do SQL. Respondendo algumas questões básicos sobre o uso de cada tipo de join, usando exemplos práticos com select e exemplos prontos. Quais questão serão respondudas no artigo: Quais são as principais funções de agregação? Quais os principais tipos de JOIN? Quais os três tipos básicos de associação join? O que faz e como funcina cada tipo de JOIN? O que faz o INNER JOIN? O que faz o Outer JOIN? O que é Full Outer JOIN? O que é full join SQL? O que é natural JOIN? Como funciona o JOIN? Como Fazer um INNER JOIN, LEFT JOIN e RIGHT JOIN em SQL? Como usar o Full Outer Join? Como usar natural join? Qual a diferença de Inner JOIN e JOIN? Qual é a diferença entre INNER JOIN e OUTER JOIN? Qual a diferença do Inner JOIN para o LEFT JOIN? Qual a diferença de LEFT JOIN e Left Outer Join? Quais as diferenças entre Natural Join e Inner Join? Quando usar LEFT JOIN? Quando usar o right join? Quando usar natural JOIN? Quando usar Left e Right Join? É possível fazer um inner join de uma tabela para ela mesma? Talvez antes de continuar você precise de um conhecimento prévio então de uma olhada em: O que é uma instrução SQL? O que significa a expressão JOIN? O que é comando SQL JOIN e para que serve? Como fazer um JOIN no SQL? Quais os três tipos básicos de associação join? Os tipos mais comuns de junção no SQL são: Junção interna. Junção de grupo. Junção externa esquerda. Enquanto o INNER JOIN combina todos os valores das duas tabelas e retorna no resultado somente as linhas presentes em ambas, o LEFT JOIN traz todas as linhas presentes na tabela 1 (ou tabela da esquerda) com os valores inner join Combina registros de duas tabelas sempre que houver valores correspondentes em um campo comum. INNER JOIN : Retorna registros que possuem valores correspondentes nas duas tabelas; LEFT JOIN: Retorna todos os registros da tabela esquerda e os registros correspondentes da tabela direita; RIGHT JOIN: Retorna todos os registros da tabela da direita e os registros correspondentes da tabela da esquerda. Junção externa completa (full outer join) Full Outer Join Conhecida como OUTER JOIN ou simplesmente FULL JOIN , este retorna todos os registros de ambas as tabelas. Uma inner join retorna apenas as linhas onde a condição de join é verdadeira. No nosso exemplo, uma inner join entre nossas tabelas de movies e directors retornaria apenas registros onde o filme possui um diretor atribuído. Quando usar natural JOIN? O NATURAL JOIN pode ser utilizado com o acompanhamento de outros JOINS, como por exemplo: INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER Diferença entre INNER JOIN e LEFT JOIN Enquanto o INNER JOIN combina todos os valores das duas tabelas e retorna no resultado somente as linhas presentes em ambas, o LEFT JOIN traz todas as linhas presentes na tabela 1 (ou tabela da esquerda) com os valores O NATURAL JOIN é só um facilitador. Ele não é mais rápido ou faz nada melhor, ele apenas permite uma sintaxe mais curta se a junção é simples, o seu exemplo ilustra bem isto. Ambos fazem exatamente a mesma coisa da mesma forma mas a primeira é mais fácil de escrever. Veja mais em: Como funciona uma Trigger? Quais os principais comandos SQL? Quais são os 4 tipos possíveis de comandos SQL? Qual dos seguintes não é um tipo de JOIN usado em SQL? Qual a diferença entre JOIN e Union? Quais são os 3 grupos de instruções em linguagem SQL? Qual SQL é mais usado? Quais são os três tipos de blocos Pl-SQL? O que são tipos UNION? Para que serve a cláusula having? exemplos: Como juntar dados de duas tabelas SQL? ********************************************************** 1 tabela 379 1.7 % 6 2 junção 359 1.6 % 6 3 tabelas 221 1.1 % 7 4 select 160 0.7 % 6 5 linhas 128 0.6 % 6 6 exemplo 115 0.6 % 7 7 junções 111 0.6 % 7 8 departamento 104 0.9 % 12 9 empregado 94 0.6 % 9 10 esquerda 87 0.5 % 8 ******************************************************* 1 tabela 9 1.6 % 6 2 natural 8 1.7 % 7 3 registros 8 2.2 % 9 4 tabelas 8 1.7 % 7 5 retorna 7 1.5 % 7 6 diferença 6 1.6 % 9 7 junção 6 1.1 % 6 8 valores 6 1.3 % 7 9 esquerda 5 1.2 % 8 10 linhas 5 0.9 % 6 ********************************************************* Count % of Text Symbols 1 join 64 7.8 % 4 2 inner 17 2.6 % 5 3 quais 14 2.1 % 5 4 left 12 1.5 % 4 5 outer 12 1.8 % 5 6 tipos 12 1.8 % 5 7 como 11 1.3 % 4 8 tabela 9 1.6 % 6 9 full 8 1.0 % 4 10 natural 8 1.7 % 7 ********************************************************* Count % of Text Symbols 1 join 597 1.8 % 4 2 tabela 368 1.7 % 6 3 junção 356 1.6 % 6 4 para 320 1.0 % 4 5 tabelas 212 1.1 % 7 6 select 158 0.7 % 6 7 from 147 0.4 % 4 8 dados 135 0.5 % 5 9 inner 130 0.5 % 5 10 linhas 127 0.6 % 6 ************************************************************* join, tabela, junção, select, inner, left, right ******************************************************** ******************************************************** devmedia.com.br INNER, CROSS, LEFT, RIGTH e FULL JOINS no SQL Wellyngton Luiz Cruz Moreira 9–12 minutos As junções entre duas ou mais tabelas podem ser realizadas através de: CROSS JOIN INNER JOIN LEFT OUTER JOIN RIGHT OUTER JOIN OUTER FULL JOIN As questões são duas: O que são cada uma dessas junções (joins)? Como usar? Para definir e exemplificar as junções acima citadas considere o modelo da figura 1 abaixo: Tabela SQL Figura 1. Modelo de tabela SQL Podemos notar pelo modelo que pode existir no banco de dados funcionários sem cargos e cargos sem funcionários. Para exemplificar melhor, observe o conteúdo das tabelas na figura 2 abaixo: Tabela de funcionários sem cargos e cargos sem funcionários Figura 2. Tabela de funcionários sem cargos e cargos sem funcionários Assim, fazemos: CROSS JOIN Quando queremos juntar duas ou mais tabelas por cruzamento. Ou seja, para cada linha da tabela FUNCIONARIO queremos todos os CARGOS ou vice-versa. Exemplo de CROSS JOIN Figura 3. Exemplo de CROSS JOIN INNER JOIN Quando queremos juntar duas ou mais tabelas por coincidência. Para cada linha da tabela FUNCINARIO queremos o CARGO correspondente que internamente (INNER), em seus valores de atributos, coincidam. No caso de FUNIONÁRIO e CARGO os atributos internos coincidentes são codigoCargo na tabela CARGO e codigoCargo na tabela FUNCIONARIO. Veja também a Figura 1 e a Figura 2, lá você notará que codigoCargo é chave primária da tabela CARGO e chave estrangeira na tabela FUNCIONARIO. Para efetivarmos a junção das duas tabelas se fará necessário ligar (ON) as duas tabelas por seus atributos internos (INNER) coincidentes. Exemplo de INNER JOIN Figura 4. Exemplo de INNER JOIN LEFT OUTER JOIN Observando a tabela FUNCIONARIO notamos que o funcionário Tadeu não possui cargo associado a ele. Se desejarmos listar todos os funcionários com seus respectivos cargos, incluindo os funcionários sem cargos, a exemplo de Tadeu, poderíamos usar todo o poder da junção INNER JOIN adicionando ainda OUTER (EXTERNOS/OUTROS) Funcionários que não fazem parte do INNER JOIN, justamente àqueles sem cargos, como Tadeu. Podemos conseguir esse feito com a junção FUNCIONARIO / CARGO através da declaração FUNCIONARIO OUTER LEFT JOIN CARGO, que promove a junção interna (INNER) de todos os funcionários a cargos e lista ainda outros (EXTERNOS/OUTER) não associados. Exemplo de LEFT OUTER JOIN Figura 5. Exemplo de LEFT OUTER JOIN Uma observação importante é que a ordem da ligação (ON) não faz diferença, ou seja: “ON (F.codCargo = C.codCargo)” é exatamente igual a “ON (C.codCargo = F.codCargo)” RIGHT OUTER JOIN Observando a tabela CARGO notamos que o cargo GERENTE, com código C3, não é referenciado/associado por/a nenhum funcionário na tabela FUNCIONARIO. Se desejarmos listar todos os CARGOS e seus respectivos FUNCIONARIOS, incluindo os CARGOS sem FUNCIONÁRIOS, poderíamos usar a junção RIGTH OUTER JOIN. Veja o exemplo da figura 6. Exemplo de RIGHT OUTER JOIN Figura 6. Exemplo de RIGHT OUTER JOIN Uma observação importante é que a ordem da ligação (ON) não faz diferença, ou seja: “ON (F.codCargo = C.codCargo)” é exatamente igual a “ON (C.codCargo = F.codCargo)”. OUTER FULL JOIN Aqui juntamos o poder das junções (JOIN) internas(INNER), a listagem de todas as outras linhas não associadas, tanto do lado direito (RIGHT) da junção como do lado esquerdo (LEFT). Veja o exemplo abaixo: Exemplo de OUTER FULL JOIN Figura 7. Exemplo de OUTER FULL JOIN Uma observação importante é que a ordem da ligação (ON) não faz diferença, ou seja: “ON (F.codCargo = C.codCargo)” é exatamente igual a “ON (C.codCargo = F.codCargo)”. Abaixo segue o SCRIPT SQL de criação das tabelas, seus relacionamentos, seu povoamento e dos exemplos utilizados. Todos os exemplos deste artigo foram testados no SGBDR MS-SQL Server 2008 Express. SCRIPT DE TESTES EM TRANSACT-SQL ( SQL SERVER ) -- Criando um dataBase para testes CREATE DATABASE dbTESTE_JOINS GO -- Usando o DataBase para criar as tabelas e povoá-las USE dbTESTE_JOINS GO -- Criando a tabela Cago CREATE TABLE CARGO ( CodCargo char(2) NOT NULL, NomeCargo varchar(50) NULL, ValorCargo money NULL, PRIMARY KEY(CodCargo) ) GO -- Criando a tabela Funcionario CREATE TABLE FUNCIONARIO ( Matricula int, NomeFuncionario varchar(50) NOT NULL, CodCargo char(2) NULL, PRIMARY KEY(Matricula), FOREIGN KEY (CodCargo) REFERENCES CARGO (CodCargo) ) GO -- Povoando a tabela CARGO INSERT CARGO (CodCargo, NomeCargo, ValorCargo) VALUES (''''''''C1'''''''', ''''''''CAIXA'''''''' , 800.00) INSERT CARGO (CodCargo, NomeCargo, ValorCargo) VALUES (''''''''C2'''''''', ''''''''VENDEDOR'''''''', 1200.00) INSERT CARGO (CodCargo, NomeCargo, ValorCargo) VALUES (''''''''C3'''''''', ''''''''GERENTE'''''''' , 2400.00) GO -- Povoando a tabela FUNCIONARIO INSERT FUNCIONARIO (Matricula, NomeFuncionario, CodCargo) VALUES (100, ''''''''JOÃO'''''''' , ''''''''C1'''''''') INSERT FUNCIONARIO (Matricula, NomeFuncionario, CodCargo) VALUES (110, ''''''''MARIA'''''''' , ''''''''C2'''''''') INSERT FUNCIONARIO (Matricula, NomeFuncionario, CodCargo) VALUES (120, ''''''''CARLOS'''''''' , ''''''''C1'''''''') INSERT FUNCIONARIO (Matricula, NomeFuncionario, CodCargo) VALUES (130, ''''''''TADEU'''''''' , NULL) GO ----------------------------------------- -- EXEMPLOS DE JOIN ABORDADOS NO ARTIGO ----------------------------------------- -- Seleção Simples ( Todos os Cargos e Todos os Funcionario ) - Veja Figura 2 SELECT * FROM CARGO AS C --> Apelidamos a tabelas Cargo de C neste artigo SELECT * FROM FUNCIONARIO AS F --> Apelidamos funcionário de F neste artigo GO -- CROSS JOIN ( Junção Cruzada ) - Veja Figura 3 SELECT F.NomeFuncionario ,C.NomeCargo FROM CARGO AS C CROSS JOIN FUNCIONARIO AS F -- INNER JOIN ( Junção Interna ) - Veja Figura 4 SELECT F.NomeFuncionario ,C.NomeCargo FROM CARGO AS C INNER JOIN FUNCIONARIO AS F ON (F.CodCargo = C.CodCargo) -- LEFT OUTER JOIN ou simplesmente LEFT JOIN ( Junção Externa Esquerda ) - Veja Figura 5 SELECT F.nomeFuncionario ,C.nomeCargo FROM FUNCIONARIO AS F LEFT OUTER JOIN CARGO AS C ON ( C.codCargo = F.codCargo ) -- RIGHT OUTER JOIN ou simplesmente RIGHT JOIN ( Junção Externa Direita) - Veja Figura 6 SELECT F.nomeFuncionario ,C.nomeCargo FROM FUNCIONARIO AS F RIGHT OUTER JOIN CARGO AS C ON ( F.codCargo = C.codCargo ) -- FULL OUTHER JOIN ou simplesmente FULL JOIN (Junção Externa Completa) SELECT F.nomeFuncionario ,C.nomeCargo FROM FUNCIONARIO AS F FULL OUTER JOIN CARGO AS C ON ( C.codCargo = F.codCargo ) Saiu na DevMedia! Programe com o Node.js: Nessa série procuramos entender essa afirmação, conversando sobre o propósito do Node.js, qual é o seu modelo de programação e o que muda quando desejamos aprender essa tecnologia vindo de alguma linguagem orientada a objetos ou multiparadigma, como é o caso do PHP, C#, Python, entre outras. Saiba mais sobre PHP ;) Guia Completo de SQL: Neste Guia Completo de SQL você encontrará todo o conteúdo que precisa para aprender sobre a SQL, linguagem de consulta estruturada utilizada por programadores e DBAs para a execução de consultas e comandos nos principais SGBDs do mercado. Tecnologias: SQL Confira outros conteúdos: Plano PRO Formação FullStack completa Projetos reais Professores online Exercícios gamificados Certificado de autoridade autor Por Wellyngton Em 2011 Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade. Aceitar ************************************************************* blog.betrybe.com SQL JOIN(INNER, LEFT, RIGHT e FULL) combinando tabelas! | Insights para te ajudar na carreira em tecnologia Cairo Noleto 9–12 minutos O SQL JOIN é um dos comandos que mais geram dúvidas entre pessoas desenvolvedoras. Afinal, ele apresenta diferentes tipos, cada qual para uma situação, e é usado para combinar dados de consultas complexas. Por isso, utilizar o tipo de JOIN inadequado para um query, por exemplo, além de resultar em um retorno diferente do esperado, pode gerar até problemas de performance no banco. No entanto, ao entender como cada JOIN funciona e para que eles servem, um universo de possibilidades se abre. Para ajudar você nesse caminho, neste post vamos mostrar: Índice 01 | O que é o comando SQL JOIN? 02 | Criando a tabela e inserindo os dados 03 | Quais os tipos de SQL JOIN? 04 | Boas práticas ao usar o comando SQL JOIN Boa leitura! O que é o comando SQL JOIN? O JOIN é uma cláusula muito importante da linguagem SQL cuja função é combinar linhas de diferentes tabelas de acordo com as relações existentes entre as colunas dessas tabelas. Basicamente o JOIN é usado em diferentes métodos de junção que são baseados na Teoria dos Conjuntos. Ao todo, a linguagem SQL padrão define cinco tipos diferentes de cláusula JOIN. São elas: INNER JOIN; RIGHT JOIN; LEFT JOIN; FULL JOIN; CROSS JOIN. Assim, cada uma delas é usada para retornar um conjunto específico de dados. Mais adiante, mostramos em detalhes o uso de cada JOIN. Criando a tabela e inserindo os dados Para mostrar o funcionamento e o retorno de cada JOIN vamos precisar de exemplos práticos, certo? Então, vamos criar algumas tabelas simples para fazer nossos testes. No entanto, para simplificar a demonstração, não vamos nos ater a questões de modelagem no momento, já que o objetivo é explicar o uso correto da cláusula JOIN em suas diferentes formas. As tabelas que vamos criar se chamam, respectivamente, “estudantes” e “professores”. Em ambas, teremos uma coluna “nome”, na qual serão inseridos dados em comum, pois é isso que nos permitirá testar os comandos. Abaixo, mostramos o código usado para criar a estrutura das tabelas e pupulá-las com os dados do nosso teste. código tabela studantes Resultado tabela alunos Figura 1. Tabela estudantes código tabela professores Resultado tabela professores Figura 2. Tabela professores Quais os tipos de SQL JOINS? Nosso ambiente de testes já foi preparado, então podemos seguir para a explicação de cada JOIN. Confira! INNER JOIN Entre os métodos de junção, o INNER JOIN é um dos mais conhecidos e tem a função de retornar os valores em comum de ambas as tabelas. Na ilustração abaixo, é possível ver a representação desse retorno de forma gráfica. Observe: Retorno do INNER JOIN Figura 3. Retorno do INNER JOIN Sintaxe Neste primeiro exemplo, vamos usar o INNER JOIN para consultar o id e o nome dos registros das tabelas “estudantes” e “professores” que têm dados equivalentes na coluna “nome”. Observe que, na sintaxe abaixo, acrescentamos um “e.” e um “p.” antes do nome das colunas da tabela e que, nas linhas seguinte,s usamos as expressões “estudantes AS e” e “professores AS p”. Isso é uma forma de definir uma espécie de “pseudônimo” para as tabelas. Dessa forma elas podem ser diferenciadas durante a execução. Já na última linha, usamos a expressão ON para indicar qual coluna das tabelas deve ter seus dados comparados. SELECT e.id, e.nome, p.id, p.nome FROM estudantes AS e INNER JOIN professores AS p ON e.nome = p.nome; resultado tabela dados comparados Figura 4. Demonstração do resultado de um INNER JOIN LEFT JOIN O LEFT JOIN é usado para retornar todos os registros da tabela esquerda, além dos registros da tabela à direita que têm valores em comum com a tabela esquerda. Veja a ilustração a seguir para entender melhor: Exemplo retorno LEFT JOIN Figura 5. Retorno do LEFT JOIN Sintaxe Observe que o código a seguir é bastante parecido com o do exemplo anterior. No entanto, como queremos apenas os dados da tabela esquerda mais os registros em comum da tabela direita, utilizamos o operador LEFT JOIN. SELECT e.nome, p.nome FROM estudantes AS e LEFT JOIN professores AS p ON e.nome = p.nome; Resultado tabela Figura 6. Demonstração do resultado de um LEFT JOIN LEFT EXCLUDING JOIN Já com o LEFT EXCLUDING JOIN é possível retornar todos os dados da tabela esquerda que não têm valores correspondentes na tabela da direita. Na imagem mostrada abaixo, vemos uma representação desse tipo de resultado. LEFT EXCLUDING JOIN retorno exemplo Figura 7. Retorno do LEFT EXCLUDING JOIN Sintaxe Prosseguindo com nossa demonstração, repare que agora acrescentamos a cláusula WHERE no fim do comando. Dessa forma, definimos um filtro para excluir do retorno os dados em comum entre as tabelas. SELECT e.nome, p.nome FROM estudantes AS e LEFT JOIN professores AS p ON e.nome = p.nome WHERE p.nome IS NULL; Demonstração do resultado de um LEFT EXCLUDING JOIN Figura 8. Demonstração do resultado de um LEFT EXCLUDING JOIN RIGHT JOIN Ao usar o RIGHT JOIN, podemos retornar todos os valores da tabela direita juntamente com os registros em comum na tabela esquerda. A seguir, observe o exemplo gráfico desse retorno: Retorno do RIGHT JOIN Figura 9. Retorno do RIGHT JOIN Sintaxe Dessa vez, como queremos retornar os dados da coluna “nome” na tabela direita mais os registros com valores repetidos na tabela esquerda, usamos o operador RIGHT JOIN no código. SELECT e.nome, p.nome FROM estudantes AS e RIGHT JOIN professores AS p ON e.nome = p.nome; Demonstração do resultado de um RIGHT JOIN / SQL JOIN Figura 10. Demonstração do resultado de um RIGHT JOIN RIGHT EXCLUDING JOIN Como é mostrado na figura abaixo, o RIGHT EXCLUDING JOIN é responsável por retornar os dados da tabela da direita que não têm valores iguais na tabela esquerda. Retorno do RIGHT EXCLUDING JOIN Figura 11. Retorno do RIGHT EXCLUDING JOIN Sintaxe Novamente, para excluir os dados com valores em comum do retorno, usamos um filtro na cláusula WHERE. Porém, dessa vez os dados serão filtrados na tabela “estudantes”. SELECT e.nome, p.nome FROM estudantes AS e RIGHT JOIN professores AS p ON e.nome = p.nome WHERE e.nome IS NULL; Demonstração do resultado de um RIGHT EXCLUDING JOIN / SQL JOIN Figura 12. Demonstração do resultado de um RIGHT EXCLUDING JOIN FULL JOIN O FULL JOIN, também conhecido como FULL OUTER JOIN, retorna todos os dados de ambas as tabelas quando há uma relação entre elas. Na imagem abaixo, é possível ver de forma gráfica o retorno desse comando: Retorno do FULL JOIN Figura 13. Retorno do FULL JOIN Sintaxe Na sintaxe abaixo, observe que agora usamos o comando FULL OUTER JOIN para retornar todos os dados da coluna “nome” comparando a igualdade dos valores desse campo de ambas as tabelas. SELECT e.nome, p.nome FROM estudantes AS e FULL OUTER JOIN professores AS p ON e.nome = p.nome; Demonstração do resultado de um FULL JOIN Figura 14. Demonstração do resultado de um FULL JOIN FULL EXCLUDING JOIN Com o FULL EXCLUDING JOIN podemos retornar todos os registros que não têm valores repetidos entre as tabelas. Ou seja, ele exclui do retorno todos os dados duplicados, como é possível ver na figura abaixo: Retorno do FULL EXCLUDING JOIN Figura 15. Retorno do FULL EXCLUDING JOIN Sintaxe Agora, perceba que acrescentamos no código um filtro com múltiplas condições usando o operador OR na cláusula WHERE. Dessa forma, conseguimos excluir os nomes em comum entre as tabelas, retornando apenas os dados que não se repetem. SELECT e.nome, p.nome FROM estudantes AS e FULL OUTER JOIN professores AS p ON e.nome = p.nome WHERE e.nome IS NULL OR p.nome IS NULL; Demonstração do resultado de um FULL EXCLUDING JOIN / SQL JOIN Figura 16. Demonstração do resultado de um FULL EXCLUDING JOIN CROSS JOIN Com o comando SQL CROSS JOIN é possível fazer um produto cartesiano entre as tabelas. Isso significa que para cada linha da tabela esquerda ele vai retornar todas as linhas da tabela direita, ou vice-versa. Para facilitar o entendimento, observe o exemplo gráfico desse tipo de retorno abaixo: Retorno do CROSS JOIN Figura 17. Retorno do CROSS JOIN Sintaxe Neste último exemplo, vamos fazer o produto cartesiano entre os campos “nome” e “idade” das tabelas “estudantes” e “professores”. Contudo, para limitar o tamanho do retorno, vamos definir um filtro para consultar apenas os registros com id igual a 1 em ambas as tabelas. SELECT e.idade, e.nome, p.idade, p.nome FROM estudantes AS e CROSS JOIN professores AS p WHERE e.id = 1 OR p.id = 1; Demonstração do resultado de um CROSS JOIN Figura 18. Demonstração do resultado de um CROSS JOIN Boas práticas ao usar o comando SQL JOIN Apesar de ser um comando muito importante para quem trabalha com bancos de dados SQL, o JOIN também é um dos que mais causa dificuldade entre pessoas desenvolvedoras iniciantes. Um dos motivos é a falta de conhecimento acerca do relacionamento entre tabelas. Antes de criar uma consulta utilizando as cláusulas JOIN, é preciso entender como a modelagem do banco foi feita para se ter uma boa noção de como suas tabelas se relacionam, identificando as dependências entre elas. Compreender como esses relacionamentos funcionam é o que nos permite identificar qual dos tipos de JOIN é mais indicado para uma determinada consulta de acordo com os dados que queremos obter. Ao longo desse conteúdo foi possível notar o quanto o comando SQL JOIN é versátil. Afinal, com suas variações podemos criar consultas mais complexas e combinar dados de diversas formas sem precisar gastar uma enorme quantidade de código. Gostou do conteúdo e quer aprender mais sobre a área de Banco de Dados? Então confira o próximo artigo e descubra o que faz um profissional de DBA! ********************************************************************* e na sala a gente vai continuar o estudo 0:02 das operações de junções em SQL se você 0:05 perdeu a primeira aula é só você 0:07 conferir o primeiro link que está aqui 0:09 na descrição desse vídeo para assistir 0:11 se nosso objetivo aqui na sala é 0:13 entender os diferentes tipos de iões que 0:16 até aqui a gente não estudou e por isso 0:18 na sala vai ser menos prática e um pouco 0:20 mais teórica porque eu vou utilizar aqui 0:22 alguns recursos visuais para a gente 0:25 entender as diferenças entre as 0:26 operações que a gente pode fazer com Joy 0:31 pois gente passou a 15 essa canal 0:34 programação dinâmica e você chegou agora 0:36 no canal Seja bem vindo esse é um espaço 0:38 de ensino de programação discussões 0:40 sobre tecnologia se você caiu aqui de 0:42 paraquedas dá uma olhada aqui na 0:43 descrição porque tem um link para 0:45 playlist todos os vídeos desse curso de 0:48 SQL para análise de dados e se você tá 0:50 acompanhando essa série você 0:51 provavelmente já tava esperando essa 0:53 continuação do tópico de junções então 0:56 pra gente vai lembrar quando a gente 0:57 está falando de John gente está falando 0:59 de fazer a combinar tabelas então aqui 1:02 no nosso quadro né Eu já coloquei uma 1:04 representação de duas tabelas A e B que 1:07 sejam elas quais forem foi importante é 1:09 que essas tabelas tem um algum atributo 1:11 em comum para a gente conseguir fazer 1:13 essa junção que se forem Chaves 1:15 primárias e Chaves estrangeiras Isso 1:17 facilita Ainda mais se você não sabe o 1:19 que eu tô falando sobre o conceito de 1:20 Chaves assistir o vídeo anterior esse 1:23 daqui do nosso curso para você entender 1:25 mas nesse contexto aqui eu não vou 1:27 enxergar essas cadelas com essa 1:29 representação na assim com essa então eu 1:31 tô olhando para tabelas como se fossem 1:34 conjuntos e isso vai nos ajudar melhor a 1:37 compreender as alterações para quem 1:38 entende conjuntos vai ficar ainda mais 1:40 fácil para quem não entende eu vou 1:42 explicar não tem nenhum problema talvez 1:44 te ajude até a realizado operações de 1:46 conjuntos mas quando a gente tá vendo 1:47 uma tabela como um conjunto a gente tá 1:49 vendo então cada um dos registros né 1:52 dessa dela como um elemento desse 1:54 conjunto e aqui a gente pode conversar 1:56 né retomando Relembrando a ideia do 1:58 Johnny que a gente estudou na primeira a 2:00 estrutura de um joinha da consulta da 2:03 cláusula é a gente tem um select de uma 2:05 lista de atributos por ontem no from a 2:08 gente vai ser entre indicar as tabelas 2:10 que a gente tá juntando Então a gente 2:11 vai fazer from tabela a Joy tabela ver 2:14 um ano e aí a gente se vê se fica em que 2:16 causa a gente tá fazendo essa junção 2:18 Então quais os atributos comuns com 2:20 essas duas tabelas tem que precisam ser 2:22 usados para compará-las e esse daqui é 2:25 exatamente onde a gente praticou na 2:27 última aula que a gente estava fazendo 2:29 uma interseção entre as tabelas então 2:32 que rola por trás essa consulta né é que 2:34 para cada vez que um atributo é 2:36 encontrado nas duas tabelas a uma junção 2:38 dessas linhas e esse é o resultado que a 2:41 gente obtém uma série de junções 2:42 Considerando o atributo específico que a 2:45 gente indicou E aí o que eu vou contar 2:47 para você agora é que esse jointly 2:49 também pode ser chamado de energia então 2:52 o John padrão ele é um Inner join no SQL 2:55 se a gente então utilizar a cláusula 2:57 John E aí negão a gente vai esperar o o 3:00 resultado que é a interseção Entre esses 3:03 dois conjuntos entre essas duas tabelas 3:05 e né do inglês é Interno tem a ver 3:07 juntamente com essa ideia de intercessão 3:09 que o que eu vou acrescentar de novo 3:11 aqui para você então se a gente não viu 3:13 na outra aula é que existe a 3:14 possibilidade da gente fazer um alta de 3:17 homem que considera algo além dessa 3:20 interseção que é justamente esse desenho 3:23 que a gente tem aqui então quando a 3:24 gente faz um autor de um entre duas 3:26 tabelas a gente tem que primeiro 3:28 adicionar um modificador né então você 3:30 fazendo um lar alternion poderia ser um 3:33 Hide out in the left-right Nações 3:35 esquerda e direita em inglês então se 3:38 referindo a qual tabela que a gente tá 3:40 utilizando como referência para esse 3:42 autor John nesse exemplo que está 3:44 representado aqui a gente tem a tabela a 3:46 e a tabela ver a gente quer como 3:48 resultado dessa consulta SQL o que há de 3:50 interseção entre as tabelas mas eu 3:52 também quero que ele coloque no meu 3:54 resultado todas as linhas que estão a 3:57 tabella que não encontram um correr e a 4:00 tabela bem na hora de fazer a junção que 4:02 que vai acontecer né quando ele 4:04 encontrar essa equivalência na tabela 4:06 dele vai acoplar né a linha da tabela B 4:08 correspondente e para todos os 4:10 resultados que não estão na tabela de 4:12 ele vai colocar um vazio um nulo Mas o 4:15 que você vai ter né a possibilidade de 4:18 não perder os dados da tabela ar você 4:20 tava consulta eu vou dar um exemplo mais 4:23 concreto para você conseguir entender 4:25 entidades né que a gente tava fazendo 4:27 aqui na Série A gente tem usado aqui os 4:30 dados do das eleições né aqui do TSE que 4:34 estão descendente do BB Cream e e na 4:36 nossa aula anterior inclusive nós 4:38 fizemos um joinha aqui né utilizando a 4:40 tabela de candidatos EA tabela de bem 4:42 dessa que foi exatamente a consulta que 4:44 a gente construiu juntos e nesse digam 4:46 Aí como eu falei que a gente utilizar 4:48 que o Energy on a gente vai obter 4:50 exatamente o mesmo resultado é muito 4:52 obteve na consulta anterior a forma da 4:55 gente concretizar isso um pouco melhor é 4:57 olhando para esse contexto então que ele 4:59 tava fazendo a conjunção a tentando 5:01 relacionar né as informações de 5:03 candidatos e candidaturas de eleições 5:06 com o patrimônio né uso de bens 5:08 declarados por cada um dos candidatos 5:10 para cada eleição então por isso que 5:13 quando a gente roda essa consulta a 5:15 gente obtém Exatamente isso né dados de 5:18 candidatos na última coluna A gente 5:20 colocou patrimônio declarado por é 5:23 candidato E aí para ele ficar a 5:25 utilidade do autor John aí né a gente 5:28 pode pensar no caso hipotético que não 5:30 se aplica esses dados mas caso se 5:32 aplicar seria utilizar o autor John 5:34 Suponha que exista um candidatos que não 5:38 tem registro de bens na tabela bens 5:40 então eles existem na tabela candidato 5:42 mas eles não existem na tabela bem Se 5:45 isso fosse verdade se a gente fizesse 5:46 uma consulta com o Energy onde o sol 5:48 joinha aqui a gente cometeria apenas os 5:51 candidatos que estão nas duas tabelas no 5:53 entanto a gente poderia ainda sem querer 5:56 listar os candidatos que não estão na 5:59 tabela bem mais a tabela candidatos 6:01 ainda que ele não tivesse nenhum 6:03 patrimônio declarado que a gente não 6:05 quer perder a lista de candidatos 6:06 entendi é para isso serviria um leve 6:09 salto região aí então a gente queria 6:10 indicar né eu vou rodar aqui para 6:13 mostrar que como esse caso não existe né 6:16 quando ele não existe que acontece o 6:18 resultado se torna o mesmo porque eu não 6:20 tenho caso de candidatos que existem 6:22 numa cadela e não na outra porque a uma 6:24 interpretação completa né das duas 6:26 tabelas eu não tenho lembrando a 6:28 representação de conjuntos né Eu não 6:30 tenho no caso que a gente tá vendo essa 6:32 parte aqui do conjunto né ou seja alguém 6:34 que ter tem esse a tabela a e não 6:36 pertenço a tabela Abrir nesse caso aqui 6:38 da consulta que a gente tá fazendo todos 6:40 os candidatos a Governador né no ano de 6:43 2018 que estão na tabela candidatos 6:45 estendendo declarados e por isso tem 6:47 essa interseção eu não consigo mostrar 6:49 exatamente o exemplo aqui que eu 6:51 gostaria para você mas eu acho que você 6:53 consegue entender ideia né então quando 6:55 você tem elementos registros que estão 6:58 numa tabela e não está se você quer 7:01 fazer uma junção mas você não quer 7:02 perder essa informação que não conta na 7:05 outra tabela né correspondente Então 7:07 você usa o autor de o que pode ser left 7:10 que você quer que isso se aplique a 7:11 tabela que está à esquerda do seu joinha 7:14 ou like se você tivesse referindo a 7:16 tabela da direita do seu joia essa então 7:19 é a fundamentação por trás Winner alto e 7:21 left Heart John e aí existe ainda uma 7:24 outra avaliação de alterações que quando 7:26 a gente quer a união dos conjuntos Então 7:29 por os casos que a intercessão né você 7:31 vai ter linhas completas para os casos 7:33 em que só informação numa tabela você 7:35 vai ter a informação nessa e a parte que 7:37 seria da junção né isso aí anula e 7:39 vice-versa então isso é o que a gente 7:41 chama de full alta John Então se a gente 7:44 quiser fazer uma operação de conjunto né 7:47 pensando em conjunto de pegar o que há 7:49 de complementar na tabela a em relação a 7:51 tabela ver a gente pode se validar 7:53 junção para fazer isso aí a gente pede 7:55 para ele selecionar 7:57 especificamente onde os ele e da chave 8:01 meu atributo em comum que essas tabelas 8:03 tem onde o atributo da favela veio aqui 8:05 no caso é no lugar aí a gente pega 8:07 exatamente o complementar o mais 8:09 interessante aqui seria que a gente 8:11 conseguisse se deparar com exemplos 8:13 concretos na prática de fazendo as 8:15 consultas mas a verdade é que eu fiz 8:18 muitas consultas e ele já cheguei aqui 8:19 na tabela pelo menos nos dados que a 8:22 gente tá utilizando eu não consegui 8:23 produzir bons exemplos de utilização do 8:26 autor John porque justamente essas 8:29 tabelas elas possuem essas intercessões 8:31 né eu precisava que não tivesse uma 8:33 interseção total para a gente poder 8:35 observar quando a gente está 8:36 selecionando um caso quando a gente vai 8:38 selecionando o outro caso eu acho que 8:40 não é tão difícil de perceber que é 8:42 possível que aconteça esse caso e que 8:44 esse recurso é útil para a gente e por 8:46 isso eu trouxe aqui para a gente 8:47 aprender como eu digo sempre é mais uma 8:50 ferramenta para gente colocar na nossa 8:51 caixa de ferramentas aqui do STF da 8:54 mesma forma que a gente pode utilizar o 8:55 leste autor de um em para calcular os 8:58 elementos complementares da tabela arr e 9:00 a gente usar o right Outer join né a 9:02 gente vai estar calculando a gente pode 9:04 só inverter a lógica né eu utilizo e 9:06 pegar o complementar da tabela bem elas 9:08 são as Lembrando que se você tem que 9:10 saber lá e dei você inverte elas de 9:12 lugar porque é leftwich então é é 9:15 simétrico da mesma maneira a gente ainda 9:17 pode fazer uma variação awful autor John 9:20 em que atira ao que tava intercessão e 9:22 ficar exatamente com o complementar da 9:24 intercessão me para fazer isso a gente 9:26 vai fazendo ajustes na cláusula SQL que 9:29 a gente adiciona condições E aí usando a 9:32 cláusula where a gente vai adicionando 9:33 condições para fazer essa manipulação 9:35 Então quando você quer tirar uma parte 9:38 de uma tabela ou de outra então 9:40 Infelizmente como eu falei eu não 9:42 consegui um exemplo bem concreto com 9:44 esses dados aqui usando left out here on 9:46 earth water Johnny Mas eu precisava 9:49 trazer esse conceito para a gente 9:50 aprender ele juntos mas existe sim uma 9:53 coisa que eu posso mostrar na prática 9:55 que aí vai encerrar que o conteúdo do 9:56 nosso vídeo de junções que são os Johns 10:00 em lícitos que na verdade nada mais é do 10:02 que fazer um joinha sem usar a cláusula 10:04 de íon sim isso é possível né em skelly 10:08 a gente acaba tendo várias maneiras de 10:09 poder fazer coisas diferentes e a gente 10:12 vai escolhendo né O que é melhor ou pior 10:14 em relação ao Joy explícito e o 10:16 implícito eu prefiro usar o explícito 10:19 justamente porque se você mesmo foi ver 10:21 seu código depois outra pessoa fica mais 10:23 evidente que está sendo feito um joinha 10:25 mas cor disso é legal você sabia que dá 10:27 para fazer o John implícito e para fazer 10:29 isso a gente Então exclui aqui a 10:32 cláusula de lá então a gente vai passar 10:34 para ele nesse from duas tabelas sem 10:37 especificar explicitamente que a gente 10:39 vai fazer um jovem com elas e o que era 10:41 a condição da nossa cláusula online vai 10:43 se tornar uma condição com outra 10:45 qualquer dentro da cláusula Where E 10:47 assim a gente tem exatamente o mesmo 10:50 John porém de maneira implícita é bem 10:53 simples né vai se produzir o mesmo 10:55 resultado né para produzir o mesmo 10:56 resultado por entanto na prática a gente 10:59 não utiliza é 11:00 explicitamente Então esse a gente agora 11:03 assim a gente viu tudo que a gente 11:05 precisava ver de junções a gente tem 11:07 todas as ferramentas que a gente precisa 11:08 utilizar e se você tem dados aí que você 11:11 está praticando diferente do meu e conta 11:13 se você já precisou usar o Walter 11:15 William Joyce você já teve dificuldade 11:18 com essas coisas antes deixa um 11:19 comentário uma sugestão aqui para mim e 11:21 não esquece de usar #sql esse vídeo fica 11:25 por aqui muito obrigada e até a próxima 11:26 tchau 11:30 [Música] 11:36 [Música] *********************************************************** pt.wikipedia.org Join (SQL) Contribuidores dos projetos da Wikimedia 14–20 minutos Uma cláusula join da SQL - correspondente a uma operação de junção em álgebra relacional - combina colunas de uma ou mais tabelas em um banco de dados relacional. Ela cria um conjunto que pode ser salvo como uma tabela ou usado da forma como está. Um JOIN é um meio de combinar colunas de uma (auto-junção) ou mais tabelas, usando valores comuns a cada uma delas. O SQL padrão ANSI especifica cinco tipos de JOIN: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER e CROSS. Como um caso especial, uma tabela (tabela base, visão ou tabela juntada) pode se juntar a si mesma em uma auto-união (self-join). Um programador declara uma instrução JOIN para identificar linhas para junção. Se o predicado avaliado for verdadeiro, a linha combinada é, então, produzida no formato esperado, um conjunto de linhas ou uma tabela temporária. Tabelas de exemplo[editar | editar código-fonte] Os bancos de dados relacionais geralmente são normalizados para eliminar a duplicação de informações, como quando os tipos de entidade têm relacionamentos um-para-muitos. Por exemplo, um departamento pode estar associado a vários funcionários. A junção de tabelas separadas para departamento e empregado cria, efetivamente, outra tabela que combina as informações de ambas as tabelas. Todas as explicações subsequentes sobre tipos de junção neste artigo utilizam as duas tabelas a seguir. As linhas nessas tabelas servem para ilustrar o efeito de diferentes tipos de junções e predicados de junção. A coluna IDDepartamento da tabela Departamento (que pode ser designada como Departamento.IDDepartamento) é a chave primária, enquanto Empregado.IDDepartamento é uma chave estrangeira. Tabela Empregado ÚltimoNome IDDepartamento Rafferty 31 Jones 33 Heisenberg 33 Robinson 34 Smith 34 Williams NULO Tabela Departamento IDDepartamento NomeDepartamento 31 Vendas 33 Engenharia 34 Administrativo 35 Marketing Observação: Na tabela Empregado acima, o empregado "Williams" ainda não foi atribuído a nenhum departamento. Além disso, observe que nenhum funcionário é atribuído ao departamento de "Marketing". Esta é a instrução SQL para criar as tabelas acima mencionadas. CREATE TABLE departamento ( IDDepartamento INT Primary key, NomeDepartamento VARCHAR(20) ); CREATE TABLE empregado ( ÚltimoNome VARCHAR(20), IDDepartamento INT references departamento(IDDepartamento) ); INSERT INTO departamento VALUES(31, 'Vendas'); INSERT INTO departamento VALUES(33, 'Engenharia'); INSERT INTO departamento VALUES(34, 'Administrativo'); INSERT INTO departamento VALUES(35, 'Marketing'); INSERT INTO empregado VALUES('Rafferty', 31); INSERT INTO empregado VALUES('Jones', 33); INSERT INTO empregado VALUES('Heisenberg', 33); INSERT INTO empregado VALUES('Robinson', 34); INSERT INTO empregado VALUES('Smith', 34); INSERT INTO empregado VALUES('Williams', NULL); Junção cruzada (cross join)[editar | editar código-fonte] Uma junção cruzada, CROSS JOIN, retorna o produto cartesiano dos registros (linhas) das tabelas na junção. Em outras palavras, ela produzirá registros que combinam cada registro da primeira tabela com cada registro da segunda tabela.[1] Exemplo de uma junção cruzada explícita: SELECT * FROM empregado CROSS JOIN departamento; Exemplo de um cross join implícito: SELECT * FROM empregado, departamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Rafferty 31 Venda 31 Jones 33 Venda 31 Heisenberg 33 Venda 31 Smith 34 Venda 31 Robinson 34 Venda 31 Williams NULO Venda 31 Rafferty 31 Engenharia 33 Jones 33 Engenharia 33 Heisenberg 33 Engenharia 33 Smith 34 Engenharia 33 Robinson 34 Engenharia 33 Williams NULO Engenharia 33 Rafferty 31 Administrativo 34 Jones 33 Administrativo 34 Heisenberg 33 Administrativo 34 Smith 34 Administrativo 34 Robinson 34 Administrativo 34 Williams NULO Administrativo 34 Rafferty 31 Marketing 35 Jones 33 Marketing 35 Heisenberg 33 Marketing 35 Smith 34 Marketing 35 Robinson 34 Marketing 35 Williams NULO Marketing 35 A junção cruzada não aplica nenhum predicado para filtrar linhas da tabela resultante da junção. Os resultados de uma junção cruzada podem ser filtrados usando uma cláusula WHERE, que pode então produzir o equivalente a uma junção interna. No padrão SQL:2011, as junções cruzadas fazem parte do pacote opcional F401, "Extended joined table". Usos comuns são para verificar o desempenho do servidor. Junção interna (inner join)[editar | editar código-fonte] A Venn Diagram showing the inner overlapping portion filled. Um diagrama de Venn representando uma instrução SQL de uma junção interna entre as tabelas A e B. Uma junção interna, INNER JOIN, requer que cada linha, nas duas tabelas da junção, tenha valores de coluna correspondentes, e é uma operação de junção comumente usada em aplicativos, mas não deve ser considerada a melhor escolha em todas as situações. A junção interna cria uma nova tabela de resultados combinando valores de coluna de duas tabelas (A e B) com base no predicado de junção. A consulta compara cada linha de A com cada linha de B para encontrar todos os pares de linhas que satisfazem o predicado da junção. Quando o predicado da junção é satisfeito pela correspondência de valores não-NULOS, os valores de coluna para cada par de linhas correspondentes de A e B são combinados em uma linha de resultado. O resultado da junção pode ser definido como o resultado da primeira obtenção do produto cartesiano (ou Cross join) de todas as linhas nas tabelas (combinando todas as linhas da tabela A com todas as linhas da tabela B) e retornando todas as linhas que satisfazem o predicado da junção. Implementações SQL reais normalmente usam outras abordagens, como junções de hash ou junções de mesclagem de ordenação, pois o cálculo do produto cartesiano é mais lento e, geralmente, requer, proibitivamente, uma grande quantidade de memória para armazenar. O SQL especifica duas formas sintáticas diferentes para expressar as junções: a "notação de junção explícita" e a "notação de junção implícita". A "notação de junção implícita" não é mais considerada uma prática recomendada, embora os sistemas de banco de dados ainda a suportem. A "notação de junção explícita" usa a palavra-chave JOIN, opcionalmente precedida pela palavra-chave INNER, para especificar a tabela a ser unida e a palavra-chave ON para especificar os predicados para a junção, como no exemplo a seguir: SELECT empregado.ÚltimoNome, empregado.IDDepartamento, departamento.NomeDepartamento FROM empregado INNER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.Departamento Departamento.NomeDepartamento Robinson 34 Administrativo Jones 33 Engenharia Smith 34 Administrativo Heisenberg 33 Engenharia Rafferty 31 Vendas A "notação de junção implícita" simplesmente lista as tabelas para unir, na cláusula FROM da instrução SELECT, usando vírgulas para separá-las. Assim, ele especifica uma junção cruzada, e a cláusula WHERE pode aplicar predicados de filtro adicionais (que funcionam comparativamente aos predicados da junção na notação explícita). O exemplo a seguir é equivalente ao anterior, mas desta vez usando notação de junção implícita: SELECT * FROM empregado, departamento WHERE empregado.IDDepartamento = departamento.IDDepartamento; Junção externa (outer join)[editar | editar código-fonte] A tabela resultante da junção retém cada linha - mesmo que não exista outra linha correspondente. As junções externas subdividem-se, adicionalmente, em junções externas esquerdas (left outer joins), junções externas direitas (right outer joins) e junções externas completas (full outer joins), dependendo de quais linhas da tabela são retidas: esquerda, direita ou ambas (neste caso, esquerda e direita referem-se aos dois lados da palavra-chave JOIN). Assim como as junções internas, pode-se ainda sub-categorizar todos os tipos de junções externas, como junções de igualdade, junções naturais, ON (junção-θ ou θ-join), etc.[2] Não existe nenhuma notação de junção implícita para junções externas no SQL padrão. A Venn Diagram showing the left circle and overlapping portion filled. Um diagrama de Venn representando a instrução SQL de Left Join, entre as tabelas A e B. Junção externa esquerda (left outer join)[editar | editar código-fonte] O resultado de uma junção externa esquerda (ou simplesmente junção esquerda - left join) para as tabelas A e B sempre contém todas as linhas da tabela "esquerda" (A), mesmo se a condição de junção não encontrar nenhuma linha correspondente na tabela "direita" (B). Isso significa que se a cláusula ON corresponder a 0 (zero) linhas em B (para uma determinada linha em A), a união ainda retornará uma linha no resultado (para aquela linha) - mas com NULO em cada coluna de B. Uma junção externa esquerda retorna todos os valores de uma junção interna mais todos os valores na tabela à esquerda que não correspondem à tabela da direita, incluindo linhas com valores NULO (vazios) na coluna de ligação. Por exemplo, isso nos permite encontrar o departamento de um funcionário, mas ainda mostra funcionários que não foram atribuídos a um departamento (ao contrário do exemplo de associação interna acima, em que funcionários não atribuídos foram excluídos do resultado). Exemplo de uma junção externa esquerda (a palavra-chave OUTER é opcional), com a linha de resultado adicional (comparada com a junção interna) em itálico: SELECT * FROM empregado LEFT OUTER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Jones 33 Engenharia 33 Rafferty 31 Vendas 31 Robinson 34 Administrativo 34 Smith 34 Administrativo 34 Williams NULO NULO NULO Heisenberg 33 Engenharia 33 Sintaxes alternativas[editar | editar código-fonte] O Oracle suporta a sintaxe depreciada[3]: SELECT * FROM empregado, departamento WHERE empregado.IDDepartamento = departamento.IDDepartamento(+) O Sybase suporta a sintaxe (o Microsoft SQL Server depreciou essa sintaxe desde a versão 2000): SELECT * FROM empregado, departamento WHERE empregado.IDDepartamento *= departamento.IDDepartamento O IBM Informix suporta a sintaxe: SELECT * FROM empregado, OUTER departamento WHERE empregado.IDDepartamento = departmento.IDDepartamento A Venn Diagram show the right circle and overlapping portions filled. Um diagrama de Venn representando a instrução de junção direita entre as tabelas A e B. Junção externa direita (right outer join)[editar | editar código-fonte] Uma junção externa direita (junção direita ou right join) se assemelha a uma junção externa esquerda, exceto com o tratamento das tabelas invertidas. Cada linha da tabela "direita" (B) aparecerá na tabela resultante da junção pelo menos uma vez. Se nenhuma linha correspondente da tabela "esquerda" (A) existir, aparecerá NULO nas colunas de A para aquelas linhas que não tiverem correspondência em B. Uma junção externa direita retorna todos os valores da tabela da direita e os valores correspondentes da tabela da esquerda (NULO no caso de nenhum predicado de junção correspondente). Por exemplo, isso nos permite encontrar cada funcionário e seu departamento, mas ainda mostrar departamentos que não possuem funcionários. Abaixo está um exemplo de uma junção externa direita (a palavra-chave OUTER é opcional), com a linha de resultado adicional em itálico: SELECT * FROM empregado RIGHT OUTER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Smith 34 Administrativo 34 Jones 33 Engenharia 33 Robinson 34 Administrativo 34 Heisenberg 33 Engenharia 33 Rafferty 31 Vendas 31 NULO NULO Marketing 35 Junções externas esquerda e direita são funcionalmente equivalentes. Nenhuma das duas fornece qualquer funcionalidade que a outra não tenha, portanto, as junções externas direita e esquerda podem substituir umas às outras, desde que a ordem da tabela seja trocada. A Venn Diagram showing the right circle, left circle, and overlapping portion filled. Um diagrama de Venn representando a instrução SQL de Junção Completa entre as tabelas A e B. Junção externa completa (full outer join)[editar | editar código-fonte] Conceitualmente, uma junção externa completa combina o efeito de aplicar junções externas esquerda e direita. Onde as linhas nas tabelas que forem unidas pela junção completa não corresponderem, o conjunto de resultados terá valores NULO para cada coluna da tabela que não possuir uma linha correspondente. Para aquelas linhas que corresponderem, uma única linha será produzida no conjunto de resultados (contendo colunas preenchidas de ambas as tabelas). Por exemplo, isso nos permite ver cada funcionário que está em um departamento e cada departamento que tem um funcionário, mas também ver cada funcionário que não faz parte de um departamento e cada departamento que não tem um funcionário. Exemplo de uma junção externa completa (a palavra-chave OUTER é opcional): SELECT * FROM empregado FULL OUTER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Smith 34 Administrativo 34 Jones 33 Engenharia 33 Robinson 34 Administrativo 34 Williams NULO NULO NULO Heisenberg 33 Engenharia 33 Rafferty 31 Administrativo 31 NULO NULO Marketing 35 Alguns sistemas de banco de dados não suportam a funcionalidade de junção externa completa diretamente, mas podem emular através do uso de uma junção interna e de seleções UNION ALL das "linhas de tabela única" das tabelas esquerda e direita, respectivamente. O mesmo exemplo pode aparecer da seguinte maneira: SELECT empregado.ÚltimoNome, empregado.IDDepartamento, departamento.NomeDepartamento, departamento.IDDepartamento FROM empregado INNER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento UNION ALL SELECT empregado.ÚltimoNome, empregado.IDDepartamento, cast(NULL as varchar(20)), cast(NULL as integer) FROM empregado WHERE NOT EXISTS ( SELECT * FROM departamento WHERE empregado.IDDepartamento = departamento.IDDepartamento) UNION ALL SELECT cast(NULL as varchar(20)), cast(NULL as integer), departamento.NomeDepartamento, departamento.IDDepartamento FROM departamento WHERE NOT EXISTS ( SELECT * FROM empregado WHERE empregado.IDDepartamento = departamento.IDDepartamento) Referências ↑ SQL CROSS JOIN ↑ Silberschatz, Abraham; Korth, Hank; Sudarshan, S. (2002). Database System Concepts 4ª ed. [S.l.: s.n.] p. 166. ISBN 0072283637 ↑ Oracle Left Outer Join ************************************************************** learn.microsoft.com Joins (SQL Server) - SQL Server WilliamDAssafMSFT 28–39 minutos Joins (SQL Server) Artigo 25/01/2023 21 minutos para o fim da leitura Neste artigo Conceitos básicos de junção Compreendendo junções de Loops Aninhados Junções de mesclagem Junções de hash Junções adaptáveis Valores nulos e junções Próximas etapas Aplica-se a: SQL Server SQL do Azure DatabaseInstância Gerenciada de SQL do AzureAzure Synapse Analytics AnalyticsPlatform System (PDW) SQL Server executa operações de classificação, interseção, união e diferença usando classificação de memória e a tecnologia de junção de hash. Usando esse tipo de plano de consulta, o SQL Server dá suporte ao particionamento de tabela vertical. SQL Server implementa operações de junção lógica, conforme determinado pela sintaxe Transact-SQL: Junção interna Junção externa esquerda Junção externa direita Junção externa completa União cruzada SQL Server emprega quatro tipos de operações de junção física para realizar as operações de junção lógica: Junções de Loops Aninhados Junções de mesclagem Junções de hash Junções adaptáveis (a partir do SQL Server 2017 (14.x)) Conceitos básicos de junção Usando junções, é possível recuperar dados de duas ou mais tabelas com base em relações lógicas entre as tabelas. Junções indicam como SQL Server deveria usar dados de uma tabela para selecionar as linhas em outra tabela. Uma condição de junção define o modo como duas tabelas são relacionadas em uma consulta por: Especificando a coluna de cada tabela a ser usada para a junção. Uma condição de junção típica especifica uma chave estrangeira de uma tabela e sua chave associada na outra tabela. Especificação de um operador lógico (por exemplo, = ou <>,) a ser usado na comparação de valores das colunas. As junções são expressas logicamente usando a seguinte sintaxe Transact-SQL: INNER JOIN LEFT [ OUTER ] JOIN RIGHT [ OUTER ] JOIN FULL [ OUTER ] JOIN CROSS JOIN As junções internas podem ser especificadas nas cláusulas FROM ou WHERE. As junções externas e as uniões cruzadas podem ser especificadas apenas na cláusula FROM. As condições de junção combinam-se com as condições de pesquisa WHERE e HAVING para controlar as linhas selecionadas das tabelas base referenciadas na cláusula FROM. Especificar as condições de junção na cláusula FROM ajuda a separá-las de qualquer outro critério de pesquisa que possa ser especificado em uma cláusula WHERE e é o método recomendado para a especificação de junções. Uma sintaxe de junção de cláusula ISO FROM simplificada é: FROM first_table < join_type > second_table [ ON ( join_condition ) ] join_type especifica que tipo de junção é executado: uma junção interna, externa ou cruzada. join_condition define o predicado a ser avaliado para cada par de linhas unidas. O seguinte exemplo refere-se a uma especificação de junção da cláusula FROM: FROM Purchasing.ProductVendor INNER JOIN Purchasing.Vendor ON ( ProductVendor.BusinessEntityID = Vendor.BusinessEntityID ) O seguinte exemplo refere-se a uma instrução SELECT simples que usa esta junção: SELECT ProductID, Purchasing.Vendor.BusinessEntityID, Name FROM Purchasing.ProductVendor INNER JOIN Purchasing.Vendor ON (Purchasing.ProductVendor.BusinessEntityID = Purchasing.Vendor.BusinessEntityID) WHERE StandardPrice > $10 AND Name LIKE N'F%' GO A instrução SELECT retorna as informações de produto e de fornecedor para qualquer combinação de partes fornecidas por uma empresa cujo nome começa com a letra F e o preço do produto é maior que US$ 10. Quando várias tabelas são referenciadas em uma única consulta, todas as referências de coluna devem ser inequívocas. No exemplo anterior, as tabelas ProductVendor e Vendor têm uma coluna chamada BusinessEntityID. Qualquer nome de coluna que seja duplicado entre duas ou mais tabelas referenciadas na consulta deve ser qualificado com o nome da tabela. Todas as referências às colunas Vendor no exemplo estão qualificadas. Quando um nome de coluna não está duplicado em duas ou mais tabelas usadas na consulta, a referências a ele não precisam ser qualificadas com o nome da tabela. Isso é mostrado no exemplo anterior. Às vezes, uma cláusula SELECT é difícil de ser compreendida, pois não há nada que indique a tabela que forneceu cada coluna. A legibilidade da consulta será aprimorada se todas as colunas estiverem qualificadas com seus nomes de tabela. A legibilidade é aperfeiçoada se aliases de tabela são usados, principalmente quando os nomes de tabelas precisam ser qualificados com nomes de proprietários e de banco de dados. O exemplo seguinte é o mesmo, exceto que aliases de tabela foram atribuídos e as colunas foram qualificadas com aliases de tabela para aperfeiçoar a legibilidade: SELECT pv.ProductID, v.BusinessEntityID, v.Name FROM Purchasing.ProductVendor AS pv INNER JOIN Purchasing.Vendor AS v ON (pv.BusinessEntityID = v.BusinessEntityID) WHERE StandardPrice > $10 AND Name LIKE N'F%'; Os exemplos anteriores especificaram as condições de junção na cláusula FROM, que é o método preferencial. A seguinte consulta contém a mesma condição de junção especificada na cláusula WHERE: SELECT pv.ProductID, v.BusinessEntityID, v.Name FROM Purchasing.ProductVendor AS pv, Purchasing.Vendor AS v WHERE pv.BusinessEntityID=v.BusinessEntityID AND StandardPrice > $10 AND Name LIKE N'F%'; A lista SELECT para uma junção pode referenciar todas as colunas nas tabelas unidas ou qualquer subconjunto das colunas. A lista SELECT não precisa conter colunas de todas as tabelas na junção. Por exemplo, em uma junção de três tabelas, somente uma tabela pode ser usada para ligar uma das tabelas à terceira e, nenhuma das colunas da tabela do meio, precisa ser referenciada na lista de seleção. Isso também é chamado de antisemijunção. Embora as condições de junção tenham comparações de igualdade (=), outros operadores relacionais ou de comparação podem ser especificados, como também outros predicados. Para obter mais informações, consulte Operadores de comparação (Transact-SQL) e WHERE (Transact-SQL). Quando o SQL Server processa as junções, o otimizador de consulta escolhe o método mais eficaz (entre várias possibilidades) de processamento da junção. Isso inclui escolher o tipo mais eficiente de junção física, a ordem na qual as tabelas serão unidas e até mesmo usar tipos de operações de junção lógica que não podem ser expressas diretamente com a sintaxe Transact-SQL, como semijunções e antijunções. A execução física de várias junções pode usar muitas otimizações diferentes e portanto não pode ser prevista de maneira confiável. Para obter mais informações sobre as semijunções e as antisemijunções, confira Referência de operadores lógicos e físicos do plano de execução. Colunas usadas em uma condição de junção não precisam ter o mesmo nome ou ter o mesmo tipo de dados. Entretanto, se os tipos de dados não forem idênticos, eles precisarão ser compatíveis ou ser tipos que o SQL Server possa converter implicitamente. Se o tipo de dados não puder ser convertido implicitamente, a condição de junção deverá converter explicitamente o tipo de dados usando a função CAST. Para obter mais informações sobre conversões implícitas e explícitas, consulte Conversão de tipo de dados (Mecanismo de Banco de Dados). A maioria das consultas que usam uma junção pode ser regravada usando uma subconsulta (uma consulta aninhada dentro de outra consulta) e a maioria das subconsultas pode ser regravada como junções. Para obter mais informações sobre subconsultas, veja Subconsultas. Observação Tabelas não podem ser unidas diretamente em colunas ntext, text ou image. No entanto, as tabelas podem ser unidas indiretamente em colunas ntext, text ou image usando SUBSTRING. Por exemplo, SELECT * FROM t1 JOIN t2 ON SUBSTRING(t1.textcolumn, 1, 20) = SUBSTRING(t2.textcolumn, 1, 20) executa uma junção interna de duas tabelas nos primeiros 20 caracteres de cada coluna de texto em tabelas t1 e t2. Além disso, outra possibilidade de comparação das colunas ntext ou text de duas tabelas é comparar o comprimento das colunas com a cláusula WHERE, por exemplo: WHERE DATALENGTH(p1.pr_info) = DATALENGTH(p2.pr_info) Compreendendo junções de Loops Aninhados Se uma entrada de junção for pequena (menos que 10 linhas) e a outra entrada de junção for bastante grande e indexada a suas colunas de junção, uma junção de loops aninhados de índice será a operação de junção mais rápida porque eles requerem o mínimo de E/S e comparações. A junção de loops aninhados, também denominada iteração aninhada, usa uma entrada de junção como a tabela de entrada externa (mostrada como a entrada superior no plano de execução) e outra como a tabela de entrada interna (na parte inferior). O loop externo consome a tabela de entrada externa linha por linha. O loop interno, executado para cada linha externa, pesquisa linhas correspondentes na tabela de entrada interna. No caso mais simples, a pesquisa examina toda uma tabela ou índice; isto é chamado de junção de loops aninhados naive. Se a pesquisa explorar um índice, será chamado de junção de loops aninhados de índice. Se o índice for criado como parte do plano de consulta (e destruído na conclusão da consulta), será chamado de junção de loops aninhados de índice temporário. Todas essas variantes são consideradas pelo Otimizador de Consulta. Uma junção de loops aninhados será particularmente eficaz se a entrada externa for pequena e a entrada interna for pré-indexada e grande. Em muitas transações pequenas, como as que afetam apenas um pequeno conjunto de linhas, as junções de loops aninhados de índice são superiores às junções mescladas e junções de hash. Em consultas grandes, contudo, as junções de loops aninhados não são frequentemente a melhor escolha. Quando o atributo OPTIMIZED de um Operador de junção de loops aninhados é definido como True, isso significa que um Loop aninhado otimizado (ou Classificação em lote) é usado para minimizar a E/S quando a tabela de lado interno é grande, independentemente de ser paralelizada ou não. A presença dessa otimização em um determinado plano pode não ser muito óbvia durante a análise de um plano de execução, uma vez que a própria classificação é uma operação oculta. Mas ao examinar o XML do plano para o atributo OPTIMIZED, isso indica que a Junção de loops aninhados pode tentar reordenar as linhas de entrada para melhorar o desempenho de E/S. Junções de mesclagem Se as duas entradas de junção não são pequenas, mas são classificadas na coluna de junção (por exemplo, se foram obtidas de exames em índices classificados), uma junção de mesclagem será a operação de junção mais rápida. Se ambas as entradas de junção forem grandes e as duas entradas forem de tamanhos semelhantes, uma junção de mesclagem com classificação prévia e uma junção de hash oferecerão desempenho semelhante. Porém, operações de junção de hash são muitas vezes mais rápidas quando os dois tamanhos da entrada diferem significativamente um do outro. A junção de mescla exige que as duas entradas sejam classificadas nas colunas de mesclagem, que são definidas pelas cláusulas de igualdade (ON) do predicado de junção. O otimizador de consulta geralmente examina um índice, caso exista um no conjunto de colunas, ou coloca um operador de classificação abaixo da junção de mescla. Em casos raros, podem existir diversas cláusulas de igualdade, mas as colunas de mesclagem são tiradas somente de algumas das cláusulas de igualdade disponíveis. Uma vez que cada entrada é classificada, o operador Junção de Mesclagem adquire uma linha de cada entrada e as compara. Por exemplo, em operações de junção internas, serão retornadas as linhas que forem iguais. Se elas não forem iguais, será descartada a linha com o menor valor e será obtida outra linha daquela entrada. Esse processo repete-se até que todas as linhas tenham sido processadas. A operação mesclar junção pode ser uma operação habitual ou uma operação muitos para muitos. Uma junção de mescla muitos para muitos usa uma tabela temporária para armazenar linhas. Se houver valores duplicados de cada entrada, uma das entradas terá que retroceder ao início das linhas duplicadas à medida que cada linha duplicada da outra entrada for processada. Se houver um predicado residual presente, todas as linhas que satisfaçam ao predicado de mesclagem avaliarão o predicado residual e serão retornadas somente as linhas que o satisfaçam. A junção de mescla é muito rápida, mas pode ser uma escolha cara se forem necessárias operações de classificação. Porém, se o volume de dados for grande e os dados desejados puderem ser obtidos pré-classificados de índices da árvore B existentes, frequentemente a junção de mescla será o algoritmo de junção mais rápido disponível. Junções de hash Junções de hash podem processar com eficácia grande volume de entradas não classificadas e não indexadas. Elas são úteis para resultados intermediários em consultas complexas por que: Os resultados intermediários não são indexados (a menos que salvos explicitamente no disco e depois indexados) e muitas vezes não são classificados adequadamente para a próxima operação no plano de consulta. Otimizadores de consulta só calculam tamanhos de resultado intermediário. Como as estimativas podem ser muito imprecisas para consultas complexas, os algoritmos para processar resultados intermediários não só devem ser eficientes, mas também devem ser degradados de forma suave se um resultado intermediário for muito maior do que o previsto. A junção de hash permite reduções no uso da desnormalização. A desnormalização é usada geralmente para obter melhor desempenho e reduzir as operações de junção, apesar dos perigos de redundância, como atualizações inconsistentes. As junções de hash reduzem a necessidade a desnormalização. As junções de hash permitem particionamento vertical (representando grupos de colunas de uma única tabela em arquivos separados ou índices) para se tornar uma opção viável no design do banco de dados físico. A junção hash tem duas entradas: a entrada build e entrada probe. O otimizador de consulta nomeia estes papéis de forma que a menor das duas entradas é a entrada de construção. Junções de hash são usadas para muitos tipos de operações para definir correspondente: junção interna; esquerda, direita e junção externa completa; semijunção esquerda e direita ; interseção; união; e diferença. Além disso, uma variante da junção de hash pode fazer remoção e agrupamento duplicados, como SUM(salary) GROUP BY department. Essas modificações usam só uma entrada para os papéis de construção e investigação. As seções seguintes descrevem tipos diferentes de junções de hash: junção de hash em-memória, junção de hash de cortesia e junção de hash recursiva. Junção Hash em-Memória A junção de hash primeiro verifica ou calcula a entrada de construção inteira e então constrói uma tabela de hash em memória. Cada linha é inserida em um compartimento de memória hash que depende do valor de hash computado para a chave hash. Se a entrada de construção inteira for menor que a memória disponível, todas as linhas poderão ser inseridas na tabela de hash. Essa fase de construção é seguida pela fase de investigação. A entrada de investigação inteira é verificada ou calculada uma linha de cada vez e o valor da chave de hash é calculado para cada linha de investigação, o compartimento de hash correspondente é verificado e as correspondências são produzidas. Junção hash de cortesia Se a entrada de construção não couber na memória, uma junção de hash continua em vários passos. Isso é conhecido como uma junção hash de cortesia. Cada passo tem uma fase de construção e fase de investigação. Inicialmente, a construção inteira e entradas de investigação são consumidas e particionadas (usando uma função de hash na chave hash) em arquivos múltiplos. Usando a função de hash nas chaves de hash garante que quaisquer dois registros de junção devem estar no mesmo par de arquivos. Portanto, a tarefa de unir duas entradas grandes foi reduzida a instâncias múltiplas, mas menores, das mesmas tarefas. A junção de hash é se aplicada então a cada par de arquivos particionados. Junção hash recursiva Se a entrada de construção for tão grande que entradas para uma fusão externa padrão requereriam níveis de fusão múltiplos, serão requeridos passos de particionamentos múltiplos e níveis de particionamentos múltiplos. Se somente algumas das partições forem grandes, passos de particionamentos adicionais serão usados apenas para essas partições específicas. Para fazer todos os passos de particionamento tão rápido quanto possível, operações grandes, assíncronas de I/O são usadas de forma que um único thread pode manter unidades de disco múltiplas ocupadas. Observação Se a entrada de construção só for ligeiramente maior que a memória disponível, elementos de junção de hash em-memória e junção de hash de cortesia serão combinados em um único passo, produzindo uma junção de hash híbrida. Nem sempre é possível durante otimização determinar qual junção de hash é usada. Portanto, o SQL Server começa usando uma junção hash em memória e gradualmente passa para a junção hash de cortesia e para a junção hash recursiva, dependendo do tamanho da entrada de compilação. Se o Otimizador de Consulta prever incorretamente qual das duas entradas será menor e, portanto, deveria ter sido a entrada de compilação, os papéis de compilação e investigação serão invertidos dinamicamente. A junção de hash garante que usa o menor arquivo com excedente como entrada de construção. Essa técnica é chamada de reversão de papel. A reversão de papel acontece dentro da junção de hash depois de pelo menos um derramamento para o disco. Observação A reversão de papel acontece independente de qualquer dica de consulta ou estrutura. A reversão de papel não aparecerá em seu plano de consulta; quando acontecer, é transparente ao usuário. Abandono de hash O termo de esgotamento de hash às vezes é usado para descrever junções hash de cortesia ou junções hash recursivas. Observação Junções de hash recursivas ou abandonos de hash causam desempenho reduzido em seu servidor. Se você vir muitos eventos de Aviso de Hash em um rastreamento, atualize as estatísticas nas colunas que estão sendo unidas. Para obter mais informações sobre esgotamento de hash, veja Classe de evento de aviso de Hash. Junções adaptáveis As Junções adaptáveis de Modo de lote permitem a escolha de um método de Junção Hash ou de Junção de loops aninhados a ser adiado até depois que a primeira entrada for verificada. O operador de Junção Adaptável define um limite que é usado para decidir quando mudar para um plano de Loops aninhados. Portanto, um plano de consulta pode alternar dinamicamente para uma estratégia de junção melhor durante a execução sem precisar ser recompilado. Dica As cargas de trabalho com oscilações frequentes entre verificações de entradas de junção pequenas e grandes terão mais benefícios com esse recurso. A decisão de runtime se baseia nas seguintes etapas: Se a contagem de linhas da entrada de junção de build for pequena o suficiente para que uma Junção de loops aninhados seja mais ideal do que uma Junção Hash, o plano será alternado para um algoritmo de Loops Aninhados. Se a entrada de junção de build exceder um limite de contagem de linhas específico, o plano não mudará e continuará com uma Junção hash. A consulta a seguir é usada para ilustrar um exemplo de Junção Adaptável: SELECT [fo].[Order Key], [si].[Lead Time Days], [fo].[Quantity] FROM [Fact].[Order] AS [fo] INNER JOIN [Dimension].[Stock Item] AS [si] ON [fo].[Stock Item Key] = [si].[Stock Item Key] WHERE [fo].[Quantity] = 360; A consulta retorna 336 linhas. Habilitar as Estatísticas de consultas dinâmicas exibe o plano a seguir: Resultados da consulta: 336 linhas No plano, observe o seguinte: Uma verificação de índice columnstore usada para fornecer linhas para a fase de build da Junção hash. O novo operador de Junção Adaptável. Este operador define um limite que é usado para decidir quando mudar para um plano de Loops Aninhados. Para esse exemplo, o limite é de 78 linhas. Tudo que for >= 78 linhas usará uma Junção hash. Quando estiver abaixo do limite, uma junção de Loops aninhados será usada. Como a consulta retorna 336 linhas, excede o limite. Portanto, a segunda branch representa a fase de investigação de uma operação de Junção de hash padrão. Observe que as Estatísticas de consultas dinâmicas mostram as linhas que passam pelos operadores – nesse caso, "672 de 672". E a última branch é uma Busca de índice clusterizado a ser usada pela junção de Loops aninhados que não teve o limite excedido. Observe que podemos ver "0 de 336" linhas exibidas (o branch não é usado). Agora compare o plano com a mesma consulta, mas quando o valor de Quantidade só tem uma linha na tabela: SELECT [fo].[Order Key], [si].[Lead Time Days], [fo].[Quantity] FROM [Fact].[Order] AS [fo] INNER JOIN [Dimension].[Stock Item] AS [si] ON [fo].[Stock Item Key] = [si].[Stock Item Key] WHERE [fo].[Quantity] = 361; A consulta retorna uma linha. Habilitar as Estatísticas de consultas dinâmicas exibe o plano a seguir: Resultado da consulta: uma linha No plano, observe o seguinte: Com uma linha retornada, a Busca de índice clusterizado agora tem linhas que passam por ela. E, como a fase de build da Junção Hash não continuou, não há linhas passando pela segunda branch. Comentários de junção adaptável As junções adaptáveis apresentam um requisito de memória maior do que um plano equivalente de Junção de Loops Aninhados indexados. A memória adicional é solicitada como se os Loops Aninhados fossem uma Junção hash. Também há sobrecarga para a fase de build como uma operação de “parar e ir” em vez de uma junção equivalente de fluxo de Loops Aninhados. Com esse custo adicional vem a flexibilidade para cenários em que as contagens de linhas podem flutuar na entrada de build. As Junções adaptáveis de modo de lote funcionam para a execução inicial de uma instrução. Depois que são compiladas, as próximas execuções permanecem adaptáveis com base no limite de Junção Adaptável compilada e nas linhas de runtime que passam pela fase de build da entrada externa. Se uma Junção Adaptável alterna para uma operação de Loops Aninhados, ela usa as linhas já lidas pelo build de Junção Hash. O operador não lê novamente as linhas de referência externa novamente. Controlando a atividade da Junção adaptável O operador de Junção Adaptável tem os seguintes atributos de operador de plano: Atributo de plano Descrição AdaptiveThresholdRows Mostra o uso de limite para alternar de uma junção hash para uma junção de loops aninhados. EstimatedJoinType Qual é o provável tipo de junção. ActualJoinType Em um plano real, mostra qual algoritmo de junção foi finalmente escolhido com base no limite. O plano estimado mostra a forma do plano de Junção Adaptável, juntamente com um limite de Junção Adaptável definido e o tipo de junção estimado. Dica O Repositório de Consultas captura e é capaz de forçar um plano de Junção Adaptável de modo de lote. Instruções qualificadas para junção adaptável Algumas condições tornam uma junção lógica qualificada para uma Junção Adaptável de modo de lote: O nível de compatibilidade do banco de dados é 140 ou superior. A consulta é uma instrução SELECT (as instruções de modificação de dados não são qualificadas no momento). A junção é qualificada para ser executada por uma Junção de loops aninhados indexada ou um algoritmo físico de Junção hash. A Junção hash usa o modo de Lote, habilitado pela presença de um Índice columnstore na consulta geral, uma tabela indexada por Columnstore referenciada diretamente pela junção ou pelo uso do Modo de lote em rowstore. As soluções alternativas geradas da Junção de loops aninhados e da Junção hash devem ter o mesmo primeiro filho (referência externa). Linhas de limite adaptável O gráfico a seguir mostra uma interseção de exemplo entre o custo de uma Junção hash e o custo de uma alternativa de Junção de loops aninhados. Neste ponto de interseção, o limite é determinado e, por sua vez, ele determina o algoritmo real usado para a operação de junção. Limite de junção Desabilitar Junções adaptáveis sem alterar o nível de compatibilidade Junções adaptáveis podem ser desabilitadas no escopo do banco de dados ou da instrução, mantendo o nível de compatibilidade do banco de dados como 140 e superior. Para desabilitar as Junções adaptáveis para todas as execuções de consulta originadas do banco de dados, execute o seguinte dentro do contexto do banco de dados aplicável: -- SQL Server 2017 ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_BATCH_MODE_ADAPTIVE_JOINS = ON; -- Azure SQL Database, SQL Server 2019 and higher ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ADAPTIVE_JOINS = OFF; Quando habilitada, essa configuração aparecerá como habilitada em sys.database_scoped_configurations. Para reabilitar as junções adaptáveis para todas as execuções de consulta originadas do banco de dados, execute o seguinte dentro do contexto do banco de dados aplicável: -- SQL Server 2017 ALTER DATABASE SCOPED CONFIGURATION SET DISABLE_BATCH_MODE_ADAPTIVE_JOINS = OFF; -- Azure SQL Database, SQL Server 2019 and higher ALTER DATABASE SCOPED CONFIGURATION SET BATCH_MODE_ADAPTIVE_JOINS = ON; As Junções adaptáveis também podem ser desabilitadas para uma consulta específica designando DISABLE_BATCH_MODE_ADAPTIVE_JOINS como uma dica de consulta USE HINT. Por exemplo: SELECT s.CustomerID, s.CustomerName, sc.CustomerCategoryName FROM Sales.Customers AS s LEFT OUTER JOIN Sales.CustomerCategories AS sc ON s.CustomerCategoryID = sc.CustomerCategoryID OPTION (USE HINT('DISABLE_BATCH_MODE_ADAPTIVE_JOINS')); Observação Uma dica de consulta USE HINT tem precedência sobre uma configuração de escopo do banco de dados ou uma configuração de sinalizador de rastreamento. Valores nulos e junções Quando há valores nulos nas colunas de tabelas sendo associadas, eles não correspondem uns aos outros. A presença de valores nulos em uma coluna de uma das tabelas que estão sendo associadas pode ser retornada apenas usando uma junção externa (a menos que a cláusula WHERE exclua valores nulos). Veja duas tabelas que contêm NULL na coluna que participará da junção: table1 table2 a b c d ------- ------ ------- ------ 1 one NULL two NULL three 4 four 4 join4 Uma junção que compara os valores na coluna a com os valores da coluna c não obtém uma correspondência nas colunas que têm valores de NULL: SELECT * FROM table1 t1 JOIN table2 t2 ON t1.a = t2.c ORDER BY t1.a; GO Somente uma linha com 4 na coluna a e c é retornada: a b c d ----------- ------ ----------- ------ 4 join4 4 four (1 row(s) affected) Os valores nulos retornados de uma tabela base também são difíceis de distinguir dos valores nulos retornados de uma junção externa. Por exemplo, a seguinte instrução SELECT faz uma junção externa esquerda nestas duas tabelas: SELECT * FROM table1 t1 LEFT OUTER JOIN table2 t2 ON t1.a = t2.c ORDER BY t1.a; GO Este é o conjunto de resultados. a b c d ----------- ------ ----------- ------ NULL three NULL NULL 1 one NULL NULL 4 join4 4 four (3 row(s) affected) Os resultados não facilitam a distinção de um NULL nos dados de um NULL que representa uma falha na junção. Quando os valores nulos estão presentes nos dados que estão sendo associados, geralmente é preferível omiti-los nos resultados usando uma junção comum. Próximas etapas Referência de operadores físicos e lógicos de plano de execução Operadores de comparação (Transact-SQL) Conversão de tipo de dados (Mecanismo de Banco de Dados) Subconsultas Junções adaptáveis Cláusula FROM mais JOIN, APPLY, PIVOT (Transact-SQL) Conteúdo recomendado Tipos de dados (Transact-SQL) - SQL Server Este artigo fornece um resumo dos diferentes tipos de dados disponíveis no SQL Server. Funções definidas pelo usuário - SQL Server As funções definidas pelo usuário são rotinas que aceitam parâmetros, executam uma ação e retornam o resultado como um único valor escalar ou um conjunto de resultados. ************************************************************* hashtagtreinamentos.com JOIN SQL: o que é, tipos e como usar (Guia para Iniciantes) Heitor Catunda 6–8 minutos Postado em em 24 de agosto de 2022 O comando JOIN do SQL é muito importante para a manipulação de tabelas. Trata-se de uma forma de lidar com os dados, buscando relacionar dois conjuntos de dados na base, o que é muito útil em diversas operações. Por isso, serve como uma forma de filtrar os dados e selecionar apenas uma parte do que se deseja ver e analisar. Neste artigo, vamos analisar a importância do comando JOIN no SQL e entender como implementar os diferentes tipos. O que é a cláusula JOIN em SQL e para que serve? A cláusula JOIN é uma forma de relacionar duas tabelas e gerar uma tabela resultante com as relações explícitas entre elas. Por exemplo, uma das operações pode ser simplesmente buscar o que é comum entre as tabelas e ressaltar isso em um novo conjunto. Baseia-se fortemente na teoria dos conjuntos. É, aliás, um dos muitos conceitos da computação que praticamente implementam a base da teoria dos conjuntos. Suas operações são literalmente as operações de união, subtração e intersecção da teoria de conjuntos em formas de comando no SQL. Logo, a partir do estudo das relações entre tabelas e conjuntos, é possível melhorar a compreensão sobre cada tabela em específico. Esses insights ajudam na tomada de decisão e são úteis para empresas em diversos contextos. Pode ser interessante para filtrar dados, explicitar relações entre as tabelas, eliminar componentes indesejados, fazer uma análise mais precisa, etc. Por exemplo, caso a empresa tenha uma tabela de vendas de uma loja e uma tabela de vendas com outra loja, é possível saber quais produtos foram vendidos em ambas pela intersecção. Ou ainda é possível unir completamente as duas tabelas e gerar uma grande relação com todas as vendas efetuadas em um dado período. Ou seja, é possível ampliar e diminuir o escopo para uma análise mais geral e mais específica, respectivamente. Nesse ponto, vale especificar que não usamos os termos da teoria dos conjuntos, mas adotamos termos únicos para subcomandos da cláusula JOIN no SQL. Vamos entender a seguir quais são esses termos. Quais são os tipos de JOINS no SQL? Tipos Join SQL ilustração com desenhos INNER JOIN O INNER JOIN traz uma ideia muito intuitiva: a de buscar a intersecção entre as tabelas (“A ∩ B” da imagem principal acima). Ou seja, resulta em uma tabela que traz os valores que estão em ambas as tabelas iniciais. Vamos recuperar o exemplo das vendas em diferentes lojas. Ao aplicar o INNER JOIN no SQL, é possível obter como resultado somente os produtos vendidos nas duas lojas. A sintaxe é desenvolvida assim: FROM tabela1 AS t INNER JOIN tabela2 AS tp ON t.produto = tp.produto LEFT JOIN Já o LEFT JOIN é um pouco mais complexo. Resulta em uma tabela que exibe somente os itens da tabela da esquerda, incluindo os itens em interseção com a tabela direita. Contudo, exclui da relação o resto da tabela da direita. É como a ideia da subtração que também considera a intersecção. É uma forma de recuperar por completo todos os dados da tabela da esquerda sem perder os que também estão relacionados com a direita. No nosso exemplo, seria como pegar as vendas da loja 1, em uma listagem completa dessas vendas, o que inclui os produtos unicamente vendidos lá e os produtos que possam ter sido vendidos na loja 2. A sintaxe: FROM tabela1 AS t LEFT JOIN tabela2 AS tp ON t.produto = tp.produto Uma variação desse LEFT JOIN é o LEFT EXCLUDING JOIN, que pega apenas os valores únicos da tabela da esquerda. Está representado pelo “A – B” na imagem acima. RIGHT JOIN O RIGHT JOIN segue a mesma lógica do LEFT, só que para a outra tabela. Pega os dados completos da tabela da direita, incluindo os que também estão na tabela da direita. A sintaxe também é muito similar. Da mesma forma, temos a variação do RIGHT EXCLUDING JOIN, que pega apenas os valores únicos da tabela da direita (representado pelo “B-A” da imagem). FULL JOIN O FULL JOIN é o comando para pegar todos os valores das duas tabelas e unir em uma única resultante. É representado pelo “A U B” da imagem principal. É como pegar todos os produtos vendidos nas duas lojas da empresa e juntar todos esses registros para facilitar o controle ou a manipulação geral, por exemplo. Esse conceito é similar à operação de união da teoria dos conjuntos. A sintaxe fica assim: FROM tabela1 AS t FULL OUTER JOIN tabela2 AS tp ON t.produto = tp.produto A variação aqui é o FULL EXCLUDING JOIN, que exclui a interseção, ou seja, os valores em comum. Assim, pega os produtos vendidos unicamente nas lojas, sem aqueles que foram vendidos em ambas as lojas. CROSS JOIN O CROSS JOIN executa uma operação mais complexa, em que todos os itens de uma tabela estarão associados a cada item da outra. Assim, se a tabela 2 tem 7 itens e a tabela 1 tem apenas 2, cada um dos dois itens da tabela 1 será representado 7 vezes na nova tabela (com relação com todos os itens da tabela 2). A sintaxe é algo assim: FROM tabela1 AS t CROSS JOIN tabela2 AS tp WHERE t.id = 1 OR tp.id = 1 Dicas ao utilizar o comando JOIN no SQL É importante se atentar para algumas dicas de como usar o comando JOIN no SQL de uma maneira eficiente. Primeiro, é necessário usar aliases (apelidos) para as tabelas, o que ajuda na hora de identificá-las. Uma forma de fazer isso é usar apenas a primeira letra do termo, por exemplo. Outra dica essencial é saber exatamente as diferenças entre os comandos do SQL que mostramos aqui. Assim, você poderá ter uma boa visão de como usá-los e poderá fazer a filtragem do jeito que deseja. Se é iniciante no tema usar um dicionário de SQL poderá ajudar bastante. Conclusão O JOIN do SQL é uma cláusula importantíssima para manipular dados, fazer a relação entre tabelas e permitir filtragem para entendimento e controle. Assim, é uma forma de gerenciar a complexidade de bancos de dados grandes e gerar insights precisos sobre eles. Expert em conteúdos da Hashtag Treinamentos. Auxilia na criação de conteúdos de variados temas voltados para aqueles que acompanham nossos canais. ********************************************************************* pt.stackoverflow.com Diferenças entre Natural Join e Inner Join 3–4 minutos Que características diferenciam uma consulta realizada com o uso de Natural Join de outra com o uso de Inner Join? Existe alguma questão relacionada a desempenho ou qualquer outra condição que me leve a escolher uma em detrimento da outra? Para o exemplo abaixo, teríamos as seguintes consultas: select livro.nome_livro, editora.nome_editora from livro natural join editora ou select livro.nome_livro, editora.nome_editora from livro inner join editora on editora.codigo_editora = livro.codigo_editora inserir a descrição da imagem aqui Maniero's user avatar Maniero♦ 470mil88 medalhas de ouro1260 medalhas de prata1956 medalhas de bronze perguntada 21/03/2015 às 14:53 Geison Santos's user avatar Geison SantosGeison Santos 4.5879 medalhas de ouro42 medalhas de prata72 medalhas de bronze O NATURAL JOIN é só um facilitador. Ele não é mais rápido ou faz nada melhor, ele apenas permite uma sintaxe mais curta se a junção é simples, o seu exemplo ilustra bem isto. Ambos fazem exatamente a mesma coisa da mesma forma mas a primeira é mais fácil de escrever. O nome é assim porque esta é a forma mais natural de fazer um INNER JOIN simples. Como dá para perceber não é possível produzir resultados com expressões mais complexas usando a forma natural. Se o * for usado para pegar os campos nas tabelas com NATURAL JOIN as colunas de mesmo nome não serão mostradas repetidas no resultado. Artigo da Wikipedia. Coloquei no GitHub para referência futura. respondida 21/03/2015 às 15:04 Maniero's user avatar Maniero♦Maniero 470mil88 medalhas de ouro1260 medalhas de prata1956 medalhas de bronze 2 Você deve fazer log-in para responder a esta pergunta. Esta não é a resposta que você está procurando? Pesquise outras perguntas com a tag . ********************************************************** support.microsoft.com Operação INNER JOIN - Suporte da Microsoft 4–6 minutos Access do Microsoft 365 Access 2021 Access 2019 Access 2016 Access 2013 Access 2010 Access 2007 Mais...Menos Combina registros de duas tabelas sempre que houver valores correspondentes em um campo comum. Sintaxe FROM tabela1 INNER JOIN tabela2 ON tabela1.campo1compopr tabela2.campo2 A operação INNER JOIN tem estas partes: Parte Descrição tabela1, tabela2 Os nomes das tabelas das quais os registros são combinados. campo1, campo2 Os nomes dos campos que são unidos. Se não forem numéricos, os campos deverão ser do mesmo tipo de dados e conter dados da mesma natureza, mas não precisam ter o mesmo nome. oprcomp Qualquer operador de comparação relacional: "=", "<", ">", "<=", ">=" ou "<>". Comentários Você pode usar uma operação de INNER JOIN na cláusula FROM. Esse é o tipo de junção mais comum. As junções internas combinam registros de duas tabelas sempre que houver valores correspondentes em um campo comum a ambas as tabelas. Você pode usar INNER JOIN com as tabelas Departamentos e Funcionários para selecionar todos os funcionários em cada departamento. Por outro lado, para selecionar todos os departamentos (mesmo que alguns não tenham funcionários atribuídos) ou todos os funcionários (mesmo que alguns não estejam atribuídos a um departamento), você pode usar uma operação LEFT JOIN ou RIGHT JOIN para criar uma junção externa. Se você tentar inserir campos com dados de Memorando ou Objeto OLE, ocorrerá um erro. Você pode juntar quaisquer dois campos numéricos de tipos semelhantes. Por exemplo, você pode juntar os campos Numeração Automática e Longo porque eles são tipos semelhantes. No entanto, você não pode juntar os tipos de campos Único e Duplo. O exemplo a seguir mostra como você pode unir as tabelas Categorias e Produtos no campo ID de Categoria: SELECT CategoryName, ProductName FROM Categories INNER JOIN Products ON Categories.CategoryID = Products.CategoryID; No exemplo anterior, a ID de Categoria é o campo de junção, mas não é incluída na saída de consulta porque não ela está incluída na instrução SELECT. Para incluir o campo de junção, inclua o nome do campo na instrução SELECT, nesse caso, Categories.CategoryID. Você também pode vincular várias cláusulas ON em uma instrução de JOIN, usando a seguinte sintaxe: SELECT campos FROM tabela1 INNER JOIN tabela2 ON tabela1.campo1compoprtabela2.campo1 AND ON tabela1.campo2compoprtabela2.campo2) OR ON tabela1.campo3compoprtabela2.campo3)]; Também é possível aninhar instruções JOIN usando a seguinte sintaxe: SELECT campos FROM tabela1 INNER JOIN (tabela2 INNER JOIN [( ]tabela3 [INNER JOIN [( ]tabelax [INNER JOIN ...)] ON tabela3.campo3compoprtabelax.campox)] ON tabela2.campo2compoprtable3.campo3) ON tabela1.campo1compoprtabela2.campo2; Uma LEFT JOIN ou RIGHT JOIN pode estar aninhada em uma INNER JOIN, mas INNER JOIN não pode estar aninhada dentro de uma LEFT JOIN ou RIGHT JOIN. Precisa de mais ajuda? ***************************************************************** alura.com.br SQL JOIN: Aprenda INNER, LEFT, RIGHT, FULL e CROSS Alura 5–7 minutos Na linguagem SQL, executamos diversas consultas para geralmente criar relatórios que serão posteriormente utilizados para análise e a tomada de alguma decisão, e para criarmos consultas cada vez mais completas precisamos utilizar várias tabelas em conjunto e para isso usamos os JOINs. O que é o comando JOIN e para que serve em SQL? Uma cláusula JOIN em SQL, correspondente a uma operação de junção em álgebra relacional, combina colunas de uma ou mais tabelas em um banco de dados relacional. Ela cria um conjunto que pode ser salvo como uma tabela ou usado da forma como está. Um JOIN é um meio de combinar colunas de uma (auto-junção) ou mais tabelas, usando valores comuns a cada uma delas. O SQL padrão ANSI especifica cinco tipos de JOIN: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN e CROSS JOIN. Como um caso especial, uma tabela (tabela base, visão ou tabela juntada) pode se juntar a si mesma em uma auto-união (self-join). Em um banco de dados relacional, os dados são distribuídos em várias tabelas lógicas. Para obter um conjunto completo e significativo de dados, é necessário consultar dados dessas tabelas usando junções (JOINs). Como já foi mencionado acima, existem diferentes tipos de JOINs no SQL. Vamos definir e exemplificar cada um deles. O que faz o INNER JOIN? SELECT FROM Tabela A INNER JOIN Tabela B ON A.Key = B.Key A cláusula INNER JOIN compara cada linha da tabela A com as linhas da tabela B para encontrar todos os pares de linhas que satisfazem a condição de junção. Se a condição de junção for avaliado como TRUE, os valores da coluna das linhas correspondentes das tabelas A e B serão combinados em uma nova linha e incluídos no conjunto de resultados. Retorna todos os registros da tabela esquerda e os registros correspondentes da tabela direita. SELECT FROM Tabela A LEFT JOIN Tabela B ON A.Key = B.Key Para cada linha da tabela A, a consulta a compara com todas as linhas da tabela B. Se um par de linhas fizer com que a condição de junção seja avaliado como TRUE, os valores da coluna dessas linhas serão combinados para formar uma nova linha que será incluída no conjunto de resultados. Se uma linha da tabela “esquerda” A não tiver nenhuma linha correspondente da tabela “direita” B, a consulta irá combinar os valores da coluna da linha da tabela “esquerda” A com NULL para cada valor da coluna da tabela da “direita” B que não satisfaça a condição de junto (FALSE). Em resumo, a cláusula LEFT JOIN retorna todas as linhas da tabela “esquerda” A e as linhas correspondentes ou valores NULL da tabela “esquerda” A. RIGHT JOIN Retorna todos os registros da tabela direita e os registros correspondentes da tabela esquerda. SELECT FROM Tabela A RIGHT JOIN Tabela B ON A.Key = B.Key A RIGHT JOIN combina dados de duas ou mais tabelas. A RIGHT JOIN começa a selecionar dados da tabela “direita” B e a corresponder às linhas da tabela “esquerda” A. A RIGHT JOIN retorna um conjunto de resultados que inclui todas as linhas da tabela “direita” B, com ou sem linhas correspondentes na tabela “esquerda” A. Se uma linha na tabela direita B não tiver nenhuma linha correspondente da tabela “esquerda” A, a coluna da tabela “esquerda” A no conjunto de resultados será nula igualmente ao que acontece no LEFT JOIN. FULL JOIN Retorna todos os registros quando houver uma correspondência na tabela esquerda ou direita. SELECT FROM Tabela A FULL JOIN Tabela B ON A.Key = B.Key A cláusula FULL JOIN retorna todas as linhas das tabelas unidas, correspondidas ou não, ou seja, você pode dizer que a FULL JOIN combina as funções da LEFT JOIN e da RIGHT JOIN. FULL JOIN é um tipo de junção externa, por isso também é chamada junção externa completa. Quando não existem linhas correspondentes para a linha da tabela esquerda, as colunas da tabela direita serão nulas. Da mesma forma, quando não existem linhas correspondentes para a linha da tabela direita, a coluna da tabela esquerda será nula. CROSS JOIN SELECT FROM Tabela A CROSS JOIN Tabela B A cláusula CROSS JOIN retorna todas as linhas das tabelas por cruzamento, ou seja, para cada linha da tabela esquerda queremos todos os linhas da tabelas direita ou vice-versa. Ele também é chamado de produto cartesiano entre duas tabelas. Porém, para isso é preciso que ambas tenham o campo em comum, para que a ligação exista entre as duas tabelas. Para entender melhor, pense que temos um banco de dado, onde temos uma tabela FUNCIONÁRIO e uma tabela CARGO, assim poderíamos ter vários cargos para um único FUNCIONÁRIO, e usando o CROSS JOIN podemos trazer todos os CARGOS de todos os FUNCIONÁRIOS. Conclusão Vimos que os JOINs na linguagem SQL são muito importantes, eles nos permite criar consultas mais completas e mais complexas de forma simples, utilizando testes lógicos (condição de junção), e são de extrema importância quando trabalhamos com bancos de dados. Gostou do artigo e quer saber mais sobre SQL e JOINs? A Formação de SQL com MySQL Server da Oracle da Alura vai te ensinar como criar JOINs e muito mais. ******************************************************************** alura.com.br JOIN e seus tipos Alura 6–8 minutos No SQL existem várias formas de realizar consultas no banco de dados utilizando desde queries simples a queries mais complexas. Um exemplo disso é a necessidade de realizar consultas em várias tabelas ao mesmo tempo. No banco de dados, existem várias tabelas diferentes onde os dados são armazenados e, muitas vezes, é necessário juntar os dados que estão em várias tabelas para se obter alguma informação muito importante. 5 retângulos dispostos um abaixo do outro, onde cada um tem o nome de um JOIN, na seguinte ordem, INNER, LEFT, RIGHT, FULL e CROSS. Ao lado dos 5 retângulos temos mais 1 retângulo com a palavra JOIN ligado a eles por uma linha Com esse intuito, foi criada a cláusula JOIN ou junção que é utilizada para realizar a combinação de colunas de uma ou mais tabelas em um única query a partir de uma coluna em comum entre as tabelas. Existem cinco tipos de JOIN, que realizam consultas de formas diferentes nas tabelas do banco de dados, o INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN e CROSS JOIN. Neste artigo, vamos abordar como cada um deles funciona. INNER JOIN O INNER JOIN é utilizado quando queremos retornar os registros que tenham correspondência nas duas tabelas presentes na junção. Observe que, na imagem a seguir, é utilizado o INNER JOIN. Nesse caso apenas os registros que estão na interseção do conjunto A com o conjunto B são retornados: Duas circunferências representando um conjunto A e um conjunto B. A interseção entre os dois conjuntos está pintada de azul Trazendo para o SQL, vamos utilizar o seguinte exemplo: em um banco de dados de uma empresa, existem duas tabelas que se relacionam entre si, sendo elas a tabela de funcionários e a tabela de cargos. A primeira possui os campos código do funcionário, nome e código do cargo: Tabela de funcionários com três colunas. Na coluna código dos funcionários temos os números 1, 2, 3 e 4. Na coluna nome temos os nomes José, Daniella, Ana e Carlos. Na coluna código cargo temos os números 3, 1, 2 e (null) E a segunda possui os campos código do cargo e descrição dos cargos: Tabela de cargos com duas colunas. Na coluna código do cargo temos os números 1, 2, 3 e 4. Na coluna descrição temos vendedor, caixa, gerente e entregador SELECT com INNER JOIN: SELECT FROM Tabela A INNER JOIN Tabela B ON A.Key = B.Key SELECT A.nome, A.cod_cargo, B.descrição FROM funcionario A INNER JOIN cargo B ON A.cod_cargo = B.cod_cargo; Informando no SELECT os campos que serão retornados no resultado: SELECT A.nome, A.cod_cargo, B.descrição Realizando a junção entre as tabelas: FROM funcionario A INNER JOIN cargo B Condição que os registros precisam corresponder para serem retornados: ON A.cod_cargo = B.cod_cargo; Resultado Tabela com 3 colunas, sendo resultante da query executada com INNER JOIN. Na coluna nome temos os nomes José, Daniella e Ana. Na coluna código do cargo temos os números 3, 1 e 2. Na coluna descrição temos gerente, vendedor e caixa Foram retornados todos funcionários, com exceção do funcionário Carlos que não tem um cargo associado a ele e do cargo entregador, pois não está associado a nenhum funcionário. LEFT JOIN O LEFT JOIN é utilizado quando queremos retornar apenas os registros da tabela da esquerda (tabela que está antes da cláusula LEFT JOIN) e os registros que tenham correspondência na tabela da direita. Observe que, na imagem a seguir, é utilizado o LEFT JOIN. Nesse caso, todos os registros do conjunto A e apenas os registros que estão na interseção do conjunto A com o conjunto B seriam retornados: Duas circunferências representando um conjunto A e um conjunto B, onde o conjunto A e a interseção entre os dois conjuntos está pintada de azul SELECT com LEFT JOIN: SELECT FROM Tabela A LEFT JOIN Tabela B ON A.Key = B.Key SELECT A.nome, A.cod_cargo, B.descrição FROM funcionario A LEFT JOIN cargo B ON A.cod_cargo = B.cod_cargo; Resultado Tabela com 3 colunas, sendo resultante da query executada com LEFT JOIN. Na coluna nome temos os nomes Daniella, Ana, José e Carlos. Na coluna código do cargo temos os números 1, 2, 3 e null. Na coluna descrição temos vendedor, caixa, gerente e null Foram retornados todos funcionários, tem um cargo associado a ele, juntamente com todos os funcionários que não tem um cargo associado. RIGHT JOIN O RIGHT JOIN é utilizado quando queremos retornar apenas os registros da tabela da direita(tabela que está após a cláusula RIGHT JOIN) e os registros que tenham correspondência na tabela da esquerda. Observe que, na imagem a seguir, é utilizado o RIGHT JOIN. Nesse caso, todos os registros do conjunto B e apenas os registros que estão na interseção do conjunto A com o conjunto B seriam retornados: Duas circunferências representando um conjunto A e um conjunto B, onde o conjunto B e a interseção entre os dois conjuntos está pintada de azul SELECT com RIGHT JOIN: SELECT FROM Tabela A RIGHT JOIN Tabela B ON A.Key = B.Key SELECT A.nome,A.cod_cargo,B.descrição FROM funcionario A RIGHT JOIN cargo B ON A.cod_cargo = B.cod_cargo; Resultado Tabela com 3 colunas, sendo resultante da query executada com RIGHT JOIN. Na coluna nome temos os nomes José, Daniella, Ana e null. Na coluna código do cargo temos os números 3, 1, 2 e null. Na coluna descrição temos gerente, vendedor e caixa Foram retornados todos os cargos que estão associados a um funcionário, juntamente com todos os cargos que não estão associados a funcionário. FULL JOIN O FULL JOIN é utilizado quando queremos retornar registros que tenham correspondência em qualquer uma das tabelas presentes na junção. Observe que, na imagem a seguir, é utilizado o FULL JOIN. Nesse caso, todos os registros do conjunto B e todos os registros do conjunto A seriam retornados: Duas circunferências representando um conjunto A é um conjunto B, onde os dois conjuntos e a interseção entre os dois conjuntos está pintada de azul SELECT com FULL JOIN: SELECT FROM Tabela A FULL JOIN Tabela B ON A.Key = B.Key SELECT A.nome, A.cod_cargo, B.descrição FROM funcionario A FULL JOIN cargo B ON A.cod_cargo = B.cod_cargo; Resultado Tabela com 3 colunas, sendo resultante da query executada com FULL JOIN. Na coluna nome temos os nomes José, Daniella, Ana, Carlos e null. Na coluna código do cargo temos os números 3, 1, 2, null e null. Na coluna descrição temos gerente, vendedor, caixa, null e entregador. Foram retornados todos os funcionários, mesmo os que não estão associados a um cargo e todos os cargos, mesmo os que não estão associados a um funcionário. CROSS JOIN O CROSS JOIN é utilizado quando queremos retornar os registros realizando um cruzamento entre os dados das tabelas presentes na junção. Observe que, na imagem a seguir, é utilizado o CROSS JOIN. Nesse caso, todos os registros do conjunto A realizam um cruzamento com todos os registros do conjunto B para serem retornados: Duas circunferências representando um conjunto A e um conjunto B. Em cada conjunto estão os números de 1 a 3. Cada número do conjunto A se liga a um número do conjunto B através de uma linha SELECT com CROSS JOIN: SELECT FROM Tabela A CROSS JOIN Tabela B SELECT A.nome, A.cod_cargo, B.descrição, B.cod_cargo FROM funcionario A CROSS JOIN cargo B; Resultado Tabela com 4 colunas, sendo resultante da query executada com CROSS JOIN. Na coluna nome temos os nomes José, Daniella, Ana, Carlos repetidos quatro vezes nas linhas subsequentes. Na coluna código do cargo, que pertence a tabela de funcionários temos a sequência 3, 1, 2 e null repetida quatro vezes nas linhas subsequentes. Na coluna descrição é apresentado 4 vezes o nome vendedor, 4 vezes o nome caixa, 4 vezes o nome gerente e 4 vezes o nome entregador. Na coluna do cargo 1, que pertence a tabela de cargo temos quatro sequências de quatro números repetidos de 1 a 4 Foi realizado o cruzamento entre todos os registros da tabela de funcionários com todos os registros da tabela de cargos. CONCLUSÃO Neste artigo podemos ver como os joins são de suma importância para a linguagem SQL. Ao utilizar os JOINS, podemos realizar a combinação de colunas de uma ou mais tabelas para realizar consultas complexas nos bancos de dados de forma simples. Gostou deste artigo e quer conhecer ainda mais sobre banco de dados e SQL? A Formação Modelagem de Dados foi feita para você! Acesse a formação e descubra o que mais você pode fazer com banco de dados e SQL. *********************************************************************** alura.com.br SQL JOIN: Aprenda INNER, LEFT, RIGHT, FULL e CROSS Alura 5–7 minutos Na linguagem SQL, executamos diversas consultas para geralmente criar relatórios que serão posteriormente utilizados para análise e a tomada de alguma decisão, e para criarmos consultas cada vez mais completas precisamos utilizar várias tabelas em conjunto e para isso usamos os JOINs. O que é o comando JOIN e para que serve em SQL? Uma cláusula JOIN em SQL, correspondente a uma operação de junção em álgebra relacional, combina colunas de uma ou mais tabelas em um banco de dados relacional. Ela cria um conjunto que pode ser salvo como uma tabela ou usado da forma como está. Um JOIN é um meio de combinar colunas de uma (auto-junção) ou mais tabelas, usando valores comuns a cada uma delas. O SQL padrão ANSI especifica cinco tipos de JOIN: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN e CROSS JOIN. Como um caso especial, uma tabela (tabela base, visão ou tabela juntada) pode se juntar a si mesma em uma auto-união (self-join). Em um banco de dados relacional, os dados são distribuídos em várias tabelas lógicas. Para obter um conjunto completo e significativo de dados, é necessário consultar dados dessas tabelas usando junções (JOINs). Como já foi mencionado acima, existem diferentes tipos de JOINs no SQL. Vamos definir e exemplificar cada um deles. O que faz o INNER JOIN? SELECT FROM Tabela A INNER JOIN Tabela B ON A.Key = B.Key A cláusula INNER JOIN compara cada linha da tabela A com as linhas da tabela B para encontrar todos os pares de linhas que satisfazem a condição de junção. Se a condição de junção for avaliado como TRUE, os valores da coluna das linhas correspondentes das tabelas A e B serão combinados em uma nova linha e incluídos no conjunto de resultados. Retorna todos os registros da tabela esquerda e os registros correspondentes da tabela direita. SELECT FROM Tabela A LEFT JOIN Tabela B ON A.Key = B.Key Para cada linha da tabela A, a consulta a compara com todas as linhas da tabela B. Se um par de linhas fizer com que a condição de junção seja avaliado como TRUE, os valores da coluna dessas linhas serão combinados para formar uma nova linha que será incluída no conjunto de resultados. Se uma linha da tabela “esquerda” A não tiver nenhuma linha correspondente da tabela “direita” B, a consulta irá combinar os valores da coluna da linha da tabela “esquerda” A com NULL para cada valor da coluna da tabela da “direita” B que não satisfaça a condição de junto (FALSE). Em resumo, a cláusula LEFT JOIN retorna todas as linhas da tabela “esquerda” A e as linhas correspondentes ou valores NULL da tabela “esquerda” A. RIGHT JOIN Retorna todos os registros da tabela direita e os registros correspondentes da tabela esquerda. SELECT FROM Tabela A RIGHT JOIN Tabela B ON A.Key = B.Key A RIGHT JOIN combina dados de duas ou mais tabelas. A RIGHT JOIN começa a selecionar dados da tabela “direita” B e a corresponder às linhas da tabela “esquerda” A. A RIGHT JOIN retorna um conjunto de resultados que inclui todas as linhas da tabela “direita” B, com ou sem linhas correspondentes na tabela “esquerda” A. Se uma linha na tabela direita B não tiver nenhuma linha correspondente da tabela “esquerda” A, a coluna da tabela “esquerda” A no conjunto de resultados será nula igualmente ao que acontece no LEFT JOIN. FULL JOIN Retorna todos os registros quando houver uma correspondência na tabela esquerda ou direita. SELECT FROM Tabela A FULL JOIN Tabela B ON A.Key = B.Key A cláusula FULL JOIN retorna todas as linhas das tabelas unidas, correspondidas ou não, ou seja, você pode dizer que a FULL JOIN combina as funções da LEFT JOIN e da RIGHT JOIN. FULL JOIN é um tipo de junção externa, por isso também é chamada junção externa completa. Quando não existem linhas correspondentes para a linha da tabela esquerda, as colunas da tabela direita serão nulas. Da mesma forma, quando não existem linhas correspondentes para a linha da tabela direita, a coluna da tabela esquerda será nula. CROSS JOIN SELECT FROM Tabela A CROSS JOIN Tabela B A cláusula CROSS JOIN retorna todas as linhas das tabelas por cruzamento, ou seja, para cada linha da tabela esquerda queremos todos os linhas da tabelas direita ou vice-versa. Ele também é chamado de produto cartesiano entre duas tabelas. Porém, para isso é preciso que ambas tenham o campo em comum, para que a ligação exista entre as duas tabelas. Para entender melhor, pense que temos um banco de dado, onde temos uma tabela FUNCIONÁRIO e uma tabela CARGO, assim poderíamos ter vários cargos para um único FUNCIONÁRIO, e usando o CROSS JOIN podemos trazer todos os CARGOS de todos os FUNCIONÁRIOS. Conclusão Vimos que os JOINs na linguagem SQL são muito importantes, eles nos permite criar consultas mais completas e mais complexas de forma simples, utilizando testes lógicos (condição de junção), e são de extrema importância quando trabalhamos com bancos de dados. Gostou do artigo e quer saber mais sobre SQL e JOINs? A Formação de SQL com MySQL Server da Oracle da Alura vai te ensinar como criar JOINs e muito mais. *********************************************************** learn.microsoft.com Cláusula join – Referência de C# BillWagner 18–24 minutos Cláusula join (Referência de C#) Artigo 04/01/2023 10 minutos para o fim da leitura Neste artigo Junção interna Junção de grupo Junção externa esquerda O operador equals Junções por não igualdade Junções em coleções de objetos versus tabelas relacionais Chaves compostas Exemplo Comentários Confira também A cláusula join é útil para associar elementos de sequências de origem diferentes que não têm nenhuma relação direta no modelo de objeto. O único requisito é que os elementos em cada fonte compartilhem algum valor que possa ser comparado pela igualdade. Por exemplo, um distribuidor de alimentos pode ter uma lista de fornecedores de um determinado produto e uma lista de compradores. Uma cláusula join pode ser usada, por exemplo, para criar uma lista de fornecedores e compradores daquele produto, que estejam na mesma região especificada. Uma cláusula join recebe duas sequências de origem como entrada. Os elementos em cada sequência devem ser ou conter uma propriedade que possa ser comparada com uma propriedade correspondente na outra sequência. A cláusula join compara a igualdade das chaves especificadas, usando a palavra-chave especial equals. Todas as junções realizadas pela cláusula join são junções por igualdade. A forma da saída de uma cláusula join depende do tipo específico de junção que você está realizando. A seguir estão os três tipos de junção mais comuns: Junção interna Junção de grupo Junção externa esquerda Junção interna O exemplo a seguir mostra uma junção por igualdade interna simples. Essa consulta produz uma sequência simples de pares "nome de produto / categoria". A mesma cadeia de caracteres de categoria aparecerá em vários elementos. Se um elemento de categories não tiver products correspondente, essa categoria não aparecerá nos resultados. var innerJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID select new { ProductName = prod.Name, Category = category.Name }; //produces flat sequence Para obter mais informações, consulte Executar junções internas. Junção de grupo Uma cláusula join com um expressão into é chamada de junção de grupo. var innerGroupJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID into prodGroup select new { CategoryName = category.Name, Products = prodGroup }; Uma junção de grupo produz uma sequência de resultados hierárquicos, que associa os elementos na sequência de origem à esquerda com um ou mais elementos correspondentes na sequência de origem do lado direito. Uma junção de grupo não tem nenhum equivalente em termos relacionais. Ela é, essencialmente, uma sequência de matrizes de objetos. Se nenhum elemento da sequência de origem à direita que corresponda a um elemento na origem à esquerda for encontrado, a cláusula join produzirá uma matriz vazia para aquele item. Portanto, a junção de grupo é, basicamente, uma junção por igualdade interna, exceto pelo fato de que a sequência de resultado é organizada em grupos. É só selecionar os resultados de uma junção de grupo e você poderá acessar os itens, mas você não poderá identificar a chave na qual eles correspondem. Portanto, geralmente há maior utilidade em selecionar os resultados da junção de grupo em um novo tipo que também tenha o nome da chave, conforme mostrado no exemplo anterior. Além disso, é claro que você pode usar o resultado de uma junção de grupo como o gerador de outra subconsulta: var innerGroupJoinQuery2 = from category in categories join prod in products on category.ID equals prod.CategoryID into prodGroup from prod2 in prodGroup where prod2.UnitPrice > 2.50M select prod2; Para obter mais informações, consulte Executar junções agrupadas. Junção externa esquerda Em uma junção externa esquerda, todos os elementos na sequência de origem à esquerda são retornados, mesmo que não haja elementos correspondentes na sequência à direita. Para executar uma junção externa esquerda no LINQ, use o método DefaultIfEmpty em combinação com uma junção de grupo para especificar um elemento padrão do lado direito, que será produzido caso um elemento do lado esquerdo não tenha correspondência. Você pode usar null como o valor padrão para qualquer tipo de referência ou pode especificar um tipo padrão definido pelo usuário. No exemplo a seguir, é mostrado um tipo padrão definido pelo usuário: var leftOuterJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID into prodGroup from item in prodGroup.DefaultIfEmpty(new Product { Name = String.Empty, CategoryID = 0 }) select new { CatName = category.Name, ProdName = item.Name }; Para obter mais informações, consulte Executar junções externas esquerdas. O operador equals Uma cláusula join realiza uma junção por igualdade. Em outras palavras, você só pode basear correspondências na igualdade de duas chaves. Não há suporte para outros tipos de comparações, como "maior que" ou "não é igual a". Para se certificar de que todas as junções são junções por igualdade, a cláusula join usa a palavra-chave equals em vez do operador ==. A palavra-chave equals só pode ser usada em uma cláusula join e ela se difere do operador == em alguns aspectos importantes. Ao comparar cadeias de caracteres, equals tem uma sobrecarga para comparar por valor e o operador == usa a igualdade de referência. Quando ambos os lados da comparação tiverem variáveis de cadeia de caracteres idênticas, equals e == alcançarão o mesmo resultado: true. Isso ocorre porque, quando um programa declara duas ou mais variáveis de cadeia de caracteres equivalentes, o compilador armazena todas elas no mesmo local. Consulte Igualdade de referência e a centralização de cadeia de caracteres para obter mais informações. Outra diferença importante é a comparação nula: null equals null é avaliada como false com o operador equals, em vez do operador ==, que a avalia como true. Por último, o comportamento de escopo é diferente: com equals, a chave esquerda consome a sequência de origem externa e a chave direita consome a origem interna. A origem externa somente está no escopo no lado esquerdo de equals e a sequência de origem interna somente está no escopo no lado direito. Junções por não igualdade Você pode realizar junções por não igualdade, uniões cruzadas e outras operações de junção personalizadas, usando várias cláusulas from para introduzir novas sequências de maneira independente em uma consulta. Para obter mais informações, consulte Executar operações de junção personalizadas. Junções em coleções de objetos versus tabelas relacionais Em uma expressão de consulta integrada à linguagem, as operações de junção são realizadas em coleções de objetos. As coleções de objetos não podem ser "unidas" exatamente da mesma forma que duas tabelas relacionais. Em LINQ as cláusulas join explícitas só são necessárias quando duas sequências de origem não estão ligadas por nenhuma relação. Ao trabalhar com LINQ to SQL, as tabelas de chave estrangeira são representadas no modelo de objeto como propriedades da tabela primária. Por exemplo, no banco de dados Northwind, a tabela Cliente tem uma relação de chave estrangeira com a tabela Pedidos. Quando você mapear as tabelas para o modelo de objeto, a classe Cliente terá uma propriedade de Pedidos contendo a coleção de Pedidos associados a esse Cliente. Na verdade, a junção já foi feita para você. Para obter mais informações sobre como fazer consultas entre tabelas relacionadas no contexto do LINQ to SQL, veja Como: mapear relações de banco de dados. Chaves compostas Você pode testar a igualdade de vários valores, usando uma chave de composição. Para obter mais informações, consulte Unir usando chaves compostas. As chaves compostas também podem ser usadas em uma cláusula group. Exemplo O exemplo a seguir compara os resultados de uma junção interna, uma junção de grupo e uma junção externa esquerda nas mesmas fontes de dados, usando as mesmas chaves correspondentes. Foi adicionado algum código extra nesses exemplos a fim de deixar os resultados na tela do console mais claros. class JoinDemonstration { #region Data class Product { public string Name { get; set; } public int CategoryID { get; set; } } class Category { public string Name { get; set; } public int ID { get; set; } } // Specify the first data source. List categories = new List() { new Category {Name="Beverages", ID=001}, new Category {Name="Condiments", ID=002}, new Category {Name="Vegetables", ID=003}, new Category {Name="Grains", ID=004}, new Category {Name="Fruit", ID=005} }; // Specify the second data source. List products = new List() { new Product {Name="Cola", CategoryID=001}, new Product {Name="Tea", CategoryID=001}, new Product {Name="Mustard", CategoryID=002}, new Product {Name="Pickles", CategoryID=002}, new Product {Name="Carrots", CategoryID=003}, new Product {Name="Bok Choy", CategoryID=003}, new Product {Name="Peaches", CategoryID=005}, new Product {Name="Melons", CategoryID=005}, }; #endregion static void Main(string[] args) { JoinDemonstration app = new JoinDemonstration(); app.InnerJoin(); app.GroupJoin(); app.GroupInnerJoin(); app.GroupJoin3(); app.LeftOuterJoin(); app.LeftOuterJoin2(); // Keep the console window open in debug mode. Console.WriteLine("Press any key to exit."); Console.ReadKey(); } void InnerJoin() { // Create the query that selects // a property from each element. var innerJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID select new { Category = category.ID, Product = prod.Name }; Console.WriteLine("InnerJoin:"); // Execute the query. Access results // with a simple foreach statement. foreach (var item in innerJoinQuery) { Console.WriteLine("{0,-10}{1}", item.Product, item.Category); } Console.WriteLine("InnerJoin: {0} items in 1 group.", innerJoinQuery.Count()); Console.WriteLine(System.Environment.NewLine); } void GroupJoin() { // This is a demonstration query to show the output // of a "raw" group join. A more typical group join // is shown in the GroupInnerJoin method. var groupJoinQuery = from category in categories join prod in products on category.ID equals prod.CategoryID into prodGroup select prodGroup; // Store the count of total items (for demonstration only). int totalItems = 0; Console.WriteLine("Simple GroupJoin:"); // A nested foreach statement is required to access group items. foreach (var prodGrouping in groupJoinQuery) { Console.WriteLine("Group:"); foreach (var item in prodGrouping) { totalItems++; Console.WriteLine(" {0,-10}{1}", item.Name, item.CategoryID); } } Console.WriteLine("Unshaped GroupJoin: {0} items in {1} unnamed groups", totalItems, groupJoinQuery.Count()); Console.WriteLine(System.Environment.NewLine); } void GroupInnerJoin() { var groupJoinQuery2 = from category in categories orderby category.ID join prod in products on category.ID equals prod.CategoryID into prodGroup select new { Category = category.Name, Products = from prod2 in prodGroup orderby prod2.Name select prod2 }; //Console.WriteLine("GroupInnerJoin:"); int totalItems = 0; Console.WriteLine("GroupInnerJoin:"); foreach (var productGroup in groupJoinQuery2) { Console.WriteLine(productGroup.Category); foreach (var prodItem in productGroup.Products) { totalItems++; Console.WriteLine(" {0,-10} {1}", prodItem.Name, prodItem.CategoryID); } } Console.WriteLine("GroupInnerJoin: {0} items in {1} named groups", totalItems, groupJoinQuery2.Count()); Console.WriteLine(System.Environment.NewLine); } void GroupJoin3() { var groupJoinQuery3 = from category in categories join product in products on category.ID equals product.CategoryID into prodGroup from prod in prodGroup orderby prod.CategoryID select new { Category = prod.CategoryID, ProductName = prod.Name }; //Console.WriteLine("GroupInnerJoin:"); int totalItems = 0; Console.WriteLine("GroupJoin3:"); foreach (var item in groupJoinQuery3) { totalItems++; Console.WriteLine(" {0}:{1}", item.ProductName, item.Category); } Console.WriteLine("GroupJoin3: {0} items in 1 group", totalItems); Console.WriteLine(System.Environment.NewLine); } void LeftOuterJoin() { // Create the query. var leftOuterQuery = from category in categories join prod in products on category.ID equals prod.CategoryID into prodGroup select prodGroup.DefaultIfEmpty(new Product() { Name = "Nothing!", CategoryID = category.ID }); // Store the count of total items (for demonstration only). int totalItems = 0; Console.WriteLine("Left Outer Join:"); // A nested foreach statement is required to access group items foreach (var prodGrouping in leftOuterQuery) { Console.WriteLine("Group:"); foreach (var item in prodGrouping) { totalItems++; Console.WriteLine(" {0,-10}{1}", item.Name, item.CategoryID); } } Console.WriteLine("LeftOuterJoin: {0} items in {1} groups", totalItems, leftOuterQuery.Count()); Console.WriteLine(System.Environment.NewLine); } void LeftOuterJoin2() { // Create the query. var leftOuterQuery2 = from category in categories join prod in products on category.ID equals prod.CategoryID into prodGroup from item in prodGroup.DefaultIfEmpty() select new { Name = item == null ? "Nothing!" : item.Name, CategoryID = category.ID }; Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", leftOuterQuery2.Count()); // Store the count of total items int totalItems = 0; Console.WriteLine("Left Outer Join 2:"); // Groups have been flattened. foreach (var item in leftOuterQuery2) { totalItems++; Console.WriteLine("{0,-10}{1}", item.Name, item.CategoryID); } Console.WriteLine("LeftOuterJoin2: {0} items in 1 group", totalItems); } } /*Output: InnerJoin: Cola 1 Tea 1 Mustard 2 Pickles 2 Carrots 3 Bok Choy 3 Peaches 5 Melons 5 InnerJoin: 8 items in 1 group. Unshaped GroupJoin: Group: Cola 1 Tea 1 Group: Mustard 2 Pickles 2 Group: Carrots 3 Bok Choy 3 Group: Group: Peaches 5 Melons 5 Unshaped GroupJoin: 8 items in 5 unnamed groups GroupInnerJoin: Beverages Cola 1 Tea 1 Condiments Mustard 2 Pickles 2 Vegetables Bok Choy 3 Carrots 3 Grains Fruit Melons 5 Peaches 5 GroupInnerJoin: 8 items in 5 named groups GroupJoin3: Cola:1 Tea:1 Mustard:2 Pickles:2 Carrots:3 Bok Choy:3 Peaches:5 Melons:5 GroupJoin3: 8 items in 1 group Left Outer Join: Group: Cola 1 Tea 1 Group: Mustard 2 Pickles 2 Group: Carrots 3 Bok Choy 3 Group: Nothing! 4 Group: Peaches 5 Melons 5 LeftOuterJoin: 9 items in 5 groups LeftOuterJoin2: 9 items in 1 group Left Outer Join 2: Cola 1 Tea 1 Mustard 2 Pickles 2 Carrots 3 Bok Choy 3 Nothing! 4 Peaches 5 Melons 5 LeftOuterJoin2: 9 items in 1 group Press any key to exit. */ Comentários Uma cláusula join que não é seguida por into é convertida em uma chamada de método Join. Uma cláusula join que é seguida por into é convertida em uma chamada de método GroupJoin. Confira também Palavras-chave de Consulta (LINQ) LINQ (Consulta Integrada à Linguagem) Operações join Cláusula group Executar junções externas esquerdas Executar junções internas Executar junções agrupadas Ordenar os resultados de uma cláusula join Unir usando chaves compostas Sistemas de banco de dados compatíveis para Visual Studio Junção interna Junção de grupo Junção externa esquerda O operador equals Junções por não igualdade Junções em coleções de objetos versus tabelas relacionais Chaves compostas Exemplo Comentários Confira também *********************************************************** terminalroot.com.br Como Fazer um INNER JOIN, LEFT JOIN e RIGHT JOIN em SQL Marcos Oliveira 5–7 minutos Como Fazer um INNER JOIN, LEFT JOIN e RIGHT JOIN em SQL Quando você tem tabelas que a resposta de uma consulta pode estar relacionada em outra tabela, muitas vezes para exibirmos de maneira simplificada precisamos fazer esses tipos de consultas um pouco mais complexas . Então vamos ver de forma mais simples para pegar o jeito de uma vez por todas. Lembrando que se você não possuir um banco de dados, nesse caso o MySQL instalado, você pode testar essas consultas online com uma das ferramentas apresentadas nesse artigo: Conheça 7 Serviços OnLine para Executar seus Comandos SQL Imagens ilustrativas Introdução Uma cláusula JOIN é usada para combinar linhas de duas ou mais tabelas, com base em uma coluna relacionada entre elas. Diferentes tipos de SQL JOINs Aqui estão os diferentes tipos de JOINs no SQL: INNER JOIN : Retorna registros que possuem valores correspondentes nas duas tabelas; LEFT JOIN: Retorna todos os registros da tabela esquerda e os registros correspondentes da tabela direita; RIGHT JOIN: Retorna todos os registros da tabela da direita e os registros correspondentes da tabela da esquerda. Conteúdo das Tabelas Para explicar como funciona essas consultas vamos usar esse banco de dados examples_joins.sql . Se quiser importar a tabela use esse comando: Logue no MySQL e crie uma [base de dados(https://www.luis.blog.br/banco-de-dados-e-sql-diferenca-entre-base-de-dados-e-banco-de-dados.html); A opção -u informa o usuário; A opção -p informa que precisa inserir senha; mysql -u NOME_DO_USUÁRIO -p Crie uma base de dados com o nome examples_joins: CREATE DATABASE examples_joins; Criando Database e Mudando Após sair do MySQL com o comando exit ou quit, rode o comando abaixo para importar a base: Lembrando que o arquivo precisa estar no mesmo diretório que você fará a importação. mysql -u NOME_DO_USUÁRIO -p NOME_DA_BASE < examples_joins.sql Depois entre no MySQL e verifique se está tudo certo. Após logar rode o comando USE examples_joins; para mudar/definir a base para uso. E rode um SHOW TABLES para verificar as tabelas. Veja as imagens abaixo: A opção -D informa a base de dados; mysql -u NOME_DO_USUÁRIO -p -D examples_joins Logando e Exibindo a base examples_joins Verificando se realmente está tudo certo com SELECT * FROM NOME_DE_ALGUMA_TABELA: SELECT * FROM clientes; SELECT * FROM notebooks; SELECT * FROM vendas; SELECT * FROM NOME_DE_ALGUMA_TABELA Realizando um INNER JOIN Retorna registros que possuem valores correspondentes nas duas tabelas. INNER JOIN SELECT * FROM vendas AS v INNER JOIN clientes AS c ON (v.id_cliente = c.id); a opção AS cria uma alias(apelido v) para a tabela vendas e outros para a tabela clientes(apelido c) Alternativamente você poderia fazer esse INNER JOIN sem usar a cláusula AS para aliases, assim: SELECT * FROM vendas v INNER JOIN clientes c ON (v.id_cliente = c.id); Eu prefiro usar o AS pra não acabar me confundindo mais tarde. =) INNER JOIN Realizando um LEFT JOIN Retorna todos os registros da tabela esquerda e os registros correspondentes da tabela direita. LEFT JOIN SELECT * FROM vendas AS v LEFT JOIN clientes AS c ON (v.id_cliente = c.id); ou SELECT * FROM vendas v LEFT JOIN clientes c ON (v.id_cliente = c.id); LEFT JOIN Realizando um RIGHT JOIN Retorna todos os registros da tabela da direita e os registros correspondentes da tabela da esquerda. RIGHT JOIN SELECT * FROM vendas AS v RIGHT JOIN clientes AS c ON (v.id_cliente = c.id); ou SELECT * FROM vendas v RIGHT JOIN clientes c ON (v.id_cliente = c.id); RIGHT JOIN Conclusão Podemos tiras nossas conclusões a partir dessa essa imagem abaixo e notar as difereças de cada um dos tipos de consultas. JOINS DICAS EXTRAS: Se quiser exportar a base de dados, caso você faça alguma alteração, rode o comando: mysqldump -h HOST -u NOME_DO_USUÁRIO -p NOME_DA_BASE > examples_joins.sql E na importação, se tiver problemas com codifição(uso de letras com acentos por exemplo), importe assim: mysql -h HOST -u NOME_DO_USUÁRIO -p --default_character_set utf8 NOME_DA_BASE < examples_joins.sql Links úteis https://dev.mysql.com/doc/refman/8.0/en/join.html https://terminalroot.com.br/2011/10/curso-certificacao-linux-lpi-102.html https://terminalroot.com.br/2019/08/conheca-o-servico-online-para-executar-seus-comandos-sql.html https://terminalroot.com.br/2019/08/o-que-e-sgbd.html https://ayltoninacio.com.br/blog/como-utilizar-inner-left-right-join-mysql mysql sql join Artigos Relacionados Crie Aplicativos Gráficos para Linux e Windows com C++ Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil. Saiba Mais ************************************************************************ pt.wikipedia.org Join (SQL) Contribuidores dos projetos da Wikimedia 14–20 minutos Uma cláusula join da SQL - correspondente a uma operação de junção em álgebra relacional - combina colunas de uma ou mais tabelas em um banco de dados relacional. Ela cria um conjunto que pode ser salvo como uma tabela ou usado da forma como está. Um JOIN é um meio de combinar colunas de uma (auto-junção) ou mais tabelas, usando valores comuns a cada uma delas. O SQL padrão ANSI especifica cinco tipos de JOIN: INNER, LEFT OUTER, RIGHT OUTER, FULL OUTER e CROSS. Como um caso especial, uma tabela (tabela base, visão ou tabela juntada) pode se juntar a si mesma em uma auto-união (self-join). Um programador declara uma instrução JOIN para identificar linhas para junção. Se o predicado avaliado for verdadeiro, a linha combinada é, então, produzida no formato esperado, um conjunto de linhas ou uma tabela temporária. Tabelas de exemplo[editar | editar código-fonte] Os bancos de dados relacionais geralmente são normalizados para eliminar a duplicação de informações, como quando os tipos de entidade têm relacionamentos um-para-muitos. Por exemplo, um departamento pode estar associado a vários funcionários. A junção de tabelas separadas para departamento e empregado cria, efetivamente, outra tabela que combina as informações de ambas as tabelas. Todas as explicações subsequentes sobre tipos de junção neste artigo utilizam as duas tabelas a seguir. As linhas nessas tabelas servem para ilustrar o efeito de diferentes tipos de junções e predicados de junção. A coluna IDDepartamento da tabela Departamento (que pode ser designada como Departamento.IDDepartamento) é a chave primária, enquanto Empregado.IDDepartamento é uma chave estrangeira. Tabela Empregado ÚltimoNome IDDepartamento Rafferty 31 Jones 33 Heisenberg 33 Robinson 34 Smith 34 Williams NULO Tabela Departamento IDDepartamento NomeDepartamento 31 Vendas 33 Engenharia 34 Administrativo 35 Marketing Observação: Na tabela Empregado acima, o empregado "Williams" ainda não foi atribuído a nenhum departamento. Além disso, observe que nenhum funcionário é atribuído ao departamento de "Marketing". Esta é a instrução SQL para criar as tabelas acima mencionadas. CREATE TABLE departamento ( IDDepartamento INT Primary key, NomeDepartamento VARCHAR(20) ); CREATE TABLE empregado ( ÚltimoNome VARCHAR(20), IDDepartamento INT references departamento(IDDepartamento) ); INSERT INTO departamento VALUES(31, 'Vendas'); INSERT INTO departamento VALUES(33, 'Engenharia'); INSERT INTO departamento VALUES(34, 'Administrativo'); INSERT INTO departamento VALUES(35, 'Marketing'); INSERT INTO empregado VALUES('Rafferty', 31); INSERT INTO empregado VALUES('Jones', 33); INSERT INTO empregado VALUES('Heisenberg', 33); INSERT INTO empregado VALUES('Robinson', 34); INSERT INTO empregado VALUES('Smith', 34); INSERT INTO empregado VALUES('Williams', NULL); Junção cruzada (cross join)[editar | editar código-fonte] Uma junção cruzada, CROSS JOIN, retorna o produto cartesiano dos registros (linhas) das tabelas na junção. Em outras palavras, ela produzirá registros que combinam cada registro da primeira tabela com cada registro da segunda tabela.[1] Exemplo de uma junção cruzada explícita: SELECT * FROM empregado CROSS JOIN departamento; Exemplo de um cross join implícito: SELECT * FROM empregado, departamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Rafferty 31 Venda 31 Jones 33 Venda 31 Heisenberg 33 Venda 31 Smith 34 Venda 31 Robinson 34 Venda 31 Williams NULO Venda 31 Rafferty 31 Engenharia 33 Jones 33 Engenharia 33 Heisenberg 33 Engenharia 33 Smith 34 Engenharia 33 Robinson 34 Engenharia 33 Williams NULO Engenharia 33 Rafferty 31 Administrativo 34 Jones 33 Administrativo 34 Heisenberg 33 Administrativo 34 Smith 34 Administrativo 34 Robinson 34 Administrativo 34 Williams NULO Administrativo 34 Rafferty 31 Marketing 35 Jones 33 Marketing 35 Heisenberg 33 Marketing 35 Smith 34 Marketing 35 Robinson 34 Marketing 35 Williams NULO Marketing 35 A junção cruzada não aplica nenhum predicado para filtrar linhas da tabela resultante da junção. Os resultados de uma junção cruzada podem ser filtrados usando uma cláusula WHERE, que pode então produzir o equivalente a uma junção interna. No padrão SQL:2011, as junções cruzadas fazem parte do pacote opcional F401, "Extended joined table". Usos comuns são para verificar o desempenho do servidor. Junção interna (inner join)[editar | editar código-fonte] A Venn Diagram showing the inner overlapping portion filled. Um diagrama de Venn representando uma instrução SQL de uma junção interna entre as tabelas A e B. Uma junção interna, INNER JOIN, requer que cada linha, nas duas tabelas da junção, tenha valores de coluna correspondentes, e é uma operação de junção comumente usada em aplicativos, mas não deve ser considerada a melhor escolha em todas as situações. A junção interna cria uma nova tabela de resultados combinando valores de coluna de duas tabelas (A e B) com base no predicado de junção. A consulta compara cada linha de A com cada linha de B para encontrar todos os pares de linhas que satisfazem o predicado da junção. Quando o predicado da junção é satisfeito pela correspondência de valores não-NULOS, os valores de coluna para cada par de linhas correspondentes de A e B são combinados em uma linha de resultado. O resultado da junção pode ser definido como o resultado da primeira obtenção do produto cartesiano (ou Cross join) de todas as linhas nas tabelas (combinando todas as linhas da tabela A com todas as linhas da tabela B) e retornando todas as linhas que satisfazem o predicado da junção. Implementações SQL reais normalmente usam outras abordagens, como junções de hash ou junções de mesclagem de ordenação, pois o cálculo do produto cartesiano é mais lento e, geralmente, requer, proibitivamente, uma grande quantidade de memória para armazenar. O SQL especifica duas formas sintáticas diferentes para expressar as junções: a "notação de junção explícita" e a "notação de junção implícita". A "notação de junção implícita" não é mais considerada uma prática recomendada, embora os sistemas de banco de dados ainda a suportem. A "notação de junção explícita" usa a palavra-chave JOIN, opcionalmente precedida pela palavra-chave INNER, para especificar a tabela a ser unida e a palavra-chave ON para especificar os predicados para a junção, como no exemplo a seguir: SELECT empregado.ÚltimoNome, empregado.IDDepartamento, departamento.NomeDepartamento FROM empregado INNER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.Departamento Departamento.NomeDepartamento Robinson 34 Administrativo Jones 33 Engenharia Smith 34 Administrativo Heisenberg 33 Engenharia Rafferty 31 Vendas A "notação de junção implícita" simplesmente lista as tabelas para unir, na cláusula FROM da instrução SELECT, usando vírgulas para separá-las. Assim, ele especifica uma junção cruzada, e a cláusula WHERE pode aplicar predicados de filtro adicionais (que funcionam comparativamente aos predicados da junção na notação explícita). O exemplo a seguir é equivalente ao anterior, mas desta vez usando notação de junção implícita: SELECT * FROM empregado, departamento WHERE empregado.IDDepartamento = departamento.IDDepartamento; Junção externa (outer join)[editar | editar código-fonte] A tabela resultante da junção retém cada linha - mesmo que não exista outra linha correspondente. As junções externas subdividem-se, adicionalmente, em junções externas esquerdas (left outer joins), junções externas direitas (right outer joins) e junções externas completas (full outer joins), dependendo de quais linhas da tabela são retidas: esquerda, direita ou ambas (neste caso, esquerda e direita referem-se aos dois lados da palavra-chave JOIN). Assim como as junções internas, pode-se ainda sub-categorizar todos os tipos de junções externas, como junções de igualdade, junções naturais, ON (junção-θ ou θ-join), etc.[2] Não existe nenhuma notação de junção implícita para junções externas no SQL padrão. A Venn Diagram showing the left circle and overlapping portion filled. Um diagrama de Venn representando a instrução SQL de Left Join, entre as tabelas A e B. Junção externa esquerda (left outer join)[editar | editar código-fonte] O resultado de uma junção externa esquerda (ou simplesmente junção esquerda - left join) para as tabelas A e B sempre contém todas as linhas da tabela "esquerda" (A), mesmo se a condição de junção não encontrar nenhuma linha correspondente na tabela "direita" (B). Isso significa que se a cláusula ON corresponder a 0 (zero) linhas em B (para uma determinada linha em A), a união ainda retornará uma linha no resultado (para aquela linha) - mas com NULO em cada coluna de B. Uma junção externa esquerda retorna todos os valores de uma junção interna mais todos os valores na tabela à esquerda que não correspondem à tabela da direita, incluindo linhas com valores NULO (vazios) na coluna de ligação. Por exemplo, isso nos permite encontrar o departamento de um funcionário, mas ainda mostra funcionários que não foram atribuídos a um departamento (ao contrário do exemplo de associação interna acima, em que funcionários não atribuídos foram excluídos do resultado). Exemplo de uma junção externa esquerda (a palavra-chave OUTER é opcional), com a linha de resultado adicional (comparada com a junção interna) em itálico: SELECT * FROM empregado LEFT OUTER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Jones 33 Engenharia 33 Rafferty 31 Vendas 31 Robinson 34 Administrativo 34 Smith 34 Administrativo 34 Williams NULO NULO NULO Heisenberg 33 Engenharia 33 Sintaxes alternativas[editar | editar código-fonte] O Oracle suporta a sintaxe depreciada[3]: SELECT * FROM empregado, departamento WHERE empregado.IDDepartamento = departamento.IDDepartamento(+) O Sybase suporta a sintaxe (o Microsoft SQL Server depreciou essa sintaxe desde a versão 2000): SELECT * FROM empregado, departamento WHERE empregado.IDDepartamento *= departamento.IDDepartamento O IBM Informix suporta a sintaxe: SELECT * FROM empregado, OUTER departamento WHERE empregado.IDDepartamento = departmento.IDDepartamento A Venn Diagram show the right circle and overlapping portions filled. Um diagrama de Venn representando a instrução de junção direita entre as tabelas A e B. Junção externa direita (right outer join)[editar | editar código-fonte] Uma junção externa direita (junção direita ou right join) se assemelha a uma junção externa esquerda, exceto com o tratamento das tabelas invertidas. Cada linha da tabela "direita" (B) aparecerá na tabela resultante da junção pelo menos uma vez. Se nenhuma linha correspondente da tabela "esquerda" (A) existir, aparecerá NULO nas colunas de A para aquelas linhas que não tiverem correspondência em B. Uma junção externa direita retorna todos os valores da tabela da direita e os valores correspondentes da tabela da esquerda (NULO no caso de nenhum predicado de junção correspondente). Por exemplo, isso nos permite encontrar cada funcionário e seu departamento, mas ainda mostrar departamentos que não possuem funcionários. Abaixo está um exemplo de uma junção externa direita (a palavra-chave OUTER é opcional), com a linha de resultado adicional em itálico: SELECT * FROM empregado RIGHT OUTER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Smith 34 Administrativo 34 Jones 33 Engenharia 33 Robinson 34 Administrativo 34 Heisenberg 33 Engenharia 33 Rafferty 31 Vendas 31 NULO NULO Marketing 35 Junções externas esquerda e direita são funcionalmente equivalentes. Nenhuma das duas fornece qualquer funcionalidade que a outra não tenha, portanto, as junções externas direita e esquerda podem substituir umas às outras, desde que a ordem da tabela seja trocada. A Venn Diagram showing the right circle, left circle, and overlapping portion filled. Um diagrama de Venn representando a instrução SQL de Junção Completa entre as tabelas A e B. Junção externa completa (full outer join)[editar | editar código-fonte] Conceitualmente, uma junção externa completa combina o efeito de aplicar junções externas esquerda e direita. Onde as linhas nas tabelas que forem unidas pela junção completa não corresponderem, o conjunto de resultados terá valores NULO para cada coluna da tabela que não possuir uma linha correspondente. Para aquelas linhas que corresponderem, uma única linha será produzida no conjunto de resultados (contendo colunas preenchidas de ambas as tabelas). Por exemplo, isso nos permite ver cada funcionário que está em um departamento e cada departamento que tem um funcionário, mas também ver cada funcionário que não faz parte de um departamento e cada departamento que não tem um funcionário. Exemplo de uma junção externa completa (a palavra-chave OUTER é opcional): SELECT * FROM empregado FULL OUTER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento; Empregado.ÚltimoNome Empregado.IDDepartamento Departamento.NomeDepartamento Departamento.IDDepartamento Smith 34 Administrativo 34 Jones 33 Engenharia 33 Robinson 34 Administrativo 34 Williams NULO NULO NULO Heisenberg 33 Engenharia 33 Rafferty 31 Administrativo 31 NULO NULO Marketing 35 Alguns sistemas de banco de dados não suportam a funcionalidade de junção externa completa diretamente, mas podem emular através do uso de uma junção interna e de seleções UNION ALL das "linhas de tabela única" das tabelas esquerda e direita, respectivamente. O mesmo exemplo pode aparecer da seguinte maneira: SELECT empregado.ÚltimoNome, empregado.IDDepartamento, departamento.NomeDepartamento, departamento.IDDepartamento FROM empregado INNER JOIN departamento ON empregado.IDDepartamento = departamento.IDDepartamento UNION ALL SELECT empregado.ÚltimoNome, empregado.IDDepartamento, cast(NULL as varchar(20)), cast(NULL as integer) FROM empregado WHERE NOT EXISTS ( SELECT * FROM departamento WHERE empregado.IDDepartamento = departamento.IDDepartamento) UNION ALL SELECT cast(NULL as varchar(20)), cast(NULL as integer), departamento.NomeDepartamento, departamento.IDDepartamento FROM departamento WHERE NOT EXISTS ( SELECT * FROM empregado WHERE empregado.IDDepartamento = departamento.IDDepartamento) Referências ↑ SQL CROSS JOIN ↑ Silberschatz, Abraham; Korth, Hank; Sudarshan, S. (2002). Database System Concepts 4ª ed. [S.l.: s.n.] p. 166. ISBN 0072283637 ↑ Oracle Left Outer Join ************************************************************************* pt.stackoverflow.com Qual é a diferença entre INNER JOIN e OUTER JOIN? epxepx 8.70511 medalhas de ouro2121 medalhas de prata3737 medalhas de bronze ~3 minutos Uma breve explicação sobre Inner, Left, Right, Outer/Full e Cross Join Vamos tomar por base estas duas tabelas: TabelaA e TabelaB Usando ambas em todos os exemplos, vamos ilustrar os tipos mais comuns de join. Inner Join Gráfico Inner Join Esse é um formato comum de join, que retorna dados apenas quando as duas tabelas tem chaves correspondentes na cláusula ON do join. Query: SELECT TabelaA.*, TabelaB.* FROM TabelaA INNER JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave Resultado: Inner Join Left Join Gráfico Left Join É um dos formatos mais usados de join, que retorna a Tabela A inteira e apenas os registros que coincidirem com a igualdade do join na TabelaB (ou campos nulos para os campos sem correspondência). Query: SELECT TabelaA.*, TabelaB.* FROM TabelaA LEFT JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave Resultado: Left Join Right Join Gráfico Right Join Segue o mesmo raciocínio do Left Join, mas se aplicando à tabela B em vez da A: Query: SELECT TabelaA.*, TabelaB.* FROM TabelaA RIGHT JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave Resultado: Right Join Full Outer Join Gráfico Full Outer Join Conhecida como OUTER JOIN ou simplesmente FULL JOIN, este retorna todos os registros de ambas as tabelas. Query: SELECT TabelaA.*, TabelaB.* FROM TabelaA FULL OUTER JOIN TabelaB ON TabelaA.Chave = TabelaB.Chave Resultado: Full/Outer Join Cross Join Gráfico Cross Join Basicamente é o produto cartesiano entre as duas tabelas. Para cada linha de TabelaA, são retornadas todas as linhas de TabelaB. É mais fácil entender o Cross Join como um "Join sem cláusula ON", ou seja, todas as combinações de linhas de A e B são devolvidas. Inclusive, se você fizer um Cross Join com cláusla ON, ele "vira" um mero Inner Join. Query: SELECT TabelaA.*, TabelaB.* FROM TabelaA CROSS JOIN TabelaB Ou ainda: SELECT TabelaA.*, TabelaB.* FROM TabelaA, TabelaB Resultado: Cross Join Considerações Notar que todos os campos pedidos no select sempre retornam (desde que existam na tabela, obviamente), independente de existirem para aquela linha específica. O que acontece no caso de uma linha ser retornada para apenas uma das tabelas é que os campos da outra vêm com conteúdo null. Usualmente, caso você precise diferenciar um nulo que realmente exista na tabela de um nulo por falta de correspondência, basta ver se os campos usados na condição do ON não retornaram null também. *********************************************************** profissionaloracle.com.br Utilizando a função NATURAL JOIN - GPO (Grupo de Profissionais Oracle) Leandro Miozzo Bonato 7–9 minutos Função NATURAL JOIN A utilização de um JOIN em uma consulta ou em uma subconsulta de banco de dados é muito comum para a utilização nos relacionamentos (pode também ser efetuada na clausula WHERE), e muitas vezes nos submetemos a criar muitos relacionamentos, tendo que declarar qual campo deverá ser relacionado com campo de “TABELA A” com campo de “TABELA B”, e isto acaba gerando muitas linhas de código, tornando muitas vezes o próprio código muito complexo e extenso, mas existe uma forma mais fácil e prática para poder eliminar tais linhas de códigos simplificando um pouco o código da consulta, que é o NATURAL JOIN (Junção Natural). A junção natural é baseada em todas as colunas nas duas tabelas que possuem o mesmo nome, ela seleciona linhas das duas tabelas que têm valores iguais nas colunas relevantes, por exemplo: TABELA1.CAMPO1 e TABELA2.CAMPO1, neste caso, se utilizado o NATURAL JOIN, o Oracle entenderá que estas duas colunas de ambas as tabelas são relacionadas e possuem os mesmos dados, com isso, o banco de dados irá agregar as colunas mostrando no resultado da consulta apenas uma coluna. O que não pode acontecer é TABELA1.CAMPO1 e TABELA2.CAMPO2, neste caso o NATURAL JOIN não irá efetuar a operação corretamente, não será mostrado erro, pois o Oracle tentará efetuar a operação, mas os resultados estarão duplicados, conforme a quantidade de registros que esteja em ambas as tabelas devido à sua cardinalidade. Alguns exemplos da prática de NATURAL JOIN para o usuário HR do Oracle: SELECT * FROM COUNTRIES NATURAL JOIN (LOCATIONS); Reparamos que neste caso, o resultado obtido foi igualmente ao que um relacionamento de ambas as tabelas teria feito, seja feita pelo WHERE ou então com um INNER JOIN. Também podemos notar que a coluna COUNTRY_ID que existe nas duas tabelas virou apenas uma. A quantidade total de registros é de 23. Para afins de testes e comprovar a teoria em que os registros irão se duplicar caso seja feita um NATURAL JOIN com todas as colunas com nomes diferentes, basta alterar o campo COUNTRY_ID de alguma tabela e executar o comando novamente, neste caso os registros passaram de 500 e também vale notar que aparecem todas as colunas, e que nenhuma foi agregada. O NATURAL JOIN pode ser utilizado com o acompanhamento de outros JOINS, como por exemplo: INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN e FULL OUTER JOIN. Mais alguns exemplos de NATURAL JOIN juntamente com os outros JOINS: Exemplo 01 – Com o INNER JOIN a junção natural permanece igual aos seus resultados: SELECT * FROM COUNTRIES NATURAL INNER JOIN (LOCATIONS); Exemplo 02 – No LEFT OUTER JOIN com a junção natural, os resultados da tabela da esquerda prevalecem sobre os registros da tabela da direita, resultando nos valores nulos para a tabela da direita, que no caso é a LOCATIONS. SELECT * FROM COUNTRIES NATURAL LEFT OUTER JOIN (LOCATIONS); Exemplo 04 – Como a tabela da direita não possuí os códigos dos países (COUNTRY_ID) e que são inexistentes na tabela COUNTRIES, o resultado será igual ao INNER JOIN. SELECT * FROM COUNTRIES NATURAL RIGHT OUTER JOIN (LOCATIONS); Exemplo 03 – Neste caso acontecerá o mesmo que o LEFT OUTER JOIN para a o comando FULL OUTER JOIN, que resultará nos registros de todos os lados. SELECT * FROM COUNTRIES NATURAL FULL OUTER JOIN (LOCATIONS); Exemplo 04 – Neste próximo exemplo será alterado a tabela pai, e também será mostrado uma junção natural com duas tabelas relacionadas SELECT * FROM LOCATIONS NATURAL JOIN (COUNTRIES INNER JOIN REGIONS ON REGIONS.REGION_ID = COUNTRIES.REGION_ID); Este exemplo mostra que a tabela LOCATIONS que possuí a coluna COUNTRY_ID que é relacionada com a tabela COUNTRIES, e a tabela COUNTRIES é efetuada um relacionamento de junção normal com a tabela REGIONS pelo campo REGION_ID. Porém estas duas tabelas também poderia ser relacionadas com um NATURAL JOIN, pois possuem o mesmo nome das colunas. Exemplo 05 – Junções naturais relacionadas com outras junções naturais, isto tudo para agregar todos as colunas no momento de efetuar a operação com asterisco (*). SELECT * FROM LOCATIONS NATURAL JOIN (COUNTRIES NATURAL JOIN (REGIONS)); Desta forma iremos obter o mesmo resultado que o exemplo número 04. Segundo a documentação da Oracle, existem algumas restrições no momento de efetuar o NATURAL JOIN. 1 – Não é permitido colunas do tipo LOB; 2 – Não são permitidas colunas ANYTYPE, ANYDATA ou ANYDATASET; 3 – Colunas com uma parte de um NATURAL JOIN; 4 – Não é possível especificar TABELA.CAMPO dentro de um NATURAL JOIN (erro ORA-00942 – A tabela ou view não existe); Quanto à sua diferença no desempenho no momento da execução, nos testes efetuados para este artigo não foram encontradas diferenças quanto ao custo para o banco de dados, ambos efetuaram a mesma operação, obtiveram a mesma cardinalidade e também o mesmo custo. Também há uma consideração a ser feito, quanto ao cuidado de se utilizar um NATURAL JOIN, caso uma tabela tenha colunas com o mesmo nome e o desenvolvedor utilizar o NATURAL JOIN sabendo que alguma dessas colunas poderá possuir valores nulos (ou diferentes) o relacionamento não acontecerá, pois, o NATURAL JOIN funciona muito bem quando uma coluna é chave estrangeira da outra tabela. Exemplo: TABELA A: Código Nome Dt. Nasc. Nom Usuário Dt. Cad. 1 Leandro M. Bonato 16/02/1991 Leandro.bonato 10/04/2016 2 Fulano 30/12/1992 Fulano.ciclano 09/04/2016 TABELA B Seq. Código Dt. Cad. Dt. Acesso Nome Obs. Site 1 1 10/04/2016 10/04/2016 Leandro M. Bonato GPO Google 2 2 09/04/2016 10/04/2016 Fulano GPO Google 3 2 10/04/2016 10/04/2016 Fulano GPO Google 4 2 09/04/2016 10/04/2016 Ciclano GPO Google 5 1 10/04/2016 10/04/2016 Leandro M. GPO Google No Exemplo acima vemos claramente que aparecerá apenas os dois primeiros registros da TABELA B, devido que os nomes dos campos que são iguais à TABELA A possuem valores diferentes com os da TABELA B, por este motivo utiliza-se com mais frequência o INNER JOIN, que neste caso conseguiríamos relacionar apenas o campo código, que é o campo de relacionamento padrão entre as tabelas. Referências http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljnaturaljoin.html Abraços Leandro Miozzo Bonato Leandro Miozzo Bonato, é formado em Sistemas de informação e é especialista em Banco de dados; trabalha com Oracle e desenvolvimento em Delphi há 5 anos. ************************************************************* kondado.com.br Bê-á-bá do SQL: Usando JOIN para combinar tabelas kondado.com.br 3–4 minutos Bê-á-bá do SQL: Usando JOIN para combinar tabelas Material de apoio: 1. Antes de iniciar esse tutorial, acesse a introdução da série de tutoriais clicando aqui, siga o passo a passo para usar a nossa plataforma interativa de SQL e pratique em tempo real 2. Participe do nosso canal do slack, onde você poderá tirar dúvidas sobre os tutoriais e também acessar conteúdo exclusivo do universo de dados, clicando aqui Confira também os posts anteriores da série: 1. Introdução 2. Estrutura do SELECT 3. Filtrando valores com o WHERE 4. Agrupando valores com o GROUP BY 5. Usando ORDER BY e LIMIT A função do JOIN no SQL é combinar duas tabelas através de alguma chave ou valor comum entre elas. Existem diversos tipos de JOINs no SQL, no tutorial de hoje iremos falar sobre o INNER JOIN e o LEFT JOIN, que são os tipos mais usados. Para os exemplos abaixo vamos considerar as tabelas “pessoas” e “dados_adicionais” do nosso banco de testes: Para combinar as duas tabelas em um JOIN é importante garantir que ambas tenham uma coluna em comum. No caso do nosso exemplo, a coluna “id” é a chave que será usada para cruzá-las. Diferença entre INNER JOIN e LEFT JOIN Enquanto o INNER JOIN combina todos os valores das duas tabelas e retorna no resultado somente as linhas presentes em ambas, o LEFT JOIN traz todas as linhas presentes na tabela 1 (ou tabela da esquerda) com os valores correspondentes da tabela 2. Sintaxe básica do JOIN INNER JOIN SELECT p.id, p.nome, p.idade, d.estado_civil FROM pessoas p INNER JOIN dados_adicionais d ON p.id = d.id No código acima estamos trazendo as colunas id, nome e idade da tabela “pessoas” e a coluna estado_civil da tabela “dados_adicionais”. A coluna id é a chave que estamos usando para cruzar as duas tabelas, neste caso, o resultado trará apenas ids que existam em ambas as tabelas. Os alias “p” e “d” são importantes para identificar de qual tabela está vindo a determinada coluna. LEFT JOIN SELECT p.id, nome, idade, estado_civil FROM pessoas p LEFT JOIN dados_adicionais d ON p.id = d.id No caso do exemplo acima, a sintaxe é bastante parecida com a do INNER JOIN, porém, no resultado virão todas as linhas da tabela “pessoas” com os valores correspondentes encontrados na tabela “dados adicionais”. Quando não houver correspondência na segunda tabela, a coluna estado_civil ficará em branco na determinada linha. Não deixe de conferir os post anteriores da nossa série de tutoriais, e fique de olho no nosso blog para acompanhar os próximos! E para testar a plataforma Kondado gratuitamente por 14 dias, basta clicar no link abaixo: Publicado em 2020-11-30 **************************************************************** acervolima.com Diferença entre JOIN e UNION no SQL – Acervo Lima ~2 minutos JOIN : JOIN em SQL é usado para combinar dados de muitas tabelas com base em uma condição de correspondência entre elas. Os dados combinados usando resultados da instrução JOIN em novas colunas. Considere as duas tabelas: Rapazes Garotas Exemplo: sql> SELECT Boys.Name, Boys.Age, Girls.Address, FROM Boys INNER JOIN Girls ON Boys.Rollno = Girls.Rollno; A tabela resultante é: UNION : UNION em SQL é usado para combinar o conjunto de resultados de duas ou mais instruções SELECT. Os dados combinados usando a instrução UNION geram resultados em novas linhas distintas. Exemplo: sql> SELECT Name FROM Boys WHERE Rollno < 16 UNION SELECT Name FROM Girls WHERE Rollno > 9 A tabela resultante é: Diferença entre JOIN e UNION no SQL: JUNTE UNIÃO JOIN combina dados de muitas tabelas com base em uma condição de correspondência entre elas. SQL combina o conjunto de resultados de duas ou mais instruções SELECT. Ele combina dados em novas colunas. Ele combina dados em novas linhas O número de colunas selecionadas em cada tabela pode não ser o mesmo. O número de colunas selecionadas de cada tabela deve ser o mesmo. Os tipos de dados das colunas correspondentes selecionadas em cada tabela podem ser diferentes. Os tipos de dados das colunas correspondentes selecionadas em cada tabela devem ser iguais. Ele pode não retornar colunas distintas. Ele retorna linhas distintas. Aprenda todos os conceitos do GATE CS com aulas gratuitas ao vivo em nosso canal do youtube. *******************************************************
99-ganhar-dinheiro

99pay-ou-sofisa

99pay

alimentos-inflamatorios

almoco-domingo-estado-mes-ano

alura-ou-udemy

alura

apenas-o-e-mail-dado-pessoal-lgpd

apostas-online

atualizacao-para-mysqli

aumentar-acessos-com-sites-similares

bootstrap-vs-wordpress

borda-tabela-css

buffer-logger

calcular-onde-investir-me-tempo-em-conteudo

cancelar-compra-multiproprieadade

caractere-invisivel-whatsapp

caracteres-especiais-html

centraliza-html

centralizar-icone-svg

coisas-de-manaus

colecionador-disco-vinil

colocar-site-google-discovery

concurso-publico-ti-2023

configurar-outlook-servidor

consulta-sql-php-8

conteudo-provas-clinicas

cores-html

corrigindo-erro-php

curiosidade

curriculo-programador-web

cursos

dar-permissao-pasta-remota-php

decoracao-com-disco-de-vinil

dinheiro-cartoes-investimentos-fintechs

disco-de-vinil-roberto-carlos

disco-de-vinil

disco-vinil-usado-antigo

discos-amazon

discos-antigos

discos-mais-procurados-colecionadores

disder

do-que-e-feito

editor-de-video-online-gratis

email-dado-pessoal-lgpd

erro-arquivo-xml-atom

espaco-imagem-css

explicando-dinheiro-cartao-de-credito

faixa-etaria-viagem

fazer-agrupamento-sql-por-todos-campos-com-mesmo-termo

fazer-antes-de-viajar

fechar-modal

filtro-psl152

forcar-arquivo-pdf-abrir-apenas-em-iframe

forcar-pdf-apenas-iframe

formulario-lead-autorizacao-lgpd

formulario-para-registro-de-lead

foto-smartwatch

frases-curiosas

front-end-linguagens

funcao-mysql

furada

gerencia-de-projetos-2015

google-ad-manager

htaccess-nao-funciona-no-host

icone-svg

if-ternario-php

imagem-escondida

impedir-link-form

include-dentro-echo-php

inteligencia-artificial

iron-man-black-sabbath

jogo-do-tigrinho

joinads

legendas-youtube

limitar-numeros-input-python

link-interno-seo

links-do-adsense-que-as-pessoas-estao-clicando

matrix-internet

matrix-reserva

matrix

medicamentos

melhores-a-piores-praias-de-salvador

melhores-capitais-para-viajar

melhores-destinos-para-viajar-baixa-temporada-brasil

micronicho-investimento-infinitas-possibilidades

monarx

multipropriedade-vale-a-pena

musica-tela

musicas-brasileiras-viajar

musicas-criticas-a-tecnologia

musicas-que-falam-de-discos

musicas-viajar

o-colorib-sabe-que-o-template-e-dele

oceano-azul-seo

paginas-amp

palavras-bomba-hidraulica

palavras-chaves-multipropriedade

pdf-para-html

perguntas-em-vagas-de-emprego

permissao-pasta-remota-php

pesquisas-abril-22-p254

picpay-vs-nubank

pilates-penteadeira

pipe-angular-cpf

png-para-jpg

pontos-negativos-contidos-livro-mulipropriedade

prioridade-matrizes

prioridade

priorizacao-de-conteudo-para-site-e-blog

priorizar-conteudo-nos-sites

que-roupa-usar

quebra-linha-whatsapp

query-artigo-800-palavras

query-php-um-campo

questoes-clinicas-2017

questoes-sprint

reclame-aqui-ganha-dinheiro

reclame-aqui

redirect-html

regex

remover-o-s-de-uma-palavra-plural-singular-php

remover-pontos-tracos-excel

rende-mais-cdi-agosto-de-2023

retirar-linha-excel

samurai-x

seo-local

serie-explicando-dinheiro-netflix-cartao-de-credito

sexta-temporada-black-mirror

simular-colunas-tabela-html

sinal-maior-menor

sistema-multipropriedade

snake-case

sugestao-dominio-feminino

taboola-o-joao-kleber-da-internet

termos-direto-ao-ponto

tipos-join

tirar-espaco-excel

trocar-foto-smartwatchs-em-alta

usar-ad-manager

usar-adsense-em-arquivo-pdf

usar-no-sobre

valor-unico-mysqli-php

varios-sites-de-prefeituras-direcionam-para-sites-de-aposta

vinil-anos-90-dificil-achar

vinil-para-depois

viver-de-blog-monetizacao

webstories-videos-texto

whatsapp-direto

whatsapp