Você está na página 1de 72

O GUIA DO

MOCHILEIRO SQL:
INICIANDO SUA
VIAGEM PELO
BANCO DE DADOS

Hélio Rodrigues
índice
Introdução
O que é e por que aprender SQL?
Fundamentos do SQL
O que é um banco de dados?
O que é uma tabela?
Tipos de dados em SQL
Criando uma tabela em SQL
Inserindo dados
Consultas
O que são consultas?
SELECT
WHERE
ORDER BY
LIMIT
Consultas avançadas
INNER JOIN
LEFT JOIN
RIGHT JOIN
FULL OUTER JOIN
SUBQUERIES
Funções de Agregação
COUNT
SUM
AVG
MAX
MIN
Otimizando o GROUP BY com HAVING

1
índice
Manipulação de dados
INSERT
UPDATE
DELETE
Melhores práticas
Como proteger seus dados com SQL
Conclusão

2
Introdução

3
O que é SQL

SQL é uma linguagem de programação


utilizada para gerenciar e manipular
bancos de dados relacionais
desenvolvida na década de 1970.
“SQL” é a abreviação de Structured
Query Language, que em português
significa Linguagem de Consulta
Estruturada. A linguagem se tornou
popular no início dos anos 1980, quando
os primeiros sistemas de
gerenciamento de bancos de dados
(SGBD) foram criados. Desde então, se
tornou a linguagem padrão para
gerenciar e manipular bancos de dados
relacionais. O SQL é uma linguagem
declarativa, o que significa que o
programador informa O QUE ele deseja
que o banco de dados faça o invés de
informar COMO ele quer que faça. Ou
seja, não informamos como buscar
dados de uma tabela, ao invés disso o

4
ao invés disso, o programador informa
quais dados devem ser buscados e o
SQL se encarrega de executar a busca
de forma otimizada. Além disso, o SQL é
utilizado em diversos tipos de
aplicações, desde pequenas aplicações
pessoais até grandes sistemas
empresariais.
O SQL é amplamente utilizado em
aplicações de gerenciamento de dados,
tais como sistemas de gestão de
estoques, sistemas de gestão de
recursos humanos, sistemas de gestão
de vendas, sistemas de gestão de
finanças e muitos outros.

Por que aprender SQL


Principalmente como um
desenvolvedor, é importante aprender
SQL por se tratar de uma linguagem de
consulta usada para gerenciar dados
em bancos de dados, sendo
amplamente utilizados em aplicativos

5
e sistemas de software modernos.
Mesmo que no seu dia a dia profissional
você trabalhe com frameworks que
abstraiam essa camada, ou seja, lidam
internamente com o SQL. É
extremamente importante ter
conhecimento no assunto. Alguns
motivos incluem:

Análise de dados em testes: Temos a


tendência de imaginar análise de
dados apenas como um pequeno
processo no campo de Data Science.
Porém, quando você é um
desenvolvedor testando uma nova
funcionalidade, ter acesso ao banco de
testes e executar consultas SQL para
validar se os dados inseridos estão
atuando como deveriam, é
extremamente útil e importante.

Melhorar o desempenho do banco de


dados: quando um desenvolvedor tem
conhecimentos em SQL, pode escrever
6
consultas mais eficientes e otimizar o
desempenho do banco de dados.

Facilita a comunicação com outras


equipes: ao entender SQL, um
desenvolvedor pode se comunicar
melhor com outros membros da equipe,
como administradores de banco de
dados e analistas de dados com maior
facilidade.

7
Fundamentos
de SQL

8
O que é um banco de dados?

Vimos anteriormente que SQL é uma


linguagem de programação utilizada
para gerenciar e manipular bancos de
dados. Porém, o que exatamente é um
banco de dados?
De forma simples e direta: Um banco de
dados é uma coleção organizada de
informações. Estes dados são
organizados em tabelas, registros e
campos, que permitem aos usuários
armazenar, gerenciar, atualizar e
consultar informações de maneira
eficiente.
Existem muitos tipos de bancos de
dados, incluindo bancos de dados
relacionais, de objetos, hierárquicos e
de grafos. Cada tipo tem seus próprios
recursos e características, e a escolha
do tipo de banco de dados depende
das necessidades da aplicação.

9
Focaremos em bancos de dados
relacionais, pois, como já sabemos, SQL
é uma linguagem de programação
utilizada para gerenciar e manipular
bancos de dados relacionais.

O que é uma tabela?

É a estrutura básica usada para


armazenar e gerenciar dados em um
banco de dados relacional. Uma tabela
é composta por colunas (também
chamadas de campos) e linhas
(também chamadas de registros).

Cada coluna em uma tabela representa


um tipo de informação ou dados
específicos, como nome, idade, e-mail,
etc.

Cada linha na tabela representa um


conjunto de informações, também
conhecido como um registro.

