意见:SQL语句,你使用表别名吗?

时间:2010-10-04 20:19:30

标签: sql alias table-alias

与我合作的其中一个人有关于使用SQL别名的以下内容,他刚刚在reddit上发布了以下内容。你们怎么想,别名或别名别名?

...

所以我和我的开发团队一直是关于如何编写SQL的奇怪人物。 我在学校学习使用别名,但我个人讨厌它们。我发现它可以使声明长时间不可读。我想知道哪些表正在加入其他表。我不想通过5-10表连接来查找“p”的含义,是产品表,人员等等吗?

就个人而言,我发现使用双击,ctrl + c,ctrl + v并不难。使用完整的表名(当然有时你必须连接到同一个表两次,你将被迫在一些更奇怪的查询中使用别名。) 防爆。我的风格

SELECT *
FROM
    People 
JOIN
    Orders ON People.PersonID = Orders.PersonID
JOIN
    OrderDetails ON Orders.OrderID = OrderDetails.OrderID
JOIN
    Products ON Products.ProductID = OrderDetails.ProductID
JOIN
    Country ON People.CountryID = Country.CountryID

VS

SELECT *
FROM
    People p
JOIN
    Orders o ON p.PersonID = o.PersonID
JOIN
    OrderDetails od ON o.OrderID = od.OrderID
JOIN
    Products pr ON pr.ProductID = od.ProductID
JOIN
    Country c ON p.CountryID = c.CountryID

个人喜好自己?我的意思是只考虑这个查询是否是一个更大的连接,并且你有一个很大的select语句。

我假设大多数人使用别名作为节省时间,你认为它更具可读性吗?你可以去你的旧sql并立即了解你的连接是如何工作的吗?

更新:具体来说,我试图争辩说将名称缩短为单个字母会使sql语句不可读。将表从ShoeStackerCrazyProducts更改为ShowProducts我认为可以有意义。另一方面,将它缩短为sscp将使其无法读取。想法?

8 个答案:

答案 0 :(得分:2)

这是主观的,但是当你的表名变长时,别名 更具可读性。请记住,列名称也需要限定符,因此您可以快速获得CamelCasedTableNames.WithDelimiters的长列表。

真实世界的例子,驯服一些遗留表:

SELECT count(*) as c, a.Attributeid, property as AttributeName, 
    a.Subattributeid, SubProperty as SubAttributeName 
    FROM prodAttribute a 
    INNER JOIN phAttributeDisplayOrder o 
        ON a.attributeID = o.AttributeID 
    INNER JOIN lstphysicalproperties y 
        ON a.attributeid = y.physicalpropertyid 
    INNER JOIN (select * from tblsubPhysicalProperties where deleted is null) z 
        ON a.attributeid = z.propertyid 
            AND a.subAttributeID = z.subpropertynumbering 
    GROUP BY o.ranking, a.attributeid, property, a.subattributeid, SubProperty 
    ORDER BY o.ranking, a.attributeid, a.subattributeid

如果没有完全合格的名字那就太糟糕了。

如果我今天写这篇文章,我可能会避免使用单字符别名,但在查询中这个简短并不重要。

答案 1 :(得分:2)

就个人而言,我总是使用别名,即使是在单个表查询上也是如此。我还养成了在每个列引用中使用该别名的习惯,即使列名是唯一的并且别名不是严格要求的。只要您的别名有意义(例如,别名产品为pr,而不是A),您就不会失去很多可读性。

另请参阅:Brent Ozar's Blog Entry关于此主题。

在相关的说明中,我也总是在每个表引用上包含模式名称(例如,dbo.Products与Products),即使它是默认模式。

答案 2 :(得分:1)

我使用SqlPrompt(RedGate),它将为您完成所有复制/粘贴,我仍然一直使用别名。我做(并且不能忍受)的是使用字母表来别名。换句话说,我写的第一个表是'a',第二个'b'等等。对于小查询,我使用表格的第一个字母。对于更长的查询,我将使用整个表名。

