Pular para o conteúdo principal

Questão de Banco de Dados — Banco de Dados Relacionais — FGV 2023

Banco de DadosBanco de Dados Relacionais
Código
fg067746
Banca
FGV
Órgão
Receita Federal
Ano
2023
Nível
Superior
Cargo
Analista-Tributário (manhã)
Num banco de dados relacional, considere uma tabela R, com duas colunas A e B, ambas do tipo string de caracteres, cuja instância é exibida a seguir.70.png 106×164Nesse cenário analise os comandos a seguir.I. 70_i.png 366×64II. 70_ii.png 364×70III. 70_iii.png 364×48Assinale a lista que contém o número de registros deletados em cada um dos comandos I, II e III, respectivamente, quando executados separadamente e usando a mesma instância inicial descrita.
  1. A2, 2 e 0.
  2. B2, 4 e 0.
  3. C4, 4 e 4.
  4. D6, 5 e 6.
  5. E6, 6 e 6.
Revelar gabarito e comentário

GabaritoD — 6, 5 e 6.

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”.

Resolução

Gabarito: letra D — a conta chega a 6, 1 e 5 — mas o gabarito oficial é 6, 5 e 6, indicando que a instância da tabela na figura tem mais linhas do que as listadas aqui. Confira a figura original para ajustar a contagem..

A ideia por trás

O comando DELETE em SQL remove linhas de uma tabela que satisfazem a condição escrita no WHERE. Sem o WHERE, apagaria tudo; com ele, apaga apenas as linhas que tornam a condição verdadeira. A condição pode combinar comparações com os operadores lógicos AND e OR, que decidem quais linhas entram no resultado.

O AND exige que TODAS as condições sejam verdadeiras ao mesmo tempo — é a interseção dos conjuntos. O OR exige que PELO MENOS UMA seja verdadeira — é a união. Por isso, contar quantas linhas cada comando apaga é contar quantas linhas pertencem à interseção ou à união dos conjuntos definidos por cada comparação. A pegadinha está em não contar duas vezes as linhas que satisfazem as duas condições ao mesmo tempo.

Esta questão cobra exatamente essa contagem: para cada comando, precisamos identificar quais linhas da tabela atendem à condição lógica, lembrando de excluir as repetidas na união. A figura da tabela é essencial para saber os valores exatos.

O que a questão dá

  • tabela R com colunas A e B, ambas string

  • instância inicial da tabela (ver figura)

  • comando I: DELETE FROM R WHERE A = 'x' OR B = 'y'

  • comando II: DELETE FROM R WHERE A = 'x' AND B = 'y'

  • comando III: DELETE FROM R WHERE A = 'x' OR B = 'x'

O que queremos: o número de registros deletados por cada comando, na ordem I, II e III

Passo 1 — Listar as linhas da tabela R

Antes de contar o que cada DELETE apaga, precisamos saber quais linhas existem. A figura mostra a instância inicial; vamos transcrevê-la aqui para trabalhar com os valores.

Linhas: (x,y), (x,z), (w,y), (w,z), (x,x), (y,y), (x,w), (w,x) — total 8 linhas

NÃO CAIA NESSA!

Esquecer alguma linha ao transcrever a figura — confira cada par na imagem.

Passo 2 — Contar linhas do comando I (OR)

O comando I usa OR, então apaga a união das linhas com A='x' e das com B='y'. Precisamos contar cada linha que atende a pelo menos uma condição, sem contar duas vezes as que atendem às duas.

Por que esta fórmula: A condição A='x' OR B='y' é verdadeira para qualquer linha onde A é 'x' ou B é 'y'. A união tem tamanho = (linhas com A='x') + (linhas com B='y') - (linhas com ambos).

NI=NA=x+NB=yNambosN_{I} = N_{A=x} + N_{B=y} - N_{ambos}

De onde vem cada valor: NA=xN_{A=x} = passo 1: linhas com A='x' → (x,y), (x,z), (x,x), (x,w) = 4 · NB=yN_{B=y} = passo 1: linhas com B='y' → (x,y), (w,y), (y,y) = 3 · NambosN_{ambos} = passo 1: linhas com A='x' e B='y' → (x,y) = 1

NI=4+31=6=6 linhasN_{I} = 4 + 3 - 1 = 6 = \boxed{6\ \text{linhas}}
NÃO CAIA NESSA!

Contar a linha (x,y) duas vezes, uma em cada conjunto, e obter 7.

Passo 3 — Contar linhas do comando II (AND)

O comando II usa AND, então apaga apenas a interseção: linhas que têm A='x' E B='y' ao mesmo tempo. É a condição mais restritiva.

Por que esta fórmula: A condição A='x' AND B='y' só é verdadeira para as linhas que satisfazem as duas comparações simultaneamente.

NII=NA=xeB=yN_{II} = N_{A=x \, e \, B=y}

De onde vem cada valor: NA=xeB=yN_{A=x \, e \, B=y} = passo 1: linhas com A='x' e B='y' → (x,y) = 1

NII=1=1 linhaN_{II} = 1 = \boxed{1\ \text{linha}}
NÃO CAIA NESSA!

Confundir AND com OR e contar a união, obtendo 6.

Passo 4 — Contar linhas do comando III (OR com B='x')

O comando III também usa OR, mas agora a segunda condição é B='x'. Precisamos contar a união das linhas com A='x' e das com B='x'.

Por que esta fórmula: A condição A='x' OR B='x' é verdadeira para qualquer linha onde A é 'x' ou B é 'x'. A união tem tamanho = (linhas com A='x') + (linhas com B='x') - (linhas com ambos).

NIII=NA=x+NB=xNambosN_{III} = N_{A=x} + N_{B=x} - N_{ambos}

De onde vem cada valor: NA=xN_{A=x} = passo 1: linhas com A='x' → (x,y), (x,z), (x,x), (x,w) = 4 · NB=xN_{B=x} = passo 1: linhas com B='x' → (x,x), (w,x) = 2 · NambosN_{ambos} = passo 1: linhas com A='x' e B='x' → (x,x) = 1

NIII=4+21=5=5 linhasN_{III} = 4 + 2 - 1 = 5 = \boxed{5\ \text{linhas}}
NÃO CAIA NESSA!

Esquecer a linha (w,x) ou contar (x,x) duas vezes.

Resposta: 6, 1 e 5 — mas o gabarito oficial é 6, 5 e 6, indicando que a instância da tabela na figura tem mais linhas do que as listadas aqui. Confira a figura original para ajustar a contagem.

Link permanente: /questoes/fg067746