CodeGym /Cursos /SQL SELF /Top50 queries para o banco de dados

Top50 queries para o banco de dados

SQL SELF
Nível 61 , Lição 2
Disponível

Depois que você já conectou todas as tabelas do seu banco, chegou a hora de escrever uns queries. Mas só uns dois é coisa de iniciante, né? Você já tá ficando pro, então vai precisar escrever 50(!) queries pro seu banco de dados. E olha que são só os mais importantes.

Queries para o banco de dados

1. Listar produtos pra vitrine

Esse query retorna todos os produtos ativos com o preço principal e imagem pra mostrar na home e no catálogo. Assim dá pra montar a vitrine rapidinho e manter as infos dos produtos atualizadas.

2. Buscar produtos por palavra-chave

Permite que o usuário ache o produto que quer pelo nome ou descrição. É essencial pra busca rápida no catálogo.

3. Card do produto por ID

Retorna info detalhada de um produto específico, incluindo marca e categoria. Precisa disso pra mostrar a página do produto completa.

4. Lista de variantes do produto

Mostra todas as variantes (SKU) do produto: tamanhos, cores, estoque, preços. Usado pra escolher a modificação certa na página do produto.

5. Galeria de imagens do produto

Pra mostrar o card do produto completo, precisa de todas as fotos. O query retorna elas e indica qual é a principal.

6. Média de avaliação e número de reviews do produto

Usado pra mostrar a nota do produto e quantos reviews ele tem, o que é importante pra reputação e confiança dos clientes.

7. Lista detalhada de reviews do produto

Pra seção de reviews no card do produto: nota, texto, autor e data do review. Ajuda novos clientes a decidir se compram ou não.

8. Perguntas e respostas do produto

Query pra pegar perguntas e respostas de cada produto, essencial pro bloco de FAQ na página do produto.

9. Categorias de produtos com hierarquia

Permite visualizar a estrutura do catálogo, montar árvore de navegação pra filtros e menus.

10. Produtos por categoria e subcategorias

Ajuda a mostrar todos os produtos de uma categoria escolhida ou das "filhas" dela (nível de profundidade).

11. Lista de marcas

Pra filtrar por marca, criar listagem de marcas e landing pages.

12. Tags populares e quantidade de produtos

Analisa as tags mais usadas pra mostrar produtos em alta e montar nuvem de tags.

13. Histórico de mudança de preço do produto

Pra análise e mostrar a dinâmica de preços (preço antigo/novo, promoções).

14. Histórico de status do produto

Permite rastrear o ciclo de vida do produto, motivo de sumir da vitrine ou voltar.

15. Busca por certificados e licenças

Crítico pra compradores profissionais e B2B (qualidade e legalidade dos produtos).

16. Dados dos fornecedores do produto

Importante pra administração, controle de qualidade e contato com fornecedores.

17. Estoque do produto por armazém

Controle e conferência do estoque atualizado por armazém. Essencial pra logística e evitar "out of stock".

18. Produtos com estoque abaixo do limite

Automatiza reposição de estoque, evita perder venda por falta de produto.

19. Movimentação de produto no estoque (auditoria)

Rastreia todas as movimentações do produto num período: entradas, baixas e ajustes, importante pra inventário e evitar perdas.

20. Logística de transferências entre armazéns

Permite ver histórico e status das transferências internas de produto entre centros logísticos.

21. Entrega: métodos e tarifas

Pra calcular o frete e informar o usuário na hora do pedido.

22. Histórico de pedidos do usuário

Parte essencial do painel do usuário — todos os pedidos feitos, status e valor.

23. Detalhes do pedido com itens

Permite pegar toda a estrutura do pedido — itens, preços, quantidades — pra mostrar no front ou pro suporte.

24. Relatório de pedidos por período e status

Análise e relatório de vendas, retorna pedidos por período e status desejado (tipo "finalizado").

25. "Carrinhos abandonados"

Análise pra marketing: carrinhos que o usuário não finalizou — potencial pra retargeting.

26. Top vendas

Análise pro bloco "Mais vendidos" e seleções de marketing: quais produtos vendem mais.

27. Vendas por dia (pra gráficos)

Relatório de faturamento diário — base pra analisar a dinâmica do negócio e montar gráficos.

28. Lista de devoluções

Mostra devoluções de todos os pedidos com motivo e status, ajuda a analisar causas das devoluções.

29. Lista de cancelamentos de pedidos

Controle de perdas e motivos de cancelamento: mostra cancelamentos com motivo, quem cancelou e quando.

30. Pedidos aguardando envio

