何时使用SQL表别名

36

我很好奇人们如何使用表别名。在我工作的地方,其他开发人员总是使用表别名,并且总是使用a、b、c等别名。

以下是一个例子:

SELECT a.TripNum, b.SegmentNum, b.StopNum, b.ArrivalTime
FROM Trip a, Segment b
WHERE a.TripNum = b.TripNum

我不同意他们的观点,认为表别名应该更加节制地使用。

我认为在查询中包含相同的表两次时,或者表名非常长,使用较短的名称将使查询更易于阅读时,应该使用表别名。

我还认为别名应该是一个描述性的名称,而不仅仅是一个字母。在上面的例子中,如果我觉得需要使用1个字母的表别名,我会使用t表示Trip表,s表示segment表。


3
我完全同意使用a、b、c等字母的做法...... 如果必须使用单个字母,就使用一个合适的字母(正如你在评论中建议的那样)。 - Dave DuPlantis
6
完全偏离主题,但现在是时候开始使用标准 JOIN 语法了 :) - Tao
标题是“何时使用SQL别名”,而不是选择哪种别名。我同意,当使用别名时,应该稍微有点助记符。也许是表名的第一个字母,需要消除歧义时加上数字。 - Walter Mitty
17个回答

26

使用表别名有两个原因。

第一个是为了美观。使用表别名可以使语句更容易编写,也更容易阅读。

第二个原因更加实质性。如果一张表在FROM子句中出现超过一次,你需要使用表别名来保持它们的区分。自连接在一张表包含一个引用同一张表的主键的外键时很常见。

两个例子:一个包含supervisorID列引用所属主管的employeeID的员工表。

第二个例子是部件爆炸。通常,这是在一个包含ComponentPartID、AssemblyPartID和Quantity三列的单独表中实现的。在这种情况下,不会有自连接,但这个表和对部件表的两个不同引用之间通常会有一个三路连接。

这是一个好习惯。


4
我同意从可读性的角度来看,a和b是没有价值的别名。而且给定的示例可以在不使用别名的情况下进行编写。 - Walter Mitty

21

我使用它们来节省打字时间。然而,我总是使用与函数类似的字母。因此,在你的例子中,我会打出:

SELECT t.TripNum, s.SegmentNum, s.StopNum, s.ArrivalTime 
FROM Trip t, Segment s 
WHERE t.TripNum = s.TripNum

这只是为了方便我阅读。


2
我不喜欢这个的唯一原因是,如果我有多个以相同字母开头的表怎么办?现在我将切换到使用2、3、4个字符作为别名……这会无休止吗?JMHO。 - mattruma
在这种情况下(经常发生),我使用一个字母来代表我要寻找的关系。例如,我经常多次连接应用程序的用户表以查找用户(u)、主管(s)或同事(c)。 - BoltBait
除非Trip和Segment都有字段名TripNum,SegmentNum,StopNum和ArrivalTime,否则你不需要在每个地方都使用别名。 - Steven A. Lowe
3
你现在只关心数据库的当前状态吗?如果我明天向“行程”表添加“到达时间”,那怎么办?你的代码就会出问题。 - Mark Brady
1
在C#中,例如,也不使用单个字母变量来完成操作,那么为什么要在SQL中这样做呢?如果使用别名,您总是需要执行翻译才能找到真实的表名,这使得理解查询更加困难... - Bliek
我认为仅仅因为我们在使用SQL,良好的命名惯例并不会被忽视。 - Matt H

6
作为一般规则,我总是使用它们,因为我的存储过程中通常会有多个连接。当使用CodeSmith等代码生成工具时,它还可以使自动生成别名更加容易。
我尽量避免使用单个字母,如a和b,因为我可能有多个以a或b字母开头的表。我采用更长的方法,即引用外键与别名表的串联,例如CustomerContact...这将是连接到联系人表时Customer表的别名。
我不介意使用较长的名称,因为我的大多数存储过程都是通过CodeSmith生成的。我不介意手动输入我可能需要构建的少数存储过程。
使用当前示例,我会做类似以下的事情:
SELECT TripNum, TripSegment.SegmentNum, TripSegment.StopNum, TripSegment.ArrivalTime 
FROM Trip, Segment TripSegment 
WHERE TripNum = TripSegment.TripNum

