Se você deseja obter algo significativo com os dados , quase sempre você precisará juntar várias tabelas. Neste artigo, mostraremos como fazer isso usando diferentes tipos de junções. Para isso, combinaremos INNER JOINs e LEFT JOINs. Então, vamos começar.
O modelo
Na imagem abaixo você pode ver o modelo existente. É composto por 6 tabelas e já, mais ou menos, o descrevemos em artigos anteriores.
Mesmo assim, mesmo sem descrever, se o banco de dados for modelado e apresentado de maneira adequada (escolhendo nomes com sabedoria, usando convenção de nomenclatura, seguindo as mesmas regras em todo o modelo, linhas / relações no esquema não se sobrepõem mais do que o necessário), você deve ser capaz para concluir onde você pode encontrar os dados de que precisa. Isso é crucial porque antes de unir várias tabelas, você precisa primeiro identificar essas tabelas.
Falaremos sobre a convenção de nomenclatura e o conselho sobre como pensar ao escrever consultas SQL, mais adiante neste Series. Até agora, vamos conviver com o fato de que este modelo é muito simples e podemos fazer isso com bastante facilidade.
O que sabemos até agora?
Nesta série, nós coberto:
- Noções básicas relacionadas à instrução SQL SELECT e
- INNER JOIN e LEFT JOIN comparados
Usaremos o conhecimento de ambos esses artigos e combiná-los para escrever instruções SELECT mais complexas que unirão várias tabelas.
Junte várias tabelas usando INNER JOIN
O primeiro exemplo que analisaremos é como recuperar dados de várias tabelas usando apenas INNER JOINs. Para cada exemplo, iremos com a definição do problema que devemos resolver e a consulta que faz o trabalho. Então, vamos começar com o primeiro problema.
# 1 Precisamos listar todas as chamadas com seus horários de início e término. Para cada chamada, queremos exibir qual foi o resultado, bem como o nome e o sobrenome do funcionário que fez a chamada. Classificaremos nossas chamadas por horário de início crescente.
Antes de escrever a consulta, identificaremos as tabelas que precisamos usar. Para fazer isso, precisamos determinar quais tabelas contêm os dados de que precisamos e incluí-los. Além disso, devemos incluir todas as tabelas ao longo do caminho entre essas tabelas – tabelas que não contêm dados necessários, mas servem como uma relação entre tabelas que contêm (esse não é o caso aqui).
A consulta que faz o trabalho é fornecida abaixo:
O resultado da consulta é fornecido abaixo:
Há algumas coisas que eu gostaria de apontar aqui:
- As tabelas que juntamos estão aqui porque os dados que precisamos está localizado nessas 3 tabelas
- Cada vez que menciono qualquer atributo de qualquer tabela, estou usando o formato nome_tabela.nome_do_atributo (por exemplo, funcionário.first_name). Embora não seja necessário, é uma boa prática, porque às vezes 2 ou mais tabelas na mesma consulta podem usar os mesmos nomes de atributos e isso levaria a um erro.
- Usamos INNER JOIN 2 vezes em ordem para juntar 3 mesas. Isso resultará no retorno apenas de linhas com pares em outra tabela
- Quando você está usando apenas INNER JOINs para juntar várias tabelas, a ordem dessas tabelas nas junções não é importante. A única coisa importante é que você use as condições de junção apropriadas após o “ON” (junção usando chaves estrangeiras)
Visto que todas as chamadas tinham funcionário e resultado da chamada relacionados, obteríamos o mesmo resultado se usamos LEFT JOIN em vez de INNER JOIN.
Junte-se a várias tabelas usando LEFT JOIN
Escrever consultas que usam LEFT JOINs não difere muito quando comparado a escrever consultas usando INNER JOINs. O resultado, é claro, seria diferente (pelo menos nos casos em que alguns registros não têm um par em outras tabelas).
Este é o problema que queremos resolver.
# 2 Liste todos os condados e clientes relacionados a esses países. Para cada país exibir seu nome em inglês, o nome da cidade do cliente está localizado em, bem como o nome desse cliente. Retorne até mesmo países sem cidades relacionadas e clientes.
As tabelas contendo os dados de que precisamos estão na imagem abaixo:
Primeiro, vamos verifique rapidamente qual é o cont ents dessas 3 tabelas.
Podemos notar duas coisas importantes:
- Embora cada cidade tenha um país relacionado, nem todos os países têm cidades relacionadas (Espanha & Rússia não as tem)
- O mesmo vale para os clientes.Cada cliente tem o valor city_id definido, mas apenas 3 cidades estão sendo usadas (Berlim, Zagreb & Nova York)
Vamos primeiro anotar o consulta usando INNER JOIN:
O resultado da consulta é mostrado na imagem abaixo:
Nós temos 7 condados e 6 cidades em nosso banco de dados, mas nossa consulta retorna apenas 4 linhas. Isso se deve ao fato de termos apenas 4 clientes em nosso banco de dados. Cada um desses 4 está relacionado à sua cidade e a cidade está relacionada ao país. Assim, INNER JOIN eliminou todos esses países e cidades sem clientes. Mas como incluí-los no resultado também?
Para fazer isso, usaremos LEFT JOIN. Vamos simplesmente substituir todos “INNER” por “LEFT” para que nossa consulta seja a seguinte:
O resultado é mostrado na imagem abaixo:
Você pode notar facilmente que agora temos todos os países, mesmo aqueles sem nenhuma cidade relacionada (Rússia & Espanha), bem como todos cidades, mesmo aquelas sem clientes (Varsóvia, Belgrado & Los Angeles). As 4 linhas restantes são iguais às da consulta usando INNER JOIN.
LEFT JOIN – a ordem das tabelas é importante
Embora a ordem dos JOINs em INNER JOIN não seja importante, o mesmo não significa LEFT JOIN. Quando usamos LEFT JOIN para juntar várias tabelas, é importante lembrar que essa junção incluirá todas as linhas da tabela no lado LEFT de JOIN. Vamos reorganizar a consulta anterior:
No início, você poderia facilmente dizer que esta consulta e a anterior são iguais (isso é verdade quando se usa INNER JOIN). Usamos as mesmas tabelas, LEFT JOINs e as mesmas condições de junção. Vamos dar uma olhada na saída primeiro:
Então, o que aconteceu aqui? Por que temos 4 linhas (as mesmas 4 que tínhamos quando usamos INNER JOIN)?
A resposta é simples e está relacionada a como LEFT JOIN funciona. Ele pega a primeira tabela (cliente) e junta todas as suas linhas (4 delas) à próxima tabela (cidade). O resultado disso são 4 linhas porque o cliente pode pertencer a apenas 1 cidade. Em seguida, juntamos essas 4 linhas à próxima tabela (país) e, novamente, temos 4 linhas porque a cidade poderia pertencer a apenas 1 país.
A razão pela qual não juntamos essas 3 tabelas neste forma é fornecida pelo texto do exemplo # 2. A consulta é escrita de forma a retornar 4 linhas que seriam a resposta para o seguinte: Retorne os nomes de todos os clientes, bem como as cidades e países em que eles estão localizados. Retorne até mesmo clientes sem cidades e países relacionados.
- Nota: Quando você usa LEFT JOIN, a ordem das tabelas nessa instrução é importante e a consulta retornará um resultado diferente se você alterar essa ordem. A ordem realmente depende do que você deseja retornar como resultado.
Junte várias tabelas usando ambos – INNER JOIN & LEFT JOIN
Isso também é possível. Vamos novamente com um exemplo.
# 3 Retorne a lista de todos os países e cidades que têm par (exclua os países que não são referenciados por nenhuma cidade). Para esses pares, retorne todos os clientes. Retorna pares pares sem um único cliente.
A consulta que faz o trabalho é:
O resultado da consulta é dado na imagem abaixo:
Você pode notar facilmente que não temos países sem nenhuma cidade relacionada (como Espanha & Rússia). O INNER JOIN eliminou essas linhas. Ainda assim, temos cidades sem nenhum cliente (Belgrado, Los Angeles & Varsóvia). Este é o resultado do fato de que usamos LEFT JOIN entre as tabelas cidade e cliente.
Conclusão
Quando você precisa juntar várias tabelas, você tem INNER & LEFT JOIN à sua disposição (RIGHT JOIN raramente é usado e pode ser facilmente substituído por LEFT JOIN). A junção que você usará depende diretamente da tarefa que você precisa resolver e você terá a sensação ao longo do caminho. Nos próximos artigos, discutiremos como pensar e se organizar quando precisar escrever consultas mais complexas.
Índice
Aprenda SQL: CREATE DATABASE & CREATE TABLE Operações
Aprenda SQL: INSERT INTO TABLE
Aprenda SQL: Chave primária
Aprenda SQL: Chave estrangeira
Aprenda SQL: SELECT instrução
Aprenda SQL: INNER JOIN vs LEFT JOIN
Aprenda SQL: Scripts SQL
Aprenda SQL: Tipos de relações
Aprenda SQL: junte várias tabelas
Aprenda SQL: funções agregadas
Aprenda SQL: como escrever um SELECT complexo Consulta
Aprenda SQL: o banco de dados INFORMATION_SCHEMA
Aprenda SQL: Tipos de dados SQL
Aprenda SQL: Teoria dos conjuntos
Aprenda SQL: Funções definidas pelo usuário
Aprenda SQL: Procedimentos armazenados definidos pelo usuário
Aprenda SQL: Exibições SQL
Aprenda SQL: Gatilhos SQL
Aprenda SQL: Pratique consultas SQL
Aprenda SQL: SQL Exemplos de consulta
Aprenda SQL: crie um relatório manualmente usando consultas SQL
Aprenda SQL: Funções de data e hora do SQL Server
Aprenda SQL: crie relatórios do SQL Server usando funções de data e hora
Aprenda SQL: tabelas dinâmicas do SQL Server
Aprenda SQL: exportação do SQL Server para Excel
Aprenda SQL: introdução aos loops do SQL Server
Aprenda SQL: cursores do SQL Server
Aprenda SQL: Práticas recomendadas de SQL para excluir e atualizar dados
Aprenda SQL: Convenções de nomenclatura
Aprenda SQL: Trabalhos relacionados a SQL
Aprenda SQL: associações não-equi no SQL Server
Aprenda SQL: injeção de SQL
- Autor
- Postagens recentes
Seus compromissos passados e presentes variam de design e codificação de banco de dados a ensino, consultoria e redação sobre bancos de dados. Sem esquecer também, BI, criação de algoritmos, xadrez, filatelia, 2 cachorros, 2 gatos, 1 esposa, 1 bebê …
Você pode encontrá-lo no LinkedIn
Ver todas as postagens de Emil Drkusic
- Aprenda SQL: SQL Injection – 2 de novembro de 2020
- Aprenda SQL: Non-Equi Joins no SQL Server – 29 de setembro de 2020
- Aprenda SQL: Trabalhos relacionados a SQL – 1 de setembro de 2020