Questão de Banco de Dados — Consultas e Comandos em SQL — CESPE / CEBRASPE 2024
Banco de Dados›Consultas e Comandos em SQL
Código
ce403639
Banca
CESPE / CEBRASPE
Órgão
TCE AC
Ano
2024
Cargo
ATI ( )
A seguir, são apresentadas as estruturas de duas tabelas, de nomes Customers e Orders, em um banco de dados, e também um comando SQL relativo a essas tabelas.
Customers CustomerID (INT) – identificador único do cliente CustomerName (VARCHAR) – nome do cliente
Orders OrderID (INT) – identificador único do pedido CustomerID (INT) – identificador do cliente que fez o pedido OrderDate (DATE) – data do pedido
SELECT Customers.CustomerName, Orders.OrderDate FROM Customers LEFT OUTER JOIN Orders ON Customers.CustomerID = Orders.CustomerID;
Com base nessas informações, julgue o item subsequente.
A cláusula ON na consulta estabelece a condição para a junção das duas tabelas, especificando que o CustomerID da tabela Customers deve corresponder ao OrderID da tabela Orders.
CCerto
EErrado
Revelar gabarito e comentário▾
GabaritoE — Errado
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
SQL – Cláusula ON em LEFT OUTER JOIN
Gabarito: Errado. A cláusula ON estabelece a condição de junção entre as tabelas, mas a condição correta é Customers.CustomerID = Orders.CustomerID (comparando a coluna CustomerID das duas tabelas), e não Customers.CustomerID = Orders.OrderID como afirma o item. O erro está em trocar Orders.CustomerID por Orders.OrderID.
A cláusula ON em um JOIN define o predicado de junção, ou seja, a condição que determina quais linhas das duas tabelas serão combinadas. No comando apresentado, a intenção é relacionar cada cliente aos seus pedidos, o que exige comparar a chave estrangeira CustomerID da tabela Orders com a chave primária CustomerID da tabela Customers. O OrderID é a chave primária da tabela Orders e identifica o pedido, não o cliente — compará-lo com o CustomerID de Customers não faz sentido lógico e não produziria o relacionamento desejado.
O LEFT OUTER JOIN (ou LEFT JOIN) retorna todas as linhas da tabela à esquerda (Customers) e as linhas correspondentes da tabela à direita (Orders) quando a condição de junção é satisfeita. Quando não há correspondência, as colunas da tabela à direita são preenchidas com NULL. A condição de junção é o que define essa correspondência, e ela deve comparar colunas que representam o mesmo conceito (no caso, o identificador do cliente).
Na prática, se a condição fosse Customers.CustomerID = Orders.OrderID, o banco tentaria encontrar pedidos cujo OrderID fosse igual ao CustomerID do cliente — um critério arbitrário e incorreto, que não reflete o relacionamento real entre as tabelas. O resultado seria, na melhor das hipóteses, um conjunto vazio ou combinações sem sentido.
A pegadinha da banca está em trocar sutilmente a coluna CustomerID por OrderID na condição de junção. O candidato que lê rapidamente pode não perceber a diferença e marcar como certo, mas a comparação correta é sempre entre as colunas que representam a mesma entidade (o cliente).
NÃO CAIA NESSA!
A banca troca Orders.CustomerID por Orders.OrderID na condição de junção. O OrderID é a chave primária da tabela Orders (identifica o pedido), enquanto o CustomerID é a chave estrangeira que referencia o cliente. A condição correta compara CustomerID com CustomerID — qualquer outra comparação não estabelece o relacionamento entre cliente e pedido.
Item — ❌ Errado
O item afirma que a cláusula ON especifica que o CustomerID da tabela Customers deve corresponder ao OrderID da tabela Orders. Isso está errado por dois motivos:
A coluna comparada está incorreta: a condição correta é Customers.CustomerID = Orders.CustomerID, pois ambas as colunas representam o identificador do cliente. O OrderID é a chave primária da tabela Orders e identifica o pedido, não o cliente.
O relacionamento lógico é quebrado: comparar CustomerID com OrderID não estabelece nenhuma relação semântica entre as tabelas. O LEFT JOIN retornaria todas as linhas de Customers, mas as colunas de Orders seriam NULL (ou combinações aleatórias), pois nenhum OrderID seria igual a um CustomerID na prática.
A cláusula ON está correta em sua função (definir a condição de junção), mas o item erra ao especificar a coluna OrderID em vez de CustomerID.