Sql 自然连接是外键名的唯一省略吗?
假设您有一个以Sql 自然连接是外键名的唯一省略吗?,sql,sqlite,Sql,Sqlite,假设您有一个以DepartmentID为主键的部门表,以及一个以DepartmentID为外键的员工表。然后,您可以使用这些列具有相同名称的事实来执行自然联接,该联接允许您从查询中省略列名。(我不是在评论你是否应该——这是一个观点问题——只是注意到这个速记是SQL语法的一部分。) SQL语法中还有许多其他情况,在这些情况下,您可以使用表达式引用列名,如employee.DepartmentID=department.DepartmentID。是否有其他情况下,某些速记允许您使用列具有相同名称的事
DepartmentID
为主键的部门表,以及一个以DepartmentID
为外键的员工表。然后,您可以使用这些列具有相同名称的事实来执行自然联接,该联接允许您从查询中省略列名。(我不是在评论你是否应该——这是一个观点问题——只是注意到这个速记是SQL语法的一部分。)
SQL语法中还有许多其他情况,在这些情况下,您可以使用表达式引用列名,如
employee.DepartmentID=department.DepartmentID
。是否有其他情况下,某些速记允许您使用列具有相同名称的事实来省略列名?SQL不直接知道外键;它只有外键约束,防止创建无效数据。当您有一个外键时,您可能同时需要一个约束和对其进行连接,但数据库不会自动从另一个派生一个约束
无论如何,在两个同名列上使用联接时:
SELECT ...
FROM employee
JOIN department ON employee.DepartmentID = department.DepartmentID
然后,您可以将ON子句替换为:
如果存在USING子句,则指定的每个列名都必须存在于join运算符左侧和右侧的数据集中。对于每对命名列,表达式“lhs.X=rhs.X”作为布尔表达式为笛卡尔乘积的每一行求值。结果集中只包括所有此类表达式计算结果均为true的行。[…]
对于由USING子句标识的每对列,右侧数据集中的列将从联接的数据集中忽略。这是USING子句与其等价的ON约束之间的唯一区别
(只有在您使用
SELECT*
时,省略重复列才有意义(我不是在评论您是否应该这样做——这是一个意见问题——只是注意到这个速记是SQL语法的一部分。)自然连接不知道外键,只有列名。使用的内部联接可以在Oracle中实现。
SELECT ...
FROM employee
JOIN department USING (DepartmentID)