题解 | 返回顾客名称和相关订单号 内连接的两种写法
返回顾客名称和相关订单号
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):
- 符合规范:这是行业标准,面试时写这个会加分。
- 逻辑安全:避免忘记连接条件导致笛卡尔积。
- 可读性强:代码即文档,别人一看就懂。
完美提交版:
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. 是好习惯,防止字段名冲突)
牛客网题目 文章被收录于专栏
做题心得,记录下来,供自己学习
查看10道真题和解析
