CodeGym /课程 /SQL SELF /数据库Top50查询

数据库Top50查询

SQL SELF
第 61 级 , 课程 2
可用

当你把所有表都关联好之后,是时候写点查询语句了。不过只写几个查询那是新手干的事。你已经是专业选手了,所以你得写50(!)个查询!而且这些都是最有用的。

数据库查询

1. 获取展示用商品列表

这个查询会返回所有激活的商品,带上主价格和图片,用于首页和目录展示。这样可以快速生成商品橱窗,保证商品信息的实时性。

2. 按关键词搜索商品

让用户可以通过名字或描述里的关键词找到他们感兴趣的商品。这是目录快速搜索的核心功能。

3. 根据ID获取商品详情页

返回某个商品的详细信息,包括品牌和分类。用于商品详情页展示。

4. 商品所有SKU列表

展示商品所有可选SKU:尺码、颜色、库存、价格。用于商品页选择不同规格。

5. 商品图片库

完整展示商品卡片时,所有图片都很重要。这个查询会返回所有图片,并标明主图。

6. 商品平均评分和评论数

用于展示商品评分和评论数量,对买家信任和口碑很重要。

7. 商品详细评论列表

商品详情页的评论区:评分、内容、作者和评论时间。帮助新买家做决策。

8. 商品问答

获取每个商品的问答,用于FAQ板块。

9. 带层级的商品分类

可视化目录结构,构建过滤和菜单的导航树。

10. 按分类及子分类获取商品

展示选中分类及其“子分类”下的所有商品(支持多级嵌套)。

11. 品牌列表

用于品牌过滤、品牌列表页和品牌落地页。

12. 热门标签及商品数量

分析最常用标签,用于展示热门商品和构建标签云。

13. 商品价格变动历史

用于分析和展示价格动态(原价/现价、促销等)。

14. 商品状态变更历史

追踪商品生命周期,分析下架或返场原因。

15. 按证书和许可证搜索

对专业买家和B2B用户很关键(产品质量和合法性)。

16. 商品供应商信息

用于后台管理、质量控制和供应商沟通。

17. 按仓库查询商品库存

实时监控各仓库库存。对物流系统和防止“缺货”很重要。

18. 库存低于阈值的商品

自动补货,防止因缺货损失销售。

19. 商品仓库流转(审计)

追踪商品在选定时间段内的所有流转:入库、出库、调整。用于盘点和防损。

20. 仓库间物流调拨

查看商品在物流中心间的调拨历史和状态。

21. 配送方式和运费

用于结算运费和下单时给用户展示。

22. 用户订单历史

个人中心最重要的部分——所有订单、状态和金额。

23. 订单详情及商品项

获取订单完整结构——商品、价格、数量。用于前端展示或客服支持。

24. 按时间和状态统计订单

销售分析和报表,按时间段和状态(比如“已完成”)返回订单。

25. “遗弃”购物车

给市场部用的分析:用户没下单的购物车——可用于再营销。

26. 热销榜

“畅销商品”区块和营销推荐:哪些商品最常被买。

27. 按天统计销售额(用于图表)

每日营收报表——业务动态分析和图表基础。

28. 退货列表

展示所有订单的退货及原因和状态,分析退货原因。

29. 订单取消列表

监控损失和取消原因:显示取消原因、操作人和时间。

30. 待发货订单

仓库和配送用——需要打包发货的订单及配送详情。

31. 平均客单价

“Average Order Value”——评估营销和品类效率的关键指标。

32. 使用过优惠码的订单

分析促销效果:哪些优惠码被用过、用得多不多。

33. 按分类和品牌统计折扣使用

评估哪些活动有效,监控各品类和品牌的折扣受欢迎程度。

34. 已用优惠码及其用户

监控优惠码使用,发现异常和滥用。

35. 订单支付历史

客服和财务用:显示所有支付交易、状态和支付方式。

36. 退款订单

分析退款、生成财务报表和防止欺诈。

37. 用户钱包余额和交易历史

监控和展示用户的奖励或返现余额及其流转历史。

38. 用户客服工单

让用户看到自己的工单和处理状态。

39. 客服工单SLA分析

分析各优先级的平均响应和解决时间,便于SLA管理。

40. 工单消息列表

查看选中工单的全部对话,对用户和客服都很重要。

41. 按分类展示活跃FAQ

给客户知识库展示常见问题,减轻客服压力。

42. 活跃营销活动和Banner

用于网站展示最新的广告和促销。

