Para escrever um SELECT sem “engasgar” é indispensável conhecer 7 itens muito importantes!
O comando SELECT é sem dúvida o comando mais usado pelos desenvolvedores, uma vez que os SGBDs relacionais ainda são os mais usados e muitas aplicações consultam dados armazenados neste tipo de SGBDs.
Modelo Relacional
O padrão SQL está baseado no modelo relacional, que é um modelo matemático para gerenciar e manipular os dados.
O modelo relacional foi desenvolvido por Edgar F. Codd em 1969, e teve colaborações de Chris Datte, Hugh Darween entre outros pesquisadores. Se você gosta muito de trabalhar com dados aconselho mil vezes que leia os livros do Chris Datte! Confesso que nem sempre acho estes livros maravilhosamente legais, mas a leitura deles já me ajudou muito!
Acho legal dizer que o nome “Modelo Relacional” não está ligado aos relacionamentos entre as tabelas! Está relacionado ao conceito matemático de relação, e uma relação é representada por uma tabela.
Não é impossível você ouvir arquitetos, desenvolvedores e outros profissionais afirmarem que usam o modelo relacional. Não está errado dizer isso, mas tenha consciência que usamos partes do modelo relacional. Até porque a linguagem SQL não suporta o modelo relacional exatamente como foi proposto por Codd.
T-SQL
T-SQL tem um lado lógico que é a interpretação conceitual de uma consulta que retorna um resultado, e tem o lado físico que é o processamento da query pela engine do banco de dados.
O processamento da query pela engine deve retornar o resultado definido pelo processamento lógico. Para isso existe a otimização, que pode reorganizar os passos para execução da query, remover passos… enfim é a responsável por fazer a execução da query da melhor maneira possível para retornar o resultado esperado. A ideia é alcançar um objetivo, usando a menor quantidade de recursos.
O SQL é uma linguagem declarativa, ou seja, você define O QUE você quer, e quem define o como este objetivo será alcançado é o otimizador
Item 1 – Ordem escrita e Ordem executada
O comando SELECT pode ser lido da seguinte maneira SELECT uma lista de atributos FROM nome da tabela. Selecione algo de algum lugar! Simples assim!!
Ele tem 6 cláusulas principais, escritas na ordem abaixo:
1- SELECT
2- FROM
3- WHERE
4- GROUP BY
5- HAVING
6- ORDER BY
Embora o comando seja escrito na ordem acima, o processamento da query acontece de forma diferente.
1- FROM
2- WHERE
3- GROUP BY
4- HAVING
5- SELECT
6- ORDER BY
E porque isso é importante?
Por exemplo, um ALIAS é um apelido que damos para uma coluna, por exemplo, temos a coluna CD_ADM_MSG e queremos que no retorno da query, o nome exibido seja “Código Administrativo Mensagem”.
Podemos usar o ALIAS que nós criamos na cláusula SELECT, para criar uma condição na cláusula WHERE? A resposta é NÃO!!! Porque na execução da query, o WHERE é executado antes da cláusula SELECT, ou seja, para a engine no momento da execução do WHERE o ALIAS nem existe ainda.
Item 2 – FROM
Esta é a primeira cláusula “avaliada”, é obrigatória e nela indicamos as relações que fazem parte de uma consulta. E neste caso entenda uma relação como outras consultas, views, tabelas temporárias, funções…
Para executar uma consulta a engine “pega” as relações indicadas na cláusula FROM e as separa, criando uma tabela virtual, interna e temporária.
Item 3 – WHERE
É a segunda cláusula executada, é opcional, mas se for informada é no processamento desta cláusula que é feito o filtro das linhas que devem ser retornadas.
Como funciona o filtro? É dada uma condição e só as linhas que obedecem a condição serão retornadas.
Item 4 – GROUP BY
Lembra que eu falei que a engine “pega as tabelas do FROM e deixa separado”? Na realidade internamente é criada uma tabela virtual, onde estão os dados das relações informadas no FROM.
No passo seguinte,os dados desta tabela virtual são filtrados na execução do WHERE. E depois são agrupados (quando existe um GROUP BY na query), e só os grupos diferentes são retornados.
O resultado final da execução desta cláusula é ser um valor para cada grupo.
Se no SELECT você usar a uma coluna que não faz parte do agrupamento, é necessário usar uma função, por exemplo, MAX, MIN, AVG e afins… Isso porque quando esta cláusula é usada, informamos para a engine que só um valor deve ser retornado por grupo (a repetição ajuda na fixação..rsrs).
ITEM 5 – HAVING
Já vi uns desenvolvedores experientes que não sabem usar a cláusula HAVING corretamente! Depois do WHERE é VIDA, outra coisa que eu amo falar é que HAVING é DIFERENTE DE WHERE! Having é um filtro que é executado depois que os dados são agrupados. Por exemplo,
SELECT Nome Funcionário, Idade Funcionário FROM Funcionário GROUP BY Idade Funcionário, Nome Funcionário HAVING AVG(Idade Funcionário) > 35
Ou seja, selecione o nome e a idade dos funcionários, agrupando os funcionários por idade e por nome, e retorne somente os grupos de funcionários que possuem a média de idade maior que 35 anos.
Não confunda a cláusula HAVING com o WHERE!!!
§ WHERE = filtro executado sobre um conjunto de linhas, antes delas serem agrupadas. Ou seja, a condição é verificada para cada linha;
§ HAVING = filtro executado após o agrupamento das linhas, avalia uma determinada condição para cada grupo.
Item 6 – SELECT
Viram quanta coisa é executada antes da cláusula SELECT ? É a primeira escrita e a quinta a ser executada.
Ela é obrigatória e executada em duas etapas:
1- Verifica se as expressões usadas produzem algum valor e se as colunas existem. Se a query possui um agrupamento, é verificado também se as colunas listadas fazem parte do GROUP BY;
2- A segunda etapa será executada somente se você estiver usando a cláusula DISTINCT (que faz parte do SELECT). O DISTINCT remove do retorno da query as informações duplicadas.
Item 7 – ORDER BY
A última cláusula a ser executada significa que uma query deve ser retornada de acordo com a ordem definida no ORDER BY.
Veja que nesta etapa é possível usar os ALIAS definidos no SELECT. Isso porque o ORDER BY é executado após o SELECT.
Conclusão
Criar queries é indispensável para qualquer desenvolvedor. Mas como você está sendo desafiado por mim e por você mesmo a ser um desenvolvedor fenomenal, e por isso tenho absoluta certeza que você criará as melhores queries!
Treino
Convido você a acessar o site da Microsoft e testar os comandos na nossa VM. Você vai ver que já conhece muita coisa!
Referências
Quando o assunto é SQL, nada melhor do que usar o training kit “Querying Data with Transact-SQL” de Itzik Ben-Gan. Este livro é da Microsoft Press tem 325 páginas, e é o livro indicado para a prova 70–761.