Questão nº 59
Questão de A definir · FGV TJ-SE Servidor 2023 (nº 59)
O administrador de banco de dados do TJSE deverá criar um script em MySQL para realizar a carga de dados da TABELA A para a TABELA B, considerando que:
• a TABELA A foi criada pelo script:
`CREATE TABLE a ( `
`id INT AUTO_INCREMENT PRIMARY KEY, `
`descricao VARCHAR(255) NOT NULL, `
`custo DECIMAL(10, 2), tipo CHAR(1), `
`CHECK (tipo IN ('A', 'B', 'C')) `
`); `
• a TABELA B foi criada pelo script:
`CREATE TABLE b ( `
`id INT AUTO_INCREMENT PRIMARY KEY, `
`descricao VARCHAR(255) NOT NULL, `
`custo DECIMAL(10, 2) NOT NULL, `
`tipo TINYINT, `
`CHECK (tipo IN (1,2,3)) `
`); `
• A TABELA A foi carregada e a coluna CUSTO possui valores NULOS.
O script para carregar os dados da TABELA A para a TABELA B é:
- AINSERT INTO b
SELECT \*
FROM a;
COMMIT; - BINSERT INTO b (id, descricao, custo, tipo)
SELECT id, descricao, custo, tipo
FROM a
WHERE custo is NOT NULL;
COMMIT; - C INSERT INTO b (id, descricao, custo, tipo)
SELECT id, descricao, custo, tipo
FROM a
WHERE custo is NOT NULL
AND tipo IN (1, 2, 3);
COMMIT; - DINSERT INTO b (id, descricao, custo, tipo)
SELECT id, descricao, COALESCE(custo, 0) as
custo,
CASE tipo
WHEN 'A' THEN 1
WHEN 'B' THEN 2
WHEN 'C' THEN 3
END AS tipo
FROM a;
COMMIT; (alternativa correta) - EINSERT INTO b (id, descricao, custo, tipo)
SELECT id, descricao, COALESCE(custo, 0) as
custo,
CASE tipo
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
WHEN 3 THEN 'C'
END AS tipo
FROM a;
COMMIT;
Resposta comentada
Gabarito Alternativa D
A transformação de dados em SQL é o processo de converter dados de um formato ou estrutura para outro, geralmente para que se ajustem aos requisitos de uma tabela de destino. Isso é crucial quando as tabelas de origem e destino têm tipos de dados, restrições (NOT NULL) ou valores diferentes para as mesmas colunas. Funções como COALESCE (para tratar valores NULL) e a estrutura CASE (para mapear valores) são ferramentas essenciais nesse processo.
(A) Incorreta: A cláusula SELECT * tenta inserir todas as colunas na ordem e tipo originais. A coluna custo na TABELA B é NOT NULL, mas na TABELA A pode ter valores NULL, o que causaria um erro. Além disso, a coluna tipo na TABELA A é CHAR ('A', 'B', 'C') e na TABELA B é TINYINT (1, 2, 3), o que geraria um erro de tipo ou violação de restrição.
(B) Incorreta: Esta alternativa tenta resolver o problema do custo NOT NULL usando WHERE custo IS NOT NULL. No entanto, essa abordagem descarta todas as linhas da TABELA A onde custo é NULL, em vez de transformar esses valores. Além disso, ela não resolve a incompatibilidade de tipo e valores da coluna tipo (CHAR vs. TINYINT).
(C) Incorreta: Esta alternativa agrava os problemas da alternativa B. Além de descartar linhas com custo IS NOT NULL, a condição AND tipo IN (1, 2, 3) na TABELA A (onde tipo é 'A', 'B', 'C') fará com que nenhuma linha seja selecionada, pois 'A', 'B', 'C' não são 1, 2 ou 3. Ou seja, nenhum dado seria inserido.
(D) Correta: Esta é a alternativa correta porque aborda todas as transformações necessárias:
COALESCE(custo, 0) as custo: Trata os valoresNULLda colunacustoda TABELA A, substituindo-os por0para satisfazer a restriçãoNOT NULLda TABELA B.CASE tipo WHEN 'A' THEN 1 WHEN 'B' THEN 2 WHEN 'C' THEN 3 END AS tipo: Transforma os valoresCHAR('A', 'B', 'C') da colunatipoda TABELA A nos valoresTINYINT(1, 2, 3) esperados pela TABELA B, garantindo a compatibilidade de tipo e a validade pela restriçãoCHECK.
(E) Incorreta: EmboraCOALESCE(custo, 0)esteja correto para a colunacusto, a lógica doCASEpara a colunatipoestá invertida. Ela tenta mapear valores numéricos (1, 2, 3) para caracteres ('A', 'B', 'C'), mas a colunatipoda TABELA A já contém os caracteres 'A', 'B', 'C'. Isso faria com que oCASEnão encontrasse nenhuma correspondência nosWHENe retornasseNULL(ou um erro de conversão), o que não é válido para a colunatipoda TABELA B que espera 1, 2 ou 3.
Fonte: FGV TJ-SE Servidor 2023 Analista Judiciário - Análise de Sistemas - Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.