Rumo a certificação 70–761

Segundo encontro “Gerenciando dados com Transact-SQL” — Parte 1

Lindos e lindas, bom dia… boa tarde… boa noite!!!

Esse não é o formato definitivo, mas como meu fone não chegou para fazer o áudio e eu não quero repetir o vexame da semana passada… Vamos começar no texto tradicional mesmo…

Vamos começar a estudar o conteúdo do livro “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.

A leitura é tranquila, ele aborda bem todos os assuntos que precisaremos para o exame. Não se assustem com o começo. Nada é engessado ou absurdamente complicado (quando for eu aviso e faremos na prática, testaremos, nos encontraremos… enfim daremos um jeito até ficar fácil :-)).

Esta semana a Amanda postou uma foto da prova dela de banco de dados. Combinei com ela de analisarmos a prova juntas no domingo à noite… Quem quiser fazer parte, é só me adicionar no Skype (DaniMonteiroDBA).

Vamos começar com o Capítulo 1! Lembrem que estamos juntas (os) na jornada!

  • Transact-SQL é uma versão (dialeto) da linguagem SQL;
  • A linguagem SQL permite gerenciar e alterar os dados em um banco de dados;
  • T-SQL é a adaptação da linguagem SQL, feita pela Microsoft para os bancos de dados SQL Server e Azure SQL Database;
  • A linguagem SQL é um padrão ISSO e ANSI, tem diversas versões e é usada na maioria dos bancos de dados relacionais;
  • A linguagem foi evoluindo e ganhando novas versões:
      SQL-86;
      SQL-89;
      SQL-92;
      SQL:1999;
      SQL:2003;
      SQL:2006;
      SQL:2008;
      SQL:2011;
  • O T-SQL não é exatamente igual ao SQL;
  • Usar o padrão SQL deixa seu código mais portável; e é uma boa prática;
     o Quando uso então o T-SQL? Sempre que precisamos de um recurso que não existe no padrão ;-)
  • 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 e outros
     o Dica… os livros de Banco de Dados destes autores, costumam ser os melhores!
  • O nome Modelo Relacional não está ligado aos relacionamentos entre as tabelas! (Pasmem!) Está ligado ao conceito matemático de relação! E uma relação é representada por uma tabela!!!
  • Uma relação contém uma “cabeça” e um “corpo” na cabeça temos um conjunto de atributos que possuem nome e tipo, e no corpo temos as tuplas (que são representadas pelas linhas). 
     • Observação by Dani:
     o Na verdade usamos partes do modelo relacional! Me arrisco a dizer que nunca usaremos 100% do modelo proposto por Codd, mas é sempre muito bom entender! Faz com que o trabalho com BD fique mais fácil!
     o Para ver as diferenças entre o SQL e o modelo Relacional, o livro da MS cita o livro: SQL and Relational Theory , 3rd Edition do C.J Date
  • 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 alcançar este objetivo 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.
     o A ideia é alcançar um objetivo, usando a menor quantidade de recursos.
  • SQL é uma linguagem declarativa, ou seja, vc define O QUE vc quer, e quem define o como este objetivo será alcançado é o otimizador;
  • Quando falamos em SQL, logo pensamos no comando SELECT. SELECT lista de atributos FROM nome da tabela. Selecione algo de algum lugar! Simples assim!!


Pessoal deste tópico para frente, temos alguns dos tópicos mais importantes para a certificação e para escrever boas queries!]

  • Temos 6 clausulas principais:
     1- SELECT
     2- FROM
     3- WHERE
     4- GROUP BY
     5- HAVING
     6- ORDER BY
  • Embora tenhamos 6 clausulas que aparecem na ordem acima quando escrevemos a consulta, o processamento lógico da query acontece de forma diferente! (Isso cai na prova!)
     1- FROM
     2- WHERE
     3- GROUP BY
     4- HAVING
     5- SELECT
     6- ORDER BY
  • Um ponto que costuma cair nas provas… 
     o ALIAS é um apelido que damos para uma coluna. Ou seja 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 clausula SELECT, na clausula WHERE? A resposta é NÃO!!! Pq na execução da query, a clausula WHERE é executada antes da clausula SELECT. Entenderam? (em caso de dúvidas vemos este caso no domingo!)

