SQL表别名-好还是坏?
在SQL中使用表别名的优缺点是什么?我个人试图避免使用它们,因为我认为它们会使代码的可读性降低(尤其是在阅读较大的where / and语句时),但是我有兴趣听取与此相反的意见。通常什么时候使用表别名是个好主意,并且我们有任何首选的格式吗?
解决方案
回答
好吧,在某些情况下,我们必须使用它们,例如当我们需要在一个查询中两次连接到同一张表时。
这还取决于我们在表之间是否具有唯一的列名称。在我们的旧数据库中,由于表的缩写形式,所有列都有3个字母的前缀,这仅仅是因为我们曾经兼容的一个古老的数据库系统并不完全支持表别名。
如果列名称出现在多个表中,则必须将表名称指定为列引用的一部分,因此表别名将允许使用较短的语法。
回答
恕我直言,有意义的短表名并不重要,有时我会在数据库中使用表名,例如VWRECOFLY或者其他可以真正代表用户的随机字符串(由公司政策规定),所以在在这种情况下,我发现别名确实有助于使代码FAR更具可读性。 (users.username比VWRECOFLY.username更具意义)
回答
当处理高度标准化的模式时,表别名是必不可少的。例如,由于我不是该数据库的架构师,所以请耐心等待,它需要进行7次连接才能获得完整干净的记录,包括个人姓名,地址,电话号码和公司隶属关系。
我倾向于使用短单词别名,而不是有些标准的单字符别名,因此上面示例的SQL最终看起来像:
select person.FirstName ,person.LastName ,addr.StreetAddress ,addr.City ,addr.State ,addr.Zip ,phone.PhoneNumber ,company.CompanyName from tblPeople person left outer join tblAffiliations affl on affl.personID = person.personID left outer join tblCompany company on company.companyID = affl.companyID
... 等等
回答
我喜欢长的显式表名(通常不超过100个字符),因为我使用了很多表,如果名称不是显式的,我可能会混淆每个表存储的内容。
因此,当我编写查询时,我倾向于使用较短的别名,这些别名在查询范围内有意义,并使代码更具可读性。
回答
如果要将表联接到自身,或者在子查询中再次使用该列,则需要它们。
回答
通过使用完全限定的名称或者别名,Microsoft SQL的查询优化程序将受益。
就我个人而言,我更喜欢别名,除非我有很多表,否则它们往往是单字母的。
--seems pretty readable to me ;-) select a.Text from Question q inner join Answer a on a.QuestionId = q.QuestionId
对Sql字符串可以执行多长时间也有实际的限制,别名使此限制更容易避免。
回答
我真的很讨厌阅读设计人员生成的查询,查询使用完整的表名作为每个列名的前缀。
回答
我总是使用别名,因为要在MSSQL上获得适当的性能,我们需要始终以模式作为前缀。所以你会看到很多
Select Person.Name From dbo.Person As Person
回答
连接具有相同名称的列的表时,需要别名。
回答
在编写查询时,我总是使用别名。通常,我尝试将表名缩写为1或者2个代表字母。因此,用户成为u,债务人事务变为dt等。
它节省了键入操作,但仍然具有一定的意义。
较短的名称也使我更容易理解。
回答
我想唯一真正反对他们的是过度抽象。如果我们对别名指的是一个好主意(良好的命名有所帮助;" a"," b"," c"可能会有很大问题,尤其是当我们在数月或者数年后阅读声明时)带有锯齿。
正如其他人所说,如果我们多次使用同一张表(或者视图),则联接需要它们,但是即使在这种情况下,别名也可以用来阐明特定上下文中数据源的用途。用别名的名称,尝试回答为什么访问特定数据而不是数据是什么。
回答
我总是在查询中使用别名,这是公司代码指南的一部分。首先,如果联接表中有名称相同的列,则需要别名或者表名。我认为别名可以提高复杂查询的可读性,并允许我快速查看每列的位置。我们甚至在单表查询中使用别名,因为经验表明单表查询不会长时间停留在单表中。
回答
如果我们认为我的组织具有以下表名,则别名非常有用:
SchemaName.DataPointName_SubPoint_Sub-SubPoint_Sub-Sub-SubPoint ...
我的团队使用了相当标准的缩写集,因此将猜测工作减至最少。我们不得不说ProgramInformationDataPoint缩短为pidp,而提交则缩短为sub。
好消息是,一旦我们采用这种方式并且得到了人们的认可,它会使那些HAYUGE文件变得更小,更易于管理。至少对我而言,传达相同信息的字符更少似乎使我的大脑容易一点。
回答
如果我们不使用别名,那么这只是等待中的错误。
SELECT Description -- actually in a FROM table_a a, table_b b WHERE a.ID = b.ID
当我们执行一些小操作(例如在Table_B中添加名为Description的列)时会发生什么。没错,我们会得到一个错误。添加一列无需中断任何操作。我从来没有见过写出好的代码,没有bug的代码是必不可少的邪恶。
回答
正如之前多次提到的那样,为所有列名称添加前缀是一种很好的做法,可轻松查看哪个列属于哪个表,而别名比完整表名短,因此查询更易于阅读和理解。当然,如果我们使用好的别名方案。
而且,如果我们创建或者读取使用外部存储的或者动态生成的表名的应用程序的代码,则没有别名的情况下,乍一看真的很难理解所有这些"%s"或者其他占位符代表什么。这不是极端情况,例如,许多Web应用程序允许在安装时自定义表名前缀。