Mysql 解释要选择的表格;从「;在JOIN语句中

Mysql 解释要选择的表格;从「;在JOIN语句中,mysql,sql,join,Mysql,Sql,Join,我是SQL新手,如果我使用点符号选择所需的表.列,我很难理解为什么在JOIN语句中有FROM关键字。我从这两张桌子中选择哪一张重要吗?在w3schools定义中,我没有看到任何关于这一点的解释,在哪个表上是来自表的。在下面的示例中,我如何知道从中为选择哪个表?因为我基本上已经选择了要选择的table.column,它可以是吗 例如: SELECT Customers.CustomerName, Orders.OrderID FROM Customers INNER JOIN Orders ON

我是SQL新手,如果我使用点符号选择所需的
表.列
,我很难理解为什么在
JOIN
语句中有
FROM
关键字。我从这两张桌子中选择哪一张重要吗?在w3schools定义中,我没有看到任何关于这一点的解释,在哪个表上是来自表的
。在下面的示例中,我如何知道从
中为
选择哪个表?因为我基本上已经选择了要选择的
table.column
,它可以是吗

例如:

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers
INNER JOIN Orders
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

对于
内部联接
而言,哪个表位于
from
子句中,哪个表位于
join
子句中并不重要。
对于
外部联接
s,这当然很重要,因为
外部联接
中的表允许有“丢失”记录。

内部联接中,顺序并不重要

但是,它在
左连接
右连接
中确实很重要。在
左联接
中,
FROM
子句中的表是主表;结果将包含从此表中选择的每一行,而
LEFT JOIN
表中命名的行可能会丢失(这些列在结果中将
NULL
)<代码>右联接
类似,但相反:在
中命名的表中可能缺少行


例如,如果您将查询更改为使用
LEFT JOIN
,您将看到没有订单的客户。但是,如果您交换了表的顺序并使用
左联接
,您将看不到这些客户。您将看到没有客户的订单(尽管这样的行可能不应该存在)。

from语句引用的是联接,而不是表。表的联接将创建一个集合,您将从中选择列。

内部联接并不重要:优化器将确定正确的表读取顺序,而不管您选择的顺序如何

对于定向外部联接,这很重要,因为它们不是对称的。选择要保留左外部联接中第一个
FROM
表的所有行的表;对于右侧外部连接,则相反

对于完全外部联接,这也无关紧要,因为完全外部联接中的表彼此对称使用


在排序无关紧要的情况下,您选择的顺序对于SQL语句的读者来说是“自然的”,无论这对您的模型意味着什么。SQL查询很快就会变得很难阅读,因此表的正确顺序对于查询的读者来说很重要。

在您当前的示例中,from操作符可以应用于两个表

SELECT Customers.CustomerName, Orders.OrderID
FROM Customers,Orders
WHERE Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;
->将像您的代码一样工作

逗号将连接两个表

From仅表示从哪个表检索数据

在您的示例中,您使用不同的语法连接了两个表。 也可能是:

SELECT Customers.CustomerName, Orders.OrderID
FROM Orders
INNER JOIN Customers
ON Customers.CustomerID=Orders.CustomerID
ORDER BY Customers.CustomerName;

所有编写的代码都将生成相同的结果

它们都是来自表…,您可以说来自订单和联接客户,如果查询是内部联接,则查询将返回相同的结果。在左联接中,“from”表是左表。当我开始使用sql时,这让我很困惑,所以请注意,左连接与左外部连接是一样的,唯一的区别是syntaxYes。两者都可以。在您的示例中,两个表名可以交换,并且返回的行是相同的。(表名的位置与“外部”联接操作有关,即“a左联接b”等同于“b右联接a”,但它不同于“a右联接b”。就
from
表的定义而言,您实际选择的是“from”是联接操作的结果,而不是一个表或另一个表。SQL指定的是两个表上的“联接”操作“
Customers join Orders on…
”。查询是从联接操作的结果中选择“from”。(相等比较中表达式的顺序也不重要。
a.col=b.col
相当于指定
b.col=a.col
;相等比较运算符的属性。)最佳做法是限定查询中的所有列引用(如示例所示)。选择为“from”FROM之后的所有结果。FROM不仅仅是它后面的第一个表。很好的例子,但我强烈建议不要像第一个例子中那样编写查询。你能解释一下原因吗?它的语法很粗糙,很难调试/增强,更不用说读了。如果你加入4个表,它会很快变得混乱。看一看在这篇文章中,我刚刚发现join操作的老式逗号语法是有效的,并且仍然受到支持。这是一件好事,对于所有仍然运行的遗留SQL来说。但是我无法理解OP想要使用逗号运算符而不是使用
join
关键字的改进语法的好理由。+1.查询是什么选择“from”是联接操作指定的结果集,而不是一个表或另一个表。