FROM

o É a primeira clausula “avaliada”
 o É uma clausula obrigatória;
 o Onde indicamos as tabelas que farão parte da consulta
  Vou adiantar uma coisa… Na clausula FROM indicamos as relações que fazem parte de uma consulta… E estas podem ser provenientes de outras consultas, de uma view, de uma tabela, de uma função… ;-)
 o Imagine que a engine pega as tabelas indicadas na clausula FROM e as separa. Cria uma tabela virtual e temporária. 
 • WHERE
 o É a clausula que filtra as linhas que devem ser retornadas na consulta
 o É a segunda etapa da consulta
 o Como funciona o filtro? É dada uma condição e só as linhas que obedecem a condição serão retornadas.
 o Lembrando que os ALIAS definidos na clausula SELECT não podem usados na clausula WHERE

GROUP BY

o Traduzo para: Agrupe as linhas por… 
 o Lembra que eu falei que a engine pega as tabelas da clausula FROM e deixa separado? Na realidade internamente é criada uma tabela virtual, onde estão os dados das tabelas da clausula FROM. Depois os dados desta tabela virtual são filtrados pela clausula WHERE. E nesta etapa são agrupados, e só os grupos diferentes farão parte do retorno da query.
 o O resultado final da execução desta clausula deve ser um valor para cada grupo
 o Se na clausula SELECT vc usar a uma coluna que não faz parte do agrupamento, vc precisará usar uma função, por exemplo, MAX, MIN, AVG e afins… Isso porque só um valor deve ser retornado por grupo. (dúvidas aqui? Podemos fazer um exemplo para deixar mais claro, acho que na prática é mais fácil de entender )

HAVING

o Essa é legal, já vi uns desenvolvedores velhos que não sabem usar direito… Having é um filtro que é executado depois que os dados são agrupados. 
 o Também é contém em uma condição, ou seja, é aplicado um filtro no grupo e só os grupos que obedecem uma condição serão retornados;
  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 filtre pelos grupos de funcionários que possuem a média de idade maior que 35 anos.
 o A diferença entre o HAVING e o WHERE (importante!!!)
  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.

SELECT

o Viram quanta coisa é executada antes da clausula SELECT ser executada? É a primeira clausula escrita e a quinta a ser executada;
 o É uma clausula obrigatória
 o É executada em duas etapas:
  1- Verificar se as expressões usadas produzem algum valor, se as colunas existem. E se a query possui um agrupamento, as colunas listadas devem fazer parte da clausula GROUP BY
  2- A segunda etapa será executada somente se vc estiver usando a clausula DISTINCT (que faz parte da clausula SELECT). Esta clausula remove do retorno da query as informações duplicadas. 
 o Se criamos um ALIAS na clausula SELECT, ele não é “visto” pelas outras colunas dentro do mesmo comando, por exemplo:
  SELECT YEAR(AnoNascimento) AS Ano , Ano + 6 AS EntradaEscola
FROM Pessoa

Esta query retornará um erro porque estamos usando um ALIAS que acabou de ser gerado. O correto seria:

 SELECT YEAR(AnoNascimento) AS Ano , YEAR(AnoNascimento) + 6 AS EntradaEscola FROM Pessoa
 o Perceberam que na clausula SELECT podemos usar colunas, funções, fazer cálculos…

ORDER BY

o A última clausula a ser executada;
 o Significa que uma query deve ser apresentada de acordo com a ordem definida nesta clausula.
 o É possível usar os ALIAS definidos na Clausula SELECT. Isso porque ela é executada após o SELECT 
 o Cuidado com as ordenações, elas podem ser custosas…

Pessoal, acho que tivemos muitaaa informação, e a ideia é que vcs entendam bem o que “conversamos” até aqui. Inicialmente eu queria conversar sobre o capitulo 1 inteiro. Mas acho que não vai ser saudável! Banco de dados é uma coisa gostosa (acreditem!) e acho que correr não nos ajudará! Paramos na metade do capitulo 1 (página 17) e nossos próximos alvos são as cláusulas FROM e SELECT. Nos profundaremos bastante nelas :-)

Beijos para todos e até domingo!
Dani