【问题标题】:SQL-92 Selecting with the dot operatorSQL-92 使用点运算符进行选择
【发布时间】:2019-08-19 12:16:55
【问题描述】:

在它被标记为重复之前,我不是在问如果我必须完全指定它,我就是为什么指定它并不重要。希望能解决这个问题。现在回答问题。

我是 SQL 新手,所以我不确定是否有一些技术术语。

假设我有一个包含表的数据库:订单和客户。

订单有类别:OrderID、CustomerID 和 OrderDate

客户有类别:CustomerID、CustomerName、ContactName 和 Country

然后我有一个 SQL 查询:

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

所以我选择Orders.OrderIDCustomers.CustomerNameOrders.OrderDate FROM Orders 表。如果是来自Orders表,为什么在select 中的OrderIDOrderDate之前指定Orders. 这是一个网站的例子,不做解释。我不确定它是否与加入有关(在示例中)所以这就是为什么我也把它放在那里和标签中。

-谢谢

【问题讨论】:

  • 您指定表(直接或通过它的别名,我几乎一直鼓励使用别名),因此 sql server 知道在哪里可以找到该列。如果列名是唯一的(例如,如果OrderIDCustomers 中不存在),则没有必要。即使没有必要总是建议使用它,因此您(以及必须维护您的代码的人)也可以轻松判断哪一列来自哪个表。尤其是当您开始加入多个表时。
  • @HoneyBadger 所以如果其他数据表有相同的列名是必需的吗? CustomerName 和 OrderDate 是唯一的。另外,如果是“FROM Orders”,那为什么还要查询其他表呢?如果您可以使用点运算符,为什么还要使用 From ......
  • 这就是 sql 的工作原理。我认为问它为什么这样工作没有多大用处。
  • object.property完全一样,如果不指定从哪个表读取列,SQL引擎要推断,如果两个表都有同名的列,它无法分辨你的意思是哪一个。更糟糕的是,当同事来阅读您的代码时,他们必须猜测。如果你真的希望你的代码难以阅读,你应该参加一个混淆编码竞赛。
  • 是的,在这种情况下,两个表可以互换。但如果您需要外部连接(左或右),则不需要。

标签: sql join tags ansi-sql


【解决方案1】:

有时在两个表中都可以找到列名,您的 DBMS 会抛出该列不明确的错误。明确声明您希望项目来自哪个表通常是个好主意。

使用别名通常会使代码更易于阅读和编写:

SELECT ord.OrderID, cus.CustomerName, ord.OrderDate
FROM Orders ord
INNER JOIN Customers cus ON ord.CustomerID=cus.CustomerID;

这些表名很短,但是当表名变得更长和更复杂时,您可以看到别名的用处。

显式声明表的一个好处是,您可以一眼看出数据来自哪个表。一旦您有来自多个来源的数据,无论是否通过连接,如果您没有在 select 语句中显示该表,就很难准确判断一个字段来自哪个表。

【讨论】:

  • 所以点之前的单词只是一个别名?我以为你用 AS 作为别名。
  • 是的,您可以看到“ord”也跟在 FROM 部分的 Orders 后面。这就是您告诉 DBMS ord 是 Orders 的别名的地方。 INNER JOIN 客户之后的“cus”也是如此。在这种情况下使用 AS 是可选的。
  • @JustAFellowCoder - AS ord 定义别名。 ord.CustomerID 正在从别名 ord 引用的表中读取列 CustomerID
  • @JustAFellowCoder - 阅读我对您帖子的评论,并阅读一些教程。很抱歉,但您现在正沿着please teach me SQL's syntax 的路线前进,而不是提出具体问题。
  • @MatBailie Fair。我会去做的。原来的问题已经回答了,所以谢谢大家:)。编码愉快。
猜你喜欢
  • 2014-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2011-07-08
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多