SóProvas


ID
2649379
Banca
CESPE / CEBRASPE
Órgão
STJ
Ano
2018
Provas
Disciplina
Banco de Dados
Assuntos

Julgue o seguinte item, relativo a métrica de qualidade de software, JUnit, SQL, Delphi e desenvolvimento mobile.


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.


SELECT Funcionarios.Nome, Departamentos.NomeDep

FROM Funcionarios

INNER JOIN Departamentos ON

Funcionarios.CodigoDep =

Departamentos.CodigoDep

ORDER BY Funcionarios.Nome;

Alternativas
Comentários
  • Não consigo visualizar o erro da questão mesmo reproduzindo o código.

  • qual o erro da questão? também não consegui visualizar. 

     

     

  • Boa noite pessoal, pois é aparentemente sem erros, mas não seria uma questão MALDOSA de interpretação? 

     "(1)A sentença SQL seguinte produzirá como resultado a lista de todos os funcionários de uma empresa. (PONTO) (2)Para aqueles em que seja verdadeira a condição Funcionarios.CodigoDep = Departamentos.CodigoDep, será apresentado também o nome do departamento."

    Na frase (1) está falando que o SQL irá retornar a lista de todos os funcionários de um empresa. 

    (2) Quando a condição for verdadeira a coluna DEPARTAMENTO também irá ser retornada.

    Ou seja, pelo meu entendimento o examinador está falando, "o sql vai retornar tudão das 2 tabelas, mas perai! quando os códigos de departamentos das 2 tabelas forem iguais vai retornar também a coluna departamento" e o retorno  correto do sql em tela seria " o sql retornará o nome de todos os funcionários  e departamentos em que a condição é verdadeira, ordenado pela coluna nome"

    No meu entendimento é claro.

  • Pessoal, o erro está em " produzirá como resultado a lista de todos os funcionários de uma empresa." e também em 

    "Para aqueles em que seja verdadeira a condição Funcionarios.CodigoDep = Departamentos.CodigoDep, será apresentado também o nome do departamento."

    Não é nem um, nem outro, foquem no resultado da consulta:
    " retornará  Funcionarios.Nome, Departamentos.NomeDep APENAS das tuplas que satisfazem Funcionarios.CodigoDep = Departamentos.CodigoDep"
    captaram?

  • ERRADO

    Resumindo: o SQL está correto, porém ele retonará TODOS OS FUNCIONÁRIOS QUE ESTÃO LOTADOS EM ALGUM DEPARTAMENTO, ordenado pelo nome do funcionario

  • Discordo de quem acha a questão errada. Até a parte textual que fala do resultado está correta. O texto diz que o comando vai retornar o nome e o departamento do funcionário associando a chave primária a chave extrangeira. Questão correta do começo ao fim.

  • Sabem qual é o erro? ".. TODOS os funcionários...". Para o CESPE (de acordo com o texto da questão e comparado com o gabarito), existem funcionários que não estão lotados em nenhum departamento, ou seja, são simplesmente funcionários vagando pelo corredor da empresa. CESPE sendo CESPE. Às vezes é impossível entender essa mente maldosa dessa banca.

  • Anderson Silva, concordo com você. Inclusive há erro de semântica. Se há funcionários com departamento, significa que há relacionamentos entre essas relações. E se houver funcionários sem departamento, como se consegue ignorar a integridade referencial? Se retorna os funcionário e seus respectivos departamentos, não há erro.

  • Integridade Referencial não obrigatória, basta um funcionáio não ter departamento, questão errada em dizer TODOS.

  • Diego Cardoso, seu comentário me trouxe mais um detalhe. A questão nem cita nada da implementação ou regra de negócio do banco, o que aumenta mais ainda a possibilidade de recurso. Como o candidato pode deduzir que a integridade referencial não existe ou não é obrigatória?

  • Assertiva ERRADA. 

     

    Como temos um INNER JOIN, e não um LEF/RIGHT JOIN, não serão trazidos resultados desta ou daquela tabela + a interseção, e sim apenas a interseção, quando houver.

     

    Por isso o comando está errado: ele diz que será apresentada a tabela Funcionários + o resultado do INNER JOIN (Funcionários.CodigoDep = Departamentos.CodigoDep), quando na verdade ele só vai retornar o INNER JOIN (Funcionários.CodigoDep = Departamentos.CodigoDep). 

     

    Acho que é isso. 

  • nossa a PF vai tá dificil, to começando agora e se esse for o nivel das perguntas to lascado

  • GENTE! 

    Se querem aprender de forma rápida e precisa banco de dados, SGBD, ODBD e etc, vai pro Khan Academy... no módulo de programação, melhor lugar pra aprender a teoria e a prática da linguagem SQL. Abraços... 

  • Acertiva Errada


    Como se trata de INNER JOIN, a Query irá trazer APENAS os funcionários cujo CodigoDep corresponde na tabela de Departamentos. Não irá trazer todos. A Query traria todos se fosse utilizado a agregação de LEFT JOIN.

  • O comando em sim está correto, sintaxe. Acontece que ele não traz o resultado do comando da questão, ou seja, "TODOS" os funcionários. Ele traz apenas os funcionários que tenham relação com a tabela de Departamentos.

    Questão nível HARD para que não é da área de TI.

  • INNER (Interno) = JOIN dos Funcionarios que estejam em departamentos + departamentos que funcionario está

    OUTER (Externo) = JOIN dos Funcionarios que não estejam nos departamentos + departamentos sem funcionários

    LEFT (esquerdo) = JOIN de todos os Funcionarios + departamento que funcionário está ou vazio para funcionários sem departamento

    RIGHT (Direito) = JOIN de somente Funcionarios em departamentos ou vazio + todos os departamentos

  • Pica!!! Essa questão deixo em branco se vier na prova de PF!!!

     

  • Para aqueles em que seja verdadeira a condição Funcionarios.CodigoDep = Departamentos.CodigoDep

    (não tem como ser FALSA). É um relacionamento entre tabelas que irá mostrar o nome do departamento,

    sendo a condição Funcionarios.CodigoDep = Departamentos.CodigoDep

  • SELECT Funcionarios.Nome, Departamentos.NomeDep

    FROM Funcionarios

    where Funcionarios.CodigoDep = Departamentos.CodigoDep

    ORDER BY Funcionarios.Nome;

  • Não desanime, ainda tem estatística

  • NÃO SEI SE ESTOU CERTO!

    Faltou apenas o sinal de asterisco antes do FROM para selecionar TODOS. 

     

    O restante da Sintaxe me parece correta. . 

  • Pessoal, o comentário correto é o do Carlos Correa:

    Como se trata de INNER JOIN, a Query irá trazer APENAS os funcionários cujo CodigoDep corresponde na tabela de Departamentos. Não irá trazer todos. A Query traria todos se fosse utilizado a agregação de LEFT JOIN.

    PS: Para quem vai fazer para agente da PF, fiquem tranquilos, SQL não está no edital..só os conceitos de banco de dados e modelagem!!!

  • INNER (Interno) = JOIN dos Funcionarios que estejam em departamentos + departamentos que funcionario está

    OUTER (Externo) = JOIN dos Funcionarios que não estejam nos departamentos + departamentos sem funcionários

    LEFT (esquerdo) = JOIN de todos os Funcionarios + departamento que funcionário está ou vazio para funcionários sem departamento

    RIGHT (Direito) = JOIN de somente Funcionarios em departamentos ou vazio + todos os departamentos

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


    SELECT Funcionarios.Nome, Departamentos.NomeDep

    FROM Funcionarios

    LEFT JOIN Departamentos ON

    Funcionarios.CodigoDep =

    Departamentos.CodigoDep

    ORDER BY Funcionarios.Nome;

  • Vamos estabelecer conjuntos:

    A={"pedro", "financeiro",
    "Maria", "RH"
    "José", "contabilidade",
    "Carla", ""}

    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, ou seja, (subconjunto B).

    SELECT Funcionarios.Nome, Departamentos.NomeDep
    FROM Funcionarios
    INNER JOIN Departamentos ON
    Funcionarios.CodigoDep =
    Departamentos.CodigoDep
    ORDER BY Funcionarios.Nome;

    O resultado:

    B={"José", "contabilidade",
    "Maria", "RH",
    "pedro", "financeiro"}

    O resultado é "todos" os elementos do subconjunto B, sendo B subconjunto de A. A palavra "todos" que muitos acham que se refere ao total dos funcionários do banco está se referindo ao "todo" dentro da restrição, ou seja, "todos" os elementos do conjunto B  e não no geral. O detalhe é de interpretação de texto e não �técnico.

    Agora, observem o enunciado:

    A sentença SQL seguinte produzirá como resultado a lista de todos os funcionários de uma empresa:

    SELECT Funcionarios.Nome, Departamentos.NomeDep
    FROM Funcionarios
    INNER JOIN Departamentos ON
    Funcionarios.CodigoDep =
    Departamentos.CodigoDep
    ORDER BY Funcionarios.Nome;

    Bom, não diga que os enunciados estão pedindo a mesma coisa, pelo amor de Deus.

    O primeiro está correto. São "todos" os funcionários dentro da condição verdadeira, ou seja, subconjunto B.

    E  o segundo está errado. São todos os funcionários do banco, o que não está de acordo com a query.

    Então, o erro não é na palavra todos porque a questão não fala de todos do total, mas sim de todos dentro da restrição. O examinador pode ser o foda de banco, mas é totalmente fudido em Português.

  • Se fosse utilizado LEFT JOIN, estaria correto, mas o INNER JOIN irá gerar como resultado apenas os funcionários que estão lotados em algum departamento.


    Bons estudos!

  • A sintaxe da consulta está correta, ou seja, os comandos são consistentes com a linguagem SQL. Contudo, o examinador alega que a consulta produzirá a lista de todos os funcionários,o que não necessariamente é verdade.

    Não sabemos se a participação de Funcionarios é total neste relacionamento, ou seja, em teoria pode haver funcionários que não estão associados a nenhum departamento. Esses casos não seriam retornados pela consulta, já que se trata de um inner join.

    É possível perceber que a ideia da banca era descrever uma operação de left join, já que, nesse tipo de operação, seriam retornados todos os registros da tabela da esquerda (Funcionarios) e aqueles registros da tabela da direita (Departamentos) em que a condição Funcionarios.CodigoDep = Departamentos.CodigoDep fosse satisfeita.

    Gabarito: E

  • ✅Resposta: ERRADO

    A assertiva é iniciada com o comando: "A sentença SQL seguinte produzirá como resultado a lista de todos os funcionários de uma empresa."

    Assim...

    INNER JOIN

    A cláusula INNER JOIN permite usar um operador de comparação para comparar os valores de colunas provenientes de tabelas associadas. Por meio desta cláusula, os registros de duas tabelas são usados para que sejam gerados os dados relacionados de ambas. Usamos as cláusulas WHERE e FROM para especificar esse tipo de associação.

    LEFT JOIN

    A cláusula LEFT JOIN ou LEFT OUTER JOIN permite obter não apenas os dados relacionados de duas tabelas, mas também os dados não relacionados encontrados na tabela à esquerda da cláusula JOIN. Caso não existam dados relacionados entre as tabelas à esquerda e a direita do JOIN, os valores resultantes de todas as colunas da lista de seleção da tabela à direita serão nulos.

    A fonte desta explicação foi o artigo do site DevMedia. Sugiro ler o artigo completo! Deixo o link abaixo: https://www.devmedia.com.br/clausulas-inner-join-left-join-e-right-join-no-sql-server/18930

  • Observem que a junção utilizada na questão é um INNER JOIN. Portanto, os funcionários que não tiverem um departamento associado não irão aparecer no resultado final da consulta. Logo, o gabarito dela é errado.