10
Por exemplo, em uma tabela de
clientes, cada linha pode representar
um cliente individual e cada coluna
pode representar informações sobre
esse cliente. Veja o exemplo a seguir:

As tabelas em um banco de dados


relacional são projetadas para
minimizar a redundância e garantir a
integridade dos dados. Isso significa
que as informações são armazenadas
em uma tabela apenas uma vez e que
as relações entre as tabelas são
gerenciadas usando chaves para
garantir a consistência dos dados.

Tipos de dados em SQL


Em SQL, há vários tipos de dados que
podem ser usados para armazenar
diferentes tipos de informações. Alguns
dos mais comuns em SQL incluem:
11
Números inteiros:
TINYINT: armazena valores inteiros
entre -128 e 127.
SMALLINT: armazena valores
inteiros entre -32.768 e 32.767.
INT: armazena valores inteiros entre
-2.147.483.648 e 2.147.483.647.
BIGINT: armazena valores inteiros
entre -9.223.372.036.854.775.808 e
9.223.372.036.854.775.807.

Números de ponto flutuante:


FLOAT: armazena valores de ponto
flutuante com precisão simples.
DOUBLE: armazena valores de
ponto flutuante com precisão dupla.

Texto:
CHAR: armazena strings com
tamanho fixo.
VARCHAR: armazena strings com
tamanho variável.

12
TEXT: armazena strings de
comprimento variável, mas com
limitação máxima.

Data e hora:
DATE: armazena uma data.
TIME: armazena um horário.
DATETIME: armazena uma data e
um horário.
TIMESTAMP: armazena uma data e
um horário com precisão de frações
de segundos.

Booleanos
BOOLEAN: armazena valores
booleanos (TRUE/FALSE ou 0/1).

Outros tipos:
BLOB: armazena dados binários
grandes.
ENUM: armazena um conjunto de
valores pré-definidos.
JSON: armazena dados no formato
JSON.
13
Criando uma tabela em SQL

Para criar uma tabela em SQL, é


preciso usar o comando CREATE TABLE,
que tem a seguinte sintaxe básica:

CREATE TABLE nome_da_tabela (


nome_da_coluna1 tipo_de_dado1 [restrições1],
nome_da_coluna2 tipo_de_dado2 [restrições2],
...
nome_da_colunaN tipo_de_dadoN
[restriçõesN]
);

nome_da_tabela: é o nome da tabela


que você quer criar.
nome_da_coluna: é o nome de uma
coluna na tabela.
tipo_de_dado: é o tipo de dado que a
coluna irá armazenar.
restrições: são opções adicionais que
você pode definir para impor limites ou
regras nas colunas. Restrições de chave
primária, chave estrangeira, not null,
entre outras.
14
Exemplo de como criar uma tabela
chamada usuarios, com as colunas id,
nome, email, senha:

CREATE TABLE usuarios (


id INT PRIMARY KEY,
nome VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
senha VARCHAR(255) NOT NULL
);

Neste exemplo, estamos definindo a


coluna id como a chave primária
(PRIMARY KEY) da tabela, e as colunas
nome, email e senha como obrigatórias
(NOT NULL). Além disso, a coluna email
possui a restrição UNIQUE, o que
significa que ela deve ser única para os
registros na tabela.

Inserindo dados
Para inserir dados em uma tabela
usando SQL, é preciso utilizar o
comando INSERT INTO, que tem a
seguinte sintaxe básica:

15
INSERT INTO tabela
(nome_da_coluna1, nome_da_coluna2, ...)
VALUES
(valor_da_coluna1, valor_da_coluna2, ...,);

Exemplo de como inserir um registro na


tabela usuarios:

INSERT INTO usuarios


(id, nome, email, senha)
VALUES
(1, 'Pedro', 'pedro@email.com', 'senha123');

Neste exemplo, estamos inserindo um


registro na tabela usuarios com os
valores 1 para a coluna id, 'Pedro' para a
coluna nome, 'pedro@email.com' para
a coluna email e 'senha123' para a
coluna senha.

16
Consultas

17
O que são consultas?

Consultas em SQL (queries), são


comandos utilizados para buscar
informações específicas de um banco
de dados. Essas consultas permitem
que você selecione, filtre e ordene
dados em uma ou mais tabelas, de
acordo com critérios específicos
definidos por você.
As consultas SQL são muito poderosas
e flexíveis, e são uma das principais
ferramentas usadas para trabalhar
com bancos de dados relacionais. Elas
permitem que você obtenha
informações específicas e precisas a
partir de grandes conjuntos de dados,
economizando tempo e aumentando a
eficiência na manipulação e obtenção
de informações.
Comandos importantes para realização
de consultas com SQL são SELECT,
WHERE, ORDER BY e LIMIT.

18
SELECT

O SELECT é uma das principais


instruções da linguagem, sendo usado
para recuperar dados de uma ou mais
tabelas em um banco de dados. O
SELECT permite que você especifique
as colunas que deseja recuperar, as
tabelas das quais deseja recuperar os
dados e os critérios de filtragem e
ordenação.
A sintaxe básica do comando SELECT é
a seguinte:

