是自然加入外键名称的唯一省略吗?

时间:2017-06-01 07:51:25

标签: sql sqlite

假设您有一个以DepartmentID为主键的department表,以及一个以DepartmentID为外键的employee表。然后,您可以使用这些列具有相同名称的事实来执行允许您从查询中省略列名称的自然连接。 (我不会评论你是否应该 - 这是一个意见问题 - 只是注意到这个简写是SQL语法的一部分。)

在SQL语法中还有其他各种情况,您可以使用employee.DepartmentID = department.DepartmentID这样的表达式来引用列名。是否有其他情况下某种速记允许您使用列具有相同名称的事实,以省略列名?

1 个答案:

答案 0 :(得分:1)

SQL不直接了解外键;它只有外键约束,这会阻止您创建无效数据。如果有外键,则需要约束并对其进行连接,但数据库不会自动从另一个派生。

无论如何,当你在两个具有相同名称的列上使用连接时:

SELECT ...
FROM employee
JOIN department ON employee.DepartmentID = department.DepartmentID

然后你可以用USING clause

替换ON子句
SELECT ...
FROM employee
JOIN department USING (DepartmentID)
  

如果存在USING子句,则指定的每个列名必须存在于join-operator左侧和右侧的数据集中。对于每对命名列,表达式为" lhs.X = rhs.X"作为布尔表达式,对笛卡尔积的每一行进行求值。结果集中仅包含所有此类表达式求值为true的行   [...]
  对于由USING子句标识的每对列,从连接的数据集中省略右侧数据集中的列。这是USING子句与其等效ON约束之间的唯一区别。

(省略重复列仅在您使用SELECT *时才有意义。(我不评论您是否应该 - 这是一个意见问题 - 只是注意到这个事实简写是SQL语法的一部分。))