Mysql SQL联接:两个以上表之间的选择是否仍然联接?

Mysql SQL联接:两个以上表之间的选择是否仍然联接?,mysql,sql,oracle,join,Mysql,Sql,Oracle,Join,当我读到SQL中的内部联接或外部联接时,所有示例和描述都是关于正在联接的两个表的。如果查询中有两个以上的表怎么办?那还算加入吗 我认为内部连接仍然有意义,即使它是在多个表之间;但我不确定两个以上的表之间的外部联接是否有意义 有人能澄清一下这个问题吗?大多数连接示例将包括两个表。但是,可以对任意数量的表进行联接 您可以在互联网站上阅读更多关于连接的信息,但您可能希望从以下内容开始: 这篇文章首先陈述的是: SQL联接用于合并两个或多个表中的行 这并不完全正确,因为您甚至可以在自己的车辆上连接表 考

当我读到SQL中的内部联接或外部联接时,所有示例和描述都是关于正在联接的两个表的。如果查询中有两个以上的表怎么办?那还算加入吗

我认为内部连接仍然有意义,即使它是在多个表之间;但我不确定两个以上的表之间的外部联接是否有意义


有人能澄清一下这个问题吗?

大多数连接示例将包括两个表。但是,可以对任意数量的表进行联接

您可以在互联网站上阅读更多关于连接的信息,但您可能希望从以下内容开始:

这篇文章首先陈述的是:

SQL联接用于合并两个或多个表中的行

这并不完全正确,因为您甚至可以在自己的车辆上连接表

考虑:

Employees
-----
EmployeeId
ManagerId
EmployeeName
如果您想了解特定经理的员工,可以写为:

select manager.EmployeeName, subordinates.*
from employees manager
inner join employees subordinates on manager.employeeId = subordinates.managerId
对于多个表联接,请考虑:

Employees
----
EmployeeId
ManagerId
EmployeeName

Departments
----
DepartmentId
DepartmentName

EmployeeDepartments
----
DepartmentId
EmployeeId
在本例中,如果您想找出员工5所属的所有部门名称,可以执行以下操作:

 select d.DepartmentName
 from employees e
 inner join employeeDepartments ed on e.employeeId = ed.employeeId
 inner join departments d on ed.departmentId = d.departmentId
 where e.employeeId = 5

TLDR;-是的,包含2个以上的表仍被视为联接

大多数联接示例将包含两个表。但是,可以对任意数量的表进行联接

您可以在互联网站上阅读更多关于连接的信息,但您可能希望从以下内容开始:

这篇文章首先陈述的是:

SQL联接用于合并两个或多个表中的行

这并不完全正确,因为您甚至可以在自己的车辆上连接表

考虑:

Employees
-----
EmployeeId
ManagerId
EmployeeName
如果您想了解特定经理的员工,可以写为:

select manager.EmployeeName, subordinates.*
from employees manager
inner join employees subordinates on manager.employeeId = subordinates.managerId
对于多个表联接,请考虑:

Employees
----
EmployeeId
ManagerId
EmployeeName

Departments
----
DepartmentId
DepartmentName

EmployeeDepartments
----
DepartmentId
EmployeeId
在本例中,如果您想找出员工5所属的所有部门名称,可以执行以下操作:

 select d.DepartmentName
 from employees e
 inner join employeeDepartments ed on e.employeeId = ed.employeeId
 inner join departments d on ed.departmentId = d.departmentId
 where e.employeeId = 5

TLDR;-是的,包含2个以上的表仍然被认为是联接

内部联接和外部联接可以与2个以上的表一起使用。 内部联接强制结果只显示包含您联接的任何行的数据,而外部联接则显示所有数据,不管是什么

假设您想将4个表连接在一起

select * from testtable
inner join testable2 on col1 = othercolumn
inner join testable3 on col2 = othercolumn
leftjoin testable4 on col3 = othercolumn
在这种情况下,它将只返回内部联接中存在的结果,但结果不必存在于外部/左侧联接中。您正在强制testtables 2和testtables 3在您加入的内容上有一个值。。它不能为空