1
为什么只给一个表设置别名?这样做似乎有些草率。 - Mark Brady

3

我可以在几年前的辩论中添加一些内容吗?

还有一个原因没有被提到。在某些数据库中,SQL解析器与别名一起使用效果更佳。我不记得Oracle是否在后来的版本中更改了这一点,但是当涉及别名时,它会在数据库中查找并记住列。而当涉及表名时,即使在语句中已经遇到过它,它也会重新检查数据库中的列。因此,使用别名可以实现更快的解析,特别是对于长 SQL 语句。我相信有人知道这是否仍然适用,其他数据库是否在解析时执行此操作以及它何时更改,什么时候更改。


2

我总是使用它,原因如下:

  • 在语句中保留完整的表名使其难以阅读,而且您不能两次使用同一张表
  • 不使用任何东西是一个非常糟糕的想法,因为以后您可能会向其中一个已经存在于其他表中的表添加某些字段

考虑以下示例:

select col1, col2
from tab1
join tab2 on tab1.col3 = tab2.col3

现在,想象一下几个月后,您决定向tab2添加名为“col1”的列。数据库会默默地允许您这样做,但执行上述查询时会因tab1.col1和tab2.col1之间的歧义而导致应用程序崩溃。
但是,我同意您对命名的看法:a、b、c很好,但是在您的示例中使用t和s会更好。当我有多个相同的表时,我会使用t1、t2等或s1、s2、s3等。

1

使用全名阅读起来更加困难,尤其是对于较大的查询或订单/产品/订单产品场景。

我建议使用t和s。或者o/p/op。

如果您使用SCHEMABINDING,则必须对列进行限定。

如果您向基表添加列,则限定可以减少查询中重复的可能性(例如“评论”列)。

由于这种限定,始终使用别名是有意义的。

使用a和b是盲目遵循奇怪标准。


1
在上述帖子中,有许多关于何时以及为什么要使用别名表名的好主意。但没有人提到它还有助于帮助维护者了解表的范围。在我们公司,不允许创建视图。(感谢DBA。)因此,我们的一些查询变得很大,甚至超过Crystal Reports中SQL命令的50,000字符限制。当一个查询将其表别名为a、b、c,而该查询的子查询也是如此,并且在其中的每个子查询中都使用相同的别名时,很容易误解正在读取哪个查询级别。当时间足够长时,这甚至会使原始开发人员感到困惑。在查询的每个级别内使用唯一的别名使其更容易阅读,因为范围保持清晰。

1

在简单的查询中,我不使用别名。在涉及多个表的查询中,我总是使用它们,因为:

  • 它们使查询更易读(我的别名是两个或更多大写字母,是表名的快捷方式,如果可能的话还与其他表有关系)
  • 它们允许更快的开发和重写(我的表名很长,并且具有根据它们所扮演的角色而定的前缀)

所以,例如,我会这样写:

SELECT SUM(a.VALUE) 
       FROM Domesticvalues a, Foreignvalues b 
       WHERE a.Value>b.Value
       AND a.Something ...

我写:

select SUM(DVAL.Value) 
       from DomesticValues DVAL, ForeignValues FVAL 
       where DVAL.Value > FVAL.Value
       and   DVAL.Something ...

0
因为我总是完全限定我的表,所以当涉及到连接的表时,我使用别名来为被选择的字段提供一个更短的名称。我认为这样可以使我的代码更易于理解。
如果查询只涉及一个数据源 - 没有连接 - 那么我不使用别名。
这只是个人偏好的问题。

0

我认为你应该尽可能经常使用它们,但我同意t和s比a和b更好地表示实体。

这归结为,像其他所有事情一样,取决于个人喜好。我喜欢当每个开发人员以相同的方式使用别名时,您可以依赖存储过程遵循相同的约定。

说服你的同事与你达成共识,否则这一切都是毫无价值的。另一种选择是将表格Zebra作为第一个表格,并将其别名为a。那只是可爱而已。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接