Em um sistema de gerenciamento de banco de dados relacional...

Próximas questões
Com base no mesmo assunto
Q3508324 Banco de Dados
Em um sistema de gerenciamento de banco de dados relacional compatível com SQL ANSI, você precisa selecionar dados de duas tabelas relacionadas: clientes (com colunas id_cliente, nome) e pedidos (com colunas id_pedido, id_cliente, data_pedido). O objetivo é obter uma lista completa de todos os clientes e todos os pedidos, mesmo que um cliente não tenha feito nenhum pedido ou que um pedido não esteja associado a um cliente existente (o que pode ocorrer devido a inconsistências nos dados). Para cada cliente, devem ser exibidos os pedidos associados (se houver), e para cada pedido, o cliente correspondente (se houver). Onde não houver correspondência, as colunas da tabela ausente devem exibir o valor NULL. Assinale a alternativa que atende corretamente o requisito descrito: 
Alternativas

Gabarito comentado

Confira o gabarito comentado por um dos nossos professores

Alternativa correta: D

Tema central: A questão aborda o uso de tipos de JOIN no SQL ANSI para combinar tabelas relacionais e exibir todos os registros, incluindo casos sem correspondência entre as tabelas. Esse conhecimento é crucial em concursos de TI, pois JOINs são essenciais para manipulação de dados em bancos relacionais.

Resumo teórico: JOINs permitem reunir informações de duas ou mais tabelas por meio de uma condição. Os principais tipos:

  • INNER JOIN: Retorna apenas registros que possuem correspondência nas duas tabelas.
  • LEFT JOIN: Retorna todos os registros da tabela da esquerda e os correspondentes da direita; onde não houver correspondência, retorna NULL para os campos da direita.
  • RIGHT JOIN: Retorna todos os registros da tabela da direita e os correspondentes da esquerda; onde não houver correspondência, retorna NULL para os campos da esquerda.
  • FULL OUTER JOIN: Retorna todos os registros das duas tabelas, com NULL nas colunas da tabela ausente quando não houver correspondência.
Fonte: ANSI/ISO SQL Standard e documentação oficial do PostgreSQL/MySQL.

Justificativa da alternativa D:
A opção D descreve corretamente o comportamento do FULL OUTER JOIN: todas as linhas de ambas as tabelas são exibidas. Se não houver correspondência entre cliente e pedido, os campos da tabela ausente recebem NULL. Assim, atende perfeitamente ao requisito do enunciado.

Análise das alternativas incorretas:

  • A: O INNER JOIN só retorna linhas que tenham correspondência nas duas tabelas, eliminando clientes sem pedidos e pedidos sem cliente. Não satisfaz o objetivo.
  • B: O RIGHT JOIN retorna todos os pedidos, mas não inclui clientes sem pedidos.
  • C: O LEFT JOIN retorna todos os clientes, mas não inclui pedidos sem cliente.
  • E: A descrição mistura conceitos de JOIN; JOIN sem especificação é um INNER JOIN, o que não resolve o problema.

Estratégias para interpretação:
Procure por expressões como “todos os registros”, “mesmo sem correspondência” ou “NULL nas colunas ausentes”. Elas quase sempre indicam a necessidade de um FULL OUTER JOIN.

Gostou do comentário? Deixe sua avaliação aqui embaixo!

Clique para visualizar este gabarito

Visualize o gabarito desta questão clicando no botão abaixo

Comentários

Veja os comentários dos nossos alunos

 * INNER JOIN: Retorna apenas as linhas onde há correspondência em ambas as tabelas. Isso excluiria clientes sem pedidos e pedidos sem clientes, o que não atende ao requisito.

 * LEFT JOIN: Retorna todas as linhas da tabela da esquerda (clientes) e as linhas correspondentes da tabela da direita (pedidos). Se não houver correspondência na tabela da direita, as colunas da tabela da direita serão NULL. Isso atenderia à parte de "todos os clientes e seus pedidos", mas não à parte de "pedidos sem cliente correspondente".

* RIGHT JOIN: Retorna todas as linhas da tabela da direita (pedidos) e as linhas correspondentes da tabela da esquerda (clientes). Se não houver correspondência na tabela da esquerda, as colunas da tabela da esquerda serão NULL. Isso atenderia à parte de "todos os pedidos e seus clientes", mas não à parte de "clientes sem pedidos".

 * FULL OUTER JOIN: É a união completa de LEFT JOIN e RIGHT JOIN. Ele retorna todas as linhas de ambas as tabelas, combinando-as onde há correspondência. Onde não há correspondência em uma das tabelas, as colunas da tabela ausente serão preenchidas com NULL. Isso garante que você veja:

  * Clientes com pedidos.

  * Clientes sem pedidos (com as colunas de pedidos como NULL).

  * Pedidos sem cliente correspondente (com as colunas de clientes como NULL).

A alternativa E está incorreta porque "JOIN" por si só é ambíguo; geralmente se refere a um INNER JOIN se não for especificado, e mesmo se fosse um tipo específico (como RIGHT JOIN, que é o que ela descreve), não atenderia a todos os requisitos.

Uma breve explicação sobre Inner, Left, Right, Outer/Full e Cross Join → https://pt.stackoverflow.com/questions/6441/qual-é-a-diferença-entre-inner-join-e-outer-join#6448

Clique para visualizar este comentário

Visualize os comentários desta questão clicando no botão abaixo