SQL para Pythonistas: do SELECT ao JOIN
Aprenda SQL com exemplos em Python. Consultas, filtros, agregações e joins.
Por que aprender SQL?
Mesmo usando ORMs como SQLAlchemy ou Django ORM, entender SQL é essencial. Em algum momento você vai precisar otimizar uma query, depurar um problema de performance ou trabalhar com um banco legado. SQL é a linguagem universal dos bancos de dados relacionais.
Vamos usar o SQLite com Python, que já vem instalado e não precisa de configuração:
import sqlite3
conexao = sqlite3.connect("loja.db")
cursor = conexao.cursor()
Criando tabelas e inserindo dados
Antes de consultar, precisamos de dados. Vamos criar uma estrutura simples de loja:
cursor.execute("""
CREATE TABLE IF NOT EXISTS clientes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
nome TEXT NOT NULL,
email TEXT UNIQUE,
cidade TEXT
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS pedidos (
id INTEGER PRIMARY KEY AUTOINCREMENT,
cliente_id INTEGER,
produto TEXT NOT NULL,
valor REAL NOT NULL,
data TEXT DEFAULT CURRENT_DATE,
FOREIGN KEY (cliente_id) REFERENCES clientes(id)
)
""")
# Inserindo dados
clientes = [
("Ana Silva", "ana@email.com", "Sao Paulo"),
("Carlos Lima", "carlos@email.com", "Rio de Janeiro"),
("Julia Santos", "julia@email.com", "Sao Paulo"),
]
cursor.executemany(
"INSERT INTO clientes (nome, email, cidade) VALUES (?, ?, ?)",
clientes
)
pedidos = [
(1, "Notebook", 3500.00),
(1, "Mouse", 89.90),
(2, "Teclado", 199.90),
(3, "Monitor", 1200.00),
(3, "Webcam", 250.00),
]
cursor.executemany(
"INSERT INTO pedidos (cliente_id, produto, valor) VALUES (?, ?, ?)",
pedidos
)
conexao.commit()
SELECT e WHERE: buscando dados
O SELECT é o comando mais usado em SQL. Ele busca dados de uma tabela e aceita filtros com WHERE:
# Todos os clientes
cursor.execute("SELECT * FROM clientes")
for linha in cursor.fetchall():
print(linha)
# Clientes de Sao Paulo
cursor.execute("SELECT nome, email FROM clientes WHERE cidade = ?", ("Sao Paulo",))
for linha in cursor.fetchall():
print(linha)
# Pedidos acima de R$200
cursor.execute("SELECT produto, valor FROM pedidos WHERE valor > 200")
for linha in cursor.fetchall():
print(f"{linha[0]}: R${linha[1]:.2f}")
Funções de agregação
SQL oferece funções para calcular totais, médias e contagens diretamente no banco:
# Total gasto por todos os clientes
cursor.execute("SELECT SUM(valor) FROM pedidos")
total = cursor.fetchone()[0]
print(f"Total: R${total:.2f}")
# Media dos pedidos
cursor.execute("SELECT AVG(valor) FROM pedidos")
media = cursor.fetchone()[0]
print(f"Media: R${media:.2f}")
# Quantidade de pedidos por cliente
cursor.execute("""
SELECT cliente_id, COUNT(*) as total_pedidos
FROM pedidos
GROUP BY cliente_id
HAVING total_pedidos > 1
""")
for linha in cursor.fetchall():
print(f"Cliente {linha[0]}: {linha[1]} pedidos")
JOIN: cruzando tabelas
O JOIN combina dados de duas ou mais tabelas. O INNER JOIN retorna apenas as linhas que têm correspondência em ambas:
cursor.execute("""
SELECT c.nome, p.produto, p.valor
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id
ORDER BY p.valor DESC
""")
for linha in cursor.fetchall():
print(f"{linha[0]} comprou {linha[1]} por R${linha[2]:.2f}")
# Total gasto por cliente
cursor.execute("""
SELECT c.nome, SUM(p.valor) as total
FROM clientes c
INNER JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.id
ORDER BY total DESC
""")
for linha in cursor.fetchall():
print(f"{linha[0]}: R${linha[1]:.2f}")
Conclusão
SQL é uma habilidade fundamental para qualquer desenvolvedor Python. Com SELECT, WHERE, funções de agregação e JOIN, você resolve a grande maioria dos problemas de consulta a dados. O próximo passo é aprender a usar essas queries dentro de um ORM como SQLAlchemy, combinando a expressividade do SQL com a praticidade do Python.