与我合作的其中一个人有关于使用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将使其无法读取。想法?
答案 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更常见:
...这使得使用别名变得非常容易。
那就是说,我不认为使用表别名是主观的。
SELECT *
。通过将列别名存在于列引用中,可以清楚地显示列的来源,如果列被更改或从表中消失,则可以依赖该列进行错误。没有什么比得到关于“错误的列'id'”的错误,然后你必须追逐 - 包括表别名,并且你已经最小化了调试问题所需的工作量。 使用表别名可以更轻松地维护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>