当然,我使用模式,所以我的完全限定对象名称往往比给定的示例长很多。

答案 3 :(得分:1)

别名更好。如果您有Product和People,只需使用不同的缩写。例如,Pd代表产品,pl代表人。

此外,在您有内部查询的情况下,别名是至关重要的。

答案 4 :(得分:1)

如果您在多个数据库中执行逻辑操作,如果您需要3部分名称,则别名非常方便。此外,它们的实用程序与DB /模式/表名称的长度和别名的体贴度成正比。

在我的环境中,我们在同一个查询中使用多个DB做了很多工作,并且别名非常有用,尤其是当你有很长的数据库名称时:

CustomerNameDataClaimsDetail
CustomerNameDataClaimsHeader

并且这些DB具有以下表格:

ClaimsDetailNew
ClaimsDetailLoad

在这种情况下,将CustomerNameDataClaimsDetail.dbo.ClaimsDetailNew别名变为CDN或其他一些内容非常有意义。

答案 5 :(得分:1)

如果您的表名称相同,但在不同的数据库上,您将被强制别名。这也发生在具有相同名称的表中,但名称不同的模式。

SELECT * FROM
DB1.dbo.Table1
JOIN DB2.dbo.Table1 ON DB1.dbo.Table1.field = DB2.dbo.Table1.field

将无效,

SELECT * FROM
DB1.dbo.Table1 T1
JOIN DB2.dbo.Table1 T2 ON T1.field = T2.field

会奏效。

还有自我加入你被迫别名。

答案 6 :(得分:1)

SQL IDE支持intellisense更常见:

  • SQL Server Management Studio 2008(但仅针对2008+实例)
  • Oracle的PLSQL Developer
  • RedGate的SqlPrompt

...这使得使用别名变得非常容易。

那就是说,我不认为使用表别名是主观的。

  1. 谁真的想为每个需要限定的列引用重写表名(特别是TSQL中的三/四名称语法)?这只是做了更多工作,而不是更少 - 而且它增加了拼写错误的可能性。
  2. 每栏参考都应合格;除非实际使用所有列,否则应避免使用SELECT *。通过将列别名存在于列引用中,可以清楚地显示列的来源,如果列被更改或从表中消失,则可以依赖该列进行错误。没有什么比得到关于“错误的列'id'”的错误,然后你必须追逐 - 包括表别名,并且你已经最小化了调试问题所需的工作量。
  3. 如果您希望在单个查询中拥有同一个表的多个实例,则表别名 required
  4. 结论

    使用表别名可以更轻松地维护SQL。

答案 7 :(得分:1)

总是在涉及多个表时立即使用别名。

我认为这使得JOIN更具可读性,特别是因为我们有很多带有复合键的表。 如果你总是要输入表名,那就更有效了,而且可读性更低:

select *
from TableWithLongName
inner join AnotherTableWithLongName on TableWithLongName.Column1 = AnotherTableWithLongName.Column1 and TableWithLongName.Column2 = AnotherTableWithLongName.Column2

...比这个:

select *
from TableWithLongName t
inner join AnotherTableWithLongName a on t.Column1 = a.Column1 and t.Column2 = a.Column2

另外,您通常不会在真实应用中执行 SELECT * ,您可以指定要选择的列。 如果您连接两个或多个表,则必须在列前添加表名。

再一次,为了救援而别名...因为我更喜欢这个:

select t.Column1, t.Column2, a.Column1, a.Column2
from ...

......而不是:

select TableWithLongName.Column1, TableWithLongName.Column2, AnotherTableWithLongName.Column1, AnotherTableWithLongName.Column2
from ...

关于如何命名别名:
当只涉及两个或三个表时,我大多使用单个字母作为别名。 如果您只有两个名称完全不同的表,那么记住“o”表示“订单”和“p”表示“产品”并不难。 如果短别名可能会引起混淆(如“人物”的“p1”和“产品”的“p2”)我使用较长的别名,但仍然不是全名(类似“peo”和“pro”)。< / p>