CEBRASPE (2019):
QUESTÃO CERTA: No modelo apresentado no texto 9A1-I, um cliente pode ser responsável por vários clientes (seus dependentes, por exemplo). Com base nisso, assinale a opção que indica o comando, em linguagem SQL, capaz de produzir uma listagem de todos os clientes (dependentes) cujos responsáveis estejam cadastrados, seguidos de seus respectivos responsáveis, exatamente nessa sequência (dependentes e responsáveis).
“Neste caso, a query está selecionando o responsável do ALIAS “a” com o código do cliente do ALIAS “b”, ou seja, está relacionando todos os dependentes (responsáveis diferente de vazio) com seus respectivos responsáveis (b.CodCliente).
A questão não é trivial. Vamos tentar entender a resposta.
Um Exemplo:
CodCliente,EnderecoCliente,TelefoneCliente,NomeCliente,Responsavel
1, , , JOSE DA SILVA,null
2, , , MARIA DA SILVA,null
3, , , RICARDO SILVA,null
4, , , ZEZINHO,1
5, , , MARIAZINHA,2
6, , , JOAOZINHO,2
1) FROM CLIENTE A, CLIENTE B – Imaginemos aqui duas tabelas criadas A e B de conteúdos idênticos. Certo que o select desse from será o produto cartesiano de CLIENTE com ele mesmo resultando em uma quantidade de registro igual a n x n (onde n é o total de registros na tabela cliente). No nosso exemplo teríamos 36 registros no select * from cliente A, cliente B;
2) WHERE B.codCliente = A.Responsavel – aqui estamos filtrando a tabela “virtual” B. O resultado desse filtro fará com que B tenha apenas responsáveis por algum outro cliente. Como assim? Ora, estou querendo apenas os clientes B (codCliente) em que na tabela A esteja com o campo Responsavel (o código) preenchido (que são exatamente os responsáveis por alguém). Quem tiver com Responsavel = NULL não será usado no filtro visto que estamos tratando de um filtro de campo chave (CodCliente – obrigatório); Ao final CLIENTE B só terá Clientes responsáveis por outro cliente.
TABELA CLIENTE B:
CodCliente,EnderecoCliente,TelefoneCliente,NomeCliente,Responsavel
1, , , JOSE DA SILVA,null
2, , , MARIA DA SILVA,null
3) Tabela A continua como estava originalmente? Não também. Ela será afetada por WHERE B.codCliente = A.Responsavel. A será filtrada considerando B.codCliente. Mas B nesse momento B já está filtrada com apenas os responsáveis. Com isso a tabela A possuirá apenas os clientes que possuem os responsáveis que estão na tabela B.
TABELA CLIENTE A NO FINAL (A.Responsavel in (1,2)):
CodCliente,EnderecoCliente,TelefoneCliente,NomeCliente,Responsavel
4, , , ZEZINHO,1
5, , , MARIAZINHA,2
6, , , JOAOZINHO,2
4) agora ficou mais fácil. SELECT A.NomeCliente, B.NomeCliente – Resultará em
(4) ZEZINHO, (1) JOSE DA SILVA
(5) MARIAZINHA, (2) MARIA DA SILVA
(6) JOAOZINHO, (2) MARIA DA SILVA”
CEBRASPE (2016)
QUESTÃO ERRADA: Para obter a quantidade de linhas que atendem a determinada instrução SQL, o processo mais eficiente e rápido é executar o comando SELECT e aplicar uma estrutura de loop para contar as linhas resultantes.
“A forma mais eficiente e rápida seria usar o count(*)”.
CEBRASPE (2016)
QUESTÃO ERRADA: Em uma mesma base de dados, uma instrução de SELECT com união de duas tabelas (INNER JOIN) e uma instrução de SELECT em uma tabela utilizando um SELECT interno de outra tabela (subquery) produzem o mesmo resultado e são executadas com o mesmo desempenho ou velocidade.
“… não são necessariamente executadas com o mesmo desempenho ou velocidade”.
CEBRASPE (2008):
QUESTÃO ERRADA: SELECT, COUNT e DISTINCT são instruções mutuamente exclusivas em SQL e, dessa maneira, não podem ser utilizadas em uma mesma sentença SQL.
“Muito pelo contrário, COUNT e DISTINCT só poderão ser utilizadas dentro de instruções SELECT. Ou seja, pode existir SELECT sem COUNT nem DISTINCT, ou com uma das duas, ou até mesmo com as duas”.