SELECT coluna1, coluna2, ..., colunaN


FROM tabela;

Colunas: colunas(dados) que você


deseja consultar.

Tabela: a tabela da qual você deseja


recuperar os dados.

19
Exemplo de uma consulta SQL básica
usando o comando SELECT:

SELECT nome, email, telefone


FROM clientes

Neste exemplo, estamos selecionando


as colunas nome, email e telefone da
tabela clientes.

WHERE

A cláusula WHERE é utilizada para


filtrar os dados retornados de uma
tabela ou conjunto de tabelas. A
cláusula WHERE especifica uma
condição que deve ser atendida para
que as linhas da tabela sejam
retornadas na consulta.
20
Por exemplo, se você quiser obter
apenas as linhas de uma tabela
"Clientes" onde o país seja "Brasil", você
poderia usar a seguinte consulta SQL:

SELECT * FROM Clientes WHERE pais = 'Brasil';

Nesta consulta, a cláusula WHERE


especifica a condição de que a coluna
"País" deve ser igual a "Brasil". Somente
os registros que atendem a essa
condição serão retornadas na consulta.

ORDER BY

A cláusula ORDER BY é usada em


consultas SQL para especificar a
ordenação dos resultados da consulta.

21
Ela é usada para classificar os registros
retornados por uma consulta em ordem
crescente ou decrescente com base em
uma, ou mais colunas de uma tabela.
Por exemplo, se você quiser listar os
nomes dos clientes em ordem
alfabética, você pode usar a seguinte
consulta SQL:

SELECT Nome FROM Clientes ORDER BY Nome ASC;

Nesta consulta, o ORDER BY especifica


que os resultados devem ser
classificados em ordem crescente com
base na coluna "Nome". O modificador
ASC (abreviação de "ascendente") é
usado para indicar que a ordem de
classificação deve ser crescente.
Ao utilizar o ORDER BY, caso não seja
informado nenhum modificador, por
padrão será definido o modificador
ASC, ou seja, o comando:

SELECT Nome FROM Clientes ORDER BY Nome ASC;

22
Tem o mesmo efeito do comando:

SELECT Nome FROM Clientes ORDER BY Nome;

Se você quiser classificar os nomes em


ordem decrescente, você pode usar o
modificador DESC (abreviação de
"descendente"):

SELECT Nome
FROM Clientes
ORDER BY Nome DESC;

Nesta consulta, a cláusula ORDER BY


especifica que os resultados devem ser
classificados em ordem decrescente
com base na coluna "Nome".

23
A cláusula ORDER BY também pode ser
usada para classificar os resultados
com base em várias colunas. Por
exemplo, se você quiser listar os nomes
dos clientes em ordem alfabética
decrescente, e para clientes com o
mesmo nome, classificá-los por país em
ordem alfabética, você pode usar a
seguinte consulta SQL:

SELECT Nome, Pais


FROM Clientes
ORDER BY Nome DESC, Pais ASC

Nesta consulta, a cláusula ORDER BY


especifica que os resultados devem ser

24
classificados em ordem decrescente
com base na coluna "Nome", e para
clientes com o mesmo nome, classificá-
los em ordem crescente com base na
coluna "Pais".

LIMIT

A cláusula LIMIT é usada para limitar a


quantidade de linhas que serão
retornadas em uma consulta. É
utilizada em conjunto com a cláusula
"SELECT" para especificar o número
máximo de linhas que devem ser
retornadas pela consulta. A sintaxe
básica da cláusula LIMIT é a seguinte:

SELECT coluna1, coluna2, ...


FROM nome_da_tabela
LIMIT [número];

Por exemplo, se quisermos retornar


apenas o primeiro registro de uma
tabela, poderíamos fazer o seguinte:
25
SELECT * FROM clientes LIMIT 1;

Dessa forma, a consulta retornaria


apenas a primeira linha da tabela de
clientes. A cláusula "LIMIT" é útil quando
precisamos restringir a quantidade de
dados retornados por uma consulta, o
que pode ajudar a tornar as consultas
mais eficientes e reduzir o tempo de
processamento necessário para
executar a consulta.
Podemos pensar em um exemplo de
uso da cláusula LIMIT com a cláusula
ORDER BY. Em um sistema onde exista
uma tabela Produtos e temos a
necessidade de encontrar os 10
produtos mais baratos, você pode
ordernar (order by) por preço e
restringir para apenas os 10 primeiros
registros (LIMIT).

26
Consultas
Avançadas

27
JOIN

Um JOIN é uma operação que combina


linhas de duas ou mais tabelas com
base em uma coluna comum. A ideia é
unir as informações de duas tabelas em
uma só, criando uma nova tabela
temporária que contém todas as
colunas e linhas das tabelas originais.

