quinta-feira, 24 de setembro de 2020

Matemática básica e estatística com SQL


Se o seu banco de dados incluir algum tipo de dados do tipo inteiro, decimais ou pontos flutuantes é provável que você vai precisar realizar alguns cálculos com esses dados. Por exemplo, se você precisar saber qual é o valor da soma de todos os elementos de uma coluna, ou você precise adicionar um valor a cada elemento de uma coluna ou linha. Felizmente podemos fazer essas tarefas utilizando a linguagem SQL. Com ela podemos realizar desde operações matemáticas básicas a estatísticas avançadas.
Nesse tutorial, vamos iniciar no básico das operações matemáticas e avançar para as funções matemáticas mais complexas e iniciar em estatística. O dataset que vamos usar pode ser baixado aqui.
Veja abaixo como importar esses dados:

MariaDB [(none)]> create database meu_db;
Query OK, 1 row affected (0.151 sec)

MariaDB [(none)]> use meu_db;
Database changed
MariaDB [meu_db]> create table censu_2015
    -> (CensusTract INT,State VARCHAR(15),County VARCHAR(15),
    -> TotalPop INT,Men INT,Women INT,
    -> Hispanic FLOAT,White FLOAT,Black FLOAT,
    -> Native FLOAT,Asian FLOAT,Pacific FLOAT,
    -> Citizen INT,Income FLOAT,IncomeErr FLOAT,
    -> IncomePerCap FLOAT,IncomePerCapErr FLOAT,Poverty FLOAT,
    -> ChildPoverty FLOAT,Professional FLOAT,Service FLOAT,
    -> Office FLOAT,Construction FLOAT,Production FLOAT,
    -> Drive FLOAT,Carpool FLOAT,Transit FLOAT,
    -> Walk FLOAT,OtherTransp FLOAT,WorkAtHome FLOAT,
    -> MeanCommute FLOAT,Employed INT,PrivateWork FLOAT,
    -> PublicWork FLOAT,SelfEmployed FLOAT,FamilyWork FLOAT,
    -> Unemployment FLOAT);
Query OK, 0 rows affected (0.914 sec)

MariaDB [meu_db]> LOAD DATA LOCAL INFILE
    -> 'C:/Users/user/acs2015_census_tract_data.csv'
    -> INTO TABLE censu_2015
    -> FIELDS TERMINATED BY ','
    -> LINES TERMINATED BY '\n'
    -> IGNORE 1 LINES;
Query OK, 74001 rows affected, 65535 warnings (8.923 sec)
Records: 74001  Deleted: 0  Skipped: 0  Warnings: 97104

Operações matemáticas

Nos primeiros exemplos vamos utilizar as operações básicas que você aprendeu na escola. Na tabela abaixo é mostrado as operações que vamos utilizar com mais frequência.

Operador Operação
+ Adição
- Subtração
* Multiplicação
/ Divisão sem resto
%, MOD(x, y) Modulo ou resto
^ Exponenciação
SQRT(x) Raiz quadrada

Esses operadores podem ser utilizados com números, como numa calculadora, ou com valores em tabelas. Nesse tutorial vamos mostrar os dois.

Tipos de dados e matemática

Quando estiver trabalhando com operações matemáticas é importante saber o tipo de dado onde essas operações serão aplicadas. Não ter conhecimento do tipo de dado pode resultar num erro ou numa operação indesejada.
Aplicando uma operação entre dois números, o resultado retornado segue o padrão abaixo:

  • Dois inteiros retorna um inteiro.
  • Um NUMERIC com outro retorna um NUMERIC.
  • Qualquer operação com um float retorna um float.

Mas com a exponenciação e a raiz quadrada isso não acontece. A operação de raiz quadrada pode retornar um número de ponto flutuante mesmo quando a operação é com um inteiro e a exponenciação pode retornar um inteiro.

Adição, subtração e multiplicação

Até o momento utilizamos a declaração SELECT para recuperar dados de uma tabela. Nesse tutorial vamos utilizá-lo em conjunto com os operadores para realizar operações matemáticas. Vamos começar com as operações de adição, subtração e multiplicação.

