quinta-feira, 29 de setembro de 2016

Group By - Agrupar registros

Olá!

O comando Group By tem o objetivo de realizar o agrupamento dos registros de uma consulta, sendo que primeiramente é realizado a seleção dos registros da tabela e depois é aplicado o agrupamento no resultado da consulta.

Sintaxe: GROUP BY campo(s)_presentes_no_select

Note que os campos mencionados no GROUP BY são todos os campos presentes no SELECT.

Tabela para os exemplos:
PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2AnaVieira20
3JoãoBarbosa19
4AlineBarbosa21
5MairaFerreira25
6AnaHavana19
7AlineFerreira22

Exemplo de consulta com o Group By:
  SELECT NOME
    FROM PESSOA
   WHERE IDADE > 18
GROUP BY NOME;

Resultado:
Resposta da execução do SQL
1º aplicação do Where2º aplicação do Group By
FelipeFelipe
AnaAna
JoãoJoão
AlineAline
MairaMaira
Ana
Aline

Como o agrupamento é realizado na resposta da consulta, repare que as linhas que possuem o mesmo valor não são apresentadas em registros diferentes, e isso não significa que elas foram descartadas. O que acontece é que foram agrupadas em um único registro.

Outro exemplo de consulta com o Group By:
  SELECT NOME
       , SOBRENOME
    FROM PESSOA
   WHERE IDADE > 18
GROUP BY NOME
       , SOBRENOME;

Resultado:
Resposta da execução do SQL
NOMESOBRENOME
FelipeBarbosa
JoãoBarbosa
AlineBarbosa
AnaVieira
MairaFerreira
AlineFerreira
AnaHavana

OK! Mas para o primeiro exemplo, poderíamos ter utilizado o Distinct, e para o segundo exemplo o Order By?

Sim, o resultado visual seria o mesmo. Entretanto, com Distinct os registros que possuem o mesmo valor são desprezados totalmente, e com o Order By os registros seriam agrupados somente em efeito visual. 

Assim, é necessário avaliar o objetivo da consulta, pois na maioria das vezes o Group By é utilizado quando ocorre o questionamento de quantidade sobre um determinado grupo de informações, ou a necessidade de utilizar uma função agregada.

Exemplo: Quantos nomes cada sobrenome possui, ou seja, quantos nomes há cadastrados para o sobrenome Barbosa, Vieira, Ferreira e Havana? Para responder essa questão, é necessário elaborar um SQL agrupado pelo sobrenome e uma função para realizar a contagem (Count( ) no próximo post).

Então, podemos dizer que o SQL que contém o comando Group By tem dois passos de execução, o primeiro é agrupar os registros em conjuntos, e o segundo é agrupar os registros desses conjuntos que possuem valores iguais em um único registro, veja o fluxo abaixo para o questionamento anterior sobre a quantidade de nomes para cada sobrenome:

Fluxo da execução do SQL
1º passo de execução2º passo de execuçãoResultado Final
SOBRENOMEContadorSOBRENOMEContadorSOBRENOMEContador
Barbosa1Barbosa1 + 1 + 1Barbosa3
Barbosa1  Barbosa1Vieira1
Barbosa1  Barbosa1Ferreira2
Vieira1Vieira1Havana1
Ferreira1Ferreira1 + 1
Ferreira1  Ferreira1
Havana1Havana1

Note que no primeiro passo de execução os registros são agrupados em conjuntos, e no segundo passo de execução os registros que possuem o mesmo valor são agrupados em uma linha. O resultado final indica que temos 3 nomes para o sobrenome Barbosa, 2 nomes para o sobrenome Ferreira, 1 nome para o sobrenome Vieira e Havana.

Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!

domingo, 18 de setembro de 2016

Operador Between

Olá!

Com o operador Between podemos realizar uma consulta no banco de dados (DB) que retorne as informações dos registros que estejam em um intervalo, ou seja, entre o valor-A e o valor-B, de modo que o valor-A é o início do intervalo e o valor-B é o fim do intervalo.

Sintaxe:
expressão BETWEEN valor-A AND valor-B

Onde:
  • expressão: pode ser um campo da tabela, ou o resultado de um sub-select, ou outro conjunto de valores;
  • valor-A: valor de início do intervalo
  • valor-B: valor de fim do intervalo