43. 首页精选商品

“精选”区块:需要在首页重点展示的商品。

44. A/B测试历史

分析实验结果,优化用户体验和营销。

45. 用户浏览商品历史

展示“你看过”或用于个性化推荐。

46. 用户热门搜索词

分析用户需求,优化搜索和推荐。

47. 流量来源分析

评估哪些广告渠道带来流量和转化。

48. 按用户分组的留存分析

评估用户忠诚度和复购的关键指标。

49. 首页新闻/文章

博客新闻和文章,提高用户参与度。

50. 活跃页面及相关内容区块

检查网站内容完整性、CMS运行和页面数据展示。

加索引

查询写得再好,慢也没用。所以你得给主要表加40个索引,提升查询性能和运维体验。

1. product.product(status)索引

几乎所有商品查询都按status过滤(比如橱窗、搜索等)。索引能加速按状态查商品,减少全表扫描。

2. product.variant(product_id, is_active)索引

SKU和橱窗查询都按商品和激活状态过滤。这个复合索引能高效查出某商品的所有激活SKU。

3. product.image(product_id, is_main DESC)索引

获取主图或全部图片时,按商品和“主图”排序。索引能加速图片查询,提升画廊加载速度。

4. product.product(name text_pattern_ops)索引

按名字关键词搜索(ILIKE '%...%')时用。name text_pattern_ops专用索引能提升大表模糊搜索效率。

5. product.product(description gin_trgm_ops)索引

同上——按描述模糊或全文搜索。GIN三元组索引能加速文本字段过滤。

6. product.product(category_id)索引

经常按分类或子分类查商品。索引能快速找到指定分类下的所有商品。

7. product.category(parent_id)索引

构建分类树和导航时常按parent_id查。索引能加速递归层级查询。

8. product.review(product_id)索引

所有商品评论都按product_id过滤(平均分、评论列表等)。索引能大幅加速评论聚合和查询。

9. product.review(product_id, created_at DESC)索引

获取商品最新评论(ORDER BY createdat DESC),配合productid过滤时,复合索引很有用。

10. product.question(product_id, created_at DESC)索引

按商品查问答,按创建时间排序。索引覆盖两个条件,加速商品Q&A展示。

11. product.answer(question_id, created_at)索引

查商品问答时,按question_id和时间排序。索引能减少Q&A生成延迟。

12. product.price_history(variant_id, changed_at DESC)索引

按SKU和最近变动查价格历史。索引能加速价格动态分析和“原价/现价”查询。

13. product.status_history(product_id, changed_at DESC)索引

按商品查状态变更历史并按时间排序,常用于审计和生命周期管理。复合索引能大幅加速。

14. product.certificate(product_id)索引

按商品id查证书——B2B和认证橱窗常用。索引能加速验证。

15. product.license(product_id)索引

按商品查许可证,尤其是按许可证类型过滤时。

16. product.product_tag(tag_id)索引

常用查询——按标签查商品(或反查)。索引能高效交叉商品和标签,用于标签云或过滤。

17. product.product_tag(product_id)索引

快速查某商品绑定了哪些标签,加速标签筛选。

18. logistics.inventory(product_id, warehouse_id)索引

实时查商品在某仓库的库存(或所有仓库),对物流、库存检查和实时橱窗很关键。

19. logistics.inventory(variant_id)索引

按SKU查库存,用于SKU维度的报表。

20. logistics.stock_level(product_id, warehouse_id)索引

快速检查商品在仓库的最低库存(比如自动补货或低库存预警)。

21. logistics.inventory_movement(product_id, changed_at DESC)索引

快速查商品最近的库存流转历史——防错、损耗分析和供应链管理。

22. logistics.transfer(product_id, requested_at DESC)索引

分析仓库间调拨,按商品和申请时间过滤。

23. logistics.shipping_rate(shipping_method_id, destination_zone)索引

结算运费时,常按配送方式和目的地查。索引能加速下单时的运费计算。

24. "order".order(user_id, placed_at DESC)索引

用户订单历史都按user_id和下单时间查。复合索引能加速个人中心订单展示。

25. "order".order(status, placed_at)索引

订单报表和分析,按时间和状态(比如“处理中”/“已完成”)查。

26. "order".order_item(order_id)索引

按订单id查所有商品项——订单详情最常用的操作。

27. "order".order_item(product_id)索引

销售分析和商品统计,按商品id查订单项。

28. "order".return(order_id)索引

退货和订单关联,用于客服和退货分析。索引能加速按订单查退货。