Existem vários tipos de JOIN em SQL,


proponho entendermos cada um:

INNER JOIN:
Retorna apenas as linhas com valores
correspondentes nas duas tabelas.

Suponha que temos duas tabelas:


"clientes" e "pedidos". A tabela
"pedidos" contém informações sobre os
pedidos realizados pelos clientes e
também o ID do cliente que fez o
pedido.

28
Para obter os nomes dos clientes e as
datas dos pedidos, podemos usar um
INNER JOIN da seguinte forma:

SELECT clientes.nome, pedidos.data


FROM clientes
INNER JOIN pedidos
ON clientes.id = pedidos.id_cliente;

Nesse exemplo, estamos selecionando


o nome do cliente da tabela "clientes" e
a data do pedido da tabela "pedidos".
Para isso, estamos unindo as duas
tabelas usando INNER JOIN através da
coluna comum. Ou seja, estamos
combinando apenas as linhas das duas
tabelas que possuem um ID de cliente
correspondente em ambas as tabelas.

29
LEFT JOIN:
Retorna todas as linhas da tabela à
esquerda (from) e as linhas
correspondentes da tabela à direita
(join). Se não houver uma
correspondência na tabela à direita, a
coluna correspondente terá um valor
nulo.
Seguindo o exemplo de CLIENTE e
PEDIDOS. Queremos obter o nome de
todos os clientes e a data de seu último
pedido. Podemos usar um LEFT JOIN da
seguinte forma:

SELECT
clientes.nome,
MAX(pedidos.data) AS ultima_data
FROM clientes
LEFT JOIN pedidos
ON clientes.id = pedidos.id_cliente
GROUP BY clientes.nome;

Nesse exemplo, estamos selecionando


o nome do cliente e a data do último
pedido. Para isso, estamos unindo as

30
duas tabelas usando LEFT JOIN, através
da coluna comum. Isso nos permite
selecionar todos os registros da tabela
"clientes" e apenas os registros
correspondentes da tabela "pedidos".
Se um cliente não tiver feito nenhum
pedido, a coluna "ultima_data" terá um
valor nulo.

Além disso, estamos usando a função


MAX() para obter a data mais recente
de cada cliente e o operador GROUP BY
para agrupar as linhas pelo nome do
cliente. Isso nos permite obter apenas
uma linha para cada cliente, com o
nome do cliente e a data de seu último
pedido (se houver).

31
RIGHT JOIN:
Retorna todas as linhas da tabela à
direita (a segunda tabela especificada
na declaração) e as correspondentes
linhas da tabela à esquerda (a primeira
tabela especificada), se houver.

A sintaxe para um right join em SQL é a


seguinte:

SELECT column_name(s)
FROM table1
RIGHT JOIN table2
ON table1.column_name = table2.column_name;

O exemplo a seguir ilustra como usar


um RIGHT JOIN para combinar duas
tabelas de departamentos e
funcionários (imagens a seguir):

32
Para obter uma lista de todos os
departamentos e seus respectivos
funcionários, mesmo que um
funcionário não tenha sido atribuído a
um departamento, você pode usar um
right join da seguinte maneira:

SELECT f.nome, d.nome departamento


FROM funcionarios f
RIGHT JOIN departamentos d
ON f.departamento_id = d.id;

O resultado dessa consulta seria:

33
Observe que o resultado inclui todos os
departamentos, mesmo aqueles sem
funcionários atribuídos a eles, graças
ao uso do right join.

FULL OUTER JOIN:


Retorna todas as linhas das tabelas
envolvidas na junção, incluindo as
linhas que não possuem
correspondência nas outras tabelas.
Na prática, é utilizado quando se quer
unir duas tabelas e manter todas as
linhas de ambas, incluindo aquelas que
não têm correspondência na outra
tabela. O resultado é uma tabela que
contém todas as linhas da tabela à
esquerda e todas as linhas da tabela à
direita, com valores nulos nas colunas
que não têm correspondência.

A sintaxe do FULL OUTER JOIN segue o


seguinte formato:

34
SELECT *
FROM tabela1
FULL OUTER JOIN tabela2 ON tabela1.coluna =
tabela2.coluna;

Aqui está um exemplo para ilustrar:

Voltaremos ao exemplo das tabelas


"clientes" e "pedidos". Supondo que
você deseje obter uma lista de todos os
clientes e seus pedidos, incluindo os
clientes que não fizeram nenhum
pedido e os pedidos que não têm um
cliente correspondente (talvez algum
bug).
A consulta SQL usando full outer join
pode ser escrita da seguinte forma:

SELECT *
FROM clientes
FULL OUTER JOIN pedidos ON clientes.id_cliente
= pedidos.id_cliente;

