Cácio Costa
Banco de
dados
01.
Modelagem de dados
02.
Introdução ao SQL
03.
Python com
Banco de dados
04.
Conteúdo desta aula
Banco de
dados
01.
Modelagem de dados
02.
Introdução ao SQL
03.
Python com
Banco de dados
04.
O que você pensa quando ouve falar em base de dados?
🤔
Bases de dados
Bases de dados
Bases de dados
Bases de dados
"Banco de dados"
Características
SGBD organizado em vários
bancos de dados
Qual a diferença entre um Banco de Dados Relacional e um Banco de dados NoSQL?
🤔
Relacional X NoSQL
Relacional
NoSQL
Relacional X NoSQL
Relacional
NoSQL
"Já sei Excel, então vai ser moleza!"
😌
Tabela de Pedidos - Exemplo Excel
| Número do Pedido | Data do Pedido | CNPJ do Fornecedor |
Nome do Fornecedor | Telefone do Fornecedor | Código do Produto | Nome do Produto | Preço do Produto | Quantidade |
|---|---|---|---|---|---|---|---|---|
| 001 | 01/01/2024 | 57.381.404/0001-90 | Forn. A | (61) 3722-6845 | P-01 | Corona | 2,99 | 250 |
| 001 | 01/01/2024 | 57.381.404/0001-90 | Forn. A | (61) 3722-6845 | P-23 | Pepsi | 5,99 | 180 |
| 002 | 01/02/2024 | 00.709.901/0001-57 | Forn. B | (61) 3775-8780 | P-11 | Hoegaarden | 6,87 | 500 |
| 003 | 01/03/2024 | 00.709.901/0001-57 | Forn. B | (61) 3775-8780 | P-09 | Guaraná | 5,99 | 100 |
| 004 | 01/03/2024 | 60.912.661/0001-15 | Forn. C | (61) 2227-4065 | P-33 | Água com gás | 1,89 | 150 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
Uma planilha bem comum de ser encontrada.
Mas você vê algum problema nessa estrutura?
🤔
Tabela de Pedidos - Exemplo Excel
| Número do Pedido | Data do Pedido | CNPJ do Fornecedor |
Nome do Fornecedor | Telefone do Fornecedor | Código do Produto | Nome do Produto | Preço do Produto | Quantidade |
|---|---|---|---|---|---|---|---|---|
| 001 | 01/01/2024 | 57.381.404/0001-90 | Forn. A | (61) 3722-6845 | P-01 | Corona | 2,99 | 250 |
| 001 | 01/01/2024 | 57.381.404/0001-90 | Forn. A | (61) 3722-6845 | P-23 | Pepsi | 5,99 | 180 |
| 002 | 01/02/2024 | 00.709.901/0001-57 | Forn. B | (61) 3775-8780 | P-11 | Hoegaarden | 6,87 | 500 |
| 003 | 01/03/2024 | 00.709.901/0001-57 | Forn. B | (61) 3775-8780 | P-09 | Guaraná | 5,99 | 100 |
| 004 | 01/03/2024 | 60.912.661/0001-15 | Forn. C | (61) 2227-4065 | P-33 | Água com gás | 1,89 | 150 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... |
Precisamos reaprender a estruturar e organizar nossas informações.
Quiz 1
a)
Um SGBD é um software que gerencia um único banco de dados dedicado.
b)
Banco de dados NoSQL utilizam SQL como linguagem de manipulação de dados.
c)
SGBDs Relacionais possuem um esquema rígido de campos e tipos.
d)
Banco Relacionais armazenam suas informações em estruturas de tabelas.
Quais das seguintes afirmações estão corretas?
Quiz 1 - Resposta
a)
Um SGBD é um software que gerencia um único banco de dados dedicado.
b)
Banco de dados NoSQL utilizam SQL como linguagem de manipulação de dados.
c)
SGBDs Relacionais possuem um esquema rígido de campos e tipos.
d)
Banco Relacionais armazenam suas informações em estruturas de tabelas.
Quais das seguintes afirmações estão corretas?
Banco de
dados
01.
Modelagem de dados
02.
Introdução ao SQL
03.
Python com
Banco de dados
04.
Modelagem de dados
Processo genérico para representar um modelo de dados graficamente.
01.
Observar elementos de um ambiente (negócio, área, processo, etc);
02.
Caracterizá-los;
03.
Abstrair características;
04.
Representá-los;
05.
Estabelecer o relacionamento entre eles.
O que é um modelo?
🤔
"Modelo é a representação abstrata e simplificada de um sistema real, com a qual se pode explicar ou testar o seu comportamento, em seu todo ou em partes."
COUGO, Paulo. Modelagem conceitual e projeto de banco de dados. Rio de Janeiro: Elsevier, 1997.
Modelo de dados relacional (notação simplificada)
Modelagem de dados
Entidades
| Código (PK) | Nome | Preço |
|---|---|---|
| P-01 | Corona | 2.99 |
| P-23 | Pepsi | 5.59 |
| P-11 | Hoegaarden | 6.87 |
| P-09 | Guaraná | 5.99 |
| P-33 | Água com gás | 1.98 |
| ... | ... | ... |
Tabela PRODUTO
Modelagem de dados
Relacionamentos
| CNPJ (PK) | Nome | Telefone |
|---|---|---|
| 57.381.404/0001-90 | Fornecedor A | (61) 3722-6845 |
| 00.709.901/0001-57 | Fornecedor B | (61) 3775-8780 |
| 60.912.661/0001-15 | Fornecedor C | (61) 2227-4065 |
Tabela FORNECEDOR
| Número (PK) | Data | CNPJ_Fornecedor (FK) |
|---|---|---|
| 1 | 01/01/2024 | 57.381.404/0001-90 |
| 2 | 01/02/2024 | 00.709.901/0001-57 |
| 3 | 01/03/2024 | 00.709.901/0001-57 |
| 4 | 01/03/2024 | 60.912.661/0001-15 |
Tabela PEDIDO
Modelagem de dados
Cardinalidade
| Código (PK) | Nome |
|---|---|
| 1 | Cerveja |
| 2 | Refrigerante |
| 3 | Sem álcool |
Tabela CATEGORIA
Tabela PRODUTO
| Código (PK) | Nome | Preço |
|---|---|---|
| 1 | Corona | 2.99 |
| 2 | Pepsi | 5.59 |
| 3 | Hoegaarden | 6.87 |
Em que tabela colocamos a chave estrangeira (FK)?
🤔
Modelagem de dados
Cardinalidade N-N
| Código (PK) | Nome |
|---|---|
| 1 | Cerveja |
| 2 | Refrigerante |
| 3 | Sem álcool |
Tabela CATEGORIA
Tabela PRODUTO
| Código (PK) | Nome | Preço |
|---|---|---|
| 1 | Corona | 2.99 |
| 2 | Pepsi | 5.59 |
| 3 | Hoegaarden | 6.87 |
Tabela CATEGORIA_PRODUTO
| Código_Categoria (PK) (FK) |
Código_Produto (PK) (FK) |
|---|---|
| 1 | 1 |
| 3 | 1 |
| 2 | 2 |
| 1 | 3 |
Relacionamentos N-N SEMPRE darão origem a uma tabela associativa no meio.
Modelo de dados relacional (notação simplificada)
Quiz 2
a) Cardinalidade
b) Chave estrangeira
d) Tabela associativa
Sobre modelagem de dados, associe as definições aos seus respectivos conceitos:
1)
Representa um conceito do negócio sendo modelado.
2)
Mecanismo usado para definir relacionamentos entre tabelas.
3)
Indica a quantidade de registros que podem ser relacionar com registros de outra tabela.
4)
Estrutura criada para possibilitar o relacionamento N-N entre duas entidades.
c) Entidade
Quiz 2 - Resposta
a) Cardinalidade
b) Chave estrangeira
d) Tabela associativa
Sobre modelagem de dados, associe as definições aos seus respectivos conceitos:
1)
Representa um conceito do negócio sendo modelado.
2)
Mecanismo usado para definir relacionamentos entre tabelas.
3)
Indica a quantidade de registros que podem ser relacionar com registros de outra tabela.
4)
Estrutura criada para possibilitar o relacionamento N-N entre duas entidades.
c) Entidade
Banco de
dados
01.
Modelagem de dados
02.
Introdução ao SQL
03.
Python com
Banco de dados
04.
Linguagem SQL
SQL (Structured Query Language) é uma linguagem padrão utilizada para gerenciar e manipular bancos de dados relacionais. Desenvolvida na década de 1970 pela IBM.
Pronuncia-se SEQUEL, porque era seu nome original (Structured English Query LanguageI).
01.
Baseada na álgebra relacional;
02.
Linguagem declarativa;
03.
Possui categorias de comando SQL (DML, DQL, DDL, DCL e TCL)
04.
Foi "padronizada", mas cada SGBD tem suas peculiaridades.
05.
É case insensitive - não diferencia letras maiúsculas de minúsculas.
Categorias de SQL
DML (Data Manipulation Language):
DQL (Data Query Language):
DDL (Data Definition Language):
DCL (Data Control Language):
TCL (Transaction Control Language):
Foco de hoje
SQL
Data Query Language
Data Manipulation Language
Data Definition Language
Data Control Language
Transaction Control Language
Manipular dados em SQL é fácil. Quero ver consultar!
Calma! Vai ser moleza.
😎
Conexão com SGBD
Agora sim, mão na massa!
DQL - SELECT "cru"
SELECT cnpj, nome, telefone
FROM fornecedor;
SELECT *
FROM fornecedor;
-- SELECT: quais campos aparecem no resultado.
-- FROM: qual tabela será consultada.Quais são os fornecedores cadastrados?
Consulta - ORDER BY
Quero os fornecedores ordenados pelo nome
select *
from fornecedor
order by nome;
select *
from fornecedor
order by nome desc;
-- ORDER BY: Diz por quais colunas ordenar o resultado.
-- Pode ser ASC (ascendente) ou DESC (decrescente).
-- Por padrão é ASC.
-- Pode estipular várias colunas para ordenação.Consulta - WHERE
Qual o preço da Coca Cola?
select preco
from produto
where nome = 'Pepsi';
-- WHERE: Cláusula usada para filtrar dados que serão exibidos no resultado.
select preco
from produto
where lower(nome) = 'Pepsi';
-- LOWER: função que retorna um texto em letras minúsculas.
-- UPPER: função que retorna um texto em letras maiúsculas.Consulta - Filtros compostos
-- LISTAR FORNECEDORES DO RJ (ddd 21), ou de SP (ddd 11)
select *
from fornecedor
where substring(telefone, 2, 2) = '21'
OR substring(telefone, 2, 2) = '11';
-- LISTAR PRODUTOS com preço entre 5 e 10
select *
from produto
where preco >= 5
AND preco <= 10;
-- SUBSTRING(valor, INÍCIO, QUANTIDADE): Extrai um pedaço do texto.
-- Começa na posição indicada no INÍCIO,
-- e retorna a QUANTIDADE de caracteres desejada.Quais os fornecedores do RJ e SP?
Quais produtos entre 5 e 10 reais?
Consulta - Funções de agregação
Quantos pedidos feitos?
Qual o maior e o menor preço de produto?
select count(*)
from pedido;
select max(preco), min(preco)
from produto;
-- COUNT: Conta a quantidade de registros.
-- MIN: Exibe o menor valor do campo.
-- MAX: Exibe o maior valor do campo.Consulta - ALIAS
Melhorar visualização do resultado
select count(*) AS quantidade_pedido -- apelido temporário para o resultado
from pedido;
select max(preco) maior_preco, -- O "AS" é opcional.
min(preco) menor_preco
from produto;Antes do ALIAS
Depois do ALIAS
Consulta - GROUP BY
Quantos pedidos cada fornecedor atendeu, do maior pro menor?
select cnpj_fornecedor, count(*) quantidade_atendida
from pedido
group by cnpj_fornecedor
order by count(*) desc;
-- Todos os campos que não estiverem em funções de agregação
-- devem estar listados no GROUP BY.Resultado
Consulta - HAVING
Quantos pedidos cada fornecedor atendeu, do maior pro menor?
select codigo_produto, count(*) numero_pedidos
from item_pedido
group by codigo_produto
having count(*) > 5;
-- HAVING: A cláusula WHERE é aplicada ANTES dos registros serem agrupados.
-- O having é executado DEPOIS dos registros serem agrupados.Resultado
Consulta - INNER JOIN
select p.nome, i.quantidade, i.numero_pedido
from produto p
inner join item_pedido i
on p.codigo = i.codigo_produto
order by p.nome, i.quantidade desc;
-- INNER JOIN: Apresenta somente registros que satisfazem a condição.
-- Se houver produto que não tenha relacionamento com
-- ITEM_PEDIDO, ele não aparece no resultado final.Informe o nome do produto e a quantidade vendida em cada pedido
Resultado
Consulta - LEFT JOIN
select *
from fornecedor f
left join pedido p
on f.cnpj = p.cnpj_fornecedor;
-- LEFT JOIN: Apresenta todos os registros que satisfazem a condição.
-- Apresenta também registros do lado esquerdo (FORNECEDOR apareceu antes),
-- mesmo que não tenham relacionamento no lado direito (PEDIDO).Descubra se tem fornecedor que não atendeu pedido.
Consulta - LEFT JOIN
select *
from fornecedor f
left join pedido p
on f.cnpj = p.cnpj_fornecedor;Resultado
Como listar somente os registros que NÃO possuem relacionamento na outra tabela?
🤔
Consulta - LEFT JOIN
select *
from fornecedor f
left join pedido p
on f.cnpj = p.cnpj_fornecedor
where p.numero is null;Resultado
Quais fornecedores que NÃO atenderam pedidos?
Consulta - Outros JOINS
Consulta - CUIDADOS com JOIN
Quais produtos os fornecedores venderam?
inner join
inner join
inner join
inner join
Consulta - CUIDADOS com JOIN
Quais produtos os fornecedores venderam?
select distinct f.nome, prod.nome
from fornecedor f
inner join pedido p
on f.cnpj = p.cnpj_fornecedor
inner join item_pedido ip
on p.numero = ip.numero_pedido
inner join produto prod
on ip.codigo_produto = prod.codigo
order by f.nome, prod.nome;Resultado
E tem muito mais...
Passamos pelas estruturas mais básicas do SQL, mas já poderosas.
Vimos
Banco de
dados
01.
Modelagem de dados
02.
Introdução ao SQL
03.
Python com
Banco de dados
04.
Python - Revisão
print('Olá, Mundo Python com SQL')
# A função `print` escreve o texto na saída do sistema operacionalOlá, Mundo!
1. Cria um arquivo com a extensão .py (ola.py, por exemplo);
2. Insere código Python nele;
C:\> cd pasta_do_arquivo
C:\pasta_do_arquivo> python ola.py
Olá, Mundo Python com SQL!3. Abre a linha de comando;
4. Acessa a pasta onde está o código fonte;
5. Executa o arquivo.
Código Fonte
Python - Revisão
# Programa que calcula a média de idade de uma família
print( (40 + 37 + 0.5) / 3 ) # Saída -> 25.833333
# Operadores matemáticos
# + -> Adição
# - -> Subtração
# * -> Multiplicação
# / -> Divisão
# % -> Módulo (resto da divisão)
# ** -> Exponenciação
# // -> Divisão inteira
#
# Parênteses, numa expressão, indicam a precedência
# Versão coom variáveis
idade_do_pai = 40
# a partir desse momento, o programa conhece
# o nome "idade_do_pai" com o valor 40
idade_da_mae = 37
idade_do_filho = 0.5
soma_das_idades = (idade_do_pai + idade_da_mae + idade_do_filho)
media = soma_das_idades / 3
print(f'A média das idades é {media}')
# SAÍDA: A média das idades é 25.833333333333332Variáveis e operações básicas
Python - Revisão
# Lista com as notas de um aluno
notas = [8.9, 9.4, 7.8]
# Tupla representando um registro lido do banco de dados
fornecedor = ('47.508.411/0001-86', "Distribuidora Água Viva Bebidas", '(11) 2564-7890')
# Elementos das listas e tuplas são acessados pelo índice.
# Começa pelo índice ZERO (0).
print(notas[1]) # SAÍDA -> 9.4
print(fornecedor[0]) # SAÍDA -> 47.508.411/0001-86
# Dicionário representando um produto
pepsi = {
'codigo': 2,
'nome': 'Pepsi',
'preco': 4.99
}
# O acesso aos valores dos dicionários se dá pela CHAVE
print(pespi['preco'])Listas, tuplas e dicionários
Lista:
Tupla:
Dicionário:
Python - Revisão
# Avalia a bebida: está barata se o preço for menor que 5 reais
pepsi = {
'codigo': 2,
'nome': 'Pepsi',
'preco': 4.99
}
if pepsi['preco'] < 5:
print('Está barata')
else:
print('Me rouba logo!!!')
# SAÍDA: -> Está barata, porque o preço da Coca (4.99) < 5
# Exibir todos os dados do fornecedor
fornecedor = ('47.508.411/0001-86', "Distribuidora Água Viva Bebidas", '(11) 2564-7890')
for campo in fornecedor:
print(campo)
# SAÍDA (cada informação é impressa em uma nova linha)
# -> 47.508.411/0001-86
# -> Distribuidora Água Viva Bebidas
# -> (11) 2564-7890Condicionais e Laços
IF:
ELSE:
FOR:
Python - Revisão
# Cria função para calcular a média final nas disciplinas da escola.
#
# -> Precisa receber 3 parâmetros para realizar o cálculo.
# -> Retorna o valor da média ao ponto em que foi invocada.
def calcula_media_final(nota1, nota2, nota3):
soma_das_notas = nota1 + nota2 + nota3
media = soma_das_notas / 3
return media
# Parâmetros seguem a ordem em que são passados: nota1=5.7, nota2=6.8 e nota3=3.4
media_do_joao = calcula_media_final(5.7, 6.8, 3.4)
media_da_maria = calcula_media_final(nota1=8.8, nota2=8.5, nota3=9.9)
print(media_do_joao) # Saída -> 5.3
print(media_da_maria) # Saída -> 9.06Funções
O que é uma função?
Para que serve?
Análise de dados com Python e SQL
Fluxograma de interação e bibliotecas
Análise 1 - Buscar dados no MySQL
# Importar as bibliotecas base
from sqlalchemy import create_engine, text
import pandas as pd
import matplotlib.pyplot as plt
# Cria motor para interagir com o MySQL
string_de_conexao = "mysql+mysqlconnector://localhost:3307/ambev_pedidos"
engine = create_engine(string_de_conexao)
# Consulta que executamos anteriormente
query = '''select cnpj_fornecedor fornecedor, count(*) quantidade_pedidos
from pedido
group by cnpj_fornecedor
order by count(*) desc;
'''
# Realiza a consulta e pega os dados retornados
with engine.connect() as conexao:
resultado = conexao.execute(text(query))
dados = resultado.mappings()
# Continua ...Quantos pedidos cada fornecedor atendeu, do maior pro menor?
Análise 1 - Carregar Dataframe e Gráfico
# ... continuando: carrega dados do banco num DataFrame do Pandas
df_pedidos_atendidos = pd.DataFrame(dados)
# Plota um gráfico de colunas para exibir as métricas
plt.figure(figsize=((10, 8)))
plt.bar(df_pedidos_atendidos['fornecedor'], df_pedidos_atendidos['quantidade_pedidos'])
plt.title('Quantidade de pedidos atendidos por fornecedor')
plt.show()Quantos pedidos cada fornecedor atendeu, do maior pro menor?
Análise 1 - Resultado final
Análise 2 - Buscar dados no MySQL
Quanto cada produto rendeu em faturamento (consulta inédita)?
# Bibliotecas e Engine do MySQL já foram criadas anteriormente
# Consulta que executamos anteriormente
query = '''select p.nome, sum(i.preco_unitario * i.quantidade) faturamento
from item_pedido i
left join produto p on i.codigo_produto = p.codigo
group by p.nome
order by faturamento
'''
# Realiza a consulta e pega os dados retornados
with engine.connect() as conexao:
resultado = conexao.execute(text(query))
dados = resultado.mappings()
df_faturamento_produtos = pd.DataFrame(dados)
df_faturamento_produtos['faturamento'] = df_faturamento_produtos['faturamento'].astype(float)
# Plota o gráfico
import locale
locale.setlocale(locale.LC_MONETARY, 'pt_BR')
total = df_faturamento_produtos['faturamento'].sum()
def my_fmt(percentual):
valor = total * percentual / 100
valor = locale.currency(valor, symbol=False, grouping=True)
return f'R$ {valor}\n({percentual:.2f}%)'
plt.figure(figsize=((10, 8)))
plt.pie(df_faturamento_produtos['faturamento'], labels=df_faturamento_produtos['nome'], autopct=my_fmt, pctdistance=0.8)Análise 2 - Resultado final
Obrigado!!!
Sobre mim
Cácio Costa
/cacio-costa
Apêndice DDL e DML
05*.
DDL - CREATE TABLE
CREATE TABLE produto (
codigo BIGINT NOT NULL AUTO_INCREMENT,
nome VARCHAR(255) NOT NULL,
preco DECIMAL(10, 2) NOT NULL,
PRIMARY KEY(codigo)
);Criar a tabela produto
SQL - Tipos de dados
Categoria
Tipo
1. p é a precisão (quantidade de dígitos antes da vírgula). s é a escala (quantidade de casas após a vírgula).
2. Data no formato YYYY-MM-DD.
3. Hora no formato HH:MM:SS.
4. Combinação dos formatos de data e hora.
5. n é a quantidade de caracteres/bytes.
DML - INSERT
INSERT INTO produto
(nome, preco)
VALUES
('Eisenbahn', 2.99);
INSERT INTO produto (nome, preco)
VALUES ('Coca Cola', 5.59);
INSERT INTO produto (nome, preco)
VALUES ('Colorado Appia', 6.87);
-- Texto, no SQL, sempre entre aspas simples
-- Números decimais separados por ponto (.)Tabela PRODUTO
| Codigo(PK) | Nome | Preco |
|---|---|---|
| 1 | Eisenbahn | 2.99 |
| 2 | Coca cola | 5.59 |
| 3 | Colorado Appia | 6.87 |
Incluir os registros abaixo
DML - UPDATE
UPDATE produto
SET preco = 6.19;
-- Se executar assim, atualiza TODOS os registros
-- Precisa colocar uma condição que indique
-- somente o registro que deve ser alterado
UPDATE produto
SET preco = 6.19
WHERE codigo = 2;
-- Também funcionaria NESTE CONJUNTO DE DADOS
UPDATE produto
SET preco = 6.19
WHERE nome = 'Coca Cola';
Tabela PRODUTO
| Codigo(PK) | Nome | Preco |
|---|---|---|
| 1 | Eisenbahn | 2.99 |
| 2 | Coca cola |
|
| 3 | Colorado Appia | 6.87 |
Atualizar preço da Coca
DML - DELETE
DELETE FROM produto;
-- Se executar assim, REMOVE TODOS os registros
-- Precisa colocar uma condição que indique
-- somente o registro que deve ser alterado
DELETE FROM produto
WHERE codigo = 3; Tabela PRODUTO
| Codigo(PK) | Nome | Preco |
|---|---|---|
| 1 | Eisenbahn | 2.99 |
| 2 | Coca cola | 6.19 |
Remover a Colorado