Usando JOINS do SQL no BigQuery

- Published on

Entendendo na prática como os JOINs funcionam no SQL (com BigQuery)
Quando trabalhamos com bancos de dados relacionais, é muito comum termos informações distribuídas em várias tabelas. O JOIN é o recurso do SQL que permite combinar dados de duas ou mais tabelas com base em uma coluna em comum entre elas.
Neste artigo, vamos entender na prática como funcionam os principais tipos de JOIN usando um exemplo clássico: uma base com as tabelas:
employees(funcionários)departments(departamentos)
Essas tabelas estão relacionadas pela coluna:
employees.department_id = departments.department_id
Os exemplos abaixo utilizam o BigQuery, mas funcionam em qualquer banco SQL com pequenas adaptações.
📦 Pré-requisito: dataset de funcionários
Considere que você já tenha o dataset employee_data no seu projeto do BigQuery, contendo as tabelas:
employee_data.employeesemployee_data.departments
E que seu project id seja algo como:
meu-projeto-123
Nos exemplos abaixo, substitua:
[your-project-id]
pelo id do seu projeto.
🔗 O que é um JOIN?
JOIN é uma cláusula SQL usada para combinar linhas de tabelas diferentes com base em uma condição.
Existem quatro JOINs principais que você precisa dominar:
| JOIN | O que retorna |
|---|---|
| INNER JOIN | Apenas registros que possuem correspondência nas duas tabelas |
| LEFT JOIN | Todos da esquerda + correspondentes da direita |
| RIGHT JOIN | Todos da direita + correspondentes da esquerda |
| FULL OUTER JOIN | Todos de ambas as tabelas, correspondentes ou não |
🧠 Estrutura das tabelas (exemplo mental)
Tabela employees
| employee_id | name | role | department_id |
|---|---|---|---|
| 1 | Ana | Designer | 10 |
| 2 | Bruno | Developer | 20 |
| 3 | Carlos | Analyst | NULL |
Tabela departments
| department_id | name |
|---|---|
| 10 | Marketing |
| 20 | Tecnologia |
| 30 | Financeiro |
Perceba que:
- Carlos não tem departamento
- O departamento Financeiro não tem funcionário
Isso é perfeito para entender as diferenças entre os JOINs.
✅ Exemplo 1 — INNER JOIN
O INNER JOIN retorna somente os registros que possuem correspondência nas duas tabelas.
SELECT
employees.name AS employee_name,
employees.role AS employee_role,
departments.name AS department_name
FROM
`[your-project-id].employee_data.employees` AS employees
INNER JOIN
`[your-project-id].employee_data.departments` AS departments
ON
employees.department_id = departments.department_id;
Resultado esperado
| employee_name | employee_role | department_name |
|---|---|---|
| Ana | Designer | Marketing |
| Bruno | Developer | Tecnologia |
❌ Carlos não aparece (não tem departamento) ❌ Financeiro não aparece (não tem funcionário)
🟦 Exemplo 2 — LEFT JOIN
O LEFT JOIN retorna todos os registros da tabela da esquerda (employees) e os correspondentes da direita.
SELECT
employees.name AS employee_name,
employees.role AS employee_role,
departments.name AS department_name
FROM
`[your-project-id].employee_data.employees` AS employees
LEFT JOIN
`[your-project-id].employee_data.departments` AS departments
ON
employees.department_id = departments.department_id;
Resultado esperado
| employee_name | employee_role | department_name |
|---|---|---|
| Ana | Designer | Marketing |
| Bruno | Developer | Tecnologia |
| Carlos | Analyst | NULL |
✔ Todos os funcionários aparecem ✔ Mesmo quem não tem departamento
🟥 Exemplo 3 — RIGHT JOIN
O RIGHT JOIN retorna todos os registros da tabela da direita (departments) e os correspondentes da esquerda.
SELECT
employees.name AS employee_name,
employees.role AS employee_role,
departments.name AS department_name
FROM
`[your-project-id].employee_data.employees` AS employees
RIGHT JOIN
`[your-project-id].employee_data.departments` AS departments
ON
employees.department_id = departments.department_id;
Resultado esperado
| employee_name | employee_role | department_name |
|---|---|---|
| Ana | Designer | Marketing |
| Bruno | Developer | Tecnologia |
| NULL | NULL | Financeiro |
✔ Todos os departamentos aparecem ✔ Mesmo sem funcionários
🟪 Exemplo 4 — FULL OUTER JOIN
O FULL OUTER JOIN é a união do LEFT com o RIGHT.
Ele retorna todos os registros de ambas as tabelas, correspondentes ou não.
SELECT
employees.name AS employee_name,
employees.role AS employee_role,
departments.name AS department_name
FROM
`[your-project-id].employee_data.employees` AS employees
FULL OUTER JOIN
`[your-project-id].employee_data.departments` AS departments
ON
employees.department_id = departments.department_id;
Resultado esperado
| employee_name | employee_role | department_name |
|---|---|---|
| Ana | Designer | Marketing |
| Bruno | Developer | Tecnologia |
| Carlos | Analyst | NULL |
| NULL | NULL | Financeiro |
Aqui você enxerga 100% do cenário do banco.
🧩 Quando usar cada JOIN na vida real
| Situação | JOIN ideal |
|---|---|
| Quero apenas dados consistentes entre tabelas | INNER JOIN |
| Quero listar todos os usuários, mesmo incompletos | LEFT JOIN |
| Quero listar todas as categorias, mesmo vazias | RIGHT JOIN |
| Quero auditar inconsistências do banco | FULL OUTER JOIN |
💡 Insight importante (muito usado em análise de dados)
O FULL OUTER JOIN é excelente para:
- Descobrir registros órfãos
- Validar integridade de dados
- Encontrar erros de modelagem
- Fazer auditorias de base
Exemplo prático para encontrar funcionários sem departamento:
SELECT *
FROM `[your-project-id].employee_data.employees` e
LEFT JOIN `[your-project-id].employee_data.departments` d
ON e.department_id = d.department_id
WHERE d.department_id IS NULL;
🏁 Conclusão
Dominar JOIN é fundamental para qualquer pessoa que trabalha com:
- SQL
- BigQuery
- Analytics
- Engenharia de dados
- Marketing data-driven
- BI
Sem JOIN, você apenas consulta tabelas. Com JOIN, você entende o banco de dados como um sistema integrado.
E é exatamente aí que a análise de dados começa a ficar realmente poderosa.
Fique ligado
Seja um Expert em Growth
Receba insights práticos sobre marketing, dados, performance e tecnologia direto no seu email.