Voltar para a lista de artigos Artigos
8 minutos de leitura

SQL INNER JOIN Explicado em palavras simples

Neste artigo, vou abordar talvez o elemento mais importante da linguagem SQL. É isso mesmo! Estou falando da cláusula SQL INNER JOIN.

Como você sabe, em um banco de dados, os dados são armazenados em várias tabelas. Em meu último artigo, eu cobri como criar consultas SQL quando os dados necessários estão em apenas uma tabela. Mas e se os dados de que você precisa estiverem em duas tabelas? Para este caso, você precisa usar uma cláusula JOIN para combinar as duas tabelas, o que é algo semelhante a conectar as duas tabelas. Neste artigo, vou explicar a cláusula SQL INNER JOIN em palavras simples usando alguns exemplos fáceis de entender.

Um banco de dados de agências de viagens

Talvez você já saiba que em um banco de dados os dados são armazenados em tabelas. Suponha que você trabalhe para uma agência de viagens, e o banco de dados da agência tenha duas tabelas: TRAVEL_PACK e CITIES. Na imagem a seguir você pode ver o banco de dados, é claro que nem todos os dados estão sendo mostrados.

Amostra de TRAVEL_PACK Tabela

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

Amostra de CITIES Tabela

NAMETYPE_OF_CITYPACK_NAMEDAYS_STAYING
San FranciscohistoricalUnited States: West Coast5
WashingtonhistoricalUnited States: Big Cities3
New YorkbusinessUnited States: Big Cities7
Rio de JaneirobeachBeaches of Brazil4
UshuaiamountainSouth American Tour3
Salvador de BahiabeachBeaches of Brazil3
Los AngelesbeachUnited States: West Coast7

Favor observar: Para usar uma cláusula JOIN para combinar duas tabelas, deve haver um campo ou coluna que apareça em ambas as tabelas.

No banco de dados de amostras, este campo é o nome do pacote de viagem. Como você pode ver no TRAVEL_PACK tabela, o nome da embalagem está sob a coluna PACK_NAMEe no CITIES tabela o nome do pacote está na coluna PACK_NAME também. É fácil ver que ambas as colunas têm o mesmo nome de coluna, porém em outros bancos de dados pode ser diferente. Em outras palavras, ao utilizar uma cláusula INNER JOIN, o nome da coluna comum pode ser diferente em ambas as tabelas ou não. De qualquer forma, lembre-se do nome da coluna PACK_NAMEporque você precisará dela mais tarde para escrever a cláusula JOIN.

Seu Primeiro JOIN SQL: Obtenha os Pacotes de Viagem Incluindo Cidades de Praia

Geralmente recomendo começar pensando onde os dados estão localizados que você precisa para a consulta. Neste caso, é claro que você precisará da TRAVEL_PACK tabela para obter os nomes das embalagens, mas ao mesmo tempo você também precisará da CITIES mesa, porque é preciso verificar se a cidade é ou não uma cidade de praia. Portanto, os dados necessários para esta consulta estão em duas tabelas, que é o motivo pelo qual você precisa usar um SQL JOIN.

Quando você tiver que obter dados de duas (ou mais) tabelas, você deve usar um SQL JOIN. O SQL JOIN atua como um conector entre duas tabelas, criando pares de registros. Basicamente, são necessários dois registros (um de cada tabela) e os une em um par de registros. Este tipo de união é chamado de INNER JOIN, e em SQL os termos JOIN ou INNER JOIN são exatamente os mesmos. Para aqueles leitores que querem ir mais fundo, existem outros tipos de join SQL, por exemplo, o oposto do join INNER é outro tipo de join chamado LEFT join ou OUTER LEFT join, e você também pode encontrar outros tipos de join como RIGHT join, NATURAL join e LATERAL join, entre outros. Você pode aprender muitos destes tipos de join SQL no curso online Cláusulas JOIN em SQL . Entretanto, neste artigo vou focalizar o INNER JOIN, que é realmente poderoso!

A imagem seguinte mostra como a cláusula JOIN cria um par de registros:

Um GIF representando como funciona a união interna das mesas

(clique para ampliar)

Agora, vou mostrar a sintaxe para implementar um INNER JOIN, usando o próximo padrão

FROM table1 
INNER JOIN table2 ON common column in table1 = common column in table2

Se você preencher o padrão com suas tabelas de amostras e nomes de colunas, então você terá a próxima cláusula INNER JOIN:

FROM CITIES 
INNER JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

DAS CIDADES Uma vez concluída a cláusula FROM com o INNER JOIN, você pode continuar trabalhando nas cláusulas SELECT e WHERE da consulta. A cláusula SELECT é fácil porque você só precisa devolver o NOME da coluna, então a cláusula será:

SELECT TRAVEL_PACK.PACK_NAME

Observe a referência à coluna PACK_NAME é feito adicionando um prefixo com o nome da tabela (TRAVEL_PACK neste caso). Esta é uma boa prática a ser aplicada quando a consulta envolve mais de uma mesa.

Na cláusula WHERE você precisará filtrar os resultados para incluir apenas cidades de praia. Então a cláusula será:

WHERE CITIES.TYPE_OF_CITY = 'beach'

Finalmente, se você colocar todas as cláusulas juntas, a consulta será:

SELECT TRAVEL_PACK.PACK_NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE CITIES.TYPE_OF_CITY = 'beach'

A seguir é o resultado da consulta anterior:

NAME
Los Angeles
Salvador de Bahia
Rio de Janeiro