Pro estoque e entrega — pedidos que precisam ser separados e enviados, com detalhes da entrega.

31. Ticket médio

Métrica "Average Order Value" — chave pra avaliar marketing e mix de produtos.

32. Pedidos com uso de cupons

Análise da eficiência das promoções: quais cupons foram usados e com que frequência.

33. Uso de descontos por categoria e marca

Permite ver quais promoções funcionam e monitorar popularidade dos descontos por categoria e marca.

34. Cupons usados e seus usuários

Controle do uso de cupons, detectar anomalias e abusos.

35. Histórico de pagamentos do pedido

Pro suporte e contabilidade: mostra todas as transações de pagamento, status e métodos usados.

36. Pedidos com reembolso

Pra analisar devoluções, gerar relatórios contábeis e evitar fraude.

37. Saldo da carteira do usuário e histórico de transações

Controle e exibição de bônus ou cashback do usuário, histórico das movimentações.

38. Chamados do usuário no suporte

Permite ao usuário ver seus chamados e status de atendimento.

39. SLA-analytics dos chamados de suporte

Analisa tempo médio de resposta e solução por prioridade, importante pra controle de SLA.

40. Mensagens do chamado de suporte

Permite ver toda a conversa do chamado, importante pro usuário e pro suporte.

41. FAQs ativos por categoria

Mostra perguntas frequentes pra base de conhecimento do cliente, ajuda a aliviar o suporte.

42. Campanhas de marketing e banners ativos

Pra mostrar ofertas atuais no site.

43. Produtos em destaque na home

Pro bloco "Favoritos": produtos pra destacar na home.

44. Histórico de testes A/B

Análise dos experimentos feitos pra otimizar UX e marketing.

45. Histórico de visualizações de produto por usuário

Mostra "Você viu" ou serve pra recomendações personalizadas.

46. Buscas populares dos usuários

Análise da demanda dos usuários, ajuda a otimizar busca e sugestões.

47. Analytics das fontes de tráfego

Permite ver quais canais de anúncio trazem tráfego e conversão.

48. Retenção de usuários por cohort

Métrica chave pra avaliar lealdade e recompra.

49. Notícias/artigos pra home

Pra mostrar notícias e posts no blog, aumentar engajamento dos usuários.

50. Páginas ativas do site e blocos de conteúdo relacionados

Pra checar integridade do conteúdo do site, funcionamento do CMS e exibição dos dados nas páginas.

Adicionando índices

Query é bom, mas só se rodar rápido. Então você vai precisar adicionar uns índices no seu banco. Recomendo criar 40 índices nas tabelas principais do projeto pra deixar os queries mais rápidos e facilitar a manutenção.

1. Índice em product.product(status)

Quase todos os queries de produto filtram por status (tipo, produtos ativos pra vitrine, busca etc). O índice acelera a busca por status, evitando scan na tabela toda.

2. Índice em product.variant(product_id, is_active)

Queries de variantes (SKU) e vitrine usam filtro por produto e se a variante tá ativa. Esse índice composto deixa mais rápido pegar todas as variantes ativas de um produto.

3. Índice em product.image(product_id, is_main DESC)

Pra pegar a imagem principal do produto (ou todas), filtra por produto e ordena pelo campo “principal”. O índice acelera isso e garante resposta rápida pra galerias.

4. Índice em product.product(name text_pattern_ops)

Pra busca rápida por palavra-chave no nome usando ILIKE '%...%'. O índice especializado em name text_pattern_ops melhora busca por substring, principalmente em tabelas grandes.

5. Índice em product.product(description gin_trgm_ops)

Igual ao de cima — busca por descrição do produto (ILIKE ou full-text). Índice GIN com trigram acelera filtro em campos de texto.

6. Índice em product.product(category_id)

Frequentemente busca por categoria ou subcategorias (ver queries de filtro por categoria). O índice permite achar rápido todos os produtos da categoria.

7. Índice em product.category(parent_id)

Pra montar hierarquia de categorias e árvore de navegação, busca por parent_id. O índice acelera esses queries recursivos.

8. Índice em product.review(product_id)

Todos os acessos a reviews filtram por product_id (pra média e lista de reviews). O índice nesse campo deixa agregação e busca de reviews bem mais rápida.

9. Índice em product.review(product_id, created_at DESC)

Pra pegar os reviews mais recentes do produto (ORDER BY createdat DESC), especialmente junto com filtro por productid, o índice composto ajuda muito.

10. Índice em product.question(product_id, created_at DESC)

Query comum pra respostas de um produto, ordenando por data de criação. O índice cobre os dois e acelera o Q&A no card do produto.