MariaDB [(none)]> SELECT 2 + 2;
+-------+
| 2 + 2 |
+-------+
|     4 |
+-------+
1 row in set (0.038 sec)

MariaDB [(none)]> SELECT 9 - 2;
+-------+
| 9 - 2 |
+-------+
|     7 |
+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT 3 * 4;
+-------+
| 3 * 4 |
+-------+
|    12 |
+-------+
1 row in set (0.007 sec)

Não temos surpresas aqui. Como esperado dois mais dois é quatro, nove menos dois é sete e, como sempre, três vezes quatro é doze. O resultado é mostrado numa coluna, mas não se preocupe, nenhuma tabela está sendo alterada.

Divisão, modulo e raiz quadrada

Na divisão, o resultado sempre será um número de ponto flutuante. Isso porque o operador de divisão faz a divisão exata. Já o operador módulo retorna o resto de uma divisão. Esse operador realiza uma divisão e retorna o resto dessa divisão. Se a divisão for exata o resto é zero, do contrário, o resto será um inteiro. A função de raiz quadrada retorna a raiz quadrada do número passado como parâmetro. Veja um exemplo de utilização:

MariaDB [(none)]> SELECT 9 / 2;
+--------+
| 9 / 2  |
+--------+
| 4.5000 |
+--------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT MOD(9,2);
+----------+
| MOD(9,2) |
+----------+
|        1 |
+----------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT 9 % 2; -- O mesmo da declaração acima
+-------+
| 9 % 2 |
+-------+
|     1 |
+-------+
1 row in set (0.001 sec)

MariaDB [(none)]> SELECT SQRT(9);
+---------+
| SQRT(9) |
+---------+
|       3 |
+---------+
1 row in set (0.001 sec)

Ordem das operações

Nas expressões matemáticas existe uma ordem em que as operações devem ser feitas. No SQL é a mesma coisa. Por exemplo, qual operação deve ser executada primeiro? A subtração ou a multiplicação? Por isso é importante saber qual operação deve ser aplicada primeiro para atingir o resultado esperado. Essa é a ordem de prioridade dos operadores:

  1. Funções. No caso a função SQRT().
  2. Multiplicação, divisão e módulo.
  3. Adição e subtração.

Seguindo essa ordem as funções serão executadas primeiro, depois a multiplicação, divisão e módulo e, por último, a adição e subtração.
Se em algum momento você precisar a operação de adição ocorra antes da multiplicação, você pode alterar essa ordem de prioridade com parênteses. No exemplo abaixo, o resultado é diferente para cada declaração. Isso porque foi alterada a prioridade das operações.

MariaDB [(none)]> SELECT 5 + 4 * 9;
+-----------+
| 5 + 4 * 9 |
+-----------+
|        41 |
+-----------+
1 row in set (0.003 sec)

MariaDB [(none)]> SELECT (5 + 4) * 9;
+-------------+
| (5 + 4) * 9 |
+-------------+
|          81 |
+-------------+
1 row in set (0.060 sec)

Operações com colunas

Agora que já aprendemos como utilizar os operadores na linguagem SQL vamos aprender a usar esses mesmos operadores com valores em colunas. Quando usamos esses operadores em colunas a operação é realizada em cada linha da tabela.

MariaDB [meu_db]> SELECT State AS 'Estado',
    -> County AS 'Município',
    -> Asian AS 'Asiático',
    -> Hispanic AS 'Hispanico',
    -> Hispanic + Asian AS "Total de Hispânicos e Asiáticos"
    -> FROM censu_2015
    -> WHERE  State = 'Kansas';