Sua próxima adesão: as cidades incluídas nos pacotes de viagem mais baratas do que US$2500

Novamente, semelhante à consulta anterior, você pode ver que precisa acessar duas tabelas para esta consulta, usando um JOIN para a CITIES e TRAVEL_PACK tabelas novamente. Nota: Uso o termo JOIN em vez de INNER JOIN porque ambos são exatamente os mesmos em SQL.

A partir da consulta anterior, você já sabe como criar a cláusula JOIN. As mudanças estão nas cláusulas SELECT e WHERE, como você pode ver nos parágrafos seguintes.

A cláusula de seleção é fácil, pois você só precisa do nome da cidade:

SELECT CITY.NAME

Na cláusula de onde você precisa filtrar pelo preço do pacote de viagem, então a cláusula WHERE será:

WHERE TRAVEL_PACK.PRICE <= 2500

Em seguida, a consulta completa será a seguinte:

SELECT CITY.NAME
FROM CITIES 
JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE TRAVEL_PACK.PRICE <= 2500

O resultado da consulta anterior será: O resultado da consulta anterior:

NAME
Rio de Janeiro
Ushuaia
Salvador de Bahia

Mergulho profundo: INNER JOIN for Three Tables

É possível utilizar um INNER JOIN com mais de duas mesas? Claro que sim. Além disso, você pode usar uma cláusula de JUNTO com quantas tabelas desejar.

Entretanto, devo mencionar que cada cláusula de SQL JOIN é apenas para um único par de tabelas. Portanto, se você tiver três tabelas para juntar, tais como T1, T2 e T3, você precisará de duas cláusulas SQL JOIN como você pode ver no exemplo a seguir:

FROM T1 JOIN T2 ON ...... 
				JOIN T3 ON .......

Eu deixei a cláusula ON vazia porque vou explicar esta parte com o seguinte exemplo. Suponha que você amplie o banco de dados da agência adicionando uma nova tabela chamada STATES onde você planeja armazenar os estados, regiões ou províncias de cada país. O banco de dados com três tabelas será como a figura a seguir:

TRAVEL_PACK Tabela

PACK_NAMEBEST_SEASONPRICEDURATION
United States: Big CitiesAll year$3500.0010 days
United States: West CoastMarch to May$3700.0012 days
South American TourAugust to November$1850.0018 days
Beaches of BrazilDecember to March$2200.007 days

STATES Tabela

NAMECOUNTRYPOPULATIONLANGUAGE
New YorkUnited States17000000english
Tierra del FuegoArgentina190000spanish
CaliforniaUnited States13400000english
Rio de JaneiroBrasil15000000portuguese
BahiaBrasil8000000portuguese

CITIES Tabela

NAMETYPE_OF CITYPACK_NAMEDAYS_STAYSTATE
San FranciscohistoricalUnited States: West Coast5California
WashingtonhistoricalUnited States: Big Cities3Washington
New YorkbusinessUnited States: Big Cities7New York
Rio de JaneirobeachBeaches of Brazil4Rio de Janeiro
UshuaiamountainSouth American Tour3Tierra del Fuego
Salvador de BahiabeachBeaches of Brazil3Bahia
Los AngelesbeachUnited States: West Coast7California

Suponha que você precise obter um relatório com uma lista de todas as cidades com o estado, o nome do pacote e o idioma usado na cidade nos estados onde o idioma é espanhol ou português. É claro que você precisa juntar as tabelas CITIES e STATES e, em seguida, junte este resultado também com o TRAVEL_PACK mesa. Você pode começar aplicando o que aprendeu nos exemplos anteriores.

Primeiro, use uma cláusula JOIN para combinar a tabela CITIES com a mesa STATES. É claro que você precisa usar as colunas CITIES.STATE e STATE.NAME na cláusula ON. Em seguida, a cláusula de origem será a seguinte:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME 

Em seguida, é preciso acrescentar a terceira tabela à cláusula de JOIN, que é a tabela TRAVEL_PACK. Você já aprendeu como se juntar a esta tabela em um exemplo anterior, portanto o JOIN completo será:

FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME

Acrescentando as cláusulas SELECT e WHERE, a consulta completa será como a seguinte:

SELECT CITIES.NAME, STATES.NAME, TRAVEL_PACK.PACK_NAME, STATES.LANGUAGE
FROM CITIES JOIN STATES ON CITIES.STATE = STATES.NAME
  JOIN TRAVEL_PACK ON CITIES.PACK_NAME = TRAVEL_PACK.PACK_NAME
WHERE STATES.LANGUAGE IN ('spanish','portuguese')

E o resultado será:

NAMENAMEPACK_NAMELANGUAGE
SalvadorBahiaBeaches of Brazilportuguese
Rio de JaneiroRio de JaneiroBeaches of Brazilportuguese
UshuaiaTierra del FuegoSouth American Tourspanish

Próximos passos para continuar aprendendo

Neste artigo, eu cobri como juntar tabelas em SQL. Expliquei usando exemplos do que é um SQL INNER JOIN e como funciona a cláusula JOIN. A cláusula JOIN abre um enorme mundo de novas possibilidades em SQL. Pense que qualquer pessoa não técnica com capacidade de usar a cláusula JOIN em consultas SQL tem um valor extra como funcionário, independentemente da área da empresa em que trabalha. Vá fundo com Cláusulas JOIN em SQL e seja um colaborador de negócios sólido em sua empresa!