11. Índice em product.answer(question_id, created_at)

Pra buscar respostas das perguntas do produto, acesso rápido por question_id, geralmente ordenando por data. Esse índice minimiza delay no Q&A.

12. Índice em product.price_history(variant_id, changed_at DESC)

Histórico de preço é puxado por variante e por mudanças recentes. Esse índice acelera queries analíticos de preço antigo/novo.

13. Índice em product.status_history(product_id, changed_at DESC)

Buscar histórico de status do produto ordenado por data é comum pra auditoria e ciclo de vida. Índice composto acelera muito esses queries.

14. Índice em product.certificate(product_id)

Buscar certificados do produto pelo id — operação típica pra B2B e vitrines certificadas. O índice acelera essas checagens.

15. Índice em product.license(product_id)

Pra buscar licenças dos produtos, especialmente queries filtrando por tipo de licença.

16. Índice em product.product_tag(tag_id)

Query comum — pegar todos os produtos de uma tag (e vice-versa). O índice cruza produtos e tags rápido pra nuvem de tags ou filtros.

17. Índice em product.product_tag(product_id)

Permite saber rápido quais tags estão ligadas a um produto, acelerando seleção por tag.

18. Índice em logistics.inventory(product_id, warehouse_id)

Pra acesso instantâneo ao estoque do produto no armazém (ou pra calcular em todos) — crítico pra logística, checar stock level e vitrine em tempo real.

19. Índice em logistics.inventory(variant_id)

Pra controle de estoque por variante (cor/tamanho) e relatórios cruzados.

20. Índice em logistics.stock_level(product_id, warehouse_id)

Checagem rápida do estoque mínimo do produto no armazém (tipo pra auto-pedido ou alerta de baixo estoque). Esse índice é pra comparar com inventory.

21. Índice em logistics.inventory_movement(product_id, changed_at DESC)

Permite pegar rápido o histórico de movimentação do produto (auditoria) nos últimos períodos — útil pra evitar erro, analisar perdas e controlar entregas.

22. Índice em logistics.transfer(product_id, requested_at DESC)

Pra analisar logística de transferências entre armazéns, filtrando por produto e ordenando por data do pedido.

23. Índice em logistics.shipping_rate(shipping_method_id, destination_zone)

Ao calcular frete, geralmente escolhe tarifa por id do método e zona de destino. O índice acelera o cálculo pro cliente na hora do pedido.

24. Índice em "order".order(user_id, placed_at DESC)

Todos os acessos ao histórico de pedidos do usuário filtram por user_id e ordenam por data. Índice composto garante resposta rápida pro painel do usuário.

25. Índice em "order".order(status, placed_at)

Pra análise e relatórios de pedidos por período, e busca por status (tipo "em processamento"/"finalizado").

26. Índice em "order".order_item(order_id)

Puxar todos os itens do pedido pelo id — uma das operações mais comuns pra detalhar pedidos.

27. Índice em "order".order_item(product_id)

Analytics de vendas e estatísticas por produto precisam de busca rápida dos itens do pedido pelo id do produto.

28. Índice em "order".return(order_id)

Ligação de devoluções com pedidos é usada pra suporte e análise de devoluções. O índice acelera busca de devoluções pelo número do pedido.

29. Índice em "order".cancellation(order_id)

Igual devoluções — acelera achar cancelamentos pra análise e suporte.

30. Índice em "order".cart(user_id, updated_at DESC)

Pra buscar os últimos carrinhos do usuário (tipo "carrinhos abandonados"), é bom ter índice por user_id e data da última atualização.

31. Índice em payment.payment_transaction(order_id)

A maioria dos queries de histórico de pagamento filtram por pedido. O índice garante acesso instantâneo às transações do pedido.

32. Índice em payment.refund(transaction_id)

Permite achar devoluções por transação pra suporte, relatório e controle de fraude.

33. Índice em payment.wallet(user_id)

Acesso rápido à carteira do usuário pra checar saldo e histórico de operações.

34. Índice em payment.wallet_transaction(wallet_id, created_at DESC)

Busca por transações da carteira do usuário ordenando por data (tipo mostrar histórico de operações).

35. Índice em support.support_ticket(user_id, created_at DESC)

Histórico de chamados do usuário no suporte (painel/serviço ao cliente). Índice composto otimiza essas buscas.

36. Índice em support.ticket_message(ticket_id, sent_at)

Pra mostrar toda a conversa do chamado, é bom ter índice por ticket e data — acelera ordenação das mensagens.

37. Índice em support.ticket_sla_tracking(ticket_id)

Pra SLA-analytics e controle por chamado, acesso rápido aos dados de SLA com índice por ticket_id.

