想象一下,我有两个简单的表,例如:
CREATE TABLE departments(dept INT PRIMARY KEY, name);
CREATE TABLE employees(id PRIMARY KEY, fname, gname,
dept INT REFERENCES departments(dept));
(当然是简化的)。
我可以有以下任何陈述:
SELECT * FROM employees e INNER JOIN departments d ON e.dept=d.dept;
SELECT * FROM employees e NATURAL JOIN departments d;
SELECT * FROM employees e JOIN departments d USING(dept);
可以在此处找到一个工作示例:SQL Fiddle: http://sqlfiddle.com/#!15/864a5/13/10
它们都给出几乎相同的结果——当然是相同的行。
我一直更喜欢第一种形式,因为它的灵 active 、可读性和可预测性——你可以清楚地定义什么与什么相关联。
现在,除了第一个表单有重复的列之外,其他两个表单有真正的优势吗?还是它们只是语法糖?
我可以看到后一种形式的缺点是您应该将主键和外键命名为相同,这并不总是实用的。
最佳答案
NATURAL JOIN
没有得到广泛支持,JOIN USING
也没有。 (即不在 SQL Server 中)
有很多理由认为 NATURAL JOIN 是个坏主意。就我个人而言,我认为不明确命名诸如连接之类的东西会招致灾难。
例如,如果您在表中添加一列而没有意识到它恰好适合“自然连接”,那么当自然连接突然执行完全不同的操作时,您可能会遇到意外的代码故障。你会认为添加一列不会破坏任何东西,但它会破坏写得不好的 View 和自然连接。
当你在构建一个系统时,你不应该让这些风险潜入。这就像在没有每列的表别名的情况下跨多个表创建 View 并使用没有列列表的插入一样。
由于这些原因,如果您现在只是学习 SQL,请改掉使用这些的习惯。
关于sql - 内部联接与自然联接与 USING 子句 : are there any advantages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35032696/