35
Essa consulta retornará todos os
registros da tabela "clientes" e da
tabela "pedidos", incluindo os registros
correspondentes e os registros que não
têm correspondência em nenhuma das
tabelas. Se um cliente não tiver feito
nenhum pedido, os campos da tabela
"pedidos" para esse cliente serão nulos,
e se um pedido não tiver um cliente
correspondente, os campos da tabela
"clientes" para esse pedido serão nulos.
O resultado será dessa forma:

A cliente Ana tem um pedido realizado


no data 01-01-2020. Existe um pedido
sem vínculo com cliente na data 10-03-
2020. E por fim, vemos que o Pedro não
realizou nenhum pedido.

36
SUBQUERIES:
Subqueries (ou subconsultas) são
consultas que são "alojadas" dentro de
outras consultas. Elas são usadas para
filtrar e manipular dados em uma
consulta com base em resultados de
outra consulta.
Existem dois tipos de subqueries:
Correlacionadas e não correlacionadas.

Uma subquery não correlacionada é


uma consulta que pode ser executada
independentemente da consulta
externa. Ela retorna um conjunto de
resultados que pode ser usado na
cláusula WHERE ou em outras cláusulas
da consulta externa. Aqui está um
exemplo de subquery não
correlacionada:

SELECT nome
FROM funcionarios
WHERE salario > (SELECT AVG(salario)
FROM funcionarios);

37
No exemplo anterior, a subquery é:

SELECT AVG(salario)
FROM funcionarios

que retorna o salário médio de todos os


funcionários. Essa subquery é alojada
na cláusula WHERE da consulta
externa, que retorna o nome de todos
os funcionários que ganham mais do
que o salário médio.

Uma subquery correlacionada é uma


consulta que depende dos resultados
da consulta externa. Ela é executada
para cada linha da consulta externa e
pode usar valores dessa linha em sua
cláusula WHERE. Aqui está um exemplo
de subquery correlacionada:

SELECT nome, departamento


