2

与我一起工作的其中一个人对使用 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 会使其不可读。想法?

4

8 回答 8

2

Personally, I always use aliases, even on a single table query. I also make it a habit to use that alias with every column reference, even when the column name is unique and the alias is not strictly required. As long as your aliases are meaningful (e.g., alias Products as pr, not as A), you shouldn't lose much readability.

See also: Brent Ozar's Blog Entry on this topic.

On a related note, I also always include the schema name on every table reference (e.g., dbo.Products vs. Products) even when it's the default schema.

于 2010-10-04T20:33:47.570 回答
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

没有完全限定的名称就够糟糕了。

如果我今天写它,我可能会避免使用单字符别名,但在这么短的查询中,它并不那么重要。

于 2010-10-04T20:22:30.990 回答
1

If your tables are named the same, but on different databases, you're forced to alias. This also occurs across identically-named tables but differently named schemas.

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

will not work, where

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

will work.

Also with a self join you're forced to alias.

于 2010-10-04T20:31:00.263 回答
1

SQL IDE 支持智能感知更为常见:

  • SQL Server Management Studio 2008 可以(但仅针对 2008+ 实例)
  • Oracle 的 PLSQL 开发人员
  • RedGate 的 SqlPrompt

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

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

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

结论

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

于 2010-10-04T20:37:20.047 回答
1

我使用 SqlPrompt (RedGate),它会为你完成所有的复制/粘贴,而且我仍然一直使用别名。我不做(也不能忍受)是使用字母表来别名。换句话说,我写的第一个表是“a”,第二个是“b”,依此类推。对于小型查询,我使用表格的第一个字母。对于更长的查询,我将使用整个表名。

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

于 2010-10-04T20:23:21.857 回答
1

别名更好。如果您有产品和人员,只需使用不同的缩写即可。例如,pd 代表产品,pl 代表人。

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

于 2010-10-04T20:24:00.897 回答
1

如果您在跨多个数据库执行逻辑时需要 3 部分名称,则别名非常方便。此外,它们的效用与数据库/模式/表名称的长度和别名的周到程度成正比。

在我的环境中,我们在同一个查询中处理多个数据库,别名非常宝贵,尤其是当您有长数据库名称时,例如:

CustomerNameDataClaimsDetail
CustomerNameDataClaimsHeader

那些数据库有如下表:

ClaimsDetailNew
ClaimsDetailLoad

在那种情况下,给别名或类似的别名CustomerNameDataClaimsDetail.dbo.ClaimsDetailNew是很有意义的。CDN

于 2010-10-04T20:25:46.863 回答
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”)。

于 2010-10-04T21:15:50.033 回答