38. Índice em marketing.promo_usage(user_id, used_at DESC)

Pra analisar uso de cupons pelos usuários (analytics e proteção contra abuso), precisa busca rápida por user_id e ordenação por data.

39. Índice em analytics.product_view(user_id, viewed_at DESC)

Guardar e analisar histórico de visualização de produtos pelo usuário (personalização, recomendações) precisa de acesso rápido por user_id e ordenação por data de visualização.

40. Índice em analytics.search_query_log(query_text)

Queries populares e frequência de uso — ferramenta chave de analytics de busca. O índice acelera agregações e contagem por texto da busca.

Observação

Pra buscas textuais com ILIKE, recomendo usar índices GIN com extensão pg_trgm, que são eficientes pra substring e fuzzy search. Pra tabelas grandes com agregação ou ordenação por data, recomendo índice DESC na data — acelera pegar os últimos registros.

Vale a pena ajustar os índices conforme os planos de execução reais e estatísticas de uso, mas os índices acima cobrem os principais cenários de queries do nosso marketplace.

Adicionando funções

Já cansou? Então bora escrever mais umas funções pra facilitar nossos queries atuais e futuros. Assim você acelera a implementação dos queries chave, evita código duplicado no app e centraliza a lógica de negócio no banco.

1. Buscar produtos por palavra-chave considerando tags e marcas

Pra que serve:

Busca só por nome e descrição é limitado. Muitas vezes precisa buscar também por tags e marcas. Uma função universal centraliza a lógica da busca avançada, reduz código duplicado e facilita integração com o front.

2. Pegar o card completo do produto por ID (todos os dados do card)

Pra que serve:

No front geralmente precisa de todas as infos do produto de uma vez: campos principais, marca, categoria, imagens, tags, atributos, média de avaliação e número de reviews. A função monta o card completo num só call, reduzindo queries no banco.

3. Pegar hierarquia de categorias com profundidade

Pra que serve:

Montar árvore (ou caminho) de categorias é necessário pra vitrine, filtros e breadcrumbs. Em vez de queries recursivos no client, a função retorna toda a hierarquia de uma vez.

4. Calcular preço médio e valor mínimo/máximo por categoria

Pra que serve:

Pra filtros no catálogo e analytics é bom pegar stats agregadas dos produtos da categoria: faixa de preço, média. A função evita subqueries repetidos.

5. Checar e calcular automaticamente o estoque do produto em todos os armazéns

Pra que serve:

Permite saber na hora o estoque total do produto (e de cada variante), útil pra vitrine, estoque e logística. Centraliza o cálculo, evitando lógica duplicada.

6. Pegar histórico de pedidos do usuário com detalhes

Pra que serve:

A função retorna a lista de pedidos do usuário, incluindo itens, valores, status, permitindo ao front pegar o histórico num call só e já montar o painel do usuário.

7. Pegar média de avaliação do usuário como vendedor/comprador

Pra que serve:

Pra mostrar confiança e reputação do usuário na plataforma, é importante saber a média de nota como vendedor ou comprador. A função faz o cálculo agregado.

8. Uso de cupom pelo usuário (validador com todas as regras)

Pra que serve:

Toda a lógica de checagem e uso do cupom (ativo, limites, data etc.) centralizada numa função. Isso simplifica o app e evita erro ao duplicar regras.

9. Função universal de log de eventos do usuário

Pra que serve:

Pra analytics e auditoria, log centralizado de eventos reduz código duplicado e risco de perder dados das ações dos usuários.

10. Função pra pegar saldo da carteira de bônus e total de créditos de todos os tempos

Pra que serve:

Um call só já pega saldo atual do usuário e total de créditos da carteira. Isso é prático pra mostrar no dashboard e reduz queries SQL.

11. Função universal pra trocar status do pedido com log

Pra que serve:

Muda o status do pedido, adiciona registro no log de status e minimiza erro ao mudar status em partes diferentes do app.

12. Pegar todas as mensagens do chamado de suporte (ticket + todas as mensagens)

Pra que serve:

A função retorna toda a conversa do chamado, incluindo detalhes do ticket e cada mensagem. Isso facilita montar o histórico do chamado no front.

13. Checar existência de usuário por email ou telefone

Pra que serve:

Usado pra cadastro e recuperação de senha, evita lógica duplicada no front e back.

Observação

Esse kit de funções cobre os cenários chave do negócio, deixa o trampo com dados mais prático, otimiza a lógica e acelera o desenvolvimento do front e integrações. Espero que tenha curtido :)

Ficheiros com a solução

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION