O Que É SQL Select? (com exemplos)

0
332

Última Atualização 21 de março de 2021

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.

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