Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 自然连接是外键名的唯一省略吗?_Sql_Sqlite - Fatal编程技术网

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)