Tutorial: SQL do Zero

SQL é uma linguagem extremamente popular no mundo de Ciência de Dados. Diferente do R e do Python, que são muito utilizadas para executar a modelagem e as análises descritivas/exploratórias, o SQL é uma linguagem de pesquisa declarativa padrão para banco de dados relacional*. Em outras palavras, é a linguagem utilizada para consulta em banco de dados. Por esse motivo, é comum vê-la quando se está organizando as informações.

Muitos cientistas de dados que estão mais próximos ao negócio acabam não fazendo parte desse processo de manutenção de banco de dados. Dessa forma, fazem pouco uso do SQL. Entretanto, aprender a linguagem é de suma importância por vários motivos. Você pode precisar fazer algum tipo de extração usando ferramentas que envolvem a linguagem; você pode estar em uma empresa onde o cientista de dados é mais envolvido com manutenção de bancos de dados; dentre várias outras situações existentes. Não à toa, é extremamente comum que a linguagem apareça em cases de processos seletivos para cientista de dados. Sendo assim, este post será dedicado ao SQL, contemplando formas de criar tabelas, filtros, agrupamentos, funções estatísticas, formas de ordenar, renomear colunas, dentre outras coisas. 

Para começar, você pode baixar o DB Browser for SQLite ou utilizar no próprio browser o SQL Fiddle, sem necessidade de downloads. Caso você tenha baixado o SQLite, vá em Execute SQL para escrever o código. Vamos iniciar construindo uma tabela que será utilizada como exemplo. Há duas etapas nessa construção e ambas serão utilizadas futuramente em situações distintas a essa. Primeiro, construímos o layout da tabela utilizando o CREATE TABLE:

CREATE TABLE base_compras (
Id int,
Nome varchar(50),
Sobrenome varchar(50),
Estado varchar(2),
Gastos decimal,
Data_Compra date
);

O que fizemos acima foi criar uma tabela com os campos Id, Nome, Sobrenome, Cidade, Gastos e Data_Compra. No exemplo, estamos simulando uma base com as informações de cada cliente que fez uma compra na sua loja. Veja que o campo Id está no formato inteiro, ou seja, é um número inteiro. Já o campo Nome é um campo texto (caractere). O campo Gastos é a representação do valor gasto pelo cliente e o formato é decimal. E o campo Data_Compra é a data em que a compra foi realizada pelo cliente.

Apesar de termos criado uma base para simular algumas tarefas, não temos nenhuma informação ali para trabalhar. Criamos uma tabela vazia. Se quisermos imputar valores, utilizamos INSERT INTO + NOME DA BASE + VALUES:

INSERT INTO base_compras
VALUES
(152, 'Andre', 'Silva', 'MG', 351.50, '2018-01-22'),
(222, 'Barbara', 'Toledo', 'SP', 250.10, '2018-05-15'),
(451, 'Carlos', 'Pinheiro', 'MG', 455.00, '2017-02-05'),
(754, 'Eduardo', 'Silva', 'SP', 390.10, '2018-04-10'),
(897, 'Juliana', 'Oliveira', 'MG', 150.50, '2017-03-01'),
(852, 'Maria', 'Lima', 'MG', 325.90, '2018-05-30'),
(997, 'Ricardo', 'Pereira', 'MG', 332.59, '2018-05-25'),
(535, 'Vanessa', 'Costa', 'SP', 241.57, '2017-04-30');

Agora, se quisermos ver como ficou nossa tabela, podemos simplesmente selecionar todos os elementos dela. Para isso, temos um comando muito intuitivo chamado SELECT que é utilizado para determinar quais campos você está selecionando. Como queremos selecionar todos os campos, utilizamos o comando acompanhado de um asterisco. Na sequência, dizemos de qual tabela queremos selecionar tais campos. Sendo assim, para selecionar todos elementos da tabela chamada base_compras, basta utilizar a seguinte linha de código:

SELECT * from base_compras

Veja que o comando, quando traduzido, diz exatamente o que queremos: selecionar todos os campos da base base_compras. Caso a gente queira selecionar somente um campo, como o Id, utilizamos:

SELECT Id from base_compras

Se quisermos selecionar o Id, o nome e o estado:

SELECT Id, Nome, Estado from base_compras

Agora, vamos imaginar que você queira filtrar somente clientes de São Paulo. Filtrar a base é um exemplo clássico de uma tarefa que aparece constantemente para um cientista de dados. Aqui, utilizamos o argumento WHERE:

SELECT * from base_compras

WHERE Estado = "SP"

Quando você utiliza somente o SELECT, o output é temporário. Ou seja, assim que você executar qualquer outro comando, a seleção se perde. Imagine que você queira salvar essa tabela com os clientes de São Paulo para utilizá-la mais tarde. O que fazer?

Bom, você poder criar uma tabela nova utilizando o já conhecido CREATE TABLE:

CREATE TABLE clientes_SP AS SELECT * from base_compras

WHERE Estado = "SP"

Agora, assim como você tem uma base chamada base_compras contendo todos os clientes que fizeram compras na sua loja, você também tem a base clientes_SP, contendo os clientes de São Paulo que fizeram compras na sua loja.

Bom, prosseguimos com mais tarefas. Se você quiser selecionar somente os clientes que são de São Paulo que fizeram compras com valor superior a 300 reais, você pode acrescentar esse novo critério no seu filtro:

SELECT * from base_compras
WHERE Estado = 'SP' and Gastos > 300

Agora, se sua empresa estiver querendo fazer promoção para clientes que são de São Paulo ou que possuem gastos superior a 300 reais, você também pode acrescentar esse novo critério em sua seleção:

SELECT * from base_compras
WHERE Estado = 'SP' or Gastos > 300

Caso você queira selecionar somente os clientes que NÃO são do estado de São Paulo, utilize WHERE NOT:

SELECT * from base_compras
WHERE NOT Estado = 'SP'

E se sua base por algum motivo possui algum erro no campo Id? Por algum motivo, ele não é único. Para evitar problemas, você sabe que se você combinar os campos Id, Nome e Sobrenome, aí sim você terá uma nova chave que será única. Vamos criar essa nova chave e salvar uma nova tabela, a versão 2 da nossa tabela inicial:

/*cria tabela com novo campo*/

CREATE TABLE base_compras_v2 AS SELECT *, (Id || Nome || Sobrenome) as Id_New from base_compras

/*exibe elementos da tabela*/

SELECT * from base_compras_v2

Atenção, note que utilizamos duas barras verticais para concatenar os campos. Em muitos sites você vai encontrar a recomendação de uso da função CONCAT( ). O problema é que essa função não existe no SQLite, por isso utilizamos as barras verticais.

Além disso, utilizamos pela primeira vez comentários e, como você pode notar, basta escrever entra barras invertidas e asterisco.

Outra coisa, se você por acaso criar uma tabela com algum erro, é necessário excluí-la antes de criar a correta. Para isso, utilize o DROP TABLE. Exemplo:

DROP TABLE base_compras_v2

Mas lembrando que isso é só para excluir a tabela. Se estiver tudo correndo bem por aí, não execute esse comando agora.

Por uma questão de capricho ou uma necessidade qualquer, você pode desejar ordenar sua base. É fácil de fazer isso com o ORDER BY:

SELECT * from base_compras_v2

ORDER BY Id DESC

Creio que vocês devem ter adivinhado que para ordenar de forma crescente, basta trocar DESC por ASC.

Para facilitar os próximos exemplos, vou utilizar o INSERT INTO VALUES novamente e incluir uma linha com valores missing:

/*insere linha com valor nulo*/

INSERT INTO base_compras_v2
VALUES
(645, NULL, 'Ferreira', NULL, 555.57, '2018-05-05', NULL);

/*mostra elementos da tabela*/

SELECT * from base_compras_v2

Imagine que você quer saber quais colunas possuem o campo Id_New não preenchido (já que isso traria um problema no campo de identificação). Para isso, você precisa combinar o comando que usamos para filtrar, WHERE, com o argumento IS NULL:

SELECT  *
FROM base_compras_v2
WHERE Id_New IS NULL;

Outra opção possível desejada é criar uma nova tabela com os elementos que possuem o campo Id_New preenchido. Podemos fazer isso combinando WHERE com IS NOT NULL:

CREATE TABLE base_Id_NOT_NULL as
SELECT * FROM base_compras_v2
WHERE Id_New IS NOT NULL

SELECT * FROM base_Id_NOT_NULL

Algumas formas de resumir os valores de sua coluna é utilizando funções como min(), max(), count(), avg(), dentre outras:

/*obtem o gasto maximo*/
SELECT max(Gastos) FROM base_Id_NOT_NULL
/*obtem o gasto minimo*/
SELECT min(Gastos) FROM base_Id_NOT_NULL
/*obtem o media de gastos*/
SELECT avg(Gastos) FROM base_Id_NOT_NULL
/*conta numero de elementos*/
SELECT count(Id) FROM base_Id_NOT_NULL

Se você achar os nomes inadequados, é possível renomear de forma bem simples:

/*conta numero de elementos*/
SELECT count(Id) as Contagem_Id FROM base_Id_NOT_NULL

Imagine que ao invés de fazer um resumo geral, você queira fazer um resumo por grupos. Por exemplo, você deseja saber o gasto médio feito por clientes de cada estado. Nesse caso, utilize o argumento para agrupamento, o GROUP BY:

SELECT Estado, avg(Gastos) as Media_Gasto
FROM base_Id_NOT_NULL
GROUP BY Estado

Por fim, podemos combinar colunas – i.e. UNIR TABELAS DISTINTAS – utilizando os famosos JOINs. No exemplo abaixo, temos uma segunda tabela onde temos a identificação das lojas nas quais as compras foram feitas pelos clientes:

/*cria a base com identificacao das lojas*/
CREATE TABLE base_lojas (
Id int,
Loja varchar(50),
Data_Compra date
);

INSERT INTO base_lojas
VALUES
(152, 'Loja C', '2018-01-22'),
(222, 'Loja A', '2018-05-15'),
(451, 'Loja C', '2017-02-05'),
(754, 'Loja A', '2018-04-10'),
(897, 'Loja E', '2017-03-01'),
(852, 'Loja E', '2018-05-30'),
(997, 'Loja D', '2018-05-25'),
(535, 'Loja B', '2017-04-30');

SELECT * FROM base_lojas

Agora, vamos trazer a identificação das lojas para nossa tabela base_Id_NOT_NULL:

/*traz a identificacao da loja*/

CREATE TABLE base_Id_NOT_NULL_v2 AS
SELECT A.*, B.Loja
FROM base_Id_NOT_NULL as A
LEFT JOIN base_lojas as B
on A.Id = B.Id;

/*mostra o resultado do join*/

base_Id_NOT_NULL_v2

Para outros tipos de JOINs, veja o diagrama abaixo:

* Wikipedia, consulta em 13/01/2020

2 comentários em “Tutorial: SQL do Zero”

  1. Vim do instagram, o que adianta saber ML e Estatistica sendo que não sabe o básico do SQL kkk, aprendi muito com esse tutorial, obrigado!

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *