SQL关键字“AS”的用途是啥?
Posted
技术标签:
【中文标题】SQL关键字“AS”的用途是啥?【英文标题】:What's the purpose of SQL keyword "AS"?SQL关键字“AS”的用途是什么? 【发布时间】:2010-11-12 12:34:28 【问题描述】:您可以在 SQL 中设置表别名,在表名之后键入标识符。
SELECT * FROM table t1;
您甚至可以使用关键字AS
来表示别名。
SELECT * FROM table AS t1;
如果有的话,它们之间有什么区别?
我看到旧的 DBA 人倾向于编写不带AS
的语句,但大多数新教程都使用它。
更新: 我知道表和列别名的用途是什么。我很好奇,为什么有一个单独的关键字来设置别名,而没有它也可以工作。
【问题讨论】:
来自msdn.microsoft.com/en-us/library/ms179300.aspx AS 子句是ISO 标准中定义的用于为结果集列分配名称的语法。这是在 SQL Server 2005 中使用的首选语法。 它还用于将过程的声明与其脚本分开。CREATE PROC Test @Param1 INT AS SELECT @Param1
【参考方案1】:
以上两种说法没有区别。 AS 只是一种更明确的提及别名的方式
【讨论】:
其实SQL没有什么区别,但是一些依赖的工具/库可以依赖这个小关键字。例如:JDBC 4.0。根据使用带“AS 原因”的别名和不带的别名,您将收到不同的行为 - 请参阅此答案 ***.com/a/4271250/814304。我想建议始终使用完整形式的语义来避免此类问题。 我可以为多个列设置别名吗?比如,两列有一个别名? @Keynes 是的。只需连接 (||) 列,然后给它一个别名,例如选择富 || bar AS foobar. 是的@RupertMadden-Abbott,谢谢!但我等了有点久,我是在上下文方面。 select 中的别名不能在 where 子句中使用,但在 from ... as X 中可以在 where 子句中使用【参考方案2】:在我之前回答的每个人都是正确的。当您有长查询或具有连接的查询时,您可以将其用作表的别名快捷方式名称。这里有几个例子。
示例 1
SELECT P.ProductName,
P.ProductGroup,
P.ProductRetailPrice
FROM Products AS P
示例 2
SELECT P.ProductName,
P.ProductRetailPrice,
O.Quantity
FROM Products AS P
LEFT OUTER JOIN Orders AS O ON O.ProductID = P.ProductID
WHERE O.OrderID = 123456
示例 3 使用 AS 关键字是一种很好的做法,并且非常推荐,但是可以在没有关键字的情况下执行相同的查询(我经常这样做)。
SELECT P.ProductName,
P.ProductRetailPrice,
O.Quantity
FROM Products P
LEFT OUTER JOIN Orders O ON O.ProductID = P.ProductID
WHERE O.OrderID = 123456
如您所知,我在上一个示例中省略了 AS 关键字。并且可以作为别名使用。
示例 4
SELECT P.ProductName AS "Product",
P.ProductRetailPrice AS "Retail Price",
O.Quantity AS "Quantity Ordered"
FROM Products P
LEFT OUTER JOIN Orders O ON O.ProductID = P.ProductID
WHERE O.OrderID = 123456
示例 4 的输出
Product Retail Price Quantity Ordered
Blue Raspberry Gum $10 pk/$50 Case 2 Cases
Twizzler $5 pk/$25 Case 10 Cases
【讨论】:
【参考方案3】:当您不确定选择哪个语法,尤其是在似乎没有太多的选择时,请在启发式中咨询一本书。据我所知,关于 SQL 的唯一启发式书籍是“Joe Celko 的 SQL 编程风格”:
关联名称更常见 称为别名,但我会正式。 在 SQL-92 中,它们可以有一个可选的
AS
运算符,应该使用 清楚地表明某事是 被赋予了新的名字。 [p16]
这样,如果你的团队不喜欢大会,你可以责怪 Celko——我知道我喜欢 ;)
UPDATE 1:IIRC长期以来,Oracle不支持AS
(前置相关名)关键字,这也许可以解释为什么一些老前辈不习惯使用它。
更新 2:尽管 SQL 标准使用了术语“相关名称”,但它是不合适的。基本概念是“range variable”。
更新 3:我刚刚重新阅读了 Celko 写的内容,但他错了:表没有被重命名!我现在认为:
关联名称通常被称为别名,但我将是正式的。在标准 SQL 中,它们可以有一个可选的
AS
关键字,但不应该使用它,因为它可能给人的印象是某些东西正在被重命名,而实际上并非如此。事实上,它应该被省略以强制它是一个范围变量。
【讨论】:
【参考方案4】:AS
关键字是为您的数据库表或表列提供一个 ALIAS 名称。在您的示例中,两个语句都是正确的,但在某些情况下需要 AS 子句(尽管 AS
运算符本身是可选的),例如
SELECT salary * 2 AS "Double salary" FROM employee;
在这种情况下,Employee
表有一个 salary
列,我们只需要新名称 Double Salary
的两倍薪水。
对不起,如果我的解释无效。
更新根据您的评论,您是对的,我之前的声明无效。我能想到的唯一原因是AS
子句在 SQL 世界中已经存在很长时间了,它已被纳入当今的 RDMS 以实现向后兼容性..
【讨论】:
不,AS
不是必需的,即使在这种情况下也不需要。试试SELECT 1 + 1 "result"
。【参考方案5】:
如果你不使用'SELECT *'(这是你应该改掉的坏习惯),使用会更明显:
SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
【讨论】:
我知道表别名的目的是什么。我很好奇,为什么有一个单独的关键字来设置别名,而没有它也可以工作。【参考方案6】:在 SQL 的早期,它被选为解决如何处理重复列名的问题(见下注)。
从另一个答案借用查询:
SELECT P.ProductName,
P.ProductRetailPrice,
O.Quantity
FROM Products AS P
INNER JOIN Orders AS O ON O.ProductID = P.ProductID
WHERE O.OrderID = 123456
ProductID
列(可能还有其他列)对两个表都是通用的,并且由于连接条件语法需要同时引用这两个列,因此“点限定”可以消除歧义。
当然,更好的解决方案是从一开始就不允许重复的列名!令人高兴的是,如果您使用较新的 NATURAL JOIN
语法,则不再需要范围变量 P
和 O
:
SELECT ProductName, ProductRetailPrice, Quantity
FROM Products NATURAL JOIN Orders
WHERE OrderID = 123456
但是为什么AS
关键字是可选的?在与 SQL 标准委员会成员(Joe Celko 或 Hugh Darwen)的个人讨论中,我的回忆是,他们的回忆是,在定义标准时,一个供应商的产品(Microsoft 的? ) 要求包含它,而另一个供应商的产品(Oracle 的?)要求省略它,因此选择的折衷方案是使其可选。我对此没有任何引用,你要么相信我,要么不相信!
在关系模型的早期,标题不相交的关系的叉积(或theta-join 或equi-join)似乎会产生具有两个同名属性的关系; Codd 在他的关系演算中对这个问题的解决方案是使用点限定,后来在 SQL 中进行了模拟(后来意识到所谓的自然连接是原始的,没有损失;也就是说,自然连接可以代替所有的 theta-join 和甚至是叉积。)
来源:Business System 12, Notes keyed to slides of the presentation given at TTM Implementers’ Workshop, University of Northumbria, 2-3 June 2011 by Hugh Darwen
【讨论】:
“当然,更好的解决方案是从一开始就不允许重复的列名!” - 所以不应该允许 company.name 和 country.name 吗?如果我将一张桌子加入到自己身上怎么办? “在 SQL 的早期,它被选择了......”你对此有参考吗/这个理由是否记录在某处? @Bob 我已经用 SQL 中点限定的历史的注释(带引用)更新了我的答案,加上我公认的模糊回忆为什么AS
关键字是可选的(没有引用,明显地!)。休几年前退休了。我认为 Celko 可能仍然很活跃——他的回忆会增加重量吗?证据和书面记录根本不存在:(
"他的回忆会增加分量吗?";无需打扰塞尔科先生; BS12 文档对点限定的缺点有 Darwen 自己的话 - 我没有想到 70 年代的内存限制和重复连接。我承认,出于同样的原因,别名似乎很有可能进入 SQL。【参考方案7】:
这是为实体指定相关名称的正式方式,以便您可以在查询的另一部分轻松解决它。
【讨论】:
【参考方案8】:本例中的AS
是ANSI SQL 92 中定义的可选关键字,用于定义<<correlation name>
,通常称为表的别名。
<table reference> ::= <table name> [ [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] ] | <derived table> [ AS ] <correlation name> [ <left paren> <derived column list> <right paren> ] | <joined table> <derived table> ::= <table subquery> <derived column list> ::= <column name list> <column name list> ::= <column name> [ <comma> <column name> ... ] Syntax Rules 1) A <correlation name> immediately contained in a <table refer- ence> TR is exposed by TR. A <table name> immediately contained in a <table reference> TR is exposed by TR if and only if TR does not specify a <correlation name>.
最好不要将AS
关键字用于表别名,因为许多常用数据库不支持它。
【讨论】:
你有没有不使用'as'关键字的dbs例子? 我相信 Oracle 是不支持表别名的as
keyword 的其中之一。
"AS 关键字是可选的。别名在查询期间有效地重命名选择列表项。别名可以在 order_by_clause 中使用,但不能在查询中的其他子句中使用。" docs.oracle.com/cd/B28359_01/server.111/b28286/… 。也相关***.com/a/8451257/1359796
我想说最好的做法是始终包含 AS 关键字。【参考方案9】:
如果您使用 SQL Server 2012 中的查询编辑器设计查询,例如,您会得到:
SELECT e.EmployeeID, s.CompanyName, o.ShipName
FROM Employees AS e INNER JOIN
Orders AS o ON e.EmployeeID = o.EmployeeID INNER JOIN
Shippers AS s ON o.ShipVia = s.ShipperID
WHERE (s.CompanyName = 'Federal Shipping')
但是删除 AS 并没有任何区别,如下所示:
SELECT e.EmployeeID, s.CompanyName, o.ShipName
FROM Employees e INNER JOIN
Orders o ON e.EmployeeID = o.EmployeeID INNER JOIN
Shippers s ON o.ShipVia = s.ShipperID
WHERE (s.CompanyName = 'Federal Shipping')
在这种情况下使用 AS 是多余的,但在许多其他地方却需要它。
【讨论】:
以上是关于SQL关键字“AS”的用途是啥?的主要内容,如果未能解决你的问题,请参考以下文章