ANC - Analista em Computação - Ênfase em Suporte de Banco de Dados
Considerando o sistema de banco de dados relacional PostgreSQL versão 14, em um banco de dados, existem duas tabelas, A e B, com alguns valores populados, conforme abaixo:Considere o resultado das duas seguintes queries em SQL: I. SELECT x FROM X UNION (SELECT y FROM Y LIMIT 1) II. SELECT x FROM X UNION SELECT y FROM Y LIMIT 1; Assinale a alternativa que representa o número de linhas resultantes das queries I e II, respectivamente.
A1 – 1.
B6 – 1.
C6 – 6.
D4 – 4.
E4 – 1.
Revelar gabarito e comentário▾
GabaritoE — 4 – 1.
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”.
UNION e LIMIT no PostgreSQL: precedência de operadores
Gabarito: letra E (4 – 1). A diferença entre as duas queries está na precedência do LIMIT: na query I, o LIMIT 1 está dentro de parênteses e se aplica apenas à subconsulta (SELECT y FROM Y LIMIT 1), enquanto na query II, sem parênteses, o LIMIT 1 se aplica ao resultado final do UNION. Como o UNION elimina duplicatas, a query I retorna 4 linhas (3 de X + 1 de Y, sem repetição) e a query II retorna apenas 1 linha (a primeira do resultado combinado).
O UNION é um operador de conjunto que combina os resultados de duas ou mais consultas, eliminando linhas duplicadas. Para que duas linhas sejam consideradas duplicadas, todos os valores das colunas selecionadas devem ser iguais. No PostgreSQL, o UNION (sem o ALL) faz uma ordenação implícita para remover duplicatas, o que pode impactar a ordem das linhas no resultado final.
O LIMIT é uma cláusula que restringe o número de linhas retornadas por uma consulta. A pegadinha clássica desta questão é a precedência de operadores: quando o LIMIT aparece após um UNION sem parênteses, ele se aplica ao resultado do UNION como um todo, e não apenas à última consulta. Para aplicar o LIMIT a uma consulta individual dentro do UNION, é necessário usar parênteses, como na query I.
Vamos analisar as duas queries com os dados da figura:
Query I:SELECT x FROM X UNION (SELECT y FROM Y LIMIT 1)
Aqui, o LIMIT 1 está dentro de parênteses, então ele se aplica apenas à subconsulta (SELECT y FROM Y LIMIT 1). Isso retorna apenas 1 linha de Y (por exemplo, o valor 1). O UNION então combina os 3 valores de X com esse 1 valor de Y, eliminando duplicatas. Como o valor 1 já existe em X, o resultado final tem 3 linhas (1, 2, 3) + 1 linha (4) = 4 linhas.
Query II:SELECT x FROM X UNION SELECT y FROM Y LIMIT 1
Sem parênteses, o LIMIT 1 se aplica ao resultado final do UNION. O UNION primeiro combina todos os valores de X e Y, eliminando duplicatas, resultando em {1, 2, 3, 4}. Depois, o LIMIT 1 restringe o resultado a apenas 1 linha (a primeira, que pode ser 1). Portanto, a query II retorna 1 linha.
A pegadinha aqui é que muitos candidatos aplicam o LIMIT apenas à última consulta do UNION na query II, mas a precedência correta no PostgreSQL é que o LIMIT se aplica ao resultado completo do UNION quando não há parênteses. Isso é uma armadilha clássica de precedência de operadores.
NÃO CAIA NESSA!
A banca explora a precedência do LIMIT em relação ao UNION. Na query II, sem parênteses, o LIMIT 1 se aplica ao resultado final do UNION, não apenas à última consulta. Muitos candidatos aplicam o LIMIT à última consulta, resultando em 4 linhas, mas o correto é 1 linha. Para aplicar o LIMIT a uma consulta individual, é necessário usar parênteses, como na query I.
Alternativa A — ❌ Incorreta
Afirma que ambas as queries retornam 1 linha. Isso está errado porque a query I retorna 4 linhas, pois o LIMIT 1 dentro de parênteses se aplica apenas à subconsulta de Y, e o UNION combina os 3 valores de X com 1 valor de Y, eliminando duplicatas. A query II retorna 1 linha, mas a query I não.
Alternativa B — ❌ Incorreta
Afirma que a query I retorna 6 linhas e a query II retorna 1 linha. Isso está errado porque a query I não retorna 6 linhas. O UNION elimina duplicatas, então mesmo que X tenha 3 linhas e Y tenha 4 linhas, o resultado combinado tem no máximo 4 linhas (1, 2, 3, 4). A query I retorna 4 linhas, não 6.
Alternativa C — ❌ Incorreta
Afirma que ambas as queries retornam 6 linhas. Isso está errado porque o UNION elimina duplicatas, então o resultado máximo é 4 linhas (1, 2, 3, 4). Além disso, a query II tem LIMIT 1, que restringe o resultado a 1 linha. Portanto, nenhuma das queries retorna 6 linhas.
Alternativa D — ❌ Incorreta
Afirma que ambas as queries retornam 4 linhas. Isso está errado porque a query II tem LIMIT 1 sem parênteses, que se aplica ao resultado final do UNION, restringindo a 1 linha. A query I retorna 4 linhas, mas a query II retorna 1 linha.
Alternativa E — ✅ Correta ⟵ GABARITO
Afirma que a query I retorna 4 linhas e a query II retorna 1 linha. Isso está correto. Na query I, o LIMIT 1 dentro de parênteses se aplica apenas à subconsulta de Y, resultando em 1 valor de Y, que combinado com os 3 valores de X via UNION (eliminando duplicatas) resulta em 4 linhas. Na query II, o LIMIT 1 sem parênteses se aplica ao resultado final do UNION, que tem 4 valores distintos, mas é restringido a 1 linha.