+--------+--------------+----------+-----------+---------------------------------+
| Estado | Município    | Asiático | Hispanico | Total de Hispânicos e Asiáticos |
+--------+--------------+----------+-----------+---------------------------------+
| Kansas | Allen        |        0 |         3 |                               3 |
| Kansas | Allen        |      1.5 |         1 |                             2.5 |
| Kansas | Allen        |        0 |       0.1 |             0.10000000149011612 |
| Kansas | Allen        |      1.3 |       6.3 |              7.6000001430511475 |
| Kansas | Allen        |        0 |       5.9 |               5.900000095367432 |
| Kansas | Anderson     |        0 |       0.5 |                             0.5 |
| Kansas | Anderson     |        0 |       0.3 |             0.30000001192092896 |
| Kansas | Wyandotte    |        0 |       7.7 |               7.699999809265137 |
| Kansas | Wyandotte    |        0 |        44 |                              44 |
| Kansas | Wyandotte    |     16.5 |      33.4 |              49.900001525878906 |
| Kansas | Wyandotte    |      2.3 |      28.9 |              31.199999570846558 |
+--------+--------------+----------+-----------+---------------------------------+
770 rows in set (0.130 sec)

Essa não é a saída completa da busca, na sua máquina deve está bem maior. Mas, para o nosso proposito vai servir. Vamos começar explicando o código linha por linha. Na primeira linha selecionamos a coluna “State” e demos um apelido para ela (Estado). Fizemos a mesma coisa na linha dois, três e quatro. Depois pedimos para o gerenciador do banco de dados fazer a soma da coluna Hispanic e Asian e, como nas linhas anteriores, demos um apelido a essa coluna – Lembre-se que cada consulta retorna os dados organizados em colunas. Na linha seis informamos onde esses dados devem ser procurados. E por último fazemos uma filtragem dos dados com WHERE. Com a declaração WHERE estamos dizendo que só queremos os dados das colunas State, County, Asian e Hispanic onde o valor da coluna State seja igual a Kansas.
Com esse exemplo fica fácil perceber como as operações funcionam em tabelas. Como exercício tente realizar as outras operações e mudar o estado.

Porcentagem

Para o nosso próximo exemplo vamos descobrir qual é a porcentagem de homens no estado do Texas. Para isso vamos precisar saber a quantidade total da população e a quantidade total de homens. Nosso banco de dados já tem essas informações.
Veja como descobrir a porcentagem de homens no estado do Texas no exemplo abaixo:

MariaDB [meu_db]> SELECT State AS 'Estado',
    -> SUM(Men) AS 'Total Homens',
    -> SUM(Women) AS 'Total Mulheres',
    -> (SUM(Men) * 100) / (SUM(Men) + SUM(Women)) AS 'Porcentagem de Homens'
    -> FROM censu_2015
    -> WHERE State = 'Texas';
+--------+--------------+----------------+-----------------------+
| Estado | Total Homens | Total Mulheres | Porcentagem de Homens |
+--------+--------------+----------------+-----------------------+
| Texas  |     13171316 |       13367298 |               49.6308 |
+--------+--------------+----------------+-----------------------+
1 row in set (0.316 sec)

Nesse exemplo usamos a função SUM() para somar todos as linhas das colunas Men e Women, lembre-se que estamos somando apenas os valores das linhas que tenham o valor Texas na coluna State. Depois utilizamos as operações de multiplicação, divisão e soma para descobrir a porcentagem de homens no estado do Texas (Regra de três).

Função de soma e médias

As duas funções mais utilizadas na análise de dados são a SUM() e AVG(). Isso porque a função SUM() faz a soma de todas as linhas de uma coluna, como vimos no exemplo anterior. E a função AVG() retorna o valor médio de uma coluna numérica. O que a função AVG() faz é somar todos os valores de uma coluna e depois dividir pelo número de linhas. Veja um exemplo de utilização das duas funções abaixo:

MariaDB [meu_db]> SELECT AVG(TotalPop) FROM censu_2015;
+---------------+
| AVG(TotalPop) |
+---------------+
|     4325.5915 |
+---------------+
1 row in set (1.760 sec)

MariaDB [meu_db]> SELECT SUM(TotalPop) FROM censu_2015;
+---------------+
| SUM(TotalPop) |
+---------------+
|     320098094 |
+---------------+
1 row in set (0.168 sec)

Com a função AVG() descobrimos que a média dos valores da coluna TotalPop é 4325.5915 e com a função SUM() descobrimos que o total da soma da coluna TotalPop é 320098094.

0 comentários:

Postar um comentário