sql - 内部联接与自然联接与 USING 子句 : are there any advantages?

标签 sql join

想象一下,我有两个简单的表,例如:

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/

相关文章:

c# - SQLDataReader C#、SQL Server 2005、VS 2008

c# - 如何按 SQL 中拼写错误的记录进行分组

mysql - 插入mysql日期范围,每7天添加不同的值(轮类日历)

mysql - 选择值子组

database - Vertica 中的 JOIN 失败,返回 "inner partition did not fit in memory"

sql - 医生、患者以及双方的联系信息

sql - 使用 ORDER BY 时数据库性能不佳

sql - 按除一列以外的所有列进行分组以计算剩余列上的不同值

mysql - 连接 MYSQL 中的 2 个不存在的表

c# - LINQ 中多个左连接的正确语法?