何时使用SQL表格别名

我很想知道人们如何使用表别名。 我工作的其他开发人员总是使用表别名,并始终使用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表段表。

使用表别名有两个原因。

首先是化妆品。 这些语句更容易编写,使用表别名时也可能更容易阅读。

第二个是更实质性的。 如果一个表在FROM子句中出现多次,则需要使用表别名来保持它们不同。 在表中包含引用同一个表的主键的外键的情况下,自连接很常见。

两个示例:包含supervisorID列的雇员表,该列引用了主pipe的employeeID。

第二个是零件爆炸。 通常,这是在具有三列的单独表中实现的:ComponentPartID,AssemblyPartID和Quantity。 在这种情况下,将不会有任何自连接,但通常会在此表和两个不同的零件表的引用之间进行三向连接。

这是一个很好的习惯。

我用它们来保存input。 但是,我总是使用类似于函数的字母。 所以,在你的例子中,我会input:

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

这只是让我更容易阅读。

作为一般规则我总是使用它们 ,因为在我的存储过程中通常会有多个连接。 当使用CodeSmith之类的代码生成工具让它为你自动生成别名时,它也变得更加容易。

我试图远离单个字母,像&b,因为我可能有多个以字母a或b开头的表。 我用更长的方法,引用的外键与别名表的连接,例如CustomerContact …这将是联系到联系人表时,客户表的别名。

另外一个原因我不介意再长一点名字,是因为我的大部分存储过程都是通过代码CodeSmith生成的。 我不介意打我可能要build立自己的less数人

使用当前的例子,我会做这样的事情:

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

我总是使用它,原因是:

  • 在语句中留下完整的表名使得它们难以阅读,而且不能有两次相同的表
  • 不使用任何东西是一个非常糟糕的主意,因为以后你可以添加一些字段到其他表中已经存在的一个表中

考虑这个例子:

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

现在,想象几个月后,您决定将名为“col1”的列添加到tab2。 数据库会默默地允许你这样做,但是当执行上面的查询时,由于tab1.col1和tab2.col1之间的歧义,应用程序会中断。

但是,我同意你的命名:a,b,c是好的,但是在你的例子中ts会好很多。 而当我有不止一次相同的表,我会使用t1,t2,…或s1,s2,s3 …

我可以添加一个已经几年的辩论吗?

还有一个原因,没有人提到。 某些数据库中的SQLparsing器可以更好地处理别名。 我不记得甲骨文在后来的版本中是否改变了它,但是当它来到一个别名时,它查询了数据库中的列并记住了它们。 当涉及表名时,即使在语句中已经遇到,它也会重新检查数据库中的列。 所以使用别名可以更快的parsing,特别是长的SQL语句。 我相信有人知道这是否仍然如此,如果其他数据库在parsing时执行此操作,并且是否更改, 何时更改。

我觉得你应该尽可能多地使用它们,但是我确实认为t&s代表的实体比a&b更好。

这可以归结为,像其他一切一样,偏好。 我喜欢你可以依照你的存储过程遵循相同的约定,当每个开发者以相同的方式使用别名时。

去说服你的同事与你相同的页面,否则这是毫无价值的。 另一种方法是你可以有一个表斑马作为第一个表,并将其别名为。 那只会是可爱的

我只在必要的时候使用它们来区分一个字段来自哪个表

 select PartNumber, I.InventoryTypeId, InventoryTypeDescription from dbo.Inventory I inner join dbo.InventoryType IT on IT.InventoryTypeId = I.InventoryTypeId 

在上面的例子中,两个表都有一个InventoryTypeId字段,但其他字段名称是唯一的。

始终使用表格的缩写作为名称,以便代码更有意义 – 请问您的其他开发人员是否将其局部variables命名为A,B,C等等!

唯一的例外是在极less数情况下,SQL语法需要一个表别名,但没有被引用,例如

 select * from ( select field1, field2, sum(field3) as total from someothertable ) X 

在上面,SQL语法需要子查询的表别名,但是它没有被引用到任何地方,所以我得到了懒惰,并使用X或类似的东西。

我觉得这不过是一种偏好。 如上所述,别名保存了input,尤其是对于长表/视图名称。

使用全名难以阅读,特别是对于大型查询或Order / Product / OrderProduct scenari0

我会用t和s。 或者o / p / op

如果您使用SCHEMABINDING,那么列必须是合格的

如果将一列添加到基表中,则该限定减less了查询中重复的机会(例如“注释”列)

由于这个限定,总是使用别名是有意义的。

使用a和b是盲目服从一个奇怪的标准。

我学到的一件事情是,特别是对于复杂的查询。 如果您使用别名作为每个字段引用的限定符,六个月后排除故障要简单得多。 那么你并不是想记住那个字段来自哪个表。

我们往往有一些可笑的长表名,所以如果表是别名的话,我发现它更容易阅读。 当然,如果你使用派生表或自联接,你必须这样做,所以在习惯中是一个好主意。 我发现大部分开发人员最终都会在所有sps中的每个表中使用相同的别名,所以大部分时间阅读的人都会立即知道pug是别名还是mmh。

我总是使用它们。 我以前只在涉及一个表的查询中使用它们,但是后来我意识到:a)只涉及一个表的查询是很less见的,而且b)只涉及一个表的查询很less保留那么长时间。 所以我总是从一开始就把它们放进去,以便我(或其他人)以后不用复制它们。 哦,顺便说一句:我称他们为“相关名称”,按照SQL-92标准:)

表别名应该是四件事情:

  1. 富有意义的
  2. 始终使用
  3. 一贯使用

例如,如果你有名为service_request,service_provider,user和affiliate(等等)的表,一个好的做法是将这些表别名为“sr”,“sp”,“u”和“a”,并且这样做在每一个可能的查询。 如果像这种情况一样,这些别名与贵组织使用的首字母缩写相一致,这样做尤其方便。 因此,如果“SR”和“SP”分别是服务请求和服务提供商的可接受条款,则上述别名携带双重负载,直观地代表它所代表的表和业务对象。

这个系统的明显缺陷首先是对于有许多“单词”的表名,例如a_long_multi_word_table_name,它可能会被almwtn或别的东西混淆,而且很可能你最终会得到一些名称缩写相同的表。 第一个缺陷可以用你喜欢的方式来处理,比如通过最后3或4个字母,或者你觉得哪一个子集最具代表性,最独特或者最容易input。 我在实践中发现的第二个问题并不像看起来那么麻烦,也许只是运气而已。 你也可以做一些事情,比如把表中的“单词”的第二个字母,比如用“atr”而不是“at”别名account_transaction来避免与account_type的冲突。

当然,不pipe你是否使用上面的方法,别名应该是短的,因为你会非常频繁地input它们,并且应该总是使用它们,因为一旦你写了一个查询单个表并省略别名,它不可避免的是,您稍后需要在第二个表中使用重复的列名进行编辑。

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

  • 他们使查询更具可读性(我的别名是2个或更多的大写字母,这是表名的捷径,如果可能的话与其他表的关系)
  • 他们允许更快的开发和重写(我的表名很长,有前缀取决于他们构成的angular色)

所以不是例如:

 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 ... 

总是。 养成习惯。