FROM funcionarios f
WHERE salario >
(SELECT AVG(salario FROM funcionarios
WHERE departamento = f.departamento)

38
No exemplo, a subquery é:

SELECT AVG(salario)
FROM funcionarios
WHERE departamento = f.departamento

que retorna o salário médio dos


funcionários em cada departamento.
Essa subquery é aninhada na cláusula
WHERE da consulta externa, que
retorna o nome e o departamento de
todos os funcionários que ganham mais
do que o salário médio de seu
departamento.

As subqueries são muito úteis em SQL,


pois permitem que você escreva
consultas mais complexas e flexíveis,
que podem manipular dados de várias
tabelas e filtrar resultados com base
em condições específicas.

Também é possível realizar subqueries


dentro da cláusula select. Suponha que
39
temos duas tabelas: "produtos" e
"vendas". A tabela "produtos" contém
informações sobre os produtos
vendidos e a tabela "vendas" contém
informações sobre as vendas
realizadas, incluindo o ID da venda, o ID
do produto vendido, a quantidade
vendida e a data da venda. Queremos
obter o nome do produto, o preço
unitário do produto e o total de vendas
para cada produto. Podemos usar
subqueries na cláusula SELECT da
seguinte forma:

SELECT
produtos.nome,
produtos.preco,
(SELECT SUM(vendas.quantidade)
FROM vendas
WHERE vendas.id_produto = produtos.id)
as total_vendas
FROM produtos;

Nesse exemplo, estamos selecionando


o nome e o preço do produto da tabela

40
"produtos". Também estamos usando
uma subquery na cláusula SELECT para
obter o total de vendas para cada
produto. A subquery seleciona a
quantidade total de vendas para o
produto correspondente na tabela
"vendas" usando a função de
agregação SUM e a cláusula WHERE
para filtrar apenas as vendas
relacionadas ao produto atual.
O resultado dessa consulta será uma
lista de todos os produtos, com seu
nome, preço e total de vendas para
cada produto.

41
Funções de
Agregação

42
Funções de agregação em SQL são
usadas para realizar cálculos em um
conjunto de valores e retornar valor.
Essas funções são frequentemente
usadas em consultas que envolvem
grupos de dados, como cálculos de
média, soma, contagem, máximo e
mínimo.

Aqui estão alguns exemplos das


principais funções de agregação em
SQL:

COUNT(): Essa função é usada para


contar o número de linhas em uma
tabela ou consulta. Suponha que temos
uma tabela "clientes" que contém
informações sobre os clientes de uma
loja. Para contar o número total de
clientes na tabela, podemos usar a
função COUNT da seguinte forma:

SELECT COUNT(*) as total FROM clientes;

43
Nesse exemplo, a função COUNT(*)
conta o número de linhas na tabela
"clientes" e retorna o número total de
clientes.
Podemos usar a função COUNT para
contar o número de valores em uma
coluna específica. Por exemplo, se
quisermos contar o número de clientes
que forneceram um número de
telefone, podemos usar a seguinte
consulta:

SELECT COUNT(telefone) as
clientesl_com_telefone
FROM clientes
WHERE telefone IS NOT NULL;

Também podemos usar a função


COUNT em combinação com a cláusula
GROUP BY para contar o número de
registros em cada grupo. Por exemplo,
se quisermos contar o número de
clientes em cada cidade, podemos usar
a seguinte consulta:

44
SELECT cidade, COUNT(*) as clientes_na_cidade
FROM clientes
GROUP BY cidade;

SUM(): A função SUM é usada para


retornar a soma dos valores em uma
coluna específica em uma tabela. Aqui
estão alguns exemplos:
Suponha que exista uma tabela
"pedidos". Para obter o valor total dos
pedidos realizados pelos clientes,
podemos usar a função SUM da
seguinte forma:

SELECT SUM(valor_pedido) as total_pedidos


FROM pedidos;

45
Nesse exemplo, a função
SUM(valor_pedido) soma todos os
valores da coluna "valor_pedido" da
tabela "pedidos" e retorna o valor total
dos pedidos realizados.
Podemos usar a função SUM
combinada com a cláusula GROUP BY.
Por exemplo, se quisermos obter o valor
total dos pedidos realizados em cada
mês, podemos usar a seguinte consulta:

SELECT
DATE_FORMAT(data_pedido, '%Y-%m') AS mes,
SUM(valor_pedido) as valor_total
FROM pedidos
GROUP BY mes;

Nesse exemplo, formatamos o mês e o


ano da coluna "data_pedido", e a
função SUM(valor_pedido) soma todos
os valores do respectivo mês. O
resultado será uma lista de meses com
o valor total dos pedidos realizados em
cada mês.

46
Nesse exemplo, a função
SUM(valor_pedido) soma todos os
valores da coluna "valor_pedido" da
tabela "pedidos" e retorna o valor total
dos pedidos realizados.
Podemos usar a função SUM
combinada com a cláusula GROUP BY.
Por exemplo, se quisermos obter o valor
total dos pedidos realizados em cada
mês, podemos usar a seguinte consulta:

SELECT
DATE_FORMAT(data_pedido, '%Y-%m') AS mes,
SUM(valor_pedido) as valor_total
FROM pedidos
GROUP BY mes;

Nesse exemplo, formatamos o mês e o


ano da coluna "data_pedido", e a
função SUM(valor_pedido) soma todos
os valores do respectivo mês. O
resultado será uma lista de meses com
o valor total dos pedidos realizados em
cada mês.

47
Também podemos usar a função SUM
para calcular a soma dos valores em
uma coluna com base em uma
condição específica. Por exemplo, se
quisermos obter o valor total dos
pedidos realizados por um cliente
específico, podemos usar a seguinte
consulta:

SELECT SUM(valor_pedido) as valor_total


FROM pedidos
WHERE id_cliente = 12345;

Asssim obtemos todos os valores de


pedidos que correspondem à condição
especificada na cláusula WHERE, ou
seja, todos os pedidos do cliente de id
12345.
48
AVG(): utilizada para calcular a média
aritmética dos valores de uma coluna
de uma tabela. Ela retorna um valor
numérico que representa a média dos
valores da coluna. A sintaxe básica da
função AVG() é a seguinte:

SELECT AVG(nome_coluna) FROM nome_tabela;

Por exemplo, suponha que temos a


seguinte tabela chamada "notas" com
os seguintes dados:

Para calcular a média de todas as


notas de todos os alunos, podemos usar
a seguinte consulta SQL:

SELECT AVG(nota) FROM notas;

49
Podemos também calcular a média de
apenas um aluno, para isso basta
utilizar a cláusula WHERE:

SELECT AVG(nota)
FROM notas
WHERE id_aluno = 1;

MAX(): utilizada para retornar o valor


máximo de uma coluna específica em
uma tabela. Ela é usada principalmente
para encontrar o maior valor em uma
determinada coluna. A sintaxe básica
da função MAX() é a seguinte:

SELECT MAX(nome_coluna) FROM nome_tabela;

Por exemplo, suponha que temos a


seguinte tabela chamada "produtos"
com os seguintes dados:

50
Para encontrar o produto com o preço
mais alto, podemos usar a seguinte
consulta SQL:

SELECT MAX(preco) FROM produtos;

A consulta acima retornaria o valor


3000, que representa o preço máximo
encontrado na coluna "valor" da tabela
"produtos".

MIN(): Ao contrário da função MAX(), a


função MIN() é utilizada para retornar o
valor mínimo de uma coluna específica
em uma tabela. Ela é usada
principalmente para encontrar o menor
valor em uma determinada coluna. Ou
seja, utilizando o mesmo exemplo
acima, se rodarmos a query:

SELECT MIN(preco) FROM produtos;

A consulta retornaria o valor 50.

51
Otimizando o GROUP BY com HAVING

HAVING é uma cláusula utilizada em


conjunto com o GROUP BY. É utilizado
para filtrar os resultados agrupados. A
sintaxe básica do HAVING é a seguinte:

SELECT
coluna1,
colunaN,
funcao_agregacao(coluna)
FROM tabela
GROUP BY coluna1, ..., colunaN HAVING condicao;

Ao falar de filtro em SQL sempre


pensamos no WHERE. Porém, enquanto
a cláusula WHERE é usada para filtrar
linhas antes de serem agrupadas pela
cláusula GROUP BY, o HAVING é usado
para filtrar grupos depois que eles são
criados pelo GROUP BY. Isso significa
que ele permite que você filtre grupos
com base em uma condição que deve
ser satisfeita pela agregação dos dados
do grupo.
52
Por exemplo, suponha que temos a
tabela "pedidos" com os seguintes
dados:

Se quisermos exibir apenas os clientes


que tiveram um valor total de pedidos
superior a 200, podemos usar a
seguinte consulta SQL com a cláusula
HAVING:

SELECT cliente, SUM(valor) as total_pedidos


FROM pedidos
GROUP BY cliente HAVING total_pedidos > 200;

A consulta acima agrupa os pedidos


por cliente, calcula o valor total dos
pedidos de cada cliente e exibe apenas
os clientes cujo valor total de pedidos é
superior a 200.
53
A saída da consulta seria a seguinte:

Observe que a cliente Maria possui 2


pedidos, um deles com o valor de 100 e
outro com o valor de 150 e nenhum
satisfaz a condição de ser superior a
200. Porém, como utilizamos o GROUP
BY e o HAVING, o filtro só foi aplicado
após a soma dos valores dos dois
pedidos da Maria, por ela aparece na
busca e com o valor da soma de todos
os pedidos (200).

54
Manipulação
de dados

55
Manipulação de dados em SQL é o
processo de alterar, atualizar, inserir ou
excluir informações em um banco de
dados relacional. Existem quatro tipos
principais de operações de
manipulação de dados em SQL:

Inserção (INSERT): a operação INSERT é


usada para adicionar novas linhas a
uma tabela existente. Por exemplo, se
você quiser adicionar um novo cliente a
uma tabela de clientes, você pode usar
o comando INSERT para inserir uma
nova linha com as informações do
cliente. Aqui está um exemplo:

INSERT INTO clientes (nome, sobrenome, email)


VALUES ('João', 'Silva', 'joao.silva@email.com');

Se a operação de inserção for bem-


sucedida, o comando retornará uma
mensagem informando quantas linhas
foram afetadas pelo comando. No
exemplo acima, a mensagem de
retorno será "1 linha inserida".
56
Atualização (UPDATE): a operação
UPDATE é usada para modificar dados
existentes em uma tabela. Por exemplo,
se você quiser atualizar o endereço de
um cliente na tabela de clientes, você
pode usar o comando UPDATE para
alterar o endereço existente na linha
correspondente. Veja o exemplo a
seguir:

UPDATE clientes
SET endereco = 'Rua Nova, 123'
WHERE id = 1;

O comando começa com a


especificação da tabela, a qual é
"clientes". Em seguida, ele usa a
palavra-chave SET para especificar
qual coluna será atualizada e o novo
valor para essa coluna. No caso deste
exemplo, a coluna a ser atualizada é
"endereco" e o novo valor para essa
coluna é "Rua Nova, 123". Finalmente, o
comando usa a palavra-chave WHERE

57
para especificar qual linha ou conjunto
de linhas deve ser atualizado. Neste
exemplo, a cláusula WHERE especifica
que apenas o registro com um valor de
id igual a 1 será atualizado.
Após a execução, todos os registros que
correspondem aos critérios definidos na
cláusula WHERE serão atualizados. É
importante lembrar que sempre que
você executar um comando UPDATE, é
recomendável fazer um backup do
banco de dados antes de executar a
operação. Isso é especialmente
importante se você estiver atualizando
muitos registros ou alterando dados
críticos em seu banco de dados.
(NUNCA FAÇA UPDATE SEM WHERE).

Exclusão (DELETE): a operação DELETE


é usada para remover linhas existentes
de uma tabela. Por exemplo, se você
quiser excluir um cliente, você pode usar
o comando DELETE para remover a
linha correspondente.
58
Suponha que tenhamos 3 registros na
tabela de clientes.

João, com id 1
Maria, com id 2
Pedro, com id 3

Se quisermos excluir o cliente com ID = 3


(Pedro), podemos usar o comando
DELETE da seguinte maneira:

DELETE FROM Clientes


WHERE ID = 3;

Observe que o comando DELETE


remove apenas as linhas que atendem
às condições especificadas na cláusula
WHERE. Se a cláusula WHERE não for
especificada, todas as linhas da tabela
serão excluídas. (NÃO RODE DELETE
SEM WHERE).

59
Essas operações de manipulação de
dados são usadas para gerenciar
informações em bancos de dados,
sendo executadas por meio de
consultas SQL. As consultas permitem
que você especifique as informações
que deseja alterar, atualizar, inserir,
excluir ou selecionar, bem como as
condições que devem ser atendidas
para a consulta ser executada
corretamente. Com as operações de
manipulação de dados em SQL, você
pode gerenciar efetivamente as
informações armazenadas em um
banco de dados relacional.

60
Melhores práticas

61
Existem várias práticas recomendadas
para escrever código SQL eficiente e de
alta qualidade. Aqui estão algumas das
melhores práticas em SQL:

Use indentação adequada: O uso de


indentação adequada torna o código
SQL mais legível e fácil de entender.
Isso ajuda a identificar facilmente
blocos de código e reduz erros de
sintaxe.

Use nomes de objetos descritivos: Dê


nomes significativos a tabelas, colunas,
chaves primárias e estrangeiras e
outros objetos SQL. Isso facilita a leitura
do código SQL e ajuda a entender
melhor o que cada objeto representa.

Use chaves primárias e estrangeiras:


Use chaves primárias e estrangeiras
para garantir a integridade dos dados.
Isso ajuda a evitar erros de referência
cruzada e garante que os dados sejam
62
consistentes e precisos.

Evite "SELECT *": evite usar SELECT * em


consultas SQL. Em vez disso, especifique
as colunas que você precisa. Isso ajuda
a reduzir a quantidade de dados que
precisam ser processados e melhorar a
performance.

Use índices: Use índices em colunas


frequentemente usadas em cláusulas
WHERE e JOINs para melhorar a
performance das consultas SQL.

Evite subconsultas aninhadas


excessivas: Subconsultas aninhadas
excessivas podem tornar o código SQL
difícil de ler e entender. Em vez disso,
use junções de tabela sempre que
possível.

Use cláusulas LIMIT: Use cláusulas LIMIT


para limitar a quantidade de resultados
retornados em consultas SQL.
63
Isso ajuda a melhorar a performance e
evitar problemas de memória.

Evite redundância de dados: Evite


armazenar dados redundantes em
várias tabelas. Isso pode levar a
inconsistências de dados e tornar o
código SQL mais difícil de manter.

Faça backup dos seus dados: Faça


backup regularmente dos seus dados
para evitar a perda de dados em caso
de falhas de hardware ou software.

64
Como proteger
seus dados

65
Existem várias técnicas que você pode
usar para proteger seus dados com
SQL. Aqui estão algumas práticas
recomendadas:

Use senhas fortes: Use senhas fortes e


únicas para cada usuário do seu banco
de dados e altere-as regularmente.

Use criptografia: Use criptografia para


proteger dados confidenciais, como
senhas, números de cartão de crédito e
informações de identificação pessoal.

Restrinja o acesso: Restrinja o acesso


ao seu banco de dados apenas para
usuários autorizados e use permissões e
funções para controlar o acesso a
dados específicos.

Use parâmetros de entrada: Use


parâmetros de entrada para prevenir
ataques de injeção de SQL. Isso ajuda a

66
evitar que hackers insiram código
malicioso em suas consultas SQL.

Faça backup de seus dados: Faça


backup regularmente de seus dados
para evitar a perda de informações
valiosas em caso de falha de hardware
ou software.

Use o mínimo de informações pessoais:


Colete apenas as informações pessoais
necessárias e mantenha-as atualizadas
e precisas.

Atualize o software regularmente:


Mantenha o software do seu banco de
dados atualizado com as últimas
correções e atualizações de segurança.

Audite suas consultas SQL: Registre e


audite todas as consultas SQL para
detectar atividades suspeitas ou
maliciosas.

67
Use firewalls: Use firewalls para
proteger seu banco de dados contra
ataques de rede.

Eduque seus usuários: Eduque seus


usuários sobre as melhores práticas de
segurança, como não compartilhar
senhas e não clicar em links ou anexos
suspeitos.

Essas são algumas das práticas


recomendadas. Entretanto, a proteção
dos dados é um processo contínuo que
requer vigilância constante e a adoção
de medidas de segurança adequadas.

68
Conclusão

69
No decorrer deste livro exploramos os
fundamentos do SQL, incluindo a
criação e manipulação de tabelas, a
realização de consultas simples e
avançadas, e a manipulação de dados.
Também aprendemos sobre as funções
de agregação, como COUNT, SUM, AVG,
MAX e MIN, as quais são muito úteis
para resumir e analisar grandes
conjuntos de dados.
Além disso, abordamos tópicos
importantes, como otimização de
consultas, proteção de dados e
melhores práticas para escrita de
consultas eficientes.

Com as habilidades que você aprendeu


neste livro, você conseguirá criar
bancos de dados complexos, manipular
grandes conjuntos de dados e criar
consultas eficientes.

Espero que este livro tenha sido útil


para você e que você tenha aprendido
70
muito. Continue praticando e
aprimorando suas habilidades, e você
estará no caminho certo para se tornar
um especialista em SQL. Boa sorte!

71

Você também pode gostar