29. "order".cancellation(order_id)索引

同退货——加速订单取消分析和客服处理。

30. "order".cart(user_id, updated_at DESC)索引

查用户最近的购物车(比如“遗弃”购物车),按user_id和更新时间排序。

31. payment.payment_transaction(order_id)索引

支付历史查询大多按订单过滤。索引能瞬间查到订单的所有交易。

32. payment.refund(transaction_id)索引

按交易查退款,用于客服、报表和防欺诈。

33. payment.wallet(user_id)索引

快速查用户钱包余额和操作历史。

34. payment.wallet_transaction(wallet_id, created_at DESC)索引

按钱包查交易并按时间排序(比如展示操作历史)。

35. support.support_ticket(user_id, created_at DESC)索引

查用户的客服工单历史(个人中心/客服)。复合索引能优化查询。

36. support.ticket_message(ticket_id, sent_at)索引

查工单所有消息,按工单和时间排序,加速消息展示。

37. support.ticket_sla_tracking(ticket_id)索引

SLA分析和工单管理,按ticket_id查SLA数据。

38. marketing.promo_usage(user_id, used_at DESC)索引

分析用户优惠码使用(分析和防滥用),按user_id和时间查。

39. analytics.product_view(user_id, viewed_at DESC)索引

存储和分析用户商品浏览历史(个性化、推荐),按user_id和浏览时间查。

40. analytics.search_query_log(query_text)索引

热门搜索词和使用频率——搜索分析的核心。索引能加速按搜索词聚合和统计。

说明

模糊搜索(ILIKE)推荐用pg_trgm扩展的GIN索引,适合子串和模糊查找。大表按日期聚合或排序建议用日期DESC索引——能加速查最新记录。

实际索引应结合执行计划和负载统计调整,但上面这些索引已覆盖我们电商平台的主要生产场景。

加函数

还没累吧?那我们再写几个函数,让现有和未来的查询更好写。这样能加速关键查询实现,减少代码重复,把业务逻辑集中到数据库里。

1. 支持标签和品牌的商品关键词搜索

为什么要用:

只按名字和描述搜不够,经常还要按标签和品牌搜。通用函数能集中扩展搜索逻辑,减少代码重复,前端集成也更简单。

2. 根据ID获取完整商品卡片(所有详情)

为什么要用:

前端经常一次性要拿到商品所有信息:主字段、品牌、分类、图片、标签、属性、平均分和评论数。函数一次性组装完整卡片,减少数据库请求。

3. 获取带嵌套的分类树

为什么要用:

橱窗、过滤和面包屑都要分类树。函数能一次性返回完整层级,省去前端递归查询。

4. 按分类统计平均价、最小/最大价

为什么要用:

目录过滤和分析时,方便拿到分类下商品的价格区间和均值。函数能省去重复子查询。

5. 自动统计所有仓库商品库存

为什么要用:

能瞬间查出商品总库存(和每个SKU),对橱窗、仓库和物流都很有用。集中计算,避免业务逻辑重复。

6. 获取用户订单历史及详情

为什么要用:

函数返回用户订单列表,包括商品项、金额、状态,让前端一次性拿到所有数据,直接渲染个人中心。

7. 获取用户作为卖家/买家的平均评分

为什么要用:

展示用户在平台的信任度和口碑,函数能聚合计算平均分。

8. 用户使用优惠码(带所有校验)

为什么要用:

所有优惠码校验和扣减逻辑(激活、限额、日期等)都集中在一个函数里。这样应用逻辑更简单,也防止条件重复出错。

9. 通用用户事件日志函数

为什么要用:

做全链路分析和审计时,集中日志能减少代码重复,也降低用户行为数据丢失风险。

10. 获取奖励钱包余额和累计奖励

为什么要用:

一次性拿到当前余额和累计奖励,方便仪表盘展示,也减少SQL请求数。

11. 通用订单状态变更并日志函数

为什么要用:

变更订单状态时自动写入状态历史日志,减少多处代码出错风险。

12. 获取客服工单所有消息(工单+消息)

为什么要用:

函数返回工单全部对话,包括工单详情和每条消息,方便前端渲染工单历史。

13. 按email或手机号查用户是否存在

为什么要用:

注册和找回密码时用,避免前后端逻辑重复。

说明

这套函数覆盖了主要业务场景,提升数据操作体验,优化逻辑,加快前端和集成开发。希望你喜欢 :)

包含解决方案的文件

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION