题解 | 返回顾客名称和相关订单号 内连接的两种写法

返回顾客名称和相关订单号

https://www.nowcoder.com/practice/7e7bc361db6a4cb6aa35eefccfe75364

select cust_name,order_num
from Customers a
join Orders b on a.cust_id = b.cust_id
order by cust_name,order_num;

select cust_name,order_num
from Customers a,Orders b
where a.cust_id = b.cust_id
order by cust_name,order_num;

是的,这两种代码在逻辑上是完全等价的,都能通过这道题!

它们实现的是同一种连接方式:内连接 (INNER JOIN)。只是写法不同,一种是现代标准的 JOIN 语法,另一种是古老的隐式连接语法。

写法 1:现代标准写法 (推荐 ⭐⭐⭐⭐⭐)

特点:使用 JOIN ... ON ... 明确指定连接条件和连接类型。

优点:语义清晰:一眼就能看出是“连接”操作,且条件是 cust_id 相等。易于扩展:如果要改成 LEFT JOIN(保留无订单客户),只需改一个词。不易出错:连接条件和过滤条件 (WHERE) 分离,逻辑更清晰。

地位:这是 ANSI SQL 标准 推荐的写法,也是现代开发中的绝对主流

写法 2:古老隐式写法 (不推荐 ❌)

特点:在 FROM 子句中用逗号分隔表名,在 WHERE 子句中写连接条件。

缺点:易混淆:连接条件和业务过滤条件都混在 WHERE 里,难以区分。容易遗漏:如果不小心忘了写 WHERE a.cust_id = b.cust_id,就会变成笛卡尔积(所有客户匹配所有订单,数据量爆炸)。难维护:如果要改连接类型(如左连接),这种写法根本做不到,必须重写。

地位:这是 SQL-89 标准的遗留写法,虽然数据库为了兼容性依然支持,但已被现代开发淘汰

🏆 最终建议

虽然两种写法都能 AC,但我强烈建议你使用第一种写法 (JOIN ... ON)

  1. 符合规范:这是行业标准,面试时写这个会加分。
  2. 逻辑安全:避免忘记连接条件导致笛卡尔积。
  3. 可读性强:代码即文档,别人一看就懂。

完美提交版:

SELECT 
    a.cust_name, 
    b.order_num
FROM sql96_Customers a
INNER JOIN sql96_Orders b ON a.cust_id = b.cust_id
ORDER BY a.cust_name, b.order_num;

(注:加上 INNER 关键字更显式,虽然默认就是 INNER;给 ORDER BY 的列加上表别名 a.b. 是好习惯,防止字段名冲突)

牛客网题目 文章被收录于专栏

做题心得,记录下来,供自己学习

全部评论

相关推荐

不愿透露姓名的神秘牛友
03-19 10:38
实力求职者:真的绷不住了,第一张霸总人设,第二张求生欲拉满
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务