SQL: Subconsultas vs JOIN

Dec 19 2022
Subconsultas e junções são dois conceitos importantes em SQL, a linguagem de programação padrão para gerenciamento e manipulação de bancos de dados. Neste blog, exploraremos o que são subconsultas e junções, como elas diferem e quando usar cada uma em suas consultas SQL.

Subconsultas e junções são dois conceitos importantes em SQL, a linguagem de programação padrão para gerenciamento e manipulação de bancos de dados. Neste blog, exploraremos o que são subconsultas e junções, como elas diferem e quando usar cada uma em suas consultas SQL.

O que são subconsultas?

Uma subconsulta é uma consulta dentro de uma consulta. É uma maneira de aninhar uma instrução SELECT dentro de outra instrução SELECT, INSERT, UPDATE ou DELETE, ou dentro de uma instrução CREATE VIEW. As subconsultas podem ser usadas para executar uma variedade de tarefas, como:

  • Filtrando linhas com base em uma condição
  • Calculando valores para uso na consulta externa
  • Retornando um único valor ou vários valores como parte da consulta externa

Uma junção é uma maneira de combinar linhas de duas ou mais tabelas com base em uma coluna relacionada entre elas. Existem vários tipos de junções, incluindo INNER JOIN, OUTER JOIN e CROSS JOIN.

Um INNER JOIN retorna apenas as linhas que correspondem à condição de junção.

Um OUTER JOIN retorna todas as linhas de ambas as tabelas, incluindo aquelas que não correspondem à condição de junção. Existem dois tipos de junções externas: LEFT JOIN e RIGHT JOIN. Um LEFT JOIN retorna todas as linhas da tabela esquerda (a primeira tabela na consulta) e todas as linhas correspondentes da tabela direita. Um RIGHT JOIN retorna todas as linhas da tabela da direita (a segunda tabela na consulta) e todas as linhas correspondentes da tabela da esquerda.

Um CROSS JOIN retorna o produto cartesiano das duas tabelas, que é uma combinação de todas as linhas de ambas as tabelas.

Exemplo Prático:

Neste cenário, temos um banco de dados de Hogwarts e as seguintes tabelas estão listadas abaixo:

  • course_table: Esta tabela contém dados sobre os nomes dos cursos e é identificada usando uma chave primária exclusiva
  • Student_table: Esta tabela contém dados sobre os nomes dos alunos que são identificados por uma chave primária única
  • matrícula_tabela: Esta tabela é a tabela JOIN que estabelece a relação entre alunos e cursos. Cada vez que um aluno se matricula em um curso, um novo registro é criado. o course_id é a chave estrangeira para identificar um curso da course_table e o student_id é uma chave estrangeira para identificar um aluno da student_table.
  • course: 
    +─────+────────────────────────────────+
    | id  | course                         |
    +─────+────────────────────────────────+
    | 1   | Defense against the dark arts  | 
    | 2   | Potions                        | 
    | 3   | History of magic               | 
    +─────+────────────────────────────────+
    
    
    student:
    +─────+────────────────────────────────+
    | id  | student                        |
    +─────+────────────────────────────────+
    | 1   | Harry Potter                   | 
    | 2   | Hermione Granger               | 
    | 3   | Ron Weasly                     |
    | 4   | Voldemort                      |   
    | 5   | Draco Malfoy                   |
    +─────+────────────────────────────────+
    
    enrollment:
    +─────+────────────+─────────────+
    | id  | course_id  | student_id  | 
    +─────+────────────+─────────────+
    | 1   | 1          | 1           | 
    | 2   | 2          | 1           |  
    | 3   | 3          | 2           |  
    | 4   | 2          | 3           | 
    | 5   | 3          | 4           | 
    | 6   | 1          | 5           |
    | 7   | 3          | 1           |   
    | 8   | 1          | 4           |  
    +─────+────────────+─────────────+
    
    
    

Listado abaixo é um exemplo da abordagem Subquery.

SELECT * FROM enrollment
WHERE enrollment.course_id IN (SELECT * FROM courses WHERE course_id = 1);

JUNTE-SE

Listada abaixo está a abordagem Join.

SELECT * FROM course AS c 
  LEFT JOIN enrollment AS e ON c.id = e.course_id
WHERE e.course_id = 1

Quando usar subconsultas e junções

Subconsultas e junções podem ser usadas para recuperar dados de várias tabelas, mas têm casos de uso diferentes. As subconsultas geralmente são usadas quando você deseja usar os resultados da consulta interna na cláusula WHERE ou HAVING da consulta externa. Eles também são úteis quando você deseja retornar um único valor ou vários valores como parte da consulta externa.

As junções geralmente são usadas quando você deseja recuperar dados de várias tabelas com base em uma coluna relacionada entre elas. Eles também são úteis quando você deseja retornar todas as linhas de ambas as tabelas, incluindo aquelas que não correspondem à condição de junção.

Em geral, as subconsultas tendem a ser mais eficientes quando você precisa retornar apenas algumas linhas, enquanto as junções são mais eficientes quando você precisa retornar um grande número de linhas. No entanto, a diferença de desempenho entre os dois pode variar dependendo do tamanho das tabelas e da complexidade das consultas.

Concluindo, subconsultas e junções são duas ferramentas importantes para recuperar dados de várias tabelas no SQL. As subconsultas são úteis para filtrar linhas e retornar valores como parte da consulta externa, enquanto as junções são úteis para combinar linhas de várias tabelas com base em uma coluna relacionada. Ambos podem ser usados ​​para atingir objetivos semelhantes, mas a escolha de qual usar depende dos requisitos específicos de sua consulta.