请编写一条 SQL 语句,用于检索 2023 年 1 月份内创建的全部订单,并关联展示每个订单对应的商品详细信息。
考察说明
考查候选人对 SQL 多表关联查询、日期范围过滤及聚合或明细展示的掌握程度。
回答思路
- 【回答框架 1】按订单日期过滤是基础,使用订单表中的下单时间字段,通过 BETWEEN '2023-01-01' AND '2023-01-31' 或 DATE_PART 等函数限定范围,注意避免函数包裹列导致索引失效。
- 【回答框架 2】若需展示订单及其商品明细,涉及订单表、订单明细表和商品表。订单明细表通常含订单ID、商品ID、数量、单价,通过订单ID关联订单表,通过商品ID关联商品表,使用内连接或左连接取决于是否要包含无商品的订单。
- 【回答框架 3】若需查询所有订单及其商品信息,即使某订单没有明细,也应以订单表为主表左连接明细和商品表,以保证订单全部展示。若只要有效订单,则使用内连接过滤无明细订单。
- 【回答框架 4】根据实际需求决定是否聚合,若需要订单汇总(如总金额),则对订单明细表按订单ID分组求和;若需要明细级记录,则直接关联展示,不分组。注意区分订单总额与商品单价的计算方式,避免遗漏折扣或数量。
- 【回答框架 5】最后可按需求排序,如订单日期、订单ID或商品名称,建议在关联字段上建索引以提升查询性能。
- 【关键点 1】使用 JOIN 关联订单表、订单明细表和商品表,注意关联字段。
- 【关键点 2】日期过滤使用订单时间字段,避免函数包裹字段导致索引失效。
- 【关键点 3】明确使用内连接或左连接:需要订单保留则左连接,否则内连接。
- 【关键点 4】若需要聚合,按订单ID分组并计算数量或金额,否则保持明细。
- 【关键点 5】考虑性能,对订单时间、订单ID和商品ID建立索引。
- 【易错点 1】错误使用函数如 YEAR(create_time)=2023 可能导致索引失效,应使用范围条件。
- 【易错点 2】忽略订单明细可能为空的情况,导致使用内连接漏掉订单。
- 【易错点 3】计算金额时漏掉数量或单价,或未考虑折扣与税费。