Database Management Systems: A Complete Guide Help
SELECT: Recuperando Dados
╔══════════════════════════════════════════════════════════════╗
║ QUERY_MASTER >> Arte da Consulta de Dados ║
║ INSTRUTOR: SELECT_SPECIALIST ║
╚══════════════════════════════════════════════════════════════╝
Fundamentos do SELECT
SELECT_SPECIALIST explica: "O comando SELECT é a base para recuperação de dados em SQL."
Sintaxe Básica
SELECT coluna1, coluna2
FROM tabela
WHERE condição
GROUP BY coluna
HAVING condição_grupo
ORDER BY coluna;
Cláusulas Principais
1. FROM
DATA_SOURCE_EXPERT demonstra: "Define a fonte dos dados"
-- Tabela única
FROM produtos
-- Múltiplas tabelas
FROM produtos p, categorias c
-- Subquery
FROM (SELECT * FROM vendas WHERE ano = 2023) v
2. WHERE
FILTER_MASTER apresenta: "Filtra os registros"
-- Comparações básicas
WHERE preco > 100
AND categoria = 'Eletrônicos'
-- Operadores IN/BETWEEN
WHERE status IN ('Ativo', 'Pendente')
AND data_criacao BETWEEN '2023-01-01' AND '2023-12-31'
-- Pattern matching
WHERE nome LIKE 'A%'
AND descricao ILIKE '%premium%'
3. JOIN
JOIN_SPECIALIST explica: "Combina dados de múltiplas tabelas"
-- INNER JOIN
SELECT p.nome, c.categoria
FROM produtos p
INNER JOIN categorias c ON p.categoria_id = c.id
-- LEFT JOIN
SELECT c.nome, COUNT(p.id) as total_pedidos
FROM clientes c
LEFT JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.nome
-- Multiple JOINs
SELECT p.nome, c.categoria, f.nome as fornecedor
FROM produtos p
JOIN categorias c ON p.categoria_id = c.id
JOIN fornecedores f ON p.fornecedor_id = f.id
4. GROUP BY
AGGREGATION_MASTER demonstra: "Agrupa resultados"
-- Agrupamento simples
SELECT categoria, COUNT(*) as total
FROM produtos
GROUP BY categoria
-- Múltiplas colunas
SELECT categoria, status, SUM(valor) as total
FROM vendas
GROUP BY categoria, status
-- Com HAVING
SELECT cliente_id, COUNT(*) as total_pedidos
FROM pedidos
GROUP BY cliente_id
HAVING COUNT(*) > 5
5. ORDER BY
SORT_EXPERT apresenta: "Ordena resultados"
-- Ordenação simples
ORDER BY data_criacao DESC
-- Múltiplas colunas
ORDER BY categoria ASC, preco DESC
-- Com expressões
ORDER BY (preco * quantidade) DESC
Funções e Expressões
1. Agregação
SELECT
COUNT(*) as total,
SUM(valor) as valor_total,
AVG(preco) as preco_medio,
MAX(data) as data_mais_recente,
MIN(data) as data_mais_antiga
FROM vendas;
2. String
SELECT
UPPER(nome) as nome_maiusculo,
LOWER(email) as email_minusculo,
SUBSTRING(descricao, 1, 100) as descricao_curta,
CONCAT(nome, ' - ', categoria) as nome_completo
FROM produtos;
3. Data/Hora
SELECT
DATE_TRUNC('month', data_criacao) as mes,
EXTRACT(YEAR FROM data_criacao) as ano,
data_criacao + INTERVAL '7 days' as data_vencimento
FROM pedidos;
Subconsultas
SUBQUERY_MASTER explica: "Consultas dentro de consultas"
-- Subconsulta no WHERE
SELECT nome
FROM produtos
WHERE categoria_id IN (
SELECT id
FROM categorias
WHERE ativo = true
);
-- Subconsulta no FROM
SELECT dept_nome, total_funcionarios
FROM (
SELECT departamento_id, COUNT(*) as total
FROM funcionarios
GROUP BY departamento_id
) f
JOIN departamentos d ON f.departamento_id = d.id;
-- Subconsulta correlacionada
SELECT p.nome
FROM produtos p
WHERE preco > (
SELECT AVG(preco)
FROM produtos
WHERE categoria_id = p.categoria_id
);
Otimização
PERFORMANCE_GURU compartilha dicas essenciais:
1. Índices
-- Use índices apropriados
CREATE INDEX idx_produtos_categoria
ON produtos(categoria_id);
-- Índice composto para consultas frequentes
CREATE INDEX idx_pedidos_cliente_data
ON pedidos(cliente_id, data_criacao);
2. Análise de Execução
-- Analise o plano de execução
EXPLAIN ANALYZE
SELECT c.nome, COUNT(p.id) as total_pedidos
FROM clientes c
JOIN pedidos p ON c.id = p.cliente_id
GROUP BY c.nome;
SELECT_SPECIALIST conclui: "O domínio do SELECT é fundamental para qualquer desenvolvedor SQL. Pratique diferentes tipos de consultas e sempre considere performance e manutenibilidade."