在SQL中使用表别名有哪些优缺点?我个人试图避免它们,因为我认为它们使代码的可读性降低(特别是在阅读大的where /和语句时),但我有兴趣听到任何反对点.什么时候使用表别名通常是个好主意,你有没有任何首选格式?
好吧,在某些情况下你必须使用它们,比如当你需要在一个查询中两次加入同一个表时.
它还取决于您是否在表中具有唯一的列名称.在我们的遗留数据库中,我们为所有列提供了3个字母的前缀,源自表中的缩写形式,因为我们曾经兼容的一个古老的数据库系统不能很好地支持表别名.
如果列名出现在多个表中,则将表名指定为列引用的一部分是必须的,因此表别名将允许更短的语法.
在处理高度规范化的模式时,表别名是必要的恶魔.例如,我不是这个数据库的架构师,所以请耐心等待,它可能需要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
......等
我是唯一真正讨厌他们的人吗?
一般来说,除非必须,否则我不会使用它们.我真的很讨厌读类似的东西
select a.id, a.region, a.firstname, a.blah, b.yadda, b.huminahumina, c.crap from table toys as a inner join prices as b on a.blah = b.yadda inner join customers as c on c.crap = something else etc
当我阅读SQL时,我想知道我在阅读时的确切选择; 别名实际上让我更加困惑,因为在实际获得表名之前我必须通过列行,这通常表示别名没有的数据信息.也许你可以创建别名,但我通常会阅读StackOverflow上的问题,而代码似乎没有任何理由使用别名.(另外,有时,有人会在语句中创建别名而不使用它.为什么?)
我认为表别名的使用非常多,因为很多人不喜欢打字.不过,我认为这不是一个好借口.这个借口是我们最终得到可怕的变量命名,可怕的函数首字母缩略词,错误的代码...我会花时间输入全名.不过,我是一个快速的人,所以也许这与它有关.(也许将来,当我有了腕管时,我会重新考虑我对别名的看法.:P)我特别讨厌在PHP代码中运行表别名,我相信绝对没有理由这样做 - 你只需输入一次!
我总是在我的陈述中使用列限定符,但我并不反对输入很多,所以我很乐意多次输入全名.(当然,我确实滥用了MySQL的标签完成.)除非我必须使用别名(如其他答案中描述的那些),我发现额外的抽象层很麻烦且不必要.
编辑:(一年后)我正在处理一些使用别名的存储过程(我没有编写它们,我是这个项目的新手),而且它们有点痛苦.我意识到我不喜欢别名的原因是因为它们是如何被定义的.您知道在范围顶部声明变量通常是一种好习惯吗?(通常在一行的开头?)SQL中的别名不遵循这个惯例,这让我磨牙.因此,我必须在整个代码中搜索单个别名以找出它的位置(令人沮丧的是,我必须在找到别名声明之前阅读逻辑).如果不是那样的话,老实说我可能更喜欢这个系统.
如果我编写了其他人必须处理的存储过程,我会将我的别名定义放在文件开头的注释块中作为参考.老实说,我不明白你们如果没有它就不会发疯.
Microsoft SQL的查询优化器可以使用完全限定名称或别名.
我个人更喜欢别名,除非我有很多表,否则他们往往是单字母表.
--seems pretty readable to me ;-) select a.Text from Question q inner join Answer a on a.QuestionId = q.QuestionId
Sql字符串的执行时间也有实际限制 - 别名使这个限制更容易避免.
正如之前多次提到的那样,最好在所有列名前加上,以便轻松查看哪个列属于哪个表 - 并且别名比完整表名更短,因此查询更容易阅读并因此理解.如果你当然使用一个好的别名方案.
如果您创建或读取使用外部存储或动态生成的表名的应用程序的代码,那么在没有别名的情况下,很难一眼就知道所有这些"%s"或其他占位符代表什么.这不是极端情况,例如许多Web应用程序允许在安装时自定义表名前缀.
如果我自己编写查询(通过在编辑器中键入而不使用设计器),我总是使用别名作为表名,所以我只需要输入一次完整的表名.
我真的很讨厌读取设计器生成的查询,并将完整的表名作为每个列名的前缀.我认为唯一真正反对他们的是过度抽象.如果你会很清楚别名所指的是什么(好的命名有帮助;'a','b','c'可能很成问题,特别是当你几个月或几年后阅读声明时),我认为没有错带别名.
正如其他人所说,如果你多次使用相同的表(或视图),连接需要它们,但即使在这种情况之外,别名也可以用于澄清数据源在特定上下文中的用途.在别名的名字,试图回答为什么要访问特定的数据,没有什么数据是.