{"subject_id":"3a3cc48d009981a2943ef78f1aa94f1c","topico":"SQL: DDL/DML/DQL/DCL/TCL, WHERE × HAVING, joins, NULL, subconsultas, views, janela","stems":["A INFRA S.A. decidiu implantar um ambiente corporativo de dados para consolidar informações de projetos ferroviários, rodoviários e hidroviários. Esse ambiente deverá integrar dados provenientes de sistemas legados, bases geoespaciais, relatórios técnicos e sistemas de acompanhamento físico-financeiro, suportando consultas analíticas complexas, operações transacionais e alto volume de dados históricos. A partir dessa situação hipotética, julgue os itens a seguir, relativos a modelagem de banco de dados, linguagem de manipulação de dados (DML) e otimização de performance em larga escala.","Acerca de otimização de desempenho de sistemas gerenciadores de banco de dados (SGBD) e de consultas SQL, julgue os itens subsequentes.","Considerando que os comandos precedentes tenham sido executados no PostgreSQL 14, julgue o item subsequente.","No que se refere à integração de sistemas, à arquitetura de software, aos testes de software e aos bancos de dados, julgue os itens subsecutivos.","Certa empresa especializada em seguros de vida privados decidiu modernizar seu sistema de informações com a utilização de um SGBD relacional, padrão SQL. Durante a reestruturação do banco de dados, a equipe de TI definiu um modelo com tabelas tais como CLIENTE, APOLICE, BENEFICIARIO e SINISTRO, com relacionamentos entre si. Um analista da equipe foi designado para realizar operações utilizando linguagens de definição (DDL), manipulação (DML) e consulta (DQL) de dados, com o objetivo de garantir a integridade e a eficiência na gestão de informações da seguradora. A respeito da situação hipotética apresentada e da linguagem SQL a ela relacionada, julgue os itens a seguir.","A respeito de linguagens de bancos de dados e administração de bancos de dados, julgue os itens subsequentes.","A seguir, são apresentadas as tabelas Pessoas, Processos e Partes que existem em um banco de dados: a primeira armazena dados acerca das pessoas envolvidas nos processos; a segunda armazena dados dos processos; e a terceira relaciona pessoas aos processos, com indicação do papel de cada uma (autor, réu, testemunha, etc.). Por fim, uma mesma pessoa pode estar envolvida em mais de um processo, e assumir diferentes papéis em cada um deles. Pessoas\n\nid_pessoa nome\n   101 João da Silva\n   102 Maria Souza\n   103 Carlos Pereira\n   104 Ana Lima\n\nProcessos id_processo numero_processo Partes\n\nid_parte id_processo id_pessoa tipo_parte\n    1 1 101 autor\n    2 1 102 réu\n    3 2 103 testemunha\n    4 4 104 réu\n    5 2 101 réu\n\nA partir das informações apresentadas, julgue o item que se segue.","A respeito de Flyway, PostgreSQL e H2 Database, julgue os próximos itens.","Julgue os itens seguintes, relativos aos conceitos de administração de dados.","Julgue os itens seguintes, relativos a RabbitMQ, PostgreSQL e Git.","Julgue os seguintes itens, que versam sobre administração de banco de dados.","Em relação a banco de dados, julgue os itens a seguir.","Julgue os itens seguintes, a respeito de H2 Database e de PostgreSQL.","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.\n\nCustomers\nCustomerID (INT) – identificador único do\ncliente\nCustomerName (VARCHAR) – nome do cliente\nOrders\nOrderID (INT) – identificador único do pedido\nCustomerID (INT) – identificador do cliente que\nfez o pedido\nOrderDate (DATE) – data do pedido\nSELECT Customers.CustomerName, Orders.OrderDate\nFROM Customers\nLEFT OUTER JOIN Orders\nON Customers.CustomerID = Orders.CustomerID;\n\nCom base nessas informações, julgue os itens subsequentes.","Julgue os itens subsequentes, com relação à linguagem de consulta estruturada (SQL).","Considerando trecho de código SQL precedente, julgue o seguinte item.","Julgue os itens que se seguem, em relação a banco de dados.","Considerando que os dados precedentes estejam armazenados em uma tabela no H2 Database chamada TABCIDADES, julgue os próximos itens.","Quanto a linguagens de consulta, julgue os próximos itens.","A figura a seguir representa um projeto de banco de dados para a análise de gastos em saúde por município e por hospital. A partir dessas informações, julgue os próximos itens.","A respeito de banco de dados, julgue os itens que se seguem.","Considerando a tabela precedente, que representa um banco de dados relacional ORACLE, julgue o próximo item.","Acerca de fundamentos dos bancos de dados relacionais, normalização, diagrama entidade-relacionamento e linguagem SQL, julgue os itens a seguir.","Uma loja pretende estruturar as informações de clientes e produtos em um banco de dados relacional. Os dados de clientes incluem ID do cliente, nome, endereço e telefone. Os dados de produtos incluem ID do produto, nome do produto, preço e quantidade em estoque. A empresa quer saber que produtos cada cliente comprou e em que quantidade, e os clientes que compraram determinado produto, em certo período. Com base na situação hipotética apresentada, julgue os seguintes itens.","Considerando a linguagem SQL, julgue os itens subsequentes.","Com base na tabela de nome vendas apresentada acima e nos conceitos de SQL, DLL e DML, julgue os próximos itens.","Considerando aspectos da análise de desempenho e otimização de consultas SQL, julgue os próximos itens.","A respeito de banco de dados, julgue os próximos itens.","Julgue os próximos itens, relativos a PostgreSQL e H2 Database.","Julgue os itens a seguir, relativos às tecnologias CSV e JSON, à Linguagem SQL e ao modelo CRISP-DM.","BIG DATA & ANALYTICS, BUSINESS INTELLIGENCE, INTELIGÊNCIA ARTIFICIAL, INTERNET DAS COISAS E NUVEM COMPUTACIONAL: I BIG DATA &ANALYTICS No que se refere a Big Data e analytics, julgue os itens a seguir.","A respeito de administração de dados e de bancos de dados, julgue os próximos itens.","Considerando as linguagens e os fundamentos de bancos de dados relacionais, julgue os itens subsequentes.","Com relação a SQL, julgue os próximos itens.","A respeito da linguagem de consulta SQL, julgue o próximo item.","A respeito de banco de dados, julgue os itens a seguir.","Em relação às linguagens de banco de dados SQL, DDL e DML, julgue os itens que se seguem.","Julgue os próximos itens, relativos a bancos de dados.","Julgue os itens a seguir, a respeito de arquitetura de dados, metadados e linguagens de bancos de dados.","Julgue os itens subsecutivos, a respeito da normalização de dados e da SQL (ANSI).","Tendo como referência as expressões SQL anteriores, julgue o item a seguir, a respeito de modelagem de dados e SQL.","Com relação aos componentes de um computador, aos barramentos de E/S, à aritmética computacional e à linguagem SQL, julgue os próximos itens.","No que se refere às características de um banco de dados relacional, julgue os itens que se seguem.","A respeito de banco de dados, julgue os itens subsequentes.","Com pertinência à linguagem SQL, julgue o item abaixo.","Em relação a projeto, modelagem e administração de banco de dados, julgue os itens subsequentes.","Julgue os próximos itens, a respeito de banco de dados.","Julgue os itens que se seguem, acerca dos conceitos de linguagem de consulta estruturada (SQL).","Julgue o item seguinte a respeito dos conceitos de administração de dados.","tabela1 tabela2 campo campo Considerando as tabela1 e tabela2 apresentadas, julgue os itens que se seguem, referentes a banco de dados.","Julgue os próximos itens, com relação à segurança e arquitetura de banco de dados e administração de dados e de banco de dados.","Quanto aos conceitos relativos à arquitetura de dados, julgue os itens a seguir.","Considerando os sistemas de gerenciamento de banco de dados (SGBD) e o Comitê Gestor da Internet no Brasil (CGIbr), julgue os itens seguintes.","Considerando a tabela Produto anterior, julgue o item a seguir.","Julgue o próximo item, referente à linguagem de manipulação de dados (DML).","Julgue o item abaixo, a respeito da linguagem SQL.","Nos itens que avaliarem conhecimentos de informática e(ou) tecnologia da informação informado o contrário, considere que todos os programas mencionados estão em configuração padrão e que não há restrições de Julgue os próximos itens, a respeito de conceitos básicos e noções de administração de banco de dados.","Julgue os itens subsequentes, referentes a otimização de bases de dados multidimensionais.","Julgue os itens que se seguem, a respeito de bancos de dados relacionais.","No que se refere à mineração de dados, julgue os itens que se seguem.","Julgue os itens a seguir, acerca dos conceitos de administração de banco de dados.","Acerca de bancos de dados relacionais, julgue os itens seguintes.","Julgue os itens subsecutivos, a respeito de administração de banco de dados.","Tendo como referência o modelo lógico precedente, julgue os itens a seguir.","Julgue os itens a seguir, referentes à modelagem de dados.","Com relação a banco de dados, julgue os itens seguintes.","Acerca dos conceitos de otimização de consultas SQL e técnicas de análise de desempenho, julgue os próximos itens.","Julgue os itens subsecutivos, a respeito de linguagem de definição e manipulação de dados.","Julgue os seguintes itens, relativos a métricas de qualidade de software, JUnit, SQL, Delphi e desenvolvimento mobile.","A respeito do Maven e do SQL, julgue os próximos itens.","Tendo como base o diagrama de entidade e relacionamento precedente, julgue o item a seguir.","A seguir, são apresentadas duas tabelas que estão relacionadas, em um diagrama entidade e relacionamento. tblprofessor codigo_professor: INTEGER NOT NULL [PK] nome_professor: VARCHAR (100) codigo_departamento: INTEGER [FK] tbldepartamento codigo_departamento: INTEGER NOT NULL [PK] nome_departamento: VARCHAR (100) chefe_departamento: INTEGER NOT NULL [FK] Tendo como base as informações precedentes, julgue o item a seguir.","Considerando o SGBD Postgresql, julgue o próximo item.","Com base nos comandos MySQL 5.6 precedentes, julgue os itens a seguir.","Acerca do Oracle 12C, julgue os próximos itens.","Julgue os itens que se seguem, a respeito do processamento de transações e otimização de desempenho do SGBD e de consultas SQL.","Com base no trecho de código apresentado para execução pelo SGBD MySQL, julgue o item a seguir.","Julgue os itens seguintes, acerca de linguagens e manipulação de um SGBD.","Julgue os itens subsequentes, acerca de segurança da informação de um SGBD e de um BI (Business Intelligence).","No que concerne à linguagem SQL, julgue os itens seguintes.","A respeito das principais instruções da linguagem SQL, julgue os itens subsecutivos.","No que concerne a banco de dados, julgue os itens a seguir.","Julgue os itens seguintes, acerca de comandos SQL.","Julgue o próximo item, relativo à linguagem de definição de dados (DDL).","Um banco de dados permite à aplicação o armazenamento e a recuperação de dados com eficiência, o que garante segurança e integridade das informações. No caso de banco de dados relacional, os dados são armazenados em tabelas e os relacionamentos entre elas as tornam relacionais. A esse respeito, julgue os itens que se seguem.","A respeito de tunning de bancos de dados, julgue os itens subsecutivos."],"questions":[{"id":"c104cbec4f1f","number":57,"stem":0,"statement":"Em consultas analíticas da INFRA S.A. que consolidam dados histórico-financeiros de diversos projetos, o uso de SELECT * tende a aumentar o consumo de memória e de E/S.","answer":"C","source":{"slug":"INFRASA_26_ANALISTA","ano":2026},"explanation":{"verdict_reason":"SELECT * traz todas as colunas, inclusive as que a consulta não usa: aumenta o volume lido do disco, os blocos trazidos para a memória e o tráfego até o cliente, além de impedir que a consulta seja atendida apenas pelo índice. Em consulta analítica sobre tabelas históricas largas o efeito é ainda maior.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Projetar só as colunas necessárias reduz E/S e memória","citation":null,"trap_note":"Item que constata o custo de uma prática reconhecidamente ruim tende a ser Certo. O que derruba, em desempenho, é a promessa de ganho garantido, não a constatação de custo."}},{"id":"a2085f32b05b","number":60,"stem":0,"statement":"No ambiente da INFRA S.A., a substituição de operações UPDATE por comandos DELETE seguidos de INSERT garantiria melhor desempenho em atualizações massivas de contratos.","answer":"E","source":{"slug":"INFRASA_26_ANALISTA","ano":2026},"explanation":{"verdict_reason":"Trocar UPDATE por DELETE seguido de INSERT faz o SGBD executar duas operações, gravar dois conjuntos de registros de log e manter todos os índices duas vezes, além de descartar e recriar as linhas; o UPDATE altera apenas as colunas atingidas. Não há garantia de ganho e, em atualização massiva, o resultado usual é perda de desempenho.","distortion_type":"generalizacao","distorted_span":"garantiria melhor desempenho em atualizações massivas de contratos","corrected_statement":"No ambiente da INFRA S.A., a substituição de operações UPDATE por comandos DELETE seguidos de INSERT não garantiria melhor desempenho em atualizações massivas de contratos.","concept":"UPDATE × DELETE mais INSERT: duas operações custam mais log e mais índice","citation":null,"trap_note":"Verbo de garantia em item de desempenho — garante, assegura, sempre melhora — quase nunca se sustenta: desempenho depende de volume, índices e plano de execução."}},{"id":"fae433d983ce","number":32,"stem":1,"statement":"Ao ser executado, o comando SELECT * FROM PROCESSO LIMIT 10 OFFSET 5 apresenta cinco registros como resultado máximo, obtidos a partir do sexto registro da tabela.","answer":"E","source":{"slug":"TCE_RS_25","ano":2025},"explanation":{"verdict_reason":"LIMIT fixa a quantidade máxima de linhas devolvidas e OFFSET, quantas são descartadas antes: LIMIT 10 OFFSET 5 pula as cinco primeiras e devolve até dez, começando pela sexta. A parte final do item está certa; o máximo é dez, não cinco.","distortion_type":"numero_errado","distorted_span":"apresenta cinco registros como resultado máximo","corrected_statement":"Ao ser executado, o comando SELECT * FROM PROCESSO LIMIT 10 OFFSET 5 apresenta dez registros como resultado máximo, obtidos a partir do sexto registro da tabela.","concept":"LIMIT é a quantidade devolvida; OFFSET é o salto inicial","citation":null,"trap_note":"Os dois números do LIMIT e do OFFSET são fáceis de trocar: OFFSET n começa no registro n+1 e LIMIT m limita a m linhas. A banca troca o papel dos dois e mantém a outra metade correta."}},{"id":"f1c64cf2d47f","number":62,"stem":2,"statement":"Suponha que, no mesmo banco de dados e imediatamente após a execução dos comandos apresentados, tenha sido executado o código SQL a seguir.\n\nWITH RECURSIVE processop AS (\n    SELECT idproc, descricao, referencia\n    FROM processos\n    WHERE referencia IS NOT NULL\n    UNION ALL\n    SELECT p.idproc, p.descricao, p.referencia\n    FROM processos p\n    INNER JOIN processop pp ON p.referencia =\npp.idproc\n)\nSELECT distinct\n    idproc,\n    descricao,\n    (SELECT descricao FROM processos WHERE\nidproc = processop.referencia) AS\ndescricao_pai\nFROM processop\nORDER BY idproc;\n\nNessa situação hipotética, após as referidas ações, será apresentado o resultado a seguir.","answer":"C","source":{"slug":"TJ_PA_25_SERVIDOR","ano":2025},"explanation":{"verdict_reason":"A âncora da CTE recursiva seleciona apenas as linhas com referencia IS NOT NULL, o que exclui a raiz Gabinete e deixa os processos 2, 3 e 4. A parte recursiva reencontra 3 e 4 por caminhos mais longos, mas o SELECT DISTINCT colapsa as repetições geradas pelo UNION ALL. Restam três linhas, ordenadas por idproc, cada uma com a descrição do pai obtida pela subconsulta escalar.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"CTE recursiva: âncora, parte recursiva e DISTINCT","citation":null,"trap_note":"Em WITH RECURSIVE, leia primeiro o filtro da âncora: ele define quem entra na hierarquia. Um IS NOT NULL ali quase sempre significa que a raiz ficou de fora."}},{"id":"e1bb904fbe3b","number":68,"stem":3,"statement":"O padrão MVC (model-view-controller) obriga que a visão (view) execute diretamente as operações de acesso e manipulação dos dados armazenados no banco de dados.","answer":"E","source":{"slug":"STM_25","ano":2025},"explanation":{"verdict_reason":"No padrão MVC o acesso e a manipulação dos dados cabem ao modelo; a visão apenas apresenta ao usuário o que recebe, e o controlador faz a mediação entre os dois. A separação de responsabilidades é justamente o que o padrão existe para impor, e não há obrigação alguma no sentido inverso.","distortion_type":"atribuicao_errada","distorted_span":"obriga que a visão (view) execute diretamente as operações de acesso e manipulação dos dados","corrected_statement":"O padrão MVC (model-view-controller) atribui ao modelo (model) as operações de acesso e manipulação dos dados armazenados no banco de dados.","concept":"No MVC o modelo acessa os dados, não a visão","citation":null,"trap_note":"Não confunda a view do MVC com a view do banco de dados: a primeira é a camada de apresentação, a segunda é uma tabela virtual. A banca aproxima os dois sentidos no mesmo bloco de itens."}},{"id":"2702ce51902b","number":70,"stem":4,"statement":"O comando UPDATE pode ser utilizado para alterar a definição de colunas em uma tabela, como o tipo de dado de uma coluna data_nascimento, por exemplo, substituindo VARCHAR por DATE.","answer":"E","source":{"slug":"SUSEP_25","ano":2025},"explanation":{"verdict_reason":"UPDATE é comando de manipulação: altera valores gravados nas linhas, uma coluna por vez, dentro do tipo já declarado. Mudar o tipo de dado de uma coluna é alteração de estrutura e se faz por ALTER TABLE, comando de definição de dados.","distortion_type":"atribuicao_errada","distorted_span":"O comando UPDATE pode ser utilizado para alterar a definição de colunas em uma tabela","corrected_statement":"O comando ALTER TABLE pode ser utilizado para alterar a definição de colunas em uma tabela, como o tipo de dado de uma coluna data_nascimento, por exemplo, substituindo VARCHAR por DATE.","concept":"UPDATE muda valores; ALTER TABLE muda definição","citation":null,"trap_note":"Pergunte se o comando mexe no conteúdo ou no molde. Conteúdo é DML, molde é DDL, e a banca costuma atribuir ao UPDATE tarefas do ALTER TABLE."}},{"id":"6f3a7db6733a","number":71,"stem":4,"statement":"A DQL é capaz de realizar agrupamentos e agregações por meio de funções como SUM, COUNT e GROUP BY, sendo possível, por exemplo, calcular o número de apólices por cidade.","answer":"C","source":{"slug":"SUSEP_25","ano":2025},"explanation":{"verdict_reason":"Quando o enunciado separa DQL das demais sublinguagens, ela é a do SELECT e de tudo o que o acompanha, incluindo GROUP BY e as funções de agregação SUM, COUNT, AVG, MIN e MAX. Contar apólices por cidade é exatamente um SELECT com COUNT e GROUP BY.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DQL abrange agregação e agrupamento","citation":null,"trap_note":"GROUP BY não é uma sublinguagem à parte: é cláusula do SELECT. Tudo o que pende do SELECT permanece na consulta de dados."}},{"id":"d098bf125fa3","number":72,"stem":4,"statement":"Para recuperar os nomes de todos os beneficiários vinculados a apólices ativas, usa-se a DQL com cláusulas como INNER JOIN e WHERE, classificando-se tal operação como consulta de dados.","answer":"C","source":{"slug":"SUSEP_25","ano":2025},"explanation":{"verdict_reason":"INNER JOIN e WHERE são cláusulas do SELECT: a primeira combina as linhas de apólices e beneficiários pela chave que as relaciona, a segunda restringe às apólices ativas. A instrução apenas recupera dados, sem alterá-los, e é por isso classificada como consulta.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Junção e filtro são operações de consulta","citation":null,"trap_note":"Nenhuma cláusula do SELECT muda a classificação do comando. Junção, filtro, agrupamento e ordenação continuam sendo consulta de dados."}},{"id":"fb763eaa62ba","number":74,"stem":4,"statement":"O comando SELECT nome, idade FROM CLIENTE; pertence à DML, pois consulta os dados armazenados no banco para eventual tomada de decisão.","answer":"E","source":{"slug":"SUSEP_25","ano":2025},"explanation":{"verdict_reason":"O enunciado deste caderno separa expressamente definição, manipulação e consulta, e nessa divisão o SELECT é o comando da DQL. A DML fica restrita a INSERT, UPDATE e DELETE, que modificam os dados; o SELECT apenas os recupera.","distortion_type":"troca_de_termo","distorted_span":"pertence à DML","corrected_statement":"O comando SELECT nome, idade FROM CLIENTE; pertence à DQL, pois consulta os dados armazenados no banco para eventual tomada de decisão.","concept":"SELECT pertence à DQL quando o item distingue DQL de DML","citation":null,"trap_note":"A classificação do SELECT depende da divisão adotada pelo próprio item. Se o enunciado cita DQL, o SELECT é DQL; se o enunciado só opõe DDL e DML, o SELECT é DML."}},{"id":"7ec67de06663","number":75,"stem":4,"statement":"A criação de uma view que exiba o total de sinistros por cliente é considerada operação de DML, pois envolve a estrutura lógica do banco.","answer":"E","source":{"slug":"SUSEP_25","ano":2025},"explanation":{"verdict_reason":"A própria justificativa do item entrega a classificação correta: envolver a estrutura lógica do banco é característica da DDL, não da DML. CREATE VIEW cria um objeto no esquema e se enquadra, com CREATE, ALTER e DROP, na linguagem de definição de dados, ainda que a consulta que define a view seja um SELECT.","distortion_type":"troca_de_termo","distorted_span":"é considerada operação de DML","corrected_statement":"A criação de uma view que exiba o total de sinistros por cliente é considerada operação de DDL, pois envolve a estrutura lógica do banco.","concept":"CREATE VIEW é DDL","citation":null,"trap_note":"O verbo CREATE define a sublinguagem, não o conteúdo do objeto criado. Uma view feita de SELECT continua sendo criada por DDL."}},{"id":"75c924c843ca","number":77,"stem":5,"statement":"Em um banco de dados relacional, os comandos SELECT e UPDATE fazem parte da DML (data manipulation language).","answer":"C","source":{"slug":"TELEBRAS_25","ano":2025},"explanation":{"verdict_reason":"Na divisão clássica das sublinguagens do SQL, a DML compreende as operações sobre os dados armazenados: SELECT, INSERT, UPDATE e DELETE. SELECT e UPDATE estão, portanto, corretamente classificados como comandos de manipulação de dados.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"SELECT e UPDATE como comandos de DML","citation":null,"trap_note":"A CEBRASPE aceita o SELECT como DML quando o item usa a divisão em duas partes, DDL e DML. Só quando o próprio enunciado introduz a DQL é que o SELECT passa a ser exigido como DQL. Leia o enunciado antes de escolher a sigla."}},{"id":"8eff7eec5a50","number":78,"stem":6,"statement":"A execução da consulta SQL a seguir listará todos os processos, inclusive aqueles que ainda não têm partes associadas, e exibirá o nome das pessoas e os seus respectivos papéis nos processos em que estão envolvidas.\n\nSELECT p.numero_processo, ps.nome,\npa.tipo_parte\nFROM Processos p\nLEFT JOIN Partes pa ON p.id_processo =\npa.id_processo\nLEFT JOIN Pessoas ps ON pa.id_pessoa =\nps.id_pessoa","answer":"C","source":{"slug":"MP_CE_25_SERVIDOR","ano":2025},"explanation":{"verdict_reason":"O LEFT JOIN preserva todas as linhas da tabela à esquerda mesmo sem correspondência à direita, preenchendo as colunas da direita com NULL. Como Processos está à esquerda do primeiro LEFT JOIN, processos sem partes continuam na saída. O segundo LEFT JOIN é igualmente necessário: se fosse INNER JOIN com Pessoas, as linhas estendidas com NULL geradas no primeiro join seriam descartadas e os processos sem partes sumiriam.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"LEFT JOIN preserva a tabela à esquerda","citation":null,"trap_note":"Em cadeias de junção externa, leia da esquerda para a direita: basta um INNER JOIN no meio da cadeia para anular a preservação obtida no join anterior."}},{"id":"67620301381b","number":90,"stem":7,"statement":"Considere que os comandos a seguir tenham sido executados no PostgreSQL 14.18.\n\nCREATE TABLE IF NOT EXISTS public.servidor\n(idServidor INT GENERATED BY DEFAULT AS\nIDENTITY PRIMARY KEY,\nnome VARCHAR(30));\nCREATE TABLE IF NOT EXISTS public.magistrado\n(idServidor INT GENERATED BY DEFAULT AS\nIDENTITY PRIMARY KEY,\nmatricula int)\nINHERITS (public.servidor);\nINSERT INTO public.servidor (nome)\nVALUES ('Pedro'), ('João');\nINSERT INTO public.magistrado (nome)\nVALUES ('Maria');\nSELECT * FROM public.servidor;\n\nNesse caso, o comando SELECT * FROM public.servidor; apresentará, ao ser executado, o resultado a seguir.\n\nidServidor | nome\n-----------+-------\n         1 | Pedro\n         2 | João\n         3 | Maria\n-----------+-------","answer":"E","source":{"slug":"STM_25","ano":2025},"explanation":{"verdict_reason":"Cada coluna de identidade é servida por uma sequência própria da sua tabela, e magistrado declara a sua. A inserção feita na tabela filha não avança o contador da tabela pai, de modo que a linha de Maria não recebe o valor seguinte ao de João. O conteúdo exibido está certo quanto às linhas, pois SELECT em uma tabela pai do PostgreSQL inclui as linhas das tabelas descendentes, mas não quanto ao identificador atribuído.","distortion_type":"numero_errado","distorted_span":"         3 | Maria","corrected_statement":"idServidor | nome\n-----------+-------\n         1 | Pedro\n         2 | João\n         1 | Maria","concept":"Cada tabela tem sua própria sequência de identidade","citation":null,"trap_note":"Herança no PostgreSQL compartilha colunas e a visibilidade das linhas, nunca o contador de sequência. Quando o item exibe uma numeração contínua entre tabela pai e filha, desconfie do número antes de desconfiar das linhas."}},{"id":"b813e0812d39","number":109,"stem":8,"statement":"O resultado de um produto cartesiano em um banco de dados relacional terá todos os atributos de todas as relações na cláusula de FROM.","answer":"C","source":{"slug":"FUB_25","ano":2025},"explanation":{"verdict_reason":"O produto cartesiano combina cada linha de uma relação com todas as da outra, e o esquema do resultado é a concatenação dos esquemas: todos os atributos de todas as relações citadas no FROM aparecem. O que se multiplica é a quantidade de linhas, não a de colunas.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Produto cartesiano concatena os esquemas das relações","citation":null,"trap_note":"Separe as duas contas e o tópico inteiro fica fácil: colunas somam, linhas multiplicam. Vale para o produto cartesiano e para qualquer junção."}},{"id":"3f26b5b19f6f","number":110,"stem":8,"statement":"O comando SQL MODIFY é utilizado para alterar tabelas de um SGBD.","answer":"E","source":{"slug":"FUB_25","ano":2025},"explanation":{"verdict_reason":"Não existe comando MODIFY na SQL: a alteração da estrutura da tabela é feita por ALTER TABLE. MODIFY aparece apenas como cláusula dentro dessa instrução, em produtos como o Oracle, na forma ALTER TABLE seguida de MODIFY para alterar a definição de uma coluna.","distortion_type":"troca_de_termo","distorted_span":"O comando SQL MODIFY","corrected_statement":"O comando SQL ALTER TABLE é utilizado para alterar tabelas de um SGBD.","concept":"ALTER TABLE altera tabelas; MODIFY é apenas uma cláusula dele","citation":null,"trap_note":"Comando inventado, ou cláusula promovida a comando, é recorrente neste tópico. Verifique se a palavra é o verbo da instrução ou só uma parte dela."}},{"id":"a7b3fa197241","number":112,"stem":8,"statement":"A execução do código SQL a seguir retornará 10.\n\nCREATE TABLE TABELA (a integer);\nINSERT INTO TABELA VALUES (null);\nSELECT a+10 FROM TABELA;","answer":"E","source":{"slug":"FUB_25","ano":2025},"explanation":{"verdict_reason":"O valor inserido é nulo, e nulo não é zero: qualquer expressão aritmética com um operando nulo devolve nulo, de modo que a+10 resulta em nulo. Para obter 10 seria preciso tratar a ausência de valor, por exemplo com COALESCE(a,0)+10.","distortion_type":"excecao_omitida","distorted_span":"A execução do código SQL a seguir retornará 10.","corrected_statement":"A execução do código SQL a seguir retornará nulo.","concept":"Aritmética com NULL devolve NULL","citation":null,"trap_note":"Nulo é ausência de valor, não zero nem cadeia vazia: propaga-se em toda conta, não se compara nem consigo mesmo — por isso IS NULL — e só é neutralizado por COALESCE, NVL ou equivalente."}},{"id":"dce7031e9449","number":116,"stem":9,"statement":"Considere que os seguintes comandos tenham sido executados no PostgreSQL 14.18.\n\nCREATE TABLE veiculo (\n    id SERIAL PRIMARY KEY,\n    nome VARCHAR(50) NOT NULL);\nCREATE TABLE carro (\n    placa VARCHAR(7) UNIQUE NOT NULL)\nINHERITS (veiculo);\nINSERT INTO veiculo (nome)\nVALUES ('Bicicleta');\nINSERT INTO carro (nome, placa)\nVALUES ('Tesla Model Y', 'Y1357'), ('BMW\nX6','W6789');\nSELECT * FROM veiculo;\n\nNesse caso, o comando SELECT * FROM veiculo; apresentará, ao ser executado, o resultado a seguir.\n\n id | nome\n----+-----------\n  1 | Bicicleta","answer":"E","source":{"slug":"STM_25","ano":2025},"explanation":{"verdict_reason":"Com INHERITS, a tabela filha herda as colunas da mãe e suas linhas passam a ser visíveis também nas consultas feitas à tabela mãe. SELECT * FROM veiculo devolve, portanto, três linhas: a bicicleta e os dois carros, cujos identificadores vêm da mesma sequência criada pelo SERIAL. Para ver apenas as linhas próprias da tabela mãe seria preciso escrever SELECT * FROM ONLY veiculo.","distortion_type":"excecao_omitida","distorted_span":" id | nome\n----+-----------\n  1 | Bicicleta","corrected_statement":"Nesse caso, o comando SELECT * FROM veiculo; apresentará, ao ser executado, três linhas: Bicicleta, Tesla Model Y e BMW X6.","concept":"Herança no PostgreSQL: a tabela mãe enxerga as linhas das filhas, salvo ONLY","citation":"PostgreSQL, documentação: herança de tabelas (INHERITS) e a palavra-chave ONLY","trap_note":"Sempre que um item do PostgreSQL mostrar o resultado de um SELECT sobre tabela que tem filhas, procure a palavra ONLY: sem ela, as linhas das filhas entram no resultado."}},{"id":"436a12ab9309","number":116,"stem":10,"statement":"A cláusula HAVING opera em um único conjunto de dados de entrada, sem agregação.","answer":"E","source":{"slug":"FUB_25","ano":2025},"explanation":{"verdict_reason":"O HAVING só existe depois da agregação: atua sobre os grupos formados pelo GROUP BY, ou sobre o grupo único que a agregação sem GROUP BY produz, e compara resultados de funções de agregação. Operar sobre um único conjunto de entrada, linha a linha e sem agregação, é o comportamento do WHERE.","distortion_type":"atribuicao_errada","distorted_span":"opera em um único conjunto de dados de entrada, sem agregação","corrected_statement":"A cláusula HAVING opera sobre os grupos resultantes da agregação.","concept":"HAVING é filtro posterior à agregação","citation":null,"trap_note":"A chave de todo item de WHERE × HAVING é a mesma: antes ou depois do GROUP BY. Descrição que dispensa agregação é sempre do WHERE."}},{"id":"4d8b323cafe9","number":117,"stem":10,"statement":"Considere que os comandos SQL a seguir tenham sido executados de forma bem-sucedida.\n\nCREATE TABLE TABELA_TESTE (a integer, b varchar);\nINSERT INTO TABELA_TESTE (a) VALUES (5);\nINSERT INTO TABELA_TESTE (b) VALUES ('FUB');\nINSERT INTO TABELA_TESTE (a) VALUES (7);\n\nNessa situação, o resultado da execução da consulta SELECT COUNT(a), AVG(a) FROM TABELA_TESTE; será o apresentado a seguir.\n\ncount | avg\n------+-----\n  3 4","answer":"E","source":{"slug":"FUB_25","ano":2025},"explanation":{"verdict_reason":"O segundo INSERT preenche apenas a coluna b, deixando a em nulo. COUNT(a) conta somente os valores não nulos da coluna e devolve 2, e não 3, que seria o resultado de COUNT(*); AVG(a) soma 5 e 7 e divide por 2, resultando 6. O valor 4 sai de dividir por três, tratando o nulo como zero, que é justamente o que a agregação não faz.","distortion_type":"excecao_omitida","distorted_span":"count | avg\n------+-----\n  3 4","corrected_statement":"Nessa situação, o resultado da execução da consulta SELECT COUNT(a), AVG(a) FROM TABELA_TESTE; será count igual a 2 e avg igual a 6.","concept":"Funções de agregação ignoram nulos; COUNT(*) não","citation":null,"trap_note":"Em todo item de agregação com nulo faça duas contas: COUNT(coluna) ignora nulos e COUNT(*) não; AVG divide pela quantidade de valores não nulos, nunca pelo total de linhas."}},{"id":"4c277aabaa9e","number":51,"stem":11,"statement":"Os índices em um banco de dados melhoram o desempenho das operações de leitura, mas podem aumentar os custos de armazenamento e impactar negativamente as operações de escrita.","answer":"C","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"O índice é uma estrutura auxiliar ordenada que reduz o número de blocos lidos na consulta, mas ocupa espaço próprio e precisa ser mantido a cada INSERT, UPDATE ou DELETE — custo que recai sobre a escrita. O item enuncia os dois lados dessa troca.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Índice troca espaço e custo de escrita por desempenho de leitura","citation":null,"trap_note":"Item que reconhece o custo ao lado do benefício costuma ser Certo. O falso é o que promete ganho sem contrapartida ou que nega o custo de manutenção do índice."}},{"id":"1e9d927ebf12","number":54,"stem":12,"statement":"CREATE TABLE cidade (\n\n  nome varchar(40),\n  codigo int );\nCREATE TABLE capital (\n  UF char(2) UNIQUE NOT NULL\n) #XPTO (cidade);\ninsert into capital values ('Brasília', 22,\n'DF');\nselect * from capital;\n\nNo script precedente, desenvolvido em SQL no PostgreSQL, a substituição dos caracteres #XPTO por References fará que a execução do script apresente o seguinte resultado.\n\nCREATE TABLE\nCREATE TABLE\nINSERT 0 1\n   nome | codigo | uf\n----------+--------+----\n Brasília | 22 | DF\n(1 row)","answer":"E","source":{"slug":"CPNUJE_24","ano":2024},"explanation":{"verdict_reason":"REFERENCES é cláusula de chave estrangeira aplicada a uma coluna; não aparece depois do fecho de parênteses da definição da tabela nem faz a tabela herdar colunas. O resultado exibido, em que capital passa a ter nome e codigo além de UF, é o da herança de tabelas do PostgreSQL, obtida com INHERITS (cidade).","distortion_type":"troca_de_termo","distorted_span":"a substituição dos caracteres #XPTO por References","corrected_statement":"No script precedente, desenvolvido em SQL no PostgreSQL, a substituição dos caracteres #XPTO por INHERITS fará que a execução do script apresente o seguinte resultado.","concept":"INHERITS herda colunas; REFERENCES declara chave estrangeira","citation":"PostgreSQL, documentação: cláusula INHERITS do CREATE TABLE","trap_note":"Quando o resultado mostrado tiver mais colunas do que a tabela declarou, a cláusula que falta é de herança, não de integridade referencial."}},{"id":"c48fee773a67","number":56,"stem":13,"statement":"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.","answer":"E","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"A condição da junção iguala a chave primária CustomerID de Customers à chave estrangeira CustomerID de Orders, como o próprio código exibe; OrderID é a chave primária do pedido e não guarda relação com o cliente. O papel atribuído ao ON está certo, mas as colunas comparadas estão erradas.","distortion_type":"troca_de_termo","distorted_span":"deve corresponder ao OrderID da tabela Orders","corrected_statement":"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 CustomerID da tabela Orders.","concept":"A junção casa chave primária com chave estrangeira","citation":null,"trap_note":"Confira o nome da coluna do ON contra o código exibido: a banca troca a chave estrangeira pela chave primária da própria tabela filha, cujo nome é parecido."}},{"id":"c027b6fa98d6","number":57,"stem":13,"statement":"A consulta retorna uma lista com o nome de todos os clientes e a data do pedido que eles fizeram, e mostra NULL na coluna data do pedido para os clientes que não possuem pedido.","answer":"C","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"O LEFT OUTER JOIN preserva todas as linhas da tabela à esquerda: todo cliente aparece, e o cliente sem pedido correspondente recebe nulo nas colunas vindas de Orders, aqui OrderDate. Esse preenchimento por nulos é o que caracteriza a junção externa.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Junção externa preenche com NULL o lado sem correspondência","citation":null,"trap_note":"Nulo na coluna do lado direito é a assinatura do LEFT JOIN, e é também o motivo de filtrar essa coluna no WHERE anular o efeito da junção externa, convertendo-a em INNER JOIN."}},{"id":"4d82340df635","number":59,"stem":14,"statement":"O comando HAVING é usado para unir duas ou mais tabelas.","answer":"E","source":{"slug":"MP_TO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"Unir tabelas é função das cláusulas de junção (JOIN, ou a condição de igualdade no WHERE). O HAVING filtra grupos já formados pelo GROUP BY, aplicando condições sobre funções de agregação: é um filtro posterior à agregação, não um operador de junção.","distortion_type":"atribuicao_errada","distorted_span":"é usado para unir duas ou mais tabelas","corrected_statement":"O comando HAVING é usado para filtrar os grupos formados pelo GROUP BY.","concept":"HAVING filtra grupos; JOIN une tabelas","citation":null,"trap_note":"Fixe a ordem lógica: FROM e JOIN unem, WHERE filtra linhas, GROUP BY agrupa, HAVING filtra grupos, SELECT projeta, ORDER BY ordena. Item que dá a uma cláusula o papel de outra da cadeia cai só com essa ordem."}},{"id":"b8792256b2f4","number":60,"stem":14,"statement":"O comando TRUNCATE é usado para remover todas as linhas de uma tabela.","answer":"C","source":{"slug":"MP_TO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"TRUNCATE TABLE remove de uma vez todas as linhas da tabela, preservando a estrutura, e por não registrar a exclusão linha a linha costuma ser bem mais rápido que o DELETE sem WHERE. O item descreve apenas esse efeito.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"TRUNCATE remove todas as linhas e mantém a tabela","citation":null,"trap_note":"O par a vigiar é DELETE × TRUNCATE: o DELETE aceita WHERE e apaga linha a linha; o TRUNCATE não aceita filtro e esvazia a tabela inteira."}},{"id":"6e724c8aac7e","number":63,"stem":15,"statement":"O retorno do comando apresentado será necessariamente uma lista de todos os itens da tabela Produtos, ordenados pelo campo Preco, do menor valor para o maior valor.","answer":"E","source":{"slug":"TRF6_24","ano":2024},"explanation":{"verdict_reason":"O comando exibido não tem ORDER BY, e sem essa cláusula o SGBD não garante ordem alguma: a sequência das linhas depende do plano de execução e pode mudar entre execuções. Além disso, o filtro sobre o preço exclui os produtos de valor zero ou nulo, de modo que a lista também não contém necessariamente todos os itens.","distortion_type":"generalizacao","distorted_span":"necessariamente uma lista de todos os itens da tabela Produtos, ordenados pelo campo Preco, do menor valor para o maior valor","corrected_statement":"O retorno do comando apresentado será uma lista dos itens da tabela Produtos com preço maior que zero, em ordem não garantida.","concept":"Sem ORDER BY não há ordenação garantida","citation":null,"trap_note":"Ordenação em SQL só existe se estiver escrita. Qualquer item que afirme ordem crescente, decrescente ou de inserção sem ORDER BY na consulta é errado."}},{"id":"7156522fc82c","number":68,"stem":16,"statement":"Por ser exclusivamente incorporada ao sistema gerenciador de banco de dados, é inviável a utilização da linguagem de exploração de um banco de dados de forma independente em programas voltados para necessidades específicas.","answer":"E","source":{"slug":"PREF_CACHOEIRO_24_ADM","ano":2024},"explanation":{"verdict_reason":"A linguagem de consulta pode ser usada interativamente no SGBD, mas também embutida em programas — SQL embutida, SQL dinâmica e interfaces de chamada como JDBC e ODBC —, que é exatamente o caso das aplicações com necessidades específicas. A premissa de exclusividade é falsa e, com ela, cai a conclusão de inviabilidade.","distortion_type":"generalizacao","distorted_span":"Por ser exclusivamente incorporada ao sistema gerenciador de banco de dados, é inviável a utilização","corrected_statement":"Por não ser exclusivamente incorporada ao sistema gerenciador de banco de dados, é viável a utilização da linguagem de exploração de um banco de dados de forma independente em programas voltados para necessidades específicas.","concept":"SQL interativa e SQL embutida em linguagem hospedeira","citation":null,"trap_note":"Exclusivamente seguido de inviável é dupla absoluta: basta um contraexemplo — qualquer programa que abre conexão e envia SQL — para o item cair."}},{"id":"024109c62179","number":69,"stem":17,"statement":"O comando seguinte excluirá da tabela em apreço a coluna IBGE.\n\nSET @COLUMN = IBGE\nDROP COLUMN ON TABCIDADES IN @COLUMN;","answer":"E","source":{"slug":"TRF6_24","ano":2024},"explanation":{"verdict_reason":"Não existem em SQL as construções SET arroba variável para nomear coluna nem DROP COLUMN ON tabela IN variável. A remoção de coluna é feita por ALTER TABLE TABCIDADES DROP COLUMN IBGE, que é comando DDL. O trecho apresentado não é executável.","distortion_type":"troca_de_termo","distorted_span":"SET @COLUMN = IBGE\nDROP COLUMN ON TABCIDADES IN @COLUMN;","corrected_statement":"O comando seguinte excluirá da tabela em apreço a coluna IBGE.\n\nALTER TABLE TABCIDADES DROP COLUMN IBGE;","concept":"Remoção de coluna é ALTER TABLE DROP COLUMN","citation":null,"trap_note":"Alterar a estrutura de uma tabela existente é sempre ALTER TABLE, com ADD, DROP ou MODIFY. Comandos inventados com ON e IN denunciam o item de imediato."}},{"id":"4b10e46afe2d","number":70,"stem":18,"statement":"Em uma consulta SQL, tuplas duplicadas são automaticamente eliminadas pelo SGBD, com o objetivo de aumentar o desempenho.","answer":"E","source":{"slug":"MP_TO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"A SQL trabalha com multiconjuntos: por padrão, equivalente a SELECT ALL, as tuplas duplicadas são mantidas, e eliminá-las exige DISTINCT. A eliminação automática seria, aliás, mais cara, pois exigiria ordenação ou hash de todo o resultado — o oposto do ganho de desempenho alegado.","distortion_type":"inversao","distorted_span":"tuplas duplicadas são automaticamente eliminadas pelo SGBD","corrected_statement":"Em uma consulta SQL, tuplas duplicadas são mantidas por padrão, sendo eliminadas apenas quando se utiliza a cláusula DISTINCT.","concept":"SQL é multiconjunto: duplicata só sai com DISTINCT","citation":null,"trap_note":"A SQL não é a álgebra relacional pura: relação é conjunto, tabela é multiconjunto. Todo item que atribui eliminação automática de duplicatas ao SELECT inverte esse ponto."}},{"id":"e48ad2f08759","number":70,"stem":17,"statement":"O comando a seguir excluirá, na tabela em questão, o registro referente à cidade de Uberlândia.\n\nSET @ROWID ON IBGE = 3170206;\nDEL ON TABCIDADES IN @ROWID;","answer":"E","source":{"slug":"TRF6_24","ano":2024},"explanation":{"verdict_reason":"DEL não é comando SQL e não há sintaxe ON tabela IN variável. Para apagar uma linha específica usa-se DELETE FROM TABCIDADES WHERE IBGE = 3170206, em que é o WHERE, e não uma pseudovariável de linha, que identifica o registro.","distortion_type":"troca_de_termo","distorted_span":"SET @ROWID ON IBGE = 3170206;\nDEL ON TABCIDADES IN @ROWID;","corrected_statement":"O comando a seguir excluirá, na tabela em questão, o registro referente à cidade de Uberlândia.\n\nDELETE FROM TABCIDADES WHERE IBGE = 3170206;","concept":"DELETE FROM com WHERE identifica a linha a excluir","citation":null,"trap_note":"A dupla que a banca embaralha aqui é DELETE, que remove linhas e aceita WHERE, e DROP, que remove objetos. Nenhum dos dois usa variável de linha."}},{"id":"3f75e7bb976c","number":70,"stem":19,"statement":"A consulta SQL a seguir cria uma view para listar o total de gastos por município e hospital, bem como agrupa os resultados por município e hospital, calcula a soma dos valores gastos e ordena os resultados, de forma decrescente, pelo maior gasto e, depois, pelo nome do município e do hospital.\n\ncreate view total_gastos_por_municipio as\nselect nome_municipio as municipio,\nnome_hospital as hospital, sum(valor_gasto)\nas total\nfrom municipio m join hospital h\non m.id_municipio = h.id_municipio\njoin gastos g on h.id_hospital =\ng.id_hospital\ngroup by 1,2\norder by 3 desc,1,2","answer":"C","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"O comando cria a view, junta municipio, hospital e gastos pelas chaves, agrupa por municipio e hospital — o group by 1,2 refere-se às duas primeiras colunas projetadas — soma valor_gasto e ordena por 3 desc, 1, 2, isto é, pelo total em ordem decrescente e depois pelos dois nomes. O enunciado descreve item a item o que o comando faz.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"GROUP BY e ORDER BY por posição das colunas projetadas","citation":null,"trap_note":"Números no GROUP BY e no ORDER BY são posições da lista do SELECT. Traduza-os para os nomes das colunas antes de julgar a descrição do item."}},{"id":"5f911ae31d3e","number":71,"stem":19,"statement":"O código a seguir cria a tabela gastos, de acordo com os relacionamentos com as outras tabelas.\n\nCREATE TABLE gastos (\nid_gasto INTEGER,\nid_tipo_gasto_saude INTEGER NOT NULL,\nid_hospital INTEGER NOT NULL,\n ano INTEGER NOT NULL,\nmes INTEGER NOT NULL,\nvalor_gasto DECIMAL(15,2) NOT NULL,\nid_municipio INTEGER NOT NULL,\nCONSTRAINT pk_gastos PRIMARY KEY (id_gasto),\nCONSTRAINT fk_gastos_tipo_gasto FOREIGN KEY\n(id_tipo_gasto_saude) REFERENCES\ntipo_gasto_saude(id_tipo_gasto_saude),CONSTRA\nINT fk_gastos_hospital FOREIGN KEY\n(id_hospital) REFERENCES\nhospital(id_hospital))","answer":"C","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"A afirmação é sobre os relacionamentos, e é isso que o código entrega: id_gasto como chave primária e duas chaves estrangeiras, uma para tipo_gasto_saude e outra para hospital, que são exatamente os relacionamentos que o diagrama atribui à entidade gastos. As demais colunas e o uso de DECIMAL(15,2), sinônimo de NUMERIC(15,2), não alteram esse enquadramento.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"FOREIGN KEY ... REFERENCES implementa o relacionamento do diagrama","citation":null,"trap_note":"Em item que pede correspondência entre DDL e diagrama, compare primeiro as chaves: o lado N do relacionamento vira chave estrangeira. Diferença entre tipos sinônimos não derruba o item."}},{"id":"02f41e404538","number":71,"stem":20,"statement":"Em uma consulta a duas tabelas, o produto cartesiano ocorrerá quando a condição de união estiver corretamente especificada.","answer":"E","source":{"slug":"PREF_CACHOEIRO_24_ADM","ano":2024},"explanation":{"verdict_reason":"O produto cartesiano é o que se obtém quando não há condição de junção, ou quando a condição está mal especificada: cada linha de uma tabela se combina com todas as linhas da outra. Especificar corretamente a condição é justamente o que evita o produto cartesiano e restringe o resultado aos pares relacionados.","distortion_type":"inversao","distorted_span":"quando a condição de união estiver corretamente especificada","corrected_statement":"Em uma consulta a duas tabelas, o produto cartesiano ocorrerá quando a condição de união não estiver especificada.","concept":"Produto cartesiano resulta da ausência de condição de junção","citation":null,"trap_note":"Este item aparece nos dois sentidos no mesmo assunto, ora atribuindo o produto cartesiano ao WHERE bem escrito, ora ao WHERE em si. A condição de junção não cria o produto cartesiano: ela o reduz."}},{"id":"2377842f5658","number":71,"stem":18,"statement":"Em uma tabela com 100 registros, uma consulta SQL com a cláusula WHERE pode apresentar resultados com quantidade variando de zero a 100 linhas.","answer":"C","source":{"slug":"MP_TO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"O WHERE é um filtro linha a linha: o predicado pode ser falso para todas as linhas, verdadeiro para todas, ou para qualquer quantidade intermediária. Numa tabela de 100 registros, portanto, a cardinalidade do resultado vai de zero a 100.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"WHERE devolve de zero até todas as linhas","citation":null,"trap_note":"Itens que apenas descrevem o intervalo possível de um resultado tendem a ser Certos; a armadilha seria fixar um mínimo, do tipo pelo menos uma linha."}},{"id":"41188a0a6837","number":72,"stem":19,"statement":"A execução da consulta SQL a seguir listará os nomes dos hospitais que tiveram gastos superiores à média geral de gastos.\n\nSELECT nome_hospital, sum(g.valor_gasto) as\ntotal\nFROM gastos g JOIN hospital h\nON g.id_hospital = h.id_hospital\ngroup by nome_hospital\nhaving sum(g.valor_gasto) >\n (SELECT AVG(valor_gasto)\n FROM gastos)\nORDER BY nome_hospital","answer":"C","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"O GROUP BY forma um grupo por hospital, o HAVING compara a soma de cada grupo com o valor devolvido pela subconsulta SELECT AVG(valor_gasto) FROM gastos — que, por não se referir à consulta externa, é calculada uma única vez e vale como a média geral — e só permanecem os grupos acima dela. A descrição corresponde ao comando.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Subconsulta escalar no HAVING compara cada grupo com um valor global","citation":null,"trap_note":"Subconsulta que não referencia a consulta externa não é correlacionada: é executada uma vez e funciona como constante. É o modo padrão de comparar cada grupo com uma média geral."}},{"id":"84854419b788","number":72,"stem":18,"statement":"A SQL permite a consulta simultânea de atributos com o mesmo nome, desde que a ordem desses atributos seja a mesma da ordem das tabelas onde eles estão armazenados.","answer":"E","source":{"slug":"MP_TO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"Atributos homônimos vindos de tabelas diferentes são desambiguados pela qualificação com o nome da tabela ou com um apelido, como em a.nome e b.nome, nunca pela posição em que as tabelas aparecem no FROM. A condição imposta pelo item não existe no padrão.","distortion_type":"troca_de_termo","distorted_span":"desde que a ordem desses atributos seja a mesma da ordem das tabelas onde eles estão armazenados","corrected_statement":"A SQL permite a consulta simultânea de atributos com o mesmo nome, desde que eles sejam qualificados pelo nome da tabela ou por um apelido.","concept":"Ambiguidade de nomes se resolve por qualificação, não por ordem","citation":null,"trap_note":"Quando o item impõe um desde que, teste se a condição é a verdadeira: aqui a exigência real é qualificar o atributo; a ordem das tabelas no FROM não desambigua nada."}},{"id":"8b0feb9f2846","number":73,"stem":19,"statement":"A seguinte consulta SQL lista os hospitais que não tiveram gastos com fisioterapia.\n\nSELECT h.nome_hospital\nFROM hospital h\nWHERE EXISTS (\nSELECT 1\nFROM gastos g\nWHERE g.id_hospital = h.id_hospital\nAND g.id_tipo_gasto_saude = (SELECT\nid_tipo_gasto_saude\nFROM tipo_gasto_saude\nWHERE nome_tipo_gasto = 'fisioterapia'))","answer":"E","source":{"slug":"TCE_AC_24","ano":2024},"explanation":{"verdict_reason":"O EXISTS é verdadeiro quando a subconsulta devolve ao menos uma linha, de modo que a consulta lista precisamente os hospitais que tiveram gasto com fisioterapia. Para obter os que não tiveram seria necessário NOT EXISTS.","distortion_type":"inversao","distorted_span":"lista os hospitais que não tiveram gastos com fisioterapia","corrected_statement":"A seguinte consulta SQL lista os hospitais que tiveram gastos com fisioterapia.","concept":"EXISTS afirma existência; a ausência exige NOT EXISTS","citation":null,"trap_note":"Em item com subconsulta, procure a negação em dois lugares: no texto e no operador. NOT EXISTS, NOT IN e a junção externa com IS NULL são as três formas de dizer que não há correspondência."}},{"id":"082b2c3010f2","number":74,"stem":21,"statement":"O select a seguir retornará o valor 70.\n\nselect max(cod_carreira)\nFROM eg.EGT_CARREIRA ec\nWHERE DES_CARREIRA LIKE 'a%'","answer":"E","source":{"slug":"MP_GO_24_SERVIDOR","ano":2024},"explanation":{"verdict_reason":"Na tabela EGT_CARREIRA as descrições estão todas em maiúsculas (MAGISTRADO, ANALISTA JUDICIÁRIO, TÉCNICO JUDICIÁRIO, AUXILIAR JUDICIÁRIO, NÃO POSSUI) e, no Oracle, a comparação LIKE distingue maiúsculas de minúsculas. O padrão 'a%' não casa com nenhuma linha, de modo que MAX opera sobre um conjunto vazio e devolve nulo. O valor 70 só apareceria com o padrão 'A%', que selecionaria ANALISTA (50) e AUXILIAR (70).","distortion_type":"numero_errado","distorted_span":"retornará o valor 70","corrected_statement":"O select a seguir retornará nulo.","concept":"LIKE é sensível à caixa; MAX sobre conjunto vazio devolve nulo","citation":"Oracle Database SQL Language Reference — condição LIKE","trap_note":"Antes de calcular o valor de uma função de agregação, confira o filtro. Se o LIKE foi escrito em caixa diferente da dos dados, nenhuma linha entra e MAX, MIN, SUM e AVG devolvem nulo; só COUNT devolve zero."}},{"id":"431b8e28c3ee","number":90,"stem":22,"statement":"Em uma consulta SQL, a cláusula FROM corresponde à seleção do predicado que envolve atributos da relação determinada pela cláusula SELECT.","answer":"E","source":{"slug":"MPO_24","ano":2024},"explanation":{"verdict_reason":"Na correspondência com a álgebra relacional, a cláusula SELECT faz a projeção, a FROM indica as relações de entrada, equivalendo ao produto cartesiano, e a WHERE é que expressa o predicado de seleção sobre os atributos das relações listadas no FROM. O item descreve a função da WHERE atribuindo-a ao FROM e ainda inverte a origem dos atributos.","distortion_type":"inversao","distorted_span":"a cláusula FROM corresponde à seleção do predicado","corrected_statement":"Em uma consulta SQL, a cláusula WHERE corresponde à seleção do predicado que envolve atributos da relação determinada pela cláusula FROM.","concept":"SELECT projeta, FROM lista, WHERE seleciona","citation":null,"trap_note":"Guarde o trio: SELECT é projeção, FROM é produto cartesiano, WHERE é seleção. A banca costuma girar as três cláusulas em uma única frase."}},{"id":"5498b96b0027","number":92,"stem":23,"statement":"Em relação às linguagens de programação para banco de dados, é correto afirmar que SQL é uma linguagem de programação que se concentra no gerenciamento de bancos de dados relacionais; T-SQL é uma extensão processual usada somente no SQL Server.","answer":"E","source":{"slug":"CODEVASF_24","ano":2024},"explanation":{"verdict_reason":"O T-SQL não é exclusivo do SQL Server: ele nasceu no Sybase, é o dialeto usado também pelo Adaptive Server Enterprise e pelos serviços de banco de dados da Microsoft na nuvem. A primeira metade do item está correta; o que o derruba é a exclusividade afirmada na segunda.","distortion_type":"generalizacao","distorted_span":"usada somente no SQL Server","corrected_statement":"Em relação às linguagens de programação para banco de dados, é correto afirmar que SQL é uma linguagem de programação que se concentra no gerenciamento de bancos de dados relacionais; T-SQL é uma extensão processual usada no SQL Server, entre outros produtos.","concept":"T-SQL não é exclusivo do SQL Server","citation":null,"trap_note":"Item com duas metades em que a primeira é evidentemente correta costuma esconder o erro na segunda, e a palavra somente é onde ele quase sempre está."}},{"id":"0d2b87a039a9","number":93,"stem":24,"statement":"A execução do comando SQL mostrado a seguir disponibilizará para seleção somente os campos cod_professor e nome_professor da tabela professores a todos os usuários.\n\nGRANT SELECT (cod_professor, nome_professor)\nON professores\nTO public;","answer":"C","source":{"slug":"MPO_24","ano":2024},"explanation":{"verdict_reason":"O GRANT do SQL admite privilégio em nível de coluna: a lista entre parênteses após SELECT restringe a consulta às colunas nomeadas. PUBLIC é o papel que representa todos os usuários do banco. O comando concede, portanto, leitura apenas de cod_professor e nome_professor, a todos.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"GRANT em nível de coluna e papel PUBLIC","citation":null,"trap_note":"DCL tem dois comandos e dois detalhes que caem: a lista de colunas depois do privilégio e o WITH GRANT OPTION, que permite repassar o privilégio adiante."}},{"id":"173e049aba85","number":94,"stem":23,"statement":"Uma consulta para mostrar o total de compras de um cliente, por produto, em determinado período, é\n\nSELECT c.Nome, sum(cp.Quantidade_Comprada)\ntotal_compras\nFROM Compras cp\nJOIN Clientes c ON cp.ID_Cliente = c.ID_Cliente\nWHERE cp.ID_Produto = c. ID_Produto;","answer":"E","source":{"slug":"CODEVASF_24","ano":2024},"explanation":{"verdict_reason":"A consulta não atende ao que promete em três pontos. Não há GROUP BY, de modo que a soma não é quebrada por cliente nem por produto e a coluna c.Nome sequer é válida ao lado da função de agregação. Não há filtro de período algum. E a condição do WHERE compara o produto da compra com uma coluna de mesmo nome na tabela de clientes, relação que não existe no modelo descrito.","distortion_type":"atribuicao_errada","distorted_span":"WHERE cp.ID_Produto = c. ID_Produto;","corrected_statement":"SELECT c.Nome, cp.ID_Produto, sum(cp.Quantidade_Comprada)\ntotal_compras\nFROM Compras cp\nJOIN Clientes c ON cp.ID_Cliente = c.ID_Cliente\nWHERE cp.Data BETWEEN :inicio AND :fim\nGROUP BY c.Nome, cp.ID_Produto;","concept":"Agregação por grupo exige GROUP BY com as colunas não agregadas","citation":null,"trap_note":"Quando o item promete um total por alguma coisa, procure o GROUP BY antes de qualquer outra coisa. Sem ele, a soma é única para toda a consulta."}},{"id":"8d1e0ad94582","number":94,"stem":25,"statement":"A execução do comando SQL a seguir apresentará a soma de todas as vendas cujo valor excede 150.00.\n\nSELECT SUM(valorVenda) FROM vendas WHERE\nvalorVenda > 150.00;","answer":"C","source":{"slug":"CPNUJE_24","ano":2024},"explanation":{"verdict_reason":"O WHERE filtra as linhas antes da agregação, de modo que SUM soma apenas os valores das vendas que satisfazem valorVenda maior que 150.00. Sem GROUP BY, a consulta devolve uma única linha com esse total.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"WHERE filtra linhas antes de a agregação ser calculada","citation":null,"trap_note":"Condição sobre coluna comum vai no WHERE; condição sobre resultado de agregação vai no HAVING. Este item usa o lado certo do par."}},{"id":"788e22b876eb","number":94,"stem":24,"statement":"Considere que, em certa loja, os pedidos realizados por vendedores sejam salvos em uma tabela SQL pedidos, que as informações dos vendedores dessa loja sejam registradas na tabela vendedores e que cada um desses vendedores possua um código que é salvo na variável codigo_vendedor. Nessa situação hipotética, a execução do comando a seguir permitirá apagar todos os registros de pedidos realizados por vendedores-fantasmas (operação caça-fantasma).\n\nDELETE FROM pedidos\nWHERE NOT EXIST\n(SELECT vendedor\nFROM vendedores\nWHERE codigo_vendedor = pedido.codigo_vendedor);","answer":"C","source":{"slug":"MPO_24","ano":2024},"explanation":{"verdict_reason":"A subconsulta é correlacionada: para cada linha de pedidos ela procura em vendedores um registro com o mesmo código. Quando nada é encontrado, o NOT EXISTS é verdadeiro e a linha é apagada. É exatamente a antijunção que remove pedidos órfãos, isto é, atribuídos a vendedores que não existem no cadastro.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Antijunção com NOT EXISTS correlacionado","citation":null,"trap_note":"NOT EXISTS e NOT IN não são equivalentes: se a subconsulta devolver um único NULL, o NOT IN não retorna nenhuma linha, enquanto o NOT EXISTS continua identificando os órfãos."}},{"id":"1838789a9e07","number":95,"stem":25,"statement":"A operação para adicionar uma coluna nova à tabela vendas é realizada por meio de DML.","answer":"E","source":{"slug":"CPNUJE_24","ano":2024},"explanation":{"verdict_reason":"Acrescentar coluna altera a estrutura da tabela e se faz com ALTER TABLE seguido de ADD, comando de DDL. A DML — INSERT, UPDATE e DELETE — apenas movimenta conteúdo dentro da estrutura que já existe.","distortion_type":"atribuicao_errada","distorted_span":"é realizada por meio de DML","corrected_statement":"A operação para adicionar uma coluna nova à tabela vendas é realizada por meio de DDL.","concept":"Adicionar coluna é DDL (ALTER TABLE)","citation":null,"trap_note":"Pergunte se o comando mexe no desenho ou no conteúdo: coluna é desenho, e portanto DDL; linha é conteúdo, e portanto DML."}},{"id":"4c7e467be41f","number":99,"stem":26,"statement":"A consulta\n\nSELECT _\nFROM Empregado\nWHERE Nome = @P\nOR Login = @P;\n\né menos eficiente que a seguinte consulta.\n\nSELECT _\nFROM Empregado\nWHERE Nome = @P\nUNION\nSELECT _\nFROM Empregado\nWHERE Login = @P;","answer":"C","source":{"slug":"MPO_24","ano":2024},"explanation":{"verdict_reason":"O OR sobre duas colunas diferentes costuma impedir o otimizador de usar índice, obrigando-o a varrer a tabela inteira uma vez para avaliar as duas condições. Reescrita como UNION, cada ramo testa uma única coluna e pode usar o índice correspondente, e o próprio UNION ainda elimina a duplicata de quem satisfaz as duas condições.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"OR sobre colunas distintas impede uso de índice","citation":null,"trap_note":"Em itens de desempenho, o critério é se o predicado permite ao otimizador buscar pelo índice. OR entre colunas distintas, função sobre a coluna e curinga inicial no LIKE tiram essa possibilidade."}},{"id":"c41aec4fed72","number":100,"stem":26,"statement":"A consulta\n\nSELECT *\nFROM Produtos\nWHERE TipoProd = ‘1’;\n\né mais eficiente que a consulta a seguir.\n\nSELECT *\nFROM Produtos\nWHERE TipoProd = CAST (@char AS INT);","answer":"E","source":{"slug":"MPO_24","ano":2024},"explanation":{"verdict_reason":"Comparar a coluna TipoProd com um literal de texto obriga o SGBD a converter implicitamente a coluna a cada linha, o que anula o índice e força varredura completa. Na segunda consulta a conversão incide sobre o parâmetro, não sobre a coluna, e o índice continua utilizável. A relação de eficiência entre as duas é a inversa da afirmada.","distortion_type":"inversao","distorted_span":"é mais eficiente que a consulta a seguir.","corrected_statement":"A consulta\n\nSELECT *\nFROM Produtos\nWHERE TipoProd = ‘1’;\n\né menos eficiente que a consulta a seguir.\n\nSELECT *\nFROM Produtos\nWHERE TipoProd = CAST (@char AS INT);","concept":"Conversão implícita na coluna anula o índice","citation":null,"trap_note":"Converta o parâmetro, nunca a coluna. O lado do CAST decide a resposta em itens de otimização de predicado."}},{"id":"0793c1e4e8ee","number":101,"stem":27,"statement":"Em SQL, a instrução mais simples para selecionar registros de uma tabela é composta pelas cláusulas SELECT e WHERE.","answer":"E","source":{"slug":"ANM_24","ano":2024},"explanation":{"verdict_reason":"A forma mínima de uma consulta é SELECT com FROM: é o FROM que indica de qual tabela os registros virão. O WHERE é opcional e serve para filtrar linhas; sem ele a consulta simplesmente devolve todas.","distortion_type":"troca_de_termo","distorted_span":"pelas cláusulas SELECT e WHERE","corrected_statement":"Em SQL, a instrução mais simples para selecionar registros de uma tabela é composta pelas cláusulas SELECT e FROM.","concept":"SELECT e FROM são obrigatórios; WHERE é opcional","citation":null,"trap_note":"Guarde quais cláusulas são obrigatórias: SELECT e FROM. WHERE, GROUP BY, HAVING e ORDER BY são todas opcionais, e HAVING depende de agrupamento."}},{"id":"c95b312f8791","number":101,"stem":28,"statement":"WITH RECURSIVE t(n) AS (\n\n    SELECT 1\n  UNION\n    SELECT n*2 FROM t\n)\nSELECT n FROM t LIMIT 5;\n\nA execução do código precedente, desenvolvido em PostgreSQL 17, apresentará o seguinte resultado.\n\nn\n(5 rows)","answer":"C","source":{"slug":"TRF6_24","ano":2024},"explanation":{"verdict_reason":"A âncora produz 1 e a parte recursiva dobra o último valor obtido, gerando 2, 4, 8, 16 e assim por diante. O UNION, sem ALL, impede que valores repetidos reiniciem a recursão, e o LIMIT 5 interrompe a avaliação assim que cinco linhas são entregues, o que faz a consulta terminar apesar de a recursão ser, em tese, infinita.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"CTE recursiva com LIMIT interrompe a geração","citation":null,"trap_note":"Em WITH RECURSIVE sem condição de parada, quem encerra a execução é o LIMIT externo, avaliado sob demanda. UNION ALL no lugar de UNION mantém o mesmo resultado aqui, porque nenhum valor se repete."}},{"id":"80b84ce768ca","number":102,"stem":28,"statement":"SELECT 'trf minas gerais'::tsvector @@ 'trf'::tsquery as resultado; O resultado apresentado após a execução do código precedente, desenvolvido em PostgreSQL 17, será o seguinte.\n\nresultado\n t\n(1 row)\n\ncidade IBGE Uberaba 3170107 Uberlândia 3170206 Araguari 3103504","answer":"C","source":{"slug":"TRF6_24","ano":2024},"explanation":{"verdict_reason":"A conversão para tsvector decompõe o texto em lexemas, entre eles trf, e a conversão para tsquery produz a busca por esse mesmo lexema. O operador arroba arroba testa a correspondência entre vetor e consulta de texto e devolve o booleano verdadeiro, impresso como t em uma única linha.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Busca textual do PostgreSQL: tsvector, tsquery e o operador de correspondência","citation":null,"trap_note":"Em PostgreSQL, a dupla tsvector e tsquery sempre devolve booleano. O item erra quando afirma que o operador devolve o texto encontrado ou a posição do termo."}},{"id":"34bdad1e819b","number":113,"stem":29,"statement":"A cláusula GROUP BY, do SQL, pode ser utilizada sem a presença de funções agregadas, desde que haja uma cláusula ORDER BY para organizar os resultados da consulta.","answer":"E","source":{"slug":"ANM_24","ano":2024},"explanation":{"verdict_reason":"O GROUP BY pode ser usado sem funções de agregação, e nesse caso apenas reduz as linhas aos valores distintos das colunas agrupadas, como faria um DISTINCT. Essa possibilidade não depende de ORDER BY algum: a condição imposta pelo item é inventada, e ORDER BY apenas ordena a saída.","distortion_type":"relacao_causal","distorted_span":"desde que haja uma cláusula ORDER BY para organizar os resultados da consulta","corrected_statement":"A cláusula GROUP BY, do SQL, pode ser utilizada sem a presença de funções agregadas, caso em que devolve as combinações distintas das colunas agrupadas.","concept":"GROUP BY sem agregação equivale a DISTINCT","citation":null,"trap_note":"Desde que, contanto que e somente se introduzem condições que o SQL não impõe. Verifique se a condição existe na linguagem antes de aceitar a frase."}},{"id":"8aaf24406799","number":114,"stem":29,"statement":"Para excluir uma tabela na linguagem SQL e liberar os recursos alocados por ela, inclusive índices e triggers associados, deve-se fazer uso do comando DELETE TABLE, pois ele remove tanto os dados quanto a estrutura da tabela.","answer":"E","source":{"slug":"ANM_24","ano":2024},"explanation":{"verdict_reason":"Não existe comando DELETE TABLE em SQL. Quem remove a estrutura da tabela, com seus dados, índices e gatilhos, e libera o espaço é o DROP TABLE, que é DDL. O DELETE, sem a palavra TABLE, apaga linhas e preserva a estrutura.","distortion_type":"troca_de_termo","distorted_span":"deve-se fazer uso do comando DELETE TABLE","corrected_statement":"Para excluir uma tabela na linguagem SQL e liberar os recursos alocados por ela, inclusive índices e triggers associados, deve-se fazer uso do comando DROP TABLE, pois ele remove tanto os dados quanto a estrutura da tabela.","concept":"DROP TABLE remove estrutura; DELETE remove linhas","citation":null,"trap_note":"Guarde a escala: DELETE apaga linhas e pode ter WHERE; TRUNCATE esvazia a tabela e mantém a estrutura; DROP elimina a tabela. DELETE é DML, TRUNCATE e DROP são DDL."}},{"id":"5ace2f10e769","number":114,"stem":27,"statement":"Uma view materializada realiza consulta em tabelas do banco de dados no momento em que o usuário faz uma consulta à","answer":"E","source":{"slug":"FUNPRESP_24_EXE","ano":2024},"explanation":{"verdict_reason":"A view materializada armazena fisicamente o resultado da consulta, calculado na criação e renovado por refresh; a consulta do usuário lê dados já gravados. Quem vai às tabelas base no instante da consulta é a view comum, cuja definição é apenas expandida no momento da execução.","distortion_type":"atribuicao_errada","distorted_span":"realiza consulta em tabelas do banco de dados no momento em que o usuário faz uma consulta","corrected_statement":"Uma view materializada devolve o resultado previamente armazenado; é a view comum que realiza consulta em tabelas do banco de dados no momento em que o usuário faz uma consulta.","concept":"View materializada guarda o resultado; view comum recalcula","citation":null,"trap_note":"Materializada significa resultado gravado: ganha desempenho e arrisca dado desatualizado. Comum significa consulta reexecutada: sempre atual e com custo a cada leitura. O item costuma trocar os dois lados."}},{"id":"620936ca3b7f","number":123,"stem":30,"statement":"Em bancos de dados, uma visão (view) é uma tabela virtual, que não existe fisicamente, e representa uma relação entre as linhas de uma ou mais tabelas físicas.","answer":"C","source":{"slug":"SEPLAG_CE_24","ano":2024},"explanation":{"verdict_reason":"A view é definida por uma consulta armazenada no catálogo e não possui existência física própria: suas linhas são produzidas no momento do acesso, a partir das tabelas-base. Por isso é descrita como tabela virtual que representa uma relação sobre uma ou mais tabelas reais.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"View como tabela virtual derivada de tabelas-base","citation":null,"trap_note":"Tabela virtual, não existe fisicamente e derivada de consulta são as três marcas corretas de view; espaço físico e armazenamento de linhas são as marcas erradas."}},{"id":"a707e02519b9","number":54,"stem":31,"statement":"A DCL (Data Control Language) é utilizada para controlar quem tem acesso aos objetos do banco de dados.","answer":"C","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"A DCL reúne GRANT e REVOKE, que concedem e retiram privilégios sobre os objetos do banco. Controlar quem acessa o quê é exatamente a definição dessa sublinguagem.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DCL = GRANT e REVOKE","citation":null,"trap_note":"Separe as sublinguagens pelo objeto sobre o qual agem: DDL na estrutura, DML nos dados, DQL na consulta, DCL nos privilégios e TCL na transação (COMMIT, ROLLBACK, SAVEPOINT)."}},{"id":"dbac2ebc2ba9","number":55,"stem":32,"statement":"No DML (data manipulation language), a instrução TRUNCATE elimina todas as linhas de uma tabela simultaneamente, enquanto a instrução DELETE oferece a possibilidade de excluir dados específicos ou todos os dados.","answer":"E","source":{"slug":"CTI_23","ano":2023},"explanation":{"verdict_reason":"A segunda metade está certa: o DELETE apaga linhas específicas, com WHERE, ou todas elas. O erro é a classificação, pois TRUNCATE é comando de DDL, não de DML — não registra a exclusão linha a linha e reinicia o armazenamento da tabela.","distortion_type":"atribuicao_errada","distorted_span":"No DML (data manipulation language), a instrução TRUNCATE","corrected_statement":"No DDL (data definition language), a instrução TRUNCATE elimina todas as linhas de uma tabela simultaneamente, enquanto a instrução DELETE, do DML, oferece a possibilidade de excluir dados específicos ou todos os dados.","concept":"TRUNCATE é DDL; DELETE é DML","citation":null,"trap_note":"O par DELETE × TRUNCATE cai por dois lados: o filtro, que só o DELETE aceita, e a sublinguagem, já que o TRUNCATE é DDL. Confira os dois antes de julgar."}},{"id":"8ba6089632bd","number":55,"stem":31,"statement":"A DDL (Data Definition Language) é utilizada em bancos de dados para comandos de UPDATE nas tabelas.","answer":"E","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"UPDATE é comando de manipulação de dados: altera valores dentro das linhas, sem tocar na estrutura. A DDL é a sublinguagem de definição — CREATE, ALTER, DROP e TRUNCATE — que age sobre os objetos do banco.","distortion_type":"atribuicao_errada","distorted_span":"para comandos de UPDATE nas tabelas","corrected_statement":"A DDL (Data Definition Language) é utilizada em bancos de dados para comandos de CREATE, ALTER e DROP nas tabelas.","concept":"UPDATE é DML, não DDL","citation":null,"trap_note":"Uma pergunta resolve: o comando muda o dado ou o desenho da tabela? INSERT, UPDATE, DELETE e SELECT mexem no conteúdo; CREATE, ALTER, DROP e TRUNCATE mexem no desenho."}},{"id":"b21ecefb7d3b","number":56,"stem":32,"statement":"Uma VIEW é uma representação virtual de dados que se comporta como uma tabela, formada a partir de uma consulta em tabelas relacionadas.","answer":"C","source":{"slug":"CTI_23","ano":2023},"explanation":{"verdict_reason":"A view é uma tabela virtual: não guarda linhas próprias, mas é consultada como se fosse tabela, e seu conteúdo é produzido pela consulta que a define sobre uma ou mais tabelas relacionadas.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"View é tabela virtual derivada de uma consulta","citation":null,"trap_note":"Descrição de finalidade, sem restrição acrescentada, costuma ser Certo neste tópico; o erro entra quando o item nega uma capacidade da view."}},{"id":"2b4905672e5d","number":59,"stem":33,"statement":"Uma VIEW é um objeto do banco de dados, mas não possui nenhuma linha em sua estrutura, pois faz referência a linhas e colunas de outras tabelas.","answer":"C","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"A view é um objeto do dicionário de dados definido por uma consulta: o SGBD guarda o texto dessa consulta, não as linhas. Quando a view é acessada, as linhas são produzidas a partir das tabelas base, o que justifica dizer que ela não possui linhas próprias.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"View é definição armazenada, não dado armazenado","citation":null,"trap_note":"Se um item disser que a view armazena linhas, lembre da exceção que confirma a regra: só a view materializada guarda dados."}},{"id":"751aef05878a","number":60,"stem":33,"statement":"Ao executar um comando de SELECT em mais de uma tabela sem a cláusula WHERE, o resultado será o produto cartesiano das tabelas acessadas.","answer":"C","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"Sem condição de junção, o FROM com duas ou mais tabelas combina cada linha de uma com todas as linhas das outras: é o produto cartesiano. Junção é produto cartesiano seguido de seleção, de modo que retirar a condição deixa apenas o produto — o mesmo resultado de um CROSS JOIN.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"FROM sem condição de junção produz produto cartesiano","citation":null,"trap_note":"Esquecer a condição de junção não gera erro, gera explosão de linhas. Guarde a conta: colunas somam, linhas multiplicam."}},{"id":"745ae6fc68b5","number":61,"stem":33,"statement":"O comando UNION é utilizado para combinar as linhas de duas tabelas, mesmo que as colunas dessas tabelas sejam de tipos e tamanhos diferentes.","answer":"E","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"O UNION exige compatibilidade de união: as consultas combinadas precisam ter a mesma quantidade de colunas e tipos compatíveis, posição a posição. Sem isso o comando sequer é executado, e é essa exigência que o item dispensa.","distortion_type":"escopo_ampliado","distorted_span":"mesmo que as colunas dessas tabelas sejam de tipos e tamanhos diferentes","corrected_statement":"O comando UNION é utilizado para combinar as linhas de duas tabelas, desde que as colunas dessas tabelas sejam em mesma quantidade e de tipos compatíveis.","concept":"UNION exige compatibilidade de união","citation":null,"trap_note":"Operadores de conjunto (UNION, INTERSECT, EXCEPT) trabalham sobre resultados compatíveis; JOIN, ao contrário, combina colunas diferentes. Item que dispensa a compatibilidade no UNION está errado."}},{"id":"3991d8d47a5b","number":64,"stem":34,"statement":"Views não inserem restrições à realização de consultas, inserções, atualizações e exclusões em tempo de execução, sendo, portanto, desnecessário traduzi-las para uma modificação nas relações reais no modelo lógico do banco de dados.","answer":"E","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"Toda operação sobre uma view precisa ser traduzida para operações sobre as relações reais, e é essa tradução que impõe restrições: views com agregação, DISTINCT, junção ou GROUP BY não são atualizáveis, e outras só aceitam alteração sob WITH CHECK OPTION. Consultar pela view é transparente; inserir, atualizar e excluir, não.","distortion_type":"inversao","distorted_span":"Views não inserem restrições à realização de consultas, inserções, atualizações e exclusões em tempo de execução","corrected_statement":"Views inserem restrições à realização de inserções, atualizações e exclusões em tempo de execução, sendo necessário traduzi-las para modificações nas relações reais do banco de dados.","concept":"Atualização por view é traduzida para as tabelas base e nem sempre é possível","citation":null,"trap_note":"View não é tabela: leitura é transparente, escrita é limitada. Item que iguala os dois lados costuma estar errado."}},{"id":"0080c268f1b5","number":102,"stem":35,"statement":"Na linguagem SQL, os comandos CREATE, ALTER e DROP são comandos de definição de dados.","answer":"C","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"CREATE, ALTER e DROP atuam sobre os objetos do esquema — criam, modificam e eliminam tabelas, visões e índices — e formam o núcleo da linguagem de definição de dados.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"CREATE, ALTER e DROP são DDL","citation":null,"trap_note":"Guarde o núcleo de cada sublinguagem para reconhecer a lista falsa: DDL (CREATE, ALTER, DROP, TRUNCATE), DML (INSERT, UPDATE, DELETE), DQL (SELECT), DCL (GRANT, REVOKE) e TCL (COMMIT, ROLLBACK, SAVEPOINT)."}},{"id":"ee5bafe2d0fe","number":103,"stem":36,"statement":"Na DDL, que é uma linguagem declarativa, é descrito o que se deseja fazer, em vez de como fazê-lo, como comandos para definir tabelas e procedures, tal qual exemplificado a seguir.\n\nCREATE TABLE <tablename> (col1 int, col2 int,\ncol3 int)","answer":"C","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"A DDL é declarativa no sentido de que o comando enuncia a estrutura desejada — colunas, tipos e restrições — cabendo ao SGBD decidir como criá-la e armazená-la. O CREATE TABLE exibido é exemplo dessa natureza declarativa.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DDL declara a estrutura; o SGBD decide como executá-la","citation":null,"trap_note":"A SQL é declarativa em todas as suas sublinguagens: descreve-se o que se quer, não o algoritmo. Item que a chame de procedural nesse ponto está errado."}},{"id":"3b3ca1624e7c","number":104,"stem":36,"statement":"A DML é uma linguagem que interage com os objetos do banco de dados, em vez de interagir com os dados.","answer":"E","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"Está invertido: quem interage com os objetos do banco — tabelas, índices, visões — é a DDL. A DML, formada por INSERT, UPDATE, DELETE e pela consulta, atua sobre o conteúdo das linhas.","distortion_type":"inversao","distorted_span":"interage com os objetos do banco de dados, em vez de interagir com os dados","corrected_statement":"A DML é uma linguagem que interage com os dados, em vez de interagir com os objetos do banco de dados.","concept":"DML age nos dados; DDL age nos objetos","citation":null,"trap_note":"A construção em vez de é o sinal: o item já traz os dois termos certos e apenas troca a ordem. Leia qual dos dois ficou ligado à sigla."}},{"id":"6100e143b8cf","number":104,"stem":35,"statement":"Na linguagem SQL, a função agregada para cálculo de média de um único atributo deve ser combinada com a cláusula GROUP BY.","answer":"E","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"Sem GROUP BY, a função de agregação percorre a tabela inteira como um grupo único e devolve uma linha: SELECT AVG(salario) FROM empregado é consulta válida. O GROUP BY só é necessário quando se quer uma média por grupo, e é exigido pelas colunas não agregadas que apareçam no SELECT.","distortion_type":"generalizacao","distorted_span":"deve ser combinada com a cláusula GROUP BY","corrected_statement":"Na linguagem SQL, a função agregada para cálculo de média de um único atributo pode ser utilizada sem a cláusula GROUP BY.","concept":"Agregação sem GROUP BY trata a tabela como grupo único","citation":null,"trap_note":"Inverta a regra para não errar: não é a função de agregação que exige GROUP BY; é a coluna não agregada projetada no SELECT que exige."}},{"id":"e237813d17e1","number":105,"stem":36,"statement":"Somente são possíveis os seguintes quatro tipos de JOIN em SQL, segundo o padrão ANSI: INNER JOIN, LEFT JOIN, RIGHT JOIN e CROSS JOIN.","answer":"E","source":{"slug":"DATAPREV_23","ano":2023},"explanation":{"verdict_reason":"O padrão prevê também o FULL OUTER JOIN, além da junção natural e da junção por USING. A lista de quatro exclui pelo menos a junção externa completa, e é o somente que derruba o item: os tipos citados existem, mas não esgotam o padrão.","distortion_type":"generalizacao","distorted_span":"Somente são possíveis os seguintes quatro tipos de JOIN em SQL","corrected_statement":"São possíveis, entre outros, os seguintes tipos de JOIN em SQL, segundo o padrão ANSI: INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN e CROSS JOIN.","concept":"Há também o FULL OUTER JOIN","citation":null,"trap_note":"Lista fechada por somente é a forma preferida da banca para esconder um elemento faltante. Confira o que falta antes de discutir o que está presente."}},{"id":"25bcc3e8d7a5","number":114,"stem":37,"statement":"Quando utilizado o comando SELECT, podem-se incluir várias subqueries internas na mesma instrução.","answer":"C","source":{"slug":"BCB_24","ano":2023},"explanation":{"verdict_reason":"O padrão SQL permite subconsultas em vários pontos da mesma instrução: na lista do SELECT, no FROM como tabela derivada, no WHERE e no HAVING, e elas ainda podem ser aninhadas umas dentro das outras. Não há restrição a uma única subquery por comando.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Subconsultas múltiplas e aninhadas em um SELECT","citation":null,"trap_note":"Itens que apenas afirmam que o SQL pode fazer algo costumam ser certos; os que restringem a uma única ocorrência ou proíbem o aninhamento costumam ser errados."}},{"id":"274d1a3ae0ab","number":124,"stem":38,"statement":"Comandos expressos em linguagem de definição de dados (DDL) são utilizados para criar estruturas de um banco de dados, e o seu processamento irá incluir ou alterar metadados desse mesmo banco de dados.","answer":"C","source":{"slug":"SEFIN_FORTALEZA_CE_23","ano":2023},"explanation":{"verdict_reason":"CREATE, ALTER e DROP não tocam nas linhas: eles gravam e alteram a descrição dos objetos no catálogo do sistema. Metadados são exatamente isso, e todo comando DDL bem-sucedido os inclui ou os modifica.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DDL escreve no catálogo, isto é, em metadados","citation":null,"trap_note":"DDL mexe na estrutura e no dicionário de dados; DML mexe nas linhas. Essa separação resolve a maior parte dos itens de linguagens do SQL."}},{"id":"78e72bb95025","number":125,"stem":38,"statement":"Usando-se SQL (structured query language), é possível unir o resultado de duas instruções SELECT quaisquer, por meio do operador UNION.","answer":"E","source":{"slug":"SEFIN_FORTALEZA_CE_23","ano":2023},"explanation":{"verdict_reason":"UNION exige compatibilidade de união: as duas consultas precisam ter o mesmo número de colunas e tipos compatíveis, na mesma ordem. Duas instruções SELECT quaisquer não atendem a isso, e a combinação é rejeitada pelo SGBD.","distortion_type":"generalizacao","distorted_span":"duas instruções SELECT quaisquer","corrected_statement":"Usando-se SQL (structured query language), é possível unir o resultado de duas instruções SELECT com o mesmo número de colunas e tipos compatíveis, por meio do operador UNION.","concept":"UNION exige compatibilidade de união","citation":null,"trap_note":"Todo item de UNION, INTERSECT ou EXCEPT que dispensa a compatibilidade de colunas e tipos é errado. O quaisquer é a palavra a sublinhar."}},{"id":"097606f47c6a","number":126,"stem":38,"statement":"A manipulação de dados armazenados em um banco de dados é feita por meio de DML (Data Manipulation Language), linguagem na qual é possível apenas descrever os dados que se deseja acessar, sem especificar como obtê-los.","answer":"E","source":{"slug":"SEFIN_FORTALEZA_CE_23","ano":2023},"explanation":{"verdict_reason":"A descrição dada é a das DMLs de alto nível, ou não procedurais, como o SQL. Mas a DML também abrange as de baixo nível, ou procedurais, embutidas em linguagem hospedeira, que percorrem registro a registro e dizem como obter os dados. O apenas fecha a definição em uma das duas metades.","distortion_type":"generalizacao","distorted_span":"é possível apenas descrever os dados que se deseja acessar, sem especificar como obtê-los","corrected_statement":"A manipulação de dados armazenados em um banco de dados é feita por meio de DML (Data Manipulation Language), linguagem que, em sua forma de alto nível, permite descrever os dados que se deseja acessar, sem especificar como obtê-los.","concept":"DML de alto nível x DML de baixo nível","citation":null,"trap_note":"Quando o item define uma linguagem por uma só de suas espécies e acrescenta apenas ou somente, procure a espécie omitida antes de julgar o conteúdo."}},{"id":"e713c2720c34","number":70,"stem":39,"statement":"De acordo com a SQL, padrão ANSI, após uma tabela ser criada não é possível excluir uma restrição do tipo PRIMAY KEY por meio do comando ALTER TABLE.","answer":"E","source":{"slug":"PGE_RJ_22","ano":2022},"explanation":{"verdict_reason":"O ALTER TABLE altera restrições depois de a tabela existir: DROP CONSTRAINT, ou DROP PRIMARY KEY na sintaxe de alguns produtos, elimina a chave primária. A única cautela é a existência de chaves estrangeiras que dependam dela, e mesmo aí a remoção em cascata resolve. A impossibilidade afirmada não existe no padrão.","distortion_type":"inversao","distorted_span":"não é possível excluir uma restrição do tipo PRIMAY KEY por meio do comando ALTER TABLE","corrected_statement":"De acordo com a SQL, padrão ANSI, após uma tabela ser criada é possível excluir uma restrição do tipo PRIMARY KEY por meio do comando ALTER TABLE.","concept":"ALTER TABLE adiciona e remove restrições, inclusive a chave primária","citation":null,"trap_note":"Item que declara impossível uma operação de ALTER TABLE quase sempre está errado: a instrução existe para ADD e para DROP, e restrição criada pode ser desfeita."}},{"id":"896240823078","number":71,"stem":39,"statement":"A instrução SQL a seguir tem por finalidade listar os números dos advogados na OAB (advogado_oab_numero) e o total de processos (total_processos), mas somente daqueles que possuem mais de cinco processos.\n\nSELECT advogado_oab_numero, count(*) as total_processos\nFROM processo\nGROUP BY advogado_oab_numero\nHAVING count(*) > 5;","answer":"C","source":{"slug":"PGE_RJ_22","ano":2022},"explanation":{"verdict_reason":"O GROUP BY forma um grupo por advogado, o count(*) conta os processos de cada grupo e o HAVING descarta os grupos com cinco ou menos — filtro que só o HAVING pode fazer, por incidir sobre o resultado da agregação. A consulta faz exatamente o que o item descreve.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"HAVING filtra grupos por resultado de função de agregação","citation":null,"trap_note":"Regra prática: condição que menciona uma função de agregação não cabe no WHERE, migra para o HAVING; condição sobre coluna comum fica no WHERE, e é mais eficiente ali."}},{"id":"e528c86549e9","number":73,"stem":40,"statement":"O resultado da execução das expressões em tela é apresentado a seguir.","answer":"C","source":{"slug":"SECONT_ES_22","ano":2022},"explanation":{"verdict_reason":"A consulta faz a junção pelo estilo antigo, listando três referências no FROM e ligando-as por igualdades no WHERE: p com composto_de por produto_id e pd com composto_de por produto_ingrediente. O filtro p.id=12 isola o Combo X Burguer, cujos três ingredientes cadastrados são os produtos 9, 10 e 11, com as respectivas unidades e quantidades.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Junção na cláusula WHERE e autorreferência de tabela","citation":null,"trap_note":"Junção escrita no WHERE equivale a INNER JOIN. Sem a igualdade, o mesmo FROM produziria o produto cartesiano; é a condição, não a cláusula, que faz a junção."}},{"id":"c83bb22becdd","number":81,"stem":41,"statement":"Em SQL, para que não haja erro de construção (sintaxe), as cláusulas GROUP BY e HAVING, quando usadas, devem ser definidas sempre antes da cláusula WHERE.","answer":"E","source":{"slug":"POLC_AL_22","ano":2022},"explanation":{"verdict_reason":"A ordem sintática das cláusulas é fixa: SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY. O WHERE vem antes porque filtra linhas antes do agrupamento; GROUP BY e HAVING vêm depois porque operam sobre os grupos já formados. Escrevê-los antes do WHERE é erro de sintaxe.","distortion_type":"inversao","distorted_span":"definidas sempre antes da cláusula WHERE","corrected_statement":"Em SQL, para que não haja erro de construção (sintaxe), as cláusulas GROUP BY e HAVING, quando usadas, devem ser definidas sempre depois da cláusula WHERE.","concept":"Ordem das cláusulas: WHERE antes de GROUP BY e HAVING","citation":null,"trap_note":"WHERE filtra linhas antes de agregar; HAVING filtra grupos depois. A ordem de escrita reproduz a ordem de execução, e é por isso que ela não pode ser trocada."}},{"id":"7b412067fb9a","number":83,"stem":42,"statement":"Visões podem ser usadas para definir relações no esquema externo que exibem para os aplicativos as alterações feitas no esquema conceitual do banco de dados.","answer":"E","source":{"slug":"SEPLAN_RR_22","ano":2022},"explanation":{"verdict_reason":"As visões compõem o nível externo justamente para isolar os aplicativos do que muda no nível conceitual: é assim que a arquitetura de três esquemas garante a independência lógica de dados. Uma view pode continuar entregando o mesmo formato depois de a tabela base ser alterada, ou seja, ela oculta a mudança em vez de exibi-la.","distortion_type":"inversao","distorted_span":"que exibem para os aplicativos as alterações feitas no esquema conceitual","corrected_statement":"Visões podem ser usadas para definir relações no esquema externo que ocultam dos aplicativos as alterações feitas no esquema conceitual do banco de dados.","concept":"Independência lógica: a view isola o aplicativo do esquema conceitual","citation":null,"trap_note":"Quando o item ligar nível externo e nível conceitual, pergunte a direção: o externo esconde o conceitual. Item que faz a view propagar ou exibir mudanças do esquema inverte a finalidade da arquitetura de três esquemas."}},{"id":"e453c994d692","number":83,"stem":43,"statement":"O comando rollback recupera o valor anterior de um registro alterado, a partir do último backup da tabela.","answer":"E","source":{"slug":"BANRISUL_22","ano":2022},"explanation":{"verdict_reason":"O ROLLBACK é comando de controle de transação: ele desfaz as alterações da transação corrente usando o log de transações e devolve o banco ao estado anterior ao BEGIN, não ao estado do último backup. Restaurar a partir de backup é operação de recuperação, externa à transação e acionada por outro procedimento.","distortion_type":"atribuicao_errada","distorted_span":"a partir do último backup da tabela","corrected_statement":"O comando rollback recupera o valor anterior de um registro alterado, desfazendo as alterações da transação corrente a partir do log de transações.","concept":"ROLLBACK desfaz a transação pelo log, não pelo backup","citation":null,"trap_note":"TCL opera sobre a transação em curso: COMMIT confirma, ROLLBACK desfaz e SAVEPOINT marca um ponto intermediário. Backup e restore pertencem a outro assunto e, citados dentro de um item de TCL, costumam ser a distorção."}},{"id":"2fcbd87d44ac","number":84,"stem":44,"statement":"Considere-se o seguinte script SQL.\n\nselect report_code, year, month, day,\nwind_speed,\ncase\n  when wind_speed>= 40 then ‘HIGH’\n  when wind_speed>= 30 then ‘MODERATE’\nelse ‘LOW’\nend as wind_severity\nfrom station_data\n\nO resultado da execução do script resultará em erro, pois, caso haja, na tabela station_data, algum registro no campo wind_speed com valor superior a 40, não será possível predizer se o valor da variável wind_severity será igual a ‘HIGH’.","answer":"E","source":{"slug":"SEPLAN_RR_22","ano":2022},"explanation":{"verdict_reason":"A expressão CASE é avaliada em sequência: a primeira condição WHEN verdadeira define o resultado e as seguintes nem chegam a ser testadas. Com wind_speed superior a 40, a primeira cláusula já é satisfeita e wind_severity recebe HIGH de forma determinística; o fato de o valor também satisfazer a condição de 30 é irrelevante. Não há ambiguidade nem erro de execução.","distortion_type":"relacao_causal","distorted_span":"não será possível predizer se o valor da variável wind_severity será igual a ‘HIGH’","corrected_statement":"O resultado da execução do script não resultará em erro, pois, caso haja, na tabela station_data, algum registro no campo wind_speed com valor superior a 40, a primeira cláusula WHEN será satisfeita e o valor da variável wind_severity será igual a ‘HIGH’.","concept":"CASE avalia as condições em ordem; a primeira verdadeira vence","citation":null,"trap_note":"Sempre que um item alegar indeterminação em um CASE com faixas sobrepostas, lembre que a ordem das cláusulas WHEN resolve a sobreposição. A indeterminação só existiria se todas as condições fossem avaliadas em paralelo, o que a linguagem não faz."}},{"id":"c012fdff5142","number":85,"stem":27,"statement":"Em um comando SELECT, a cláusula WHERE define que o resultado da consulta é o produto cartesiano das tabelas envolvidas.","answer":"E","source":{"slug":"SEPLAN_RR_22","ano":2022},"explanation":{"verdict_reason":"A cláusula WHERE filtra linhas e, quando contém a condição de junção, é justamente ela que reduz o produto cartesiano aos pares relacionados. O produto cartesiano é o resultado de listar mais de uma tabela no FROM sem condição alguma que as ligue.","distortion_type":"inversao","distorted_span":"a cláusula WHERE define que o resultado da consulta é o produto cartesiano das tabelas envolvidas","corrected_statement":"Em um comando SELECT, a cláusula WHERE restringe o produto cartesiano das tabelas envolvidas às linhas que satisfazem a condição informada.","concept":"FROM produz o produto cartesiano; WHERE o restringe","citation":null,"trap_note":"Pense na ordem lógica de avaliação: o FROM forma as combinações, o WHERE as filtra, o GROUP BY as agrupa e o HAVING filtra os grupos. Cada cláusula recebe o resultado da anterior."}},{"id":"e9e38d18c604","number":86,"stem":41,"statement":"Ao ser executado, o comando SQL a seguir mostrará o CPF e o nome de todas as pessoas que cometeram pelo menos um crime do tipo hediondo.\n\nselect P.CPF, P.NOME\nfrom POLITEC.PESSOA P\nwhere P;CPF exists (select C.CPF\n            from POLITEC.CRIME C\n            where C.CPF=P.CPF\n            and C.TIPO = ‘HEDIONDO’);","answer":"E","source":{"slug":"POLC_AL_22","ano":2022},"explanation":{"verdict_reason":"EXISTS é um predicado unário: recebe apenas a subconsulta e devolve verdadeiro se ela retornar ao menos uma linha. Não existe a forma coluna EXISTS (subconsulta) escrita no comando, de modo que ele não chega a ser executado. A construção pretendida seria WHERE EXISTS (SELECT ... WHERE C.CPF = P.CPF AND C.TIPO = 'HEDIONDO').","distortion_type":"troca_de_termo","distorted_span":"where P;CPF exists","corrected_statement":"Ao ser executado, o comando SQL a seguir mostrará o CPF e o nome de todas as pessoas que cometeram pelo menos um crime do tipo hediondo.\n\nselect P.CPF, P.NOME\nfrom POLITEC.PESSOA P\nwhere exists (select C.CPF\n            from POLITEC.CRIME C\n            where C.CPF=P.CPF\n            and C.TIPO = ‘HEDIONDO’);","concept":"EXISTS é predicado unário sobre a subconsulta","citation":null,"trap_note":"IN compara um valor com a lista devolvida; EXISTS não compara nada, só testa se veio alguma linha. Quem escreve coluna EXISTS confundiu os dois."}},{"id":"6c2030c180e1","number":87,"stem":27,"statement":"Em SQL, o comando DISTINCT é utilizado para eliminar resultados repetidos em consultas a tabelas do banco de dados.","answer":"C","source":{"slug":"SEPLAN_RR_22","ano":2022},"explanation":{"verdict_reason":"DISTINCT é o modificador da lista de projeção do SELECT e faz o SGBD descartar as linhas repetidas do resultado, comparando todas as colunas projetadas. Sem ele, o SQL preserva as duplicatas, ao contrário da álgebra relacional pura, que trabalha com conjuntos.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DISTINCT elimina linhas repetidas do resultado","citation":null,"trap_note":"O SQL opera com multiconjuntos: a repetição só desaparece se você pedir, com DISTINCT, com GROUP BY ou com uma operação de conjunto sem ALL."}},{"id":"5b719884bf1a","number":88,"stem":45,"statement":"A linguagem de controle de dados (DCL) é um dos componentes da SQL e permite gerenciar as autorizações aos dados constantes do banco de dados.","answer":"C","source":{"slug":"BANCO_DO_NORDESTE_22","ano":2022},"explanation":{"verdict_reason":"A DCL é o componente da SQL dedicado à autorização: GRANT concede e REVOKE retira privilégios sobre os dados e demais objetos do banco. Gerenciar autorizações é exatamente a sua função.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DCL gerencia autorizações de acesso","citation":null,"trap_note":"Autorização é DCL, integridade é DDL e transação é TCL. Em cada bloco costuma haver um item que troca duas dessas atribuições."}},{"id":"d701dd15e587","number":93,"stem":46,"statement":"A implementação de uma view consiste na geração de uma tabela física que consolida os dados de outras tabelas do banco de dados.","answer":"E","source":{"slug":"SECONT_ES_22","ano":2022},"explanation":{"verdict_reason":"Implementar uma view é registrar no catálogo a consulta que a define; nenhuma tabela física é gerada e nenhum dado é duplicado. A consolidação física de dados de outras tabelas descreve a visão materializada ou uma tabela de resumo, objetos distintos da view.","distortion_type":"troca_de_termo","distorted_span":"geração de uma tabela física","corrected_statement":"A implementação de uma view consiste na geração de uma tabela virtual que reúne, em tempo de consulta, os dados de outras tabelas do banco de dados.","concept":"View não gera tabela física","citation":null,"trap_note":"Tabela física, consolidação e espaço ocupado são marcas de visão materializada. Em item sobre view simples, qualquer uma delas derruba a assertiva."}},{"id":"48f535d1b6c3","number":106,"stem":47,"statement":"Considere-se a tabela e o script SQL a seguir. Tabela: colaboradores\n\nSELECT avg(idade), sexo\nFROM colaboradores\nGROUP BY sexo\n\nO resultado da consulta SQL é\n\navg(idade) sexo\n15 Feminino\n32 Masculino","answer":"C","source":{"slug":"BANCO_DO_NORDESTE_22","ano":2022},"explanation":{"verdict_reason":"O GROUP BY sexo forma um grupo por valor distinto da coluna sexo e a função AVG calcula a média das idades dentro de cada grupo. O resultado tem, portanto, uma linha por sexo presente na tabela, com a média correspondente, exatamente como exibido.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Uma linha por grupo em consulta com GROUP BY","citation":null,"trap_note":"O número de linhas de uma consulta agrupada é o número de valores distintos das colunas do GROUP BY. Conte-os antes de conferir a saída exibida."}},{"id":"3c3b66fcd31b","number":107,"stem":47,"statement":"A linguagem de manipulação de dados (DML) inclui instruções que modificam a estrutura de um banco de dados.","answer":"E","source":{"slug":"BANCO_DO_NORDESTE_22","ano":2022},"explanation":{"verdict_reason":"A DML atua sobre o conteúdo das tabelas, com INSERT, UPDATE, DELETE e, na divisão em duas sublinguagens, também o SELECT. Modificar a estrutura do banco, criando, alterando ou removendo objetos, é competência da DDL.","distortion_type":"troca_de_termo","distorted_span":"instruções que modificam a estrutura de um banco de dados","corrected_statement":"A linguagem de manipulação de dados (DML) inclui instruções que modificam os dados armazenados em um banco de dados.","concept":"DML modifica dados; DDL modifica estrutura","citation":null,"trap_note":"Este é o par mais frequente do assunto e cai nos dois sentidos: ora a DML recebe tarefas da DDL, ora a DDL recebe o UPDATE. A palavra estrutura é a marca da DDL."}},{"id":"f2d02028e5e8","number":118,"stem":48,"statement":"Os comandos TRUNCATE e DROP TABLE removem todas as linhas de uma tabela, porém o comando DROP TABLE exclui também a estrutura da tabela do banco de dados bem como todos os dados armazenados na tabela.","answer":"C","source":{"slug":"SEPLAN_RR_22","ano":2022},"explanation":{"verdict_reason":"TRUNCATE esvazia a tabela, mas preserva a sua definição; DROP TABLE remove o objeto do dicionário de dados e, com ele, todas as linhas armazenadas. O item descreve exatamente essa diferença: os dois deixam a tabela sem dados, mas só o DROP elimina a estrutura.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"TRUNCATE esvazia; DROP TABLE elimina o objeto","citation":null,"trap_note":"Ordene os três comandos e quase todo item do bloco se resolve: DELETE apaga linhas com filtro e é DML; TRUNCATE apaga todas as linhas e é DDL; DROP apaga a tabela."}},{"id":"581fb9da8909","number":42,"stem":49,"statement":"Considere que o comando a seguir seja executado sem erro.\n\nselect campo from tabela2\nwhere exists\n(select campo from tabela1)\n\nNesse caso, o resultado será a tabela seguinte.","answer":"E","source":{"slug":"TCE_SC_21_AUDITOR","ano":2021},"explanation":{"verdict_reason":"A subconsulta do EXISTS não é correlacionada: ela não menciona nenhuma coluna de tabela2. Como tabela1 tem linhas, o predicado é verdadeiro uma única vez e para sempre, de modo que a condição não filtra nada e a consulta devolve integralmente a coluna campo de tabela2, inclusive seus valores repetidos. O conjunto exibido no item não é esse.","distortion_type":"atribuicao_errada","distorted_span":"Nesse caso, o resultado será a tabela seguinte.","corrected_statement":"Nesse caso, o resultado será a própria coluna campo de tabela2, integralmente, porque o EXISTS não está correlacionado.","concept":"EXISTS não correlacionado não filtra","citation":null,"trap_note":"Antes de calcular qualquer EXISTS, procure na subconsulta uma referência à tabela externa. Sem essa referência, o predicado vale o mesmo para todas as linhas: ou passa tudo, ou não passa nada."}},{"id":"7e9545ec62fd","number":43,"stem":49,"statement":"Considere que o comando a seguir seja executado sem erro.\n\nselect campo from tabela2\nexcept\nselect campo from tabela1\n\nNesse caso, o resultado obtido será a tabela seguinte.","answer":"E","source":{"slug":"TCE_SC_21_AUDITOR","ano":2021},"explanation":{"verdict_reason":"EXCEPT é a diferença de conjuntos: devolve os valores que aparecem na primeira consulta e não aparecem na segunda, e, por ser operação de conjunto sem ALL, ainda elimina as repetições. Aplicado às colunas apresentadas, sobram apenas os valores de tabela2 ausentes de tabela1, uma vez cada. O resultado exibido no item não corresponde a esse conjunto.","distortion_type":"atribuicao_errada","distorted_span":"Nesse caso, o resultado obtido será a tabela seguinte.","corrected_statement":"Nesse caso, o resultado obtido será o conjunto dos valores distintos de tabela2 que não ocorrem em tabela1.","concept":"EXCEPT é diferença de conjuntos e remove duplicatas","citation":null,"trap_note":"Nas operações de conjunto, resolva em duas etapas: primeiro a operação, depois a eliminação de duplicatas, que só não ocorre se estiver escrito ALL."}},{"id":"f26816a19ab5","number":44,"stem":50,"statement":"O role contém as definições de permissões, privilégios e garantias de acesso aos objetos do banco e aos dados.","answer":"C","source":{"slug":"TCE_SC_21_AUDITOR","ano":2021},"explanation":{"verdict_reason":"O papel é o agrupamento nomeado de privilégios: em vez de conceder permissões usuário a usuário, o administrador as reúne no papel e concede o papel. Ele carrega, portanto, as definições de permissões e de acesso aos objetos e aos dados do banco.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Papel agrupa privilégios de acesso","citation":null,"trap_note":"Controle de acesso baseado em papéis: privilégio se concede ao papel, papel se concede ao usuário. É o que torna a revogação administrável."}},{"id":"a80bf3029aa9","number":46,"stem":50,"statement":"O comando create database aluno permite criar uma tabela de nome aluno no banco de dados.","answer":"E","source":{"slug":"TCE_SC_21_AUDITOR","ano":2021},"explanation":{"verdict_reason":"CREATE DATABASE cria um banco de dados, isto é, o contêiner dos esquemas e das tabelas. Para criar uma tabela chamada aluno o comando seria CREATE TABLE aluno, com a lista de colunas e tipos.","distortion_type":"troca_de_termo","distorted_span":"permite criar uma tabela de nome aluno","corrected_statement":"O comando create database aluno permite criar um banco de dados de nome aluno.","concept":"CREATE DATABASE x CREATE TABLE","citation":null,"trap_note":"Em DDL, o objeto vem logo depois do verbo: DATABASE, SCHEMA, TABLE, VIEW, INDEX. Basta ler essa palavra para saber o que foi criado."}},{"id":"ec47dbf10fce","number":57,"stem":51,"statement":"O comando a seguir, em SQL, está sintaticamente correto e permite criar uma tabela de nome turma.\n\nCREATE TABLE turma (\n      idturma INTEGER(4) NOT NULL\nAUTO_INCREMENT,\n      capacidade INTEGER(2) NOT NULL,\n      idProfessor INTEGER(4) NOT NULL,\n      PRIMARY KEY (idturma),\n      FOREIGN KEY (idProfessor)\nREFERENCES professor(idProfessor),\n      UNIQUE KEY idturma (idturma)\n)","answer":"C","source":{"slug":"PETROBRAS_21_NS","ano":2021},"explanation":{"verdict_reason":"O comando declara colunas com tipo e restrição de obrigatoriedade, marca a chave primária, define uma chave estrangeira que referencia professor e acrescenta uma restrição de unicidade, tudo em construções aceitas pelo dialeto em que AUTO_INCREMENT e UNIQUE KEY existem. É um CREATE TABLE válido e cria a tabela turma.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Estrutura do CREATE TABLE com restrições de integridade","citation":null,"trap_note":"Em CREATE TABLE, confira nesta ordem: cada coluna tem tipo, as restrições de tabela vêm depois das colunas e a tabela referenciada pela chave estrangeira já existe."}},{"id":"200023275b73","number":78,"stem":52,"statement":"No PostgreSQL 13 é possível obter informações das configurações correntes do SGBD por meio de consultas às suas views nativas. O comando abaixo permite obter o número máximo de conexões ativas que uma database, de nome bancodedados, pode receber.\n\nSELECT max_connections FROM pg_stat_database\nWHERE datname= 'bancodedados';","answer":"E","source":{"slug":"TCE_SC_21_AUDITOR","ano":2021},"explanation":{"verdict_reason":"pg_stat_database é a visão de estatísticas de atividade por banco, com contadores como número de conexões correntes, transações confirmadas e blocos lidos, e não possui coluna max_connections. O limite global é o parâmetro de configuração max_connections, consultado por SHOW ou pela visão pg_settings, enquanto o limite por banco fica em datconnlimit, no catálogo pg_database.","distortion_type":"atribuicao_errada","distorted_span":"SELECT max_connections FROM pg_stat_database","corrected_statement":"No PostgreSQL 13 é possível obter informações das configurações correntes do SGBD por meio de consultas às suas views nativas. O comando abaixo permite obter o número máximo de conexões ativas que uma database, de nome bancodedados, pode receber.\n\nSELECT datconnlimit FROM pg_database\nWHERE datname= 'bancodedados';","concept":"Visão de estatísticas x catálogo x parâmetro de configuração","citation":null,"trap_note":"Distinga as três famílias do PostgreSQL: pg_stat guarda contadores de atividade, pg_catalog guarda a definição dos objetos e pg_settings guarda os parâmetros. O item que busca configuração em visão de estatística está errado."}},{"id":"c6cb7d428e12","number":83,"stem":53,"statement":"Ao executar o seguinte SQL\n\nSELECT IdCategoria, SUM(ValorProduto) AS\nValorTotal\nFROM Produto\nGROUP BY idCategoria\nHAVING Valortotal > 45\n\no resultado retornará mais de uma linha.","answer":"E","source":{"slug":"SEFAZ_CE_21","ano":2021},"explanation":{"verdict_reason":"Os grupos somam 65 para a categoria 1, que reúne os produtos de 10,00, 30,00 e 25,00, e 45 para a categoria 2, com 20,00 e 25,00. O HAVING exige valor estritamente maior que 45, e 45 não é maior que 45: só a categoria 1 sobrevive ao filtro. A consulta devolve uma única linha.","distortion_type":"numero_errado","distorted_span":"o resultado retornará mais de uma linha","corrected_statement":"Ao executar o seguinte SQL\n\nSELECT IdCategoria, SUM(ValorProduto) AS\nValorTotal\nFROM Produto\nGROUP BY idCategoria\nHAVING Valortotal > 45\n\no resultado retornará apenas uma linha.","concept":"HAVING filtra grupos depois da agregação","citation":null,"trap_note":"Nos itens com HAVING, calcule os totais de cada grupo e confira a desigualdade no limite: maior que e maior ou igual a mudam o número de linhas quando a soma bate exatamente no valor citado."}},{"id":"ca0c006b2032","number":93,"stem":54,"statement":"A expressão SQL a seguir está sintaticamente correta e permite inserir dois alunos de nomes Pedro e Maria na tabela alunos.\n\nI N S E R T V A L U E S ( ' P e d r o ' ,\n'Maria') INTO alunos;","answer":"E","source":{"slug":"PETROBRAS_21_NS","ano":2021},"explanation":{"verdict_reason":"A ordem das palavras-chave do INSERT é fixa: INSERT INTO tabela VALUES lista de valores. O comando exibido coloca o nome da tabela no fim, depois do VALUES, e não é sintaticamente válido. Além disso, os dois nomes estão em uma única lista de valores, o que descreveria uma linha com duas colunas, e não dois alunos.","distortion_type":"troca_de_termo","distorted_span":"I N S E R T V A L U E S ( ' P e d r o ' ,\n'Maria') INTO alunos;","corrected_statement":"A expressão SQL a seguir está sintaticamente correta e permite inserir dois alunos de nomes Pedro e Maria na tabela alunos.\n\nINSERT INTO alunos VALUES ('Pedro'),\n('Maria');","concept":"Sintaxe do INSERT e uma lista de valores por linha","citation":null,"trap_note":"Cada par de parênteses depois do VALUES corresponde a uma linha. Duas linhas exigem dois pares, separados por vírgula."}},{"id":"c92f3a1c2bac","number":107,"stem":55,"statement":"O comando delete alunos permite apagar uma tabela de nome alunos.","answer":"E","source":{"slug":"PETROBRAS_21_NS","ano":2021},"explanation":{"verdict_reason":"DELETE é comando de DML e apaga linhas, deixando a tabela existente e vazia; quem apaga a tabela, estrutura e dados, é DROP TABLE, da DDL. A própria sintaxe denuncia o item, pois o DELETE exige a cláusula FROM.","distortion_type":"atribuicao_errada","distorted_span":"O comando delete alunos","corrected_statement":"O comando drop table alunos permite apagar uma tabela de nome alunos.","concept":"DELETE apaga linhas; DROP TABLE apaga a tabela","citation":null,"trap_note":"Três verbos, três alvos: DELETE atinge linhas e aceita filtro, TRUNCATE atinge todas as linhas e DROP atinge o objeto. Item que promete apagar a tabela com DELETE troca o alvo."}},{"id":"54e372dd2446","number":55,"stem":56,"statement":"Em um banco de dados relacional, todos os usuários devem possuir uma mesma visão (view) do banco de dados, o que é necessário para garantir a consistência dos dados.","answer":"E","source":{"slug":"DPDF_20_ANALISTA","ano":2020},"explanation":{"verdict_reason":"A view existe exatamente para dar a cada usuário ou aplicação um recorte diferente do banco, escondendo linhas e colunas que não lhe dizem respeito — é instrumento de independência lógica e de segurança, não de uniformidade. A consistência dos dados é garantida por restrições de integridade e pelo controle de concorrência, não por uma visão única.","distortion_type":"generalizacao","distorted_span":"todos os usuários devem possuir uma mesma visão (view) do banco de dados","corrected_statement":"Em um banco de dados relacional, cada usuário pode possuir uma visão (view) própria do banco de dados, sem que isso comprometa a consistência dos dados.","concept":"View é recorte por usuário, não visão única","citation":null,"trap_note":"Absoluto sobre todos os usuários somado a uma justificativa de consistência troca o mecanismo: consistência vem de restrições e transações; a view serve a recorte e segurança."}},{"id":"28dbb693a01d","number":66,"stem":35,"statement":"A criação de tabelas e as restrições de integridade são atividades de administração de banco de dados descritas como DDL (data definition language).","answer":"C","source":{"slug":"DPDF_20_ANALISTA","ano":2020},"explanation":{"verdict_reason":"Criar tabelas e declarar restrições de integridade (PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL) são operações sobre a estrutura, executadas por CREATE TABLE e ALTER TABLE, ambos da DDL.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Restrição de integridade é definida por DDL","citation":null,"trap_note":"A restrição declarada faz parte do esquema, não do dado; por isso vive na DDL, ainda que só produza efeito quando a DML roda."}},{"id":"f143a42f7dfe","number":76,"stem":57,"statement":"Índices de bitmap não permitem linhas com valores NULL.","answer":"E","source":{"slug":"DPDF_20_ANALISTA","ano":2020},"explanation":{"verdict_reason":"Quem não indexa entradas inteiramente nulas é o índice B-tree; o índice bitmap faz o oposto, pois representa cada valor distinto da coluna — inclusive o nulo — como um mapa de bits, o que permite responder consultas com IS NULL pelo próprio índice. É por isso que o bitmap é indicado em colunas de baixa cardinalidade e com muitos nulos.","distortion_type":"atribuicao_errada","distorted_span":"não permitem linhas com valores NULL","corrected_statement":"Índices de bitmap permitem linhas com valores NULL.","concept":"Bitmap indexa nulos; B-tree ignora chaves totalmente nulas","citation":null,"trap_note":"Quando o item nega uma capacidade de um tipo de índice, verifique se a restrição não pertence ao outro tipo: a regra de não indexar nulos é do B-tree, e a banca costuma colá-la no bitmap."}},{"id":"363915e8d981","number":105,"stem":58,"statement":"Utilizada para recuperar dados de um banco de dados SQL, a lógica booleana possui três operadores básicos: AND, OR e NOT.","answer":"C","source":{"slug":"TCE_RJ_20","ano":2020},"explanation":{"verdict_reason":"Os predicados do WHERE são combinados pelos três conectivos da lógica booleana: AND, OR e NOT, com precedência nessa ordem inversa, primeiro NOT, depois AND e por fim OR. É essa álgebra que constrói as condições de recuperação em SQL.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Operadores booleanos do WHERE e sua precedência","citation":null,"trap_note":"Lembre da precedência: AND liga mais forte que OR. Item que troca a ordem, ou que dispensa parênteses em condição mista, costuma ser errado."}},{"id":"3fd5e47aef68","number":109,"stem":59,"statement":"No SQL, SELECT * FROM table é uma consulta de banco de dados e exibe informações da tabela do banco de dados, portanto é correto considerá-la uma mineração de dados.","answer":"E","source":{"slug":"DPDF_20_ANALISTA","ano":2020},"explanation":{"verdict_reason":"Uma consulta apenas recupera e exibe dados já armazenados. Mineração de dados é a etapa que descobre padrões não evidentes — associações, agrupamentos, classificações — que não estariam ao alcance de uma consulta comum. A descrição do SELECT está certa; o que não se sustenta é a conclusão que estende o rótulo de mineração a uma simples recuperação.","distortion_type":"escopo_ampliado","distorted_span":"portanto é correto considerá-la uma mineração de dados","corrected_statement":"No SQL, SELECT * FROM table é uma consulta de banco de dados e exibe informações da tabela do banco de dados, portanto não é correto considerá-la uma mineração de dados.","concept":"Consulta recupera o que já existe; mineração descobre padrão novo","citation":null,"trap_note":"Recuperar não é descobrir. Se a operação descrita devolve o que já está gravado, é consulta, por maior que seja o volume; mineração exige a produção de um padrão que não estava explícito."}},{"id":"960a0a0ada9f","number":116,"stem":60,"statement":"Para selecionar todos os registros da tabela PESSOAS, em que o valor da coluna NOME começa com a letra a, é correto utilizar o comando SQL a seguir. SELECT NOME.* FROM PESSOAS WHERE NOME = '%a%'","answer":"E","source":{"slug":"TCE_RJ_20","ano":2020},"explanation":{"verdict_reason":"O curinga por cento só é interpretado pelo operador LIKE; com o sinal de igualdade o SGBD procura a cadeia literal formada pelos próprios caracteres. Além disso, o padrão correto para nomes iniciados por a é 'a%', sem o curinga à esquerda, e a lista de projeção seria NOME, não NOME ponto asterisco.","distortion_type":"troca_de_termo","distorted_span":"WHERE NOME = '%a%'","corrected_statement":"Para selecionar todos os registros da tabela PESSOAS, em que o valor da coluna NOME começa com a letra a, é correto utilizar o comando SQL a seguir. SELECT NOME FROM PESSOAS WHERE NOME LIKE 'a%'","concept":"Curinga exige LIKE; posição do por cento define o padrão","citation":null,"trap_note":"Curinga com igual é sempre erro. E repare na posição: 'a%' começa com a, '%a' termina com a, '%a%' contém a."}},{"id":"87a06a826eda","number":53,"stem":61,"statement":"Uma visão representa um conjunto de informações de uma ou mais tabelas, em uma representação específica, ocupando espaço físico no banco de dados.","answer":"E","source":{"slug":"FUB_19","ano":2019},"explanation":{"verdict_reason":"Uma visão comum é uma tabela virtual: o SGBD guarda apenas a consulta que a define no dicionário de dados e a executa a cada acesso. Nenhuma linha da view é materializada em disco. O único objeto de visão que ocupa espaço físico é a visão materializada, que não é o caso descrito.","distortion_type":"troca_de_termo","distorted_span":"ocupando espaço físico no banco de dados","corrected_statement":"Uma visão representa um conjunto de informações de uma ou mais tabelas, em uma representação específica, sem ocupar espaço físico no banco de dados.","concept":"View é tabela virtual; só a definição é armazenada","citation":null,"trap_note":"Sempre que um item disser que uma view armazena, guarda, ocupa espaço ou grava dados, confira se ele escreveu materializada. Sem essa palavra, a resposta é virtual."}},{"id":"d8e18838bb5b","number":61,"stem":62,"statement":"Views são visões de tabelas de banco de dados e são armazenadas em disco, com as informações de condições e situações que necessitem de atualização constante.","answer":"E","source":{"slug":"FUB_19","ano":2019},"explanation":{"verdict_reason":"O que o SGBD armazena de uma view é o texto da consulta, não o seu resultado. Os dados continuam existindo apenas nas tabelas-base e são recalculados a cada execução, justamente por isso a view está sempre atualizada sem precisar de gravação em disco.","distortion_type":"troca_de_termo","distorted_span":"são armazenadas em disco","corrected_statement":"Views são visões de tabelas de banco de dados e têm apenas sua definição armazenada em disco, com as informações de condições e situações que necessitem de atualização constante.","concept":"View armazena definição, não dados","citation":null,"trap_note":"A CEBRASPE repete esse par: view guarda a consulta, view materializada guarda o resultado. Se o item inverter os dois, é errado."}},{"id":"755eb386a956","number":48,"stem":63,"statement":"Após as tabelas serem implementadas, a inserção de um registro na tabela Universidade pode ser realizada corretamente por meio do comando a seguir.\n\nI N S E R T I N T O U n i v e r s i d ade VAL U E S\n(00.038.174/0001-43, ‘Universidade de\nBrasília’, ‘Graduação e Pós-Graduação’);","answer":"E","source":{"slug":"EBSERH_18_ADMINISTRATIVO","ano":2018},"explanation":{"verdict_reason":"O primeiro valor da lista, o CNPJ, contém pontos, barra e hífen e foi escrito sem aspas. Um literal alfanumérico precisa vir entre apóstrofos, como os dois valores seguintes; sem eles o SGBD tenta interpretar a sequência como expressão numérica e o comando falha.","distortion_type":"troca_de_termo","distorted_span":"(00.038.174/0001-43,","corrected_statement":"Após as tabelas serem implementadas, a inserção de um registro na tabela Universidade pode ser realizada corretamente por meio do comando a seguir.\n\nI N S E R T I N T O U n i v e r s i d ade VAL U E S\n(‘00.038.174/0001-43’, ‘Universidade de\nBrasília’, ‘Graduação e Pós-Graduação’);","concept":"Literal de caractere exige apóstrofos no INSERT","citation":null,"trap_note":"Em item que exibe INSERT, confira três coisas na ordem: aspas nos literais de texto, quantidade de valores igual à de colunas e correspondência de tipos."}},{"id":"c6d677e4d758","number":49,"stem":63,"statement":"O comando SELECT nome FROM Hospital WHERE UF ‘SP’; permite mostrar os nomes dos hospitais localizados na UF (unidade da federação) SP.","answer":"C","source":{"slug":"EBSERH_18_ADMINISTRATIVO","ano":2018},"explanation":{"verdict_reason":"A consulta projeta a coluna nome e restringe as linhas às do hospital cuja UF é SP. É a combinação básica de projeção, feita pela lista do SELECT, com seleção, feita pelo WHERE, e devolve exatamente os nomes dos hospitais daquela unidade da federação.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"SELECT projeta colunas; WHERE seleciona linhas","citation":null,"trap_note":"Separe as duas operações da álgebra relacional: a lista do SELECT é a projeção e o WHERE é a seleção. A banca gosta de trocar os nomes das duas."}},{"id":"6522f4896ea8","number":50,"stem":63,"statement":"O comando GRANT DELETE ON Hospital TO ebserh; tem a finalidade de conceder o privilégio de remoção da tabela Hospital ao usuário ebserh.","answer":"E","source":{"slug":"EBSERH_18_ADMINISTRATIVO","ano":2018},"explanation":{"verdict_reason":"O privilégio DELETE autoriza apagar linhas da tabela Hospital, não eliminar a tabela. Remover o objeto é DROP TABLE, atributo do proprietário do objeto e não um privilégio concedido por GRANT DELETE.","distortion_type":"troca_de_termo","distorted_span":"o privilégio de remoção da tabela Hospital","corrected_statement":"O comando GRANT DELETE ON Hospital TO ebserh; tem a finalidade de conceder o privilégio de remoção de registros da tabela Hospital ao usuário ebserh.","concept":"GRANT DELETE concede exclusão de linhas, não da tabela","citation":null,"trap_note":"Em item de DCL, leia o objeto do privilégio: os privilégios de GRANT recaem sobre os dados da tabela, ao passo que criar e destruir o objeto pertence ao proprietário."}},{"id":"0472785efff8","number":65,"stem":64,"statement":"A DDL (data definition language) é usada para a definição da estrutura do banco de dados ou do esquema. São comandos DDL: CREATE, TRUNCATE, GRANT e ROLLBACK.","answer":"E","source":{"slug":"STJ_18","ano":2018},"explanation":{"verdict_reason":"A definição de DDL apresentada está certa, mas a lista mistura sublinguagens: GRANT é DCL, por tratar de privilégios, e ROLLBACK é TCL, por encerrar transação desfazendo alterações. Apenas CREATE e TRUNCATE são comandos de definição de dados.","distortion_type":"atribuicao_errada","distorted_span":"São comandos DDL: CREATE, TRUNCATE, GRANT e ROLLBACK.","corrected_statement":"A DDL (data definition language) é usada para a definição da estrutura do banco de dados ou do esquema. São comandos DDL: CREATE, TRUNCATE, ALTER e DROP.","concept":"GRANT é DCL e ROLLBACK é TCL","citation":null,"trap_note":"Quando o item define a sigla corretamente e depois lista comandos, o erro está na lista. Classifique comando a comando antes de julgar a definição."}},{"id":"5c456ccdec57","number":78,"stem":65,"statement":"Na SQL (structured query language), existem funções de agregação com diferentes capacidades; como, por exemplo, a função AVG, que é responsável pelo cálculo da média dos valores de determinado campo.","answer":"C","source":{"slug":"EBSERH_18_ADMINISTRATIVO","ano":2018},"explanation":{"verdict_reason":"AVG é uma das funções de agregação previstas no padrão, ao lado de COUNT, SUM, MIN e MAX, e devolve a média aritmética dos valores não nulos da coluna indicada. O item apenas descreve essa função.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"AVG calcula a média dos valores da coluna","citation":null,"trap_note":"As cinco agregações do padrão são COUNT, SUM, AVG, MIN e MAX, e todas, exceto COUNT(*), ignoram nulos — detalhe que decide vários itens deste tópico."}},{"id":"a7237fbcf790","number":100,"stem":66,"statement":"Uma view materializada armazena apenas a consulta que define e apresenta o resultado sempre atualizado de todas as operações de definição de dados DDL.","answer":"E","source":{"slug":"FUB_18","ano":2018},"explanation":{"verdict_reason":"A troca está nas duas metades. Quem armazena apenas a consulta que a define é a view comum; a view materializada guarda fisicamente o resultado já calculado. E precisamente por guardar o resultado ela não fica sempre atualizada: depende de um refresh, programado ou sob demanda, para refletir as alterações das tabelas-base.","distortion_type":"inversao","distorted_span":"armazena apenas a consulta que define e apresenta o resultado sempre atualizado","corrected_statement":"Uma view materializada armazena fisicamente o resultado da consulta que a define e apresenta esse resultado conforme a última atualização (refresh) realizada.","concept":"View materializada guarda resultado e exige refresh","citation":null,"trap_note":"O ganho de desempenho da view materializada tem um preço, e é ele que a banca cobra: os dados podem estar defasados até o próximo refresh."}},{"id":"a6f99288e01c","number":105,"stem":67,"statement":"O comando DROP TABLE permite excluir do banco de dados a definição de uma tabela e de todos os seus dados.","answer":"C","source":{"slug":"FUB_18","ano":2018},"explanation":{"verdict_reason":"DROP TABLE é comando de definição de dados e remove o objeto do catálogo: vão junto a definição da tabela, as linhas nela armazenadas e os objetos dependentes, como índices e gatilhos. Nada da tabela permanece após sua execução.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DROP TABLE elimina definição e dados","citation":null,"trap_note":"Os três graus de remoção caem sempre juntos: DELETE apaga linhas escolhidas, TRUNCATE esvazia a tabela mantendo a estrutura e DROP elimina a tabela inteira."}},{"id":"e7677efde179","number":106,"stem":67,"statement":"O comando WHERE do SQL corresponde à operação de projeção da álgebra relacional.","answer":"E","source":{"slug":"FUB_18","ano":2018},"explanation":{"verdict_reason":"O WHERE restringe quais linhas entram no resultado, o que corresponde à seleção da álgebra relacional, representada pela letra sigma. A projeção, representada por pi, escolhe colunas e corresponde à lista de atributos do SELECT.","distortion_type":"inversao","distorted_span":"corresponde à operação de projeção","corrected_statement":"O comando WHERE do SQL corresponde à operação de seleção da álgebra relacional.","concept":"WHERE é seleção; lista do SELECT é projeção","citation":null,"trap_note":"Guarde pela direção do corte: seleção corta linhas, projeção corta colunas. O nome SELECT induz ao erro justamente porque a cláusula homônima faz a projeção."}},{"id":"f464756e9535","number":107,"stem":68,"statement":"A sentença SQL seguinte produzirá como resultado a lista de todos os funcionários de uma empresa. Para aqueles em que seja verdadeira a condição Funcionarios.CodigoDep = Departamentos.CodigoDep, será apresentado também o nome do departamento.\n\nSELECT Funcionarios.Nome, Departamentos.NomeDep\nFROM Funcionarios\nINNER JOIN Departamentos ON\nFuncionarios.CodigoDep =\nDepartamentos.CodigoDep\nORDER BY Funcionarios.Nome;","answer":"E","source":{"slug":"STJ_18","ano":2018},"explanation":{"verdict_reason":"O INNER JOIN devolve apenas as linhas que satisfazem a condição de junção: funcionário sem departamento correspondente simplesmente não aparece no resultado. A lista descrita — todos os funcionários, com o nome do departamento quando houver correspondência — é o resultado de um LEFT OUTER JOIN.","distortion_type":"atribuicao_errada","distorted_span":"produzirá como resultado a lista de todos os funcionários de uma empresa","corrected_statement":"A sentença SQL seguinte produzirá como resultado a lista dos funcionários para os quais seja verdadeira a condição Funcionarios.CodigoDep = Departamentos.CodigoDep, apresentando também o nome do departamento.","concept":"INNER JOIN só devolve linhas com correspondência; manter as demais exige junção externa","citation":null,"trap_note":"Leia primeiro o tipo de junção e só depois a descrição do resultado: todos os X, com o dado de Y quando existir, descreve LEFT JOIN; apenas os que casam, INNER JOIN."}},{"id":"187306ec2d3a","number":110,"stem":69,"statement":"Situação hipotética: Determinada consulta foi feita mediante a execução da seguinte sequência de comandos SQL.\n\nCREATE TABLE prova (codprocesso integer,\ndescricao varchar(10),\ncodprocessopai integer);\nINSERT INTO prova VALUES (1, \"A\", 3);\nINSERT INTO prova VALUES (2, \"B\", 1);\nINSERT INTO prova VALUES (3, \"C\", null);\nINSERT INTO prova VALUES (4, \"D\", 3);\nSELECT p.descricao, pp.descricao as\ndescricaopai\nFROM prova p\nINNER JOIN prova pp on p.codprocesso=pp.codprocessopai\nWHERE pp.codprocessopai =3;\n\nAssertiva: Nessa situação, o resultado da consulta será o que se segue. descrição descricaopai","answer":"C","source":{"slug":"MP_PI_18","ano":2018},"explanation":{"verdict_reason":"A autojunção liga p.codprocesso a pp.codprocessopai, e o WHERE restringe pp a linhas cujo pai seja 3. Só as linhas A e D têm codprocessopai igual a 3, e ambas se emparelham com a linha de codprocesso 3, que é C. O resultado são os pares C com A e C com D. A linha C, cujo codprocessopai é null, nunca aparece do lado pp porque a igualdade com NULL não é verdadeira.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Autojunção hierárquica e exclusão de NULL pelo INNER JOIN","citation":null,"trap_note":"Em autojunção pai e filho, monte a tabela mentalmente e lembre-se de que a linha raiz, com pai NULL, jamais casa em INNER JOIN: NULL não é igual a coisa alguma, nem a NULL."}},{"id":"727701dd8cc3","number":51,"stem":70,"statement":"Os comandos DDL abaixo permitem criar as tabelas do diagrama.\n\nCREATE TABLE tbldepartamento\n(\n  codigo_departamento integer NOT NULL,\n  nome_departamento character varying(100),\n  chefe_departamento integer,\n  CONSTRAINT departamento_pkey PRIMARY KEY\n(codigo_departamento),\n   CONSTRAINT departamento_chefe_fkey foreign\nkey (chefe_departamento) references\ntblprofessor\n);\nCREATE TABLE tblprofessor\n(\n  codigo_professor integer NOT NULL,\n  nome_professor character varying(100),\n  codigo_departamento integer,\n  CONSTRAINT professor_primarykey PRIMARY KEY\n(codigo_professor),\n     CONSTRAINT professor_departamento_fkey\nforeign key (codigo_departamento) references\ntbldepartamento\n);","answer":"E","source":{"slug":"TRF1_17_SERVIDOR","ano":2017},"explanation":{"verdict_reason":"tbldepartamento é criada primeiro e já declara uma chave estrangeira que referencia tblprofessor, tabela que só é criada no comando seguinte. Uma FOREIGN KEY só pode apontar para tabela existente, de modo que o primeiro CREATE TABLE falha e as tabelas não são criadas por esse script.","distortion_type":"atribuicao_errada","distorted_span":"CONSTRAINT departamento_chefe_fkey foreign\nkey (chefe_departamento) references\ntblprofessor","corrected_statement":"Os comandos DDL abaixo não permitem criar as tabelas do diagrama, pois tbldepartamento referencia tblprofessor antes de esta existir.","concept":"Chave estrangeira exige tabela referenciada já criada","citation":null,"trap_note":"Quando duas tabelas se referenciam mutuamente, nenhum par de CREATE TABLE puro funciona: uma das FKs tem de vir por ALTER TABLE depois."}},{"id":"89c5b3ac2164","number":51,"stem":71,"statement":"Os comandos DDL abaixo permitem criar as referidas tabelas.\n\nCREATE TABLE tbldepartamento\n(\n  codigo_departamento integer NOT NULL,\n  nome_departamento character varying(100),\n  chefe_departamento integer,\n  CONSTRAINT departamento_pkey PRIMARY KEY\n(codigo_departamento),\n   CONSTRAINT departamento_chefe_fkey foreign\nkey (chefe_departamento) references\ntblprofessor\n);\nCREATE TABLE tblprofessor\n(\n  codigo_professor integer NOT NULL,\n  nome_professor character varying(100),\n  codigo_departamento integer,\n  CONSTRAINT professor_primarykey PRIMARY KEY\n(codigo_professor),\n     CONSTRAINT professor_departamento_fkey\nforeign key (codigo_departamento) references\ntbldepartamento\n);","answer":"E","source":{"slug":"TRF1_17_SERVIDOR","ano":2017},"explanation":{"verdict_reason":"O script cria tbldepartamento antes de tblprofessor, mas a chave estrangeira departamento_chefe_fkey já referencia tblprofessor, que ainda não existe. O SGBD rejeita a referência a uma tabela inexistente e o primeiro CREATE TABLE falha. Para que o par circular seja criado, uma das chaves estrangeiras precisa ser adicionada depois, por ALTER TABLE.","distortion_type":"atribuicao_errada","distorted_span":"CONSTRAINT departamento_chefe_fkey foreign\nkey (chefe_departamento) references\ntblprofessor","corrected_statement":"Os comandos DDL abaixo não permitem criar as referidas tabelas, pois tbldepartamento referencia tblprofessor antes de esta ser criada.","concept":"Ordem de criação e referência circular entre chaves estrangeiras","citation":null,"trap_note":"Em item que exibe dois CREATE TABLE, verifique primeiro a ordem: uma FK só pode apontar para tabela já existente. Referência circular exige ALTER TABLE posterior."}},{"id":"3a7fb881b96e","number":56,"stem":72,"statement":"Após a execução do trecho de código SQL a seguir, a tabela tbl_conceito não será criada.\n\nbegin;\n  savepoint primeiro;\n  create table tbl_conceito (id int, nome\nvarchar);\n  rollback to savepoint primeiro;\ncommit;","answer":"C","source":{"slug":"TRF1_17_SERVIDOR","ano":2017},"explanation":{"verdict_reason":"No PostgreSQL o DDL é transacional: CREATE TABLE participa da transação como qualquer outro comando. O ROLLBACK TO SAVEPOINT primeiro desfaz tudo o que foi feito depois do savepoint, inclusive a criação da tabela, e o COMMIT seguinte confirma uma transação que já não contém essa criação.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"DDL transacional e ROLLBACK TO SAVEPOINT no PostgreSQL","citation":null,"trap_note":"PostgreSQL desfaz DDL dentro de transação; Oracle e MySQL executam commit implícito antes e depois do DDL, e nesses o rollback não desfaz a criação. O SGBD citado no item decide a resposta."}},{"id":"4b56af8575cb","number":75,"stem":73,"statement":"Especialmente devido à expressão na linha 11, o comando a seguir, após executado, retornará três registros.\n\nSELECT a.idsoft, a.versao, a.descricao\nFROM 'vsoftware' a\nINNER JOIN (\n   SELECT idsoft, MAX(versao) versao\n   FROM 'vsoftware'\n   GROUP BY idsoft) b ON a.idsoft = b.idsoft\nAND a.versao = b.versao;","answer":"E","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"A tabela derivada agrupa por idsoft e devolve a maior versão de cada software, o que produz duas linhas: a versão 3 do software 1 e a versão 2 do software 2. A junção interna com vsoftware casa cada uma dessas linhas com um único registro, pela chave composta idsoft e versao. O comando retorna dois registros, não três.","distortion_type":"numero_errado","distorted_span":"retornará três registros","corrected_statement":"Especialmente devido à expressão na linha 11, o comando a seguir, após executado, retornará dois registros.","concept":"Junção com tabela derivada de MAX por grupo","citation":null,"trap_note":"O tamanho do resultado de uma junção com subconsulta agrupada é o número de grupos, não o de linhas da tabela original. Conte os valores distintos da coluna do GROUP BY."}},{"id":"4f62f05db308","number":76,"stem":73,"statement":"A execução do comando\n\nSELECT a.idsoft, a.versao, a.descricao\nFROM 'vsoftware' a\nLEFT OUTER JOIN 'vsoftware' b\n    ON a.idsoft = b.idsoft AND a.versao <\nb.versao\nWHERE b.idsoft IS NULL;\n\nretornará os seguintes dados.\n\nidsoft versao descricao\n1 3 adicao da tela C.\n2 2 adicao da tela D.","answer":"C","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"A junção externa procura, para cada linha, outra do mesmo software com versão maior. Quando não existe nenhuma, o LEFT OUTER JOIN preserva a linha e preenche as colunas de b com NULL; o filtro b.idsoft IS NULL retém exatamente essas. Sobram as versões máximas de cada software: a versão 3 do software 1 e a versão 2 do software 2.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Antijunção por LEFT JOIN com filtro IS NULL","citation":null,"trap_note":"O par LEFT JOIN mais IS NULL é o idioma canônico da antijunção. O IS NULL não testa dado nulo na tabela: testa a ausência de correspondência criada pela própria junção externa."}},{"id":"f3200ac43fc5","number":77,"stem":73,"statement":"A execução do comando\n\nSELECT a.id\nFROM 'software' a\nwhere a.id not in (\nSELECT b.idsoft\nFROM 'vsoftware' b);\n\nterá resultado idêntico à execução do comando a seguir.\n\nSELECT distinct a.id\nFROM 'software' a left outer join 'vsoftware' b\non a.id=b.idsoft;","answer":"E","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"O primeiro comando é uma antijunção e devolve apenas os softwares sem nenhuma versão cadastrada. O segundo faz a junção externa mas não filtra as linhas sem correspondência, de modo que o DISTINCT devolve todos os identificadores de software, inclusive os que têm versões. Faltou ao segundo comando a condição WHERE b.idsoft IS NULL, que é o que tornaria os dois equivalentes.","distortion_type":"excecao_omitida","distorted_span":"terá resultado idêntico à execução do comando a seguir.","corrected_statement":"terá resultado idêntico à execução do comando a seguir apenas se a este for acrescentada a condição WHERE b.idsoft IS NULL.","concept":"NOT IN equivale a LEFT JOIN somente com o filtro IS NULL","citation":null,"trap_note":"Junção externa sem o filtro IS NULL não é antijunção: ela devolve tudo, com nulos onde não houve par. E, ao contrário do NOT IN, a antijunção continua correta mesmo quando a subconsulta contém NULL."}},{"id":"1f6e4191b932","number":79,"stem":73,"statement":"O comando ALTER TABLE software add data datetime; no MySQL 5.6 adiciona um novo campo data à tabela software.","answer":"C","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"ALTER TABLE com ADD acrescenta uma coluna à tabela existente, e no MySQL a palavra COLUMN é opcional. O comando cria, portanto, o campo chamado data, do tipo datetime, na tabela software.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"ALTER TABLE ADD acrescenta coluna","citation":null,"trap_note":"ALTER TABLE é o único comando que altera uma tabela já criada, e seus três verbos caem sempre: ADD acrescenta, DROP remove e MODIFY ou ALTER COLUMN muda a definição."}},{"id":"3af1655df1b2","number":80,"stem":73,"statement":"O comando a seguir no MySQL 5.6 modifica o tipo do campo nome para CHAR na tabela software. ALTER TABLE software MODIFY nome char(100);","answer":"C","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"No MySQL, MODIFY dentro do ALTER TABLE redefine a coluna informada, mantendo o nome e trocando a especificação de tipo. O comando altera o campo nome para o tipo CHAR com cem posições na tabela software.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"ALTER TABLE MODIFY altera o tipo da coluna","citation":null,"trap_note":"Distinga MODIFY de CHANGE no MySQL: MODIFY redefine mantendo o nome, CHANGE exige repetir o nome antigo e o novo. Ambos são DDL."}},{"id":"64f979f501e4","number":83,"stem":74,"statement":"Especialmente voltado para o armazenamento de dados de sistemas de suporte a decisão (DSS) e data warehouse, os dados no Oracle podem ser armazenados em uma nova área opcional denominada In-Memory (IM). A IM é um suplemento que substitui a system global area (SGA), pois se sobrepõe ao cache de buffer do banco de dados, permitindo alto poder de processamento ao varrer dados colunares rapidamente por meio de vetorização.","answer":"E","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"O armazenamento colunar em memória do Oracle é uma área alocada dentro da SGA, e não algo que a substitua. Ele funciona como complemento do cache de buffer, que continua atendendo o formato de linhas para a carga transacional, enquanto a área em memória acelera as varreduras analíticas em formato de coluna.","distortion_type":"troca_de_termo","distorted_span":"A IM é um suplemento que substitui a system global area (SGA)","corrected_statement":"Especialmente voltado para o armazenamento de dados de sistemas de suporte a decisão (DSS) e data warehouse, os dados no Oracle podem ser armazenados em uma nova área opcional denominada In-Memory (IM). A IM é um suplemento alocado dentro da system global area (SGA), pois complementa o cache de buffer do banco de dados, permitindo alto poder de processamento ao varrer dados colunares rapidamente por meio de vetorização.","concept":"O armazenamento colunar em memória fica dentro da SGA","citation":null,"trap_note":"Substituir e complementar são verbos que a banca troca em itens de arquitetura. Estrutura nova que acelera um caso de uso quase sempre convive com a antiga em vez de eliminá-la."}},{"id":"35a045bdf73f","number":84,"stem":74,"statement":"Os dados nos SGBDs são organizados em blocos, em que os sistemas de suporte à decisão (DSS) e os ambientes de banco de dados de data warehouse tendem a se beneficiar de valores de tamanho de bloco maiores.","answer":"C","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"O bloco é a menor unidade de entrada e saída do SGBD. Ambientes de apoio à decisão e de data warehouse executam varreduras longas e sequenciais sobre grandes volumes, e blocos maiores trazem mais linhas por leitura, reduzindo o número de operações de E/S. Cargas transacionais, ao contrário, favorecem blocos menores por acessarem poucas linhas por vez.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Tamanho de bloco maior favorece varreduras analíticas","citation":null,"trap_note":"Dimensionamento em banco de dados segue o padrão de acesso: leitura sequencial de muitos dados pede blocos grandes; acesso aleatório a poucas linhas pede blocos pequenos."}},{"id":"519a3a6a330b","number":85,"stem":74,"statement":"Os blocos de dados são organizados em cabeçalho (row header) e dados (column data); a cada nova transação, o registro é armazenado como uma nova linha na tabela e, assim, um registro é armazenado em várias colunas em blocos de dados no disco.","answer":"C","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"Dentro do bloco, cada peça de linha tem um cabeçalho, com os metadados da linha, seguido da área de dados das colunas, em que os valores do registro são gravados em sequência. É assim que um mesmo registro fica distribuído por várias colunas dentro do bloco em disco.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Organização interna do bloco: cabeçalho e dados de coluna","citation":null,"trap_note":"Armazenamento em blocos é assunto físico, e não lógico. Não misture com o modelo relacional: a ordem das colunas no bloco nada diz sobre o esquema."}},{"id":"206b58522989","number":87,"stem":75,"statement":"No MySQL 5.6, o modo padrão de execução das transações é autocommit, o qual faz que as mudanças realizadas se tornem permanentes após a execução bem-sucedida desse comando; entretanto, esse modo será desabilitado implicitamente, se uma série de instruções for iniciada por meio do comando START TRANSACTION.","answer":"C","source":{"slug":"STM_17_ANALISTA_TECNICO","ano":2017},"explanation":{"verdict_reason":"No MySQL o autocommit vem ativado por padrão, o que faz cada comando bem-sucedido ser confirmado de imediato, como se fosse uma transação isolada. START TRANSACTION suspende esse comportamento até que venha um COMMIT ou um ROLLBACK, agrupando as instruções em uma única transação.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Autocommit padrão e sua suspensão por START TRANSACTION","citation":null,"trap_note":"Em itens de TCL, verifique quem delimita a transação: sem START TRANSACTION ou BEGIN, cada comando já é uma transação confirmada, e não há o que desfazer com ROLLBACK depois."}},{"id":"2568b4e778a0","number":99,"stem":76,"statement":"Quando executado, o código retornará os nomes dos dez contribuintes com maior valor atribuído de IPTU, considerando a soma dos valores de IPTU de todos os imóveis registrados nos nomes desses contribuintes.","answer":"E","source":{"slug":"PREF_JP_17_CGM","ano":2017},"explanation":{"verdict_reason":"O código não contém função de agregação nem GROUP BY, de modo que nada é somado por contribuinte: ele ordenaria pelo valor de cada imóvel isolado. Além disso, o WHERE aparece depois do ORDER BY e do LIMIT, o que viola a ordem obrigatória das cláusulas e impede a execução. Para o resultado descrito seriam necessários SUM com GROUP BY pelo contribuinte e o LIMIT ao final.","distortion_type":"atribuicao_errada","distorted_span":"considerando a soma dos valores de IPTU de todos os imóveis registrados nos nomes desses contribuintes","corrected_statement":"Quando executado, o código não retornará os nomes dos dez contribuintes com maior valor atribuído de IPTU, pois não agrupa nem soma os valores por contribuinte e apresenta as cláusulas fora da ordem exigida.","concept":"Total por entidade exige SUM com GROUP BY; ordem das cláusulas é fixa","citation":null,"trap_note":"Duas verificações resolvem quase todo item que exibe consulta e promete um ranking: existe GROUP BY com a função de agregação, e as cláusulas estão na ordem SELECT, FROM, WHERE, GROUP BY, HAVING, ORDER BY."}},{"id":"d145760287ec","number":57,"stem":77,"statement":"As DMLs de alto nível são incapazes de especificar e restaurar múltiplos registros em um único comando.","answer":"E","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"As DMLs de alto nível, ou não procedurais, são orientadas a conjuntos: um único comando especifica e recupera vários registros de uma vez. Incapazes disso são as DMLs de baixo nível, ou procedurais, que operam registro a registro e por isso precisam ser embutidas em uma linguagem hospedeira.","distortion_type":"inversao","distorted_span":"são incapazes de especificar e restaurar múltiplos registros em um único comando","corrected_statement":"As DMLs de alto nível são capazes de especificar e recuperar múltiplos registros em um único comando.","concept":"DML de alto nível opera por conjunto; a de baixo nível, registro a registro","citation":null,"trap_note":"Alto nível é não procedural e trabalha um conjunto de cada vez, como a SQL; baixo nível é procedural e trabalha um registro de cada vez. Negação de capacidade atribuída ao alto nível inverte esse par."}},{"id":"ec8a8665ea13","number":59,"stem":77,"statement":"Para se eliminar a restrição empfunfk de uma tabela chamada empregado, pode-se utilizar o seguinte comando.\n\nALTER TABLE TBEMPREGADO DROP CONSTRAINT\nEMPFUNFK CASCADE;","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"Restrições nomeadas são removidas com ALTER TABLE seguido de DROP CONSTRAINT, e o CASCADE propaga a remoção aos objetos que dependem dela, como chaves estrangeiras que a referenciam. O comando exibido tem exatamente essa forma.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"ALTER TABLE ... DROP CONSTRAINT ... CASCADE","citation":null,"trap_note":"O ALTER TABLE altera a estrutura nos dois sentidos: adiciona e remove colunas e restrições. Item que nega uma dessas possibilidades costuma ser falso."}},{"id":"1f999cc44ea1","number":60,"stem":77,"statement":"Um compilador DDL tem a função de processar os comandos DDL para que sejam identificadas as seguintes operações sobre o banco de dados: recuperação, inserção, remoção e modificação dos dados.","answer":"E","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"Recuperação, inserção, remoção e modificação de dados são as quatro operações da DML, processadas pelo compilador (ou pré-compilador) DML junto ao processador de consultas. O compilador DDL trata das definições do esquema, convertendo-as em metadados no catálogo.","distortion_type":"atribuicao_errada","distorted_span":"Um compilador DDL tem a função de processar os comandos DDL","corrected_statement":"Um compilador DML tem a função de processar os comandos DML para que sejam identificadas as seguintes operações sobre o banco de dados: recuperação, inserção, remoção e modificação dos dados.","concept":"Compilador DDL trata do esquema; compilador DML, das operações sobre os dados","citation":null,"trap_note":"Quando o item nomeia um componente e em seguida lista operações, confira se a lista pertence ao componente: aqui a lista é a própria definição da DML."}},{"id":"4ecf243f4cae","number":64,"stem":78,"statement":"Situação hipotética: O proprietário de determinada relação concedeu, com grant option, um privilégio sobre essa relação a uma conta. Assertiva: Nessa situação, a conta poderá conceder esse privilégio para outras contas sem que o proprietário saiba.","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"O grant option transfere ao beneficiário o poder de repassar o privilégio recebido, e esse repasse não exige nova autorização nem aviso ao proprietário — é o mecanismo de propagação de privilégios da DCL. Ao proprietário resta revogar, e a revogação em cascata é o que desfaz os repasses.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"WITH GRANT OPTION propaga o privilégio sem novo consentimento","citation":null,"trap_note":"Conceder com grant option é abrir mão do controle do repasse; só o REVOKE em cascata recupera esse controle."}},{"id":"417ffeef68e8","number":98,"stem":79,"statement":"O comando create table pode ser utilizado para criar tanto uma tabela vazia quanto uma com dados de outra tabela.","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"O CREATE TABLE define a tabela vazia e, na forma CREATE TABLE seguida de AS SELECT, cria a tabela já preenchida com o resultado de uma consulta a outra tabela. As duas possibilidades estão previstas.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"CREATE TABLE ... AS SELECT cria e popula em um comando","citation":null,"trap_note":"Quando o item diz que um comando pode ser utilizado para algo, basta uma forma da instrução que satisfaça a afirmação para que ele seja Certo."}},{"id":"f399d937d948","number":99,"stem":79,"statement":"Ao se criar uma view, não é necessário que os nomes dos atributos da view sejam os mesmos dos atributos da tabela.","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"Na definição da view é possível renomear os atributos, tanto pela lista de nomes que segue o nome da view quanto por apelidos atribuídos no SELECT. O nome exibido pela view é, portanto, independente do nome da coluna na tabela base.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"View pode renomear os atributos da tabela base","citation":null,"trap_note":"View é consulta com nome: tudo o que o SELECT permite — apelidar, calcular, agregar, juntar — a view também permite."}},{"id":"5b578116d307","number":100,"stem":79,"statement":"Para que um usuário possa executar o comando select em uma view, não é necessário que ele tenha esse privilégio diretamente na view, mas apenas na tabela a que a view faz referência.","answer":"E","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"O privilégio é concedido sobre o objeto efetivamente acessado: para consultar a view, o usuário precisa de SELECT na view, e o privilégio na tabela base não substitui esse. É justamente por isso que a view funciona como instrumento de segurança, permitindo liberar o recorte sem liberar a tabela.","distortion_type":"inversao","distorted_span":"não é necessário que ele tenha esse privilégio diretamente na view, mas apenas na tabela a que a view faz referência","corrected_statement":"Para que um usuário possa executar o comando select em uma view, é necessário que ele tenha esse privilégio na view, ainda que não o tenha na tabela a que a view faz referência.","concept":"O privilégio se concede sobre a view, não se herda da tabela base","citation":null,"trap_note":"A view existe para dar acesso sem dar acesso à tabela. Quem precisa de privilégio sobre a base é o dono da view, não quem a consulta."}},{"id":"edb27c34062e","number":101,"stem":79,"statement":"A inserção de uma consulta na cláusula from de outra consulta não configura erro de sintaxe.","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"Uma subconsulta na cláusula FROM forma uma tabela derivada, construção prevista no padrão, bastando que receba um apelido nos produtos que o exigem. Não há erro de sintaxe em aninhar consulta nessa posição.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Subconsulta no FROM é tabela derivada","citation":null,"trap_note":"Subconsulta cabe no SELECT, no FROM, no WHERE e no HAVING. Item que proíbe uma dessas posições costuma ser falso."}},{"id":"37bb44188598","number":102,"stem":79,"statement":"Em versões recentes da linguagem SQL, o comando delete permite a exclusão de valores em atributos específicos, mantendo-se inalterados os valores dos outros atributos que compõem a tupla.","answer":"E","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"O DELETE atua sobre a linha inteira: ou a tupla é removida, ou permanece como está. Apagar o conteúdo de atributos específicos, preservando os demais, é trabalho do UPDATE, inclusive quando o que se quer é atribuir nulo à coluna.","distortion_type":"atribuicao_errada","distorted_span":"o comando delete permite a exclusão de valores em atributos específicos","corrected_statement":"Em versões recentes da linguagem SQL, o comando update permite a alteração de valores em atributos específicos, mantendo-se inalterados os valores dos outros atributos que compõem a tupla.","concept":"DELETE remove a linha inteira; UPDATE altera colunas","citation":null,"trap_note":"A granularidade decide: linha inteira é DELETE, valor de coluna é UPDATE, definição da coluna é ALTER TABLE."}},{"id":"d28f704b990c","number":106,"stem":80,"statement":"A instrução create assertion <nome-asserção> check <predicado> é utilizada para definir restrições de integridade.","answer":"C","source":{"slug":"FUB_16_1","ano":2016},"explanation":{"verdict_reason":"O CREATE ASSERTION define uma restrição de integridade geral, que pode envolver mais de uma tabela, e o predicado do CHECK precisa permanecer verdadeiro a cada alteração do banco. A instrução tem no padrão exatamente a forma apresentada.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"CREATE ASSERTION define restrição de integridade geral","citation":"Padrão SQL (ISO/IEC 9075) — CREATE ASSERTION","trap_note":"Restrição ligada a uma coluna ou tabela usa CHECK; a que envolve mais de uma tabela usa ASSERTION, ou gatilhos nos produtos que não a implementam."}},{"id":"9e62c87a16a4","number":107,"stem":80,"statement":"O operador BETWEEN-AND retornará verdadeiro se o valor da coluna na cláusula WHERE for maior ou igual ao primeiro valor e menor ou igual ao segundo valor.","answer":"C","source":{"slug":"FUB_16_1","ano":2016},"explanation":{"verdict_reason":"BETWEEN define um intervalo fechado: a expressão coluna BETWEEN a AND b equivale a coluna maior ou igual a a e menor ou igual a b, incluindo os dois extremos. É o que o item enuncia.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"BETWEEN é intervalo fechado, inclui os limites","citation":null,"trap_note":"Nos itens de operadores, o ponto decisivo é sempre a inclusão dos extremos e o tratamento de nulos: nenhuma comparação com nulo devolve verdadeiro, nem dentro do BETWEEN."}},{"id":"8bc92ce008d1","number":108,"stem":80,"statement":"SELECT é uma instrução de controle de banco de dados que permite recuperar o conteúdo de uma ou mais tabelas.","answer":"E","source":{"slug":"FUB_16_1","ano":2016},"explanation":{"verdict_reason":"A segunda metade descreve corretamente o que o SELECT faz, mas a classificação está errada: SELECT é a instrução de consulta, tratada como DQL ou, em muitos autores, como parte da DML. Controle de banco de dados é a DCL, de GRANT e REVOKE, que trata de privilégios.","distortion_type":"atribuicao_errada","distorted_span":"SELECT é uma instrução de controle de banco de dados","corrected_statement":"SELECT é uma instrução de consulta de banco de dados que permite recuperar o conteúdo de uma ou mais tabelas.","concept":"SELECT é consulta (DQL/DML), não controle (DCL)","citation":null,"trap_note":"Quando a descrição do efeito está certa, desconfie da etiqueta: é comum a banca acertar o que o comando faz e errar de propósito a sublinguagem a que ele pertence."}},{"id":"768911a98de7","number":109,"stem":80,"statement":"Em uma consulta SQL que contém as cláusulas WHERE e HAVING, a cláusula WHERE é aplicada às linhas no conjunto de resultados.","answer":"E","source":{"slug":"FUB_16_1","ano":2016},"explanation":{"verdict_reason":"O WHERE é aplicado antes do agrupamento, linha a linha, e decide quais linhas entram nos grupos; quem atua sobre o conjunto já agregado é o HAVING. O item dá ao WHERE o momento de atuação do HAVING.","distortion_type":"atribuicao_errada","distorted_span":"a cláusula WHERE é aplicada às linhas no conjunto de resultados","corrected_statement":"Em uma consulta SQL que contém as cláusulas WHERE e HAVING, a cláusula WHERE é aplicada às linhas antes do agrupamento, e a cláusula HAVING, aos grupos do conjunto de resultados.","concept":"WHERE atua antes do agrupamento; HAVING, depois","citation":null,"trap_note":"Decore a ordem lógica de execução: FROM, WHERE, GROUP BY, HAVING, SELECT, ORDER BY. Toda questão de WHERE × HAVING é uma pergunta sobre essa ordem."}},{"id":"02f5cbe9560a","number":112,"stem":81,"statement":"O resultado da consulta a seguir, que utiliza o operador UNION, não elimina os registros duplicados entre as tabelas.\n\nSELECT depto FROM emp\nUNION\nSELECT depto FROM depto;","answer":"E","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"UNION é operação de conjuntos e, por definição, elimina as linhas duplicadas do resultado combinado. Quem preserva as repetições é o UNION ALL, que por isso costuma ser mais rápido, já que dispensa a ordenação ou o hash necessários à remoção de duplicatas.","distortion_type":"inversao","distorted_span":"não elimina os registros duplicados entre as tabelas","corrected_statement":"O resultado da consulta a seguir, que utiliza o operador UNION, elimina os registros duplicados entre as tabelas.\n\nSELECT depto FROM emp\nUNION\nSELECT depto FROM depto;","concept":"UNION elimina duplicatas; UNION ALL as mantém","citation":null,"trap_note":"A palavra ALL é o interruptor das operações de conjunto: sem ela, UNION, INTERSECT e EXCEPT devolvem resultado sem repetições."}},{"id":"f11dafd05cf2","number":117,"stem":82,"statement":"O comando seguinte altera a informação do salário dos funcionários do setor de vendas aumentando-o em 15%.\n\nupdate tabela_salario set salario =\nsalario*1.15 where setor='vendas'","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"O UPDATE altera apenas as linhas selecionadas pelo WHERE, e a expressão salario = salario*1.15 toma o valor atual da coluna e o acresce de 15%. O filtro setor='vendas' restringe a alteração ao setor indicado, como o item afirma.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"UPDATE com expressão calculada sobre a própria coluna","citation":null,"trap_note":"Em item de UPDATE confira dois pontos: o fator, pois 1.15 acresce 15% enquanto 0.15 reduziria o salário a 15% do valor, e a presença do WHERE, cuja ausência atingiria a tabela inteira."}},{"id":"83e5dd575c66","number":118,"stem":82,"statement":"O comando a seguir exclui da tabela pessoas o registro de pessoas cujo nome começa com as letras ca. delete from pessoas where nome like 'ca%'","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"No LIKE, o curinga % substitui qualquer sequência de caracteres, inclusive vazia, de modo que o padrão 'ca%' casa todo nome iniciado por ca. O DELETE remove as linhas que satisfazem esse filtro, exatamente como descrito.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"% no LIKE representa qualquer sequência de caracteres","citation":null,"trap_note":"Os dois curingas e sua posição decidem esses itens: % vale por qualquer sequência e _ por exatamente um caractere; o curinga no fim do padrão testa o início do valor."}},{"id":"26369d3d656c","number":119,"stem":83,"statement":"A expressão DDL abaixo cria a tabela referente ao diagrama de entidade e relacionamento apresentado a seguir.\n\ncreate table tribunal(\n   tribunal_codigo integer ,\n   tribunal_descricao varchar(100),\n   tribunal_pai integer primary key,\n   constraint fk_tribunal\n   foreign key (tribunal_codigo )\n   references tribunal","answer":"C","source":{"slug":"TCE_PA_16","ano":2016},"explanation":{"verdict_reason":"O diagrama apresenta a tabela tribunal com tribunal_pai como chave primária, tribunal_codigo como chave estrangeira e um autorrelacionamento, e o comando reproduz exatamente isso: primary key em tribunal_pai e a restrição fk_tribunal ligando tribunal_codigo à própria tabela tribunal. Autorrelacionamento se implementa assim, com a chave estrangeira referenciando a própria tabela.","distortion_type":"correto","distorted_span":null,"corrected_statement":null,"concept":"Autorrelacionamento: chave estrangeira que referencia a própria tabela","citation":null,"trap_note":"Em item que pede correspondência entre DDL e diagrama, compare coluna a coluna com o desenho, não com o que pareceria natural: aqui a chave primária está em tribunal_pai, contra a intuição, e é o que o diagrama mostra."}},{"id":"9f3f8cf153fd","number":78,"stem":84,"statement":"As operações do tipo CRUD (Create, Read, Update, Drop) formam uma das funcionalidades básicas utilizadas em bancos de dados relacionais.","answer":"E","source":{"slug":"TJDFT_15_SERVIDOR","ano":2015},"explanation":{"verdict_reason":"A sigla CRUD corresponde a Create, Read, Update e Delete, as quatro operações elementares sobre dados, mapeadas em SQL como INSERT, SELECT, UPDATE e DELETE. Drop não faz parte da sigla: é comando de definição de dados, que destrói o objeto, e não uma operação sobre registros.","distortion_type":"troca_de_termo","distorted_span":"(Create, Read, Update, Drop)","corrected_statement":"As operações do tipo CRUD (Create, Read, Update, Delete) formam uma das funcionalidades básicas utilizadas em bancos de dados relacionais.","concept":"CRUD: o D é Delete, não Drop","citation":null,"trap_note":"Toda sigla expandida no item é um ponto de checagem. Aqui a troca de Delete por Drop ainda muda a linguagem: DML vira DDL."}},{"id":"6cd4dbe2c56f","number":94,"stem":85,"statement":"O uso de correlated subquery aumenta o desempenho na execução de consultas a bancos de dados.","answer":"E","source":{"slug":"TJDFT_15_SERVIDOR","ano":2015},"explanation":{"verdict_reason":"A subconsulta correlacionada depende de uma coluna da consulta externa e, por isso, é reavaliada uma vez para cada linha candidata da consulta externa. Esse comportamento linha a linha degrada o desempenho, e é justamente o que se procura eliminar em tunning, reescrevendo-a como junção ou como tabela derivada.","distortion_type":"inversao","distorted_span":"aumenta o desempenho","corrected_statement":"O uso de correlated subquery reduz o desempenho na execução de consultas a bancos de dados.","concept":"Subconsulta correlacionada é reavaliada por linha","citation":null,"trap_note":"Em itens de otimização, o que é reexecutado por linha piora o desempenho: subconsulta correlacionada, função aplicada à coluna no WHERE e conversão implícita da coluna."}}]}