左连接不关心值是否为null,但仍将显示结果。
我希望这有助于。。。大体上如果对某个值进行内部联接,并且该值可能为空,则整个查询将显示为空。这是您将使用outter连接的场景。。您没有强制该值存在

对于2个以上的表,使用内部联接和外部联接是完全合理的。 内部联接强制结果只显示包含您联接的任何行的数据,而外部联接则显示所有数据,不管是什么

假设您想将4个表连接在一起

select * from testtable
inner join testable2 on col1 = othercolumn
inner join testable3 on col2 = othercolumn
leftjoin testable4 on col3 = othercolumn
在这种情况下,它将只返回内部联接中存在的结果,但结果不必存在于外部/左侧联接中。您正在强制testtables 2和testtables 3在您加入的内容上有一个值。。它不能为空

左连接不关心值是否为null,但仍将显示结果。
我希望这有助于。。。大体上如果对某个值进行内部联接,并且该值可能为空,则整个查询将显示为空。这是您将使用outter连接的场景。。您没有强制该值存在

每个join子句在逻辑上位于两个虚拟表之间,但虚拟表本身可以定义为其他表上的联接

在下面的例子中

SELECT Foo
FROM   A
       INNER JOIN B
               ON A.X = B.X
       INNER JOIN C
               ON C.Y = A.Y
                  AND C.Z = B.Z 
可以认为,逻辑上A连接到B,然后虚拟表A x B连接到C。因此,在final ON子句中,所有三个表中的列都可用

您可以控制通过ON子句的放置来计算的虚拟表

下面的示例创建一个虚拟表a x B和一个虚拟表C x D,然后将这两个表连接在一起

SELECT Foo
FROM   A
       INNER JOIN B
               ON A.X = B.X
       INNER JOIN C
                  INNER JOIN D
                          ON C.Y = D.Y /*Only C and D in scope here*/
               ON A.Z = D.Z  /*All tables back in scope*/

然而,查询优化程序可以自由地以维护语义的任何方式实际实现连接。由于内部联接是可交换和关联的,因此可以自由地重新排列上面示例中的表。对于外部联接,重新排列它们可能会改变语义。

每个联接子句在逻辑上位于两个虚拟表之间,但虚拟表本身可以定义为其他表上的联接

在下面的例子中

SELECT Foo
FROM   A
       INNER JOIN B
               ON A.X = B.X
       INNER JOIN C
               ON C.Y = A.Y
                  AND C.Z = B.Z 
可以认为,逻辑上A连接到B,然后虚拟表A x B连接到C。因此,在final ON子句中,所有三个表中的列都可用

您可以控制通过ON子句的放置来计算的虚拟表

下面的示例创建了一个Virtual l表A x B和虚拟表C x D,然后将这两个表连接在一起

SELECT Foo
FROM   A
       INNER JOIN B
               ON A.X = B.X
       INNER JOIN C
                  INNER JOIN D
                          ON C.Y = D.Y /*Only C and D in scope here*/
               ON A.Z = D.Z  /*All tables back in scope*/

然而,查询优化程序可以自由地以维护语义的任何方式实际实现连接。由于内部联接是可交换和关联的,因此可以自由地重新排列上面示例中的表。对于外部连接,重新安排它们可能会改变语义。

就像在现实世界中一样,我们可以与任何伙伴进行内部连接。伙伴也可以与任何其他成员进行内部连接。说到外部加入,你可以在外部加入任何合作伙伴,但你的外部加入的合作伙伴,不能在内部加入你范围内的任何其他合作伙伴:@MaheswaranRavisankar这不是我对现实世界的体验,但话说回来,那是很久以前的事了。就像在现实世界中,我们可以在内部加入任何合作伙伴。伙伴也可以与任何其他成员进行内部连接。当谈到外部加入时,你可以与任何伙伴进行外部加入,但你的外部加入的伙伴,不能与你范围内的任何其他伙伴进行内部加入:@MaheswaranRavisankar这不是我在现实世界中的经历,但话说回来,那是很久以前的事了。