Considere a existência de uma tabela relacional N, com apenas uma coluna, intitulada numero, contendo os números inteiros de 1 até 100, um em cada linha, como ilustrada a seguir.
Como pode haver discrepâncias entre implementações da linguagem SQL, é dado que a função sqrt(x) retorna a raiz quadrada de x e que a expressão a % b retorna o resto da divisão inteira de a por b.
Este é a resultado produzido por um determinado script SQL que utiliza a tabela N, anteriormente descrita.
Abaixo, são apresentadas três versões para o referido script, não necessariamente corretas.
Sobre essas afirmativas, é correto afirmar que:
Anenhuma delas produz o resultado correto;
Bsomente l e ll produzem o resultado correto;
Csomente Il e Ill produzem o resultado correto;
Dsomente III produz o resultado correto;
Etodas produzem o resultado correto.
Revelar gabarito e comentário▾
GabaritoE — todas produzem o resultado correto.
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: produto cartesiano e filtro de desigualdade
Gabarito: letra E. As três versões do script produzem o mesmo resultado correto, pois todas realizam o produto cartesiano da tabela N com ela mesma e filtram as linhas em que os valores das duas colunas são diferentes, retornando 9.900 linhas. A chave está em reconhecer que n1.numero <> n2.numero exclui apenas os 100 pares em que os números são iguais, e que as três sintaxes são equivalentes para esse fim.
O problema central é entender o que acontece quando uma tabela é combinada consigo mesma em um JOIN sem condição de junção — o chamado produto cartesiano. A tabela N tem 100 linhas (números de 1 a 100). Ao fazer FROM N n1, N n2 (ou JOIN), o banco combina cada linha de n1 com cada linha de n2, gerando 100 × 100 = 10.000 combinações possíveis. Dessas, a condição WHERE n1.numero <> n2.numero (ou ON n1.numero <> n2.numero) mantém apenas os pares em que os números são diferentes. Para cada número de 1 a 100, existe exatamente um par em que ele aparece igual nos dois lados: (1,1), (2,2), ..., (100,100). São 100 pares eliminados. Portanto, o resultado tem 10.000 − 100 = 9.900 linhas.
Agora, o que muda entre as três versões? A primeira usa FROM N n1, N n2 WHERE n1.numero <> n2.numero — a sintaxe clássica de junção implícita com filtro no WHERE. A segunda usa FROM N n1 JOIN N n2 ON n1.numero <> n2.numero — a junção explícita com a condição no ON. A terceira usa FROM N n1 CROSS JOIN N n2 WHERE n1.numero <> n2.numero — o produto cartesiano explícito com filtro no WHERE. As três são maneiras equivalentes de expressar a mesma operação: combinar todas as linhas e depois selecionar aquelas em que os números diferem. Não há diferença semântica no resultado final, apenas na forma de escrever.
A pegadinha que a banca explora é justamente essa: o candidato pode achar que CROSS JOIN não aceita WHERE, ou que JOIN ... ON com desigualdade se comporta de forma diferente, ou que a sintaxe implícita com vírgula é obsoleta. Nenhuma dessas suposições é verdadeira. Todas as três produzem exatamente o mesmo conjunto de pares ordenados (a, b) com a ≠ b, totalizando 9.900 linhas. A ordem das linhas pode variar entre implementações, mas o conteúdo é idêntico.
Guarde o critério decisivo: o que importa é o conjunto de linhas retornado, não a sintaxe usada. Se todas as versões expressam o mesmo produto cartesiano com o mesmo filtro de desigualdade, o resultado é o mesmo. É exatamente nessa equivalência que as alternativas se dividem.
1100 × 100 = 10.000 pares
2Filtra n1.numero <> n2.numero
3Exclui 100 pares iguais
4Resultado: 9.900 linhas
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
Afirma que nenhuma das versões produz o resultado correto. Isso é falso, pois todas as três produzem o mesmo resultado de 9.900 linhas, como demonstrado. A alternativa tenta induzir o candidato a achar que alguma sintaxe está errada, mas todas são válidas e equivalentes.
Alternativa B — ❌ Incorreta
Afirma que somente I e II produzem o resultado correto, excluindo a III. A versão III, que usa CROSS JOIN com WHERE, também produz o resultado correto. O CROSS JOIN é exatamente o produto cartesiano, e o filtro no WHERE funciona da mesma forma que nas outras versões. Portanto, a III também está correta.
Alternativa C — ❌ Incorreta
Afirma que somente II e III produzem o resultado correto, excluindo a I. A versão I, com a sintaxe implícita FROM N n1, N n2 WHERE ..., é a forma clássica e totalmente válida de fazer a junção. Ela produz o mesmo resultado que as outras. Portanto, a I também está correta.
Alternativa D — ❌ Incorreta
Afirma que somente III produz o resultado correto, excluindo I e II. Como já visto, tanto a sintaxe implícita (I) quanto a junção explícita com ON (II) produzem o mesmo resultado correto. A alternativa D é claramente falsa.
Alternativa E — ✅ Correta ⟵ GABARITO
Afirma que todas as versões produzem o resultado correto. De fato, as três sintaxes — junção implícita com WHERE, junção explícita com ON e CROSS JOIN com WHERE — são equivalentes e retornam as 9.900 linhas esperadas. A alternativa E é a única que reconhece essa equivalência.
PEGA ESSA DICA!
Na prova, quando vir três versões de um mesmo SELECT, compare o conjunto de linhas que cada uma retorna, não a sintaxe. Se a condição de filtro é a mesma e o produto cartesiano é o mesmo, o resultado é idêntico. Desconfie de alternativas que excluem uma versão sem motivo técnico — a banca adora criar distratores baseados em diferenças superficiais de escrita.