Sendo que valor-A e valor-B estão inclusos na análise dos dados, e também eles devem possuir o mesmo tipo de dado da expressão.

Para os exemplos considerar a tabela abaixo:
PESSOA
CD_PESSOANOMESOBRENOMEIDADE
1FelipeBarbosa23
2AnaVieira20
3JoãoSantos19
4AlineSilva21
5MairaDantas25
6AnaHavana19
7AlineFerreira22

Exemplo de instrução SQL com Between:
SELECT NOME
  FROM PESSOA
 WHERE IDADE BETWEEN 19 
                 AND 22;

Resultado:
Ana
João
Aline
Ana
Aline

Também é possível realizar a comparação com caracteres, datas e outros tipos de dados, veja:
SELECT NOME
  FROM PESSOA
 WHERE SOBRENOME BETWEEN 'A' 
                     AND 'D';

Resultado:
Felipe
Maira

O operador Between possui o comando NOT como opcional, e quando utilizado é desprezado todos os registros que se encontram dentro do intervalo determinado, exemplo:
SELECT NOME
  FROM PESSOA
 WHERE SOBRENOME NOT BETWEEN 'A' 
                         AND 'D';

Resultado:
Ana
João
Aline
Ana
Aline

Em comparação aos operadores relacionais o Between é equivalente ao  => e =<.

Enfim, lembre-se que os valores que estão sendo comparados devem possuir o mesmo tipo de dado, e que os valores de início e fim estão contidos na resposta da instrução do SQL.

Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!

sábado, 3 de setembro de 2016

Operador IN

Olá!

Ao elaborar uma instrução SQL que tenha a finalidade de consultar e filtrar os registros por valores específicos, como por exemplo: uma consulta que retorne os nomes das pessoas que contenham idade igual a 19, e 20, e 22, e 25.

Podemos construir o SQL da seguinte forma:
           SELECT NOME
              FROM PESSOA
           WHERE IDADE = 19
                AND IDADE = 20
                AND IDADE = 22
                AND IDADE = 25
     ORDER BY CD_PESSOA

Note a quantidade de vezes que a instrução "AND IDADE = x" está sendo repetida. Imagine se filtro da pesquisa tivesse que possuir 50 idades especificas, deste modo teríamos que repetir a instrução 50 vezes. Desde modo, não é viável elaborar um código SQL desta forma.

Lembre-se que quando há uma instrução de código que está sendo repetida muitas vezes em sua aplicação, pare e analise o que está sendo feito. Pois, há uma grande chance de algo está errado.

Então, como eliminar essa repetição de código?

O operador IN permite especificar vários valores para realizar o filtro da consulta. Este operador é utilizado na clausula Where de uma instrução SQL. 

A sintaxe:
campo_tabela IN (valor_1, valor_2, valor_3, ...)

Assim, o SQL apresentado no início deste post com o uso do operador IN possui a seguinte forma:
           SELECT NOME
              FROM PESSOA
           WHERE IDADE IN (19, 20, 22, 25)
     ORDER BY CD_PESSOA

Veja, como o código ficou claro, simples, fácil leitura. E que somente neste exemplo simples, conseguimos eliminar três linhas de códigos que estavam sendo repetidas.

Podemos usar o operador IN com valores Strings (textos) também, exemplo:
           SELECT NOME
              FROM PESSOA
           WHERE IDADE IN (19, 20, 22, 25)
                AND SOBRENOME IN ('Barbosa', 'Silva')
     ORDER BY CD_PESSOA

Também, podemos fazer com que o operador IN  ignore os registros que contenham os valores determinados. Para isso, basta adicionar o comando NOT antes do operador IN, conforme:
           SELECT NOME
              FROM PESSOA
           WHERE IDADE NOT IN (19, 20, 22, 25)
     ORDER BY CD_PESSOA

Neste exemplo, os registros da tabela que tiverem a idade igual os valores informados no operador IN, não serão listados na resposta da execução deste SQL.

Então, com o operador IN é possível fazer a filtragem dos dados de uma tabela por valores determinados, sendo para selecionar os registros que contenham o valor, ou ignorar tais registros na resposta da consulta ao banco de dados.

Consultar a relação de Termos e Abreviaturas acesse aqui.
Felipe Barbosa Ferreira
Até o próximo post!