您可以在SQL中设置表别名,在表名后面键入标识符。
SELECT * FROM table t1;
您甚至可以使用关键字AS
来表示别名。
SELECT * FROM table AS t1;
如果有的话,它们之间有什么区别?
我看到老DBA的人倾向于在没有AS
的情况下编写语句,但大多数新教程都使用它。
更新:我知道表和列别名的用途是什么。我很好奇,有什么原因可以设置一个单独的关键字来设置别名,而不管它也可以。
答案 0 :(得分:113)
上述两个陈述之间没有区别。 AS只是提及别名
的一种更明确的方式答案 1 :(得分:34)
在我之前回答的每个人都是正确的。当您有长查询或具有连接的查询时,可以将它用作表的别名快捷方式名称。这里有几个例子。
示例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
答案 2 :(得分:20)
如果您不确定选择哪种语法,尤其是在选项分离似乎不多的情况下,请参阅有关启发式的书籍。据我所知,SQL的唯一启发式书是'Joe Celko的SQL编程风格':
相关名称更常见 称为别名,但我会正式的。 在SQL-92中,它们可以有一个可选项
AS
运算符,应该使用它 明确表达某些事情 被赋予一个新名字。 [P16]
这样,如果你的团队不喜欢这个惯例,你可以责怪Celko--我知道我这样做;)
更新1:IIRC很长一段时间,Oracle不支持AS
(前面的相关名称)关键字,这可以解释为什么有些旧计时器不习惯使用它。
更新2:术语“相关名称”虽然由SQL标准使用,但却不合适。基本概念是“range variable”。
更新3:我刚刚重新阅读了Celko所写的内容并且他错了:该表未被重命名!我现在想:
相关名称通常被称为别名,但我将是正式的。在标准SQL中,他们可以使用可选的
AS
关键字,但不应该使用它,因为它可能会给人的印象是某些内容正在被重命名。实际上,应该省略它以强制它是一个范围变量。
答案 3 :(得分:13)
AS
关键字是为数据库表或表列提供 ALIAS 名称。在您的示例中,两个语句都是正确的,但是存在需要AS子句的情况(尽管AS
运算符本身是可选的),例如。
SELECT salary * 2 AS "Double salary" FROM employee;
在这种情况下,Employee
表格有一个salary
列,我们只想要一个新名称为Double Salary
的薪水的两倍。
很抱歉,如果我的解释无效。
更新,您说得对,我之前的陈述无效。我能想到的唯一原因是AS
子句已经在SQL世界中存在了很长时间,它已被合并到现在的RDMS中以实现向后兼容性。
答案 4 :(得分:6)
如果你不使用'SELECT *'(这是一个你应该摆脱的坏习惯),使用会更加明显:
SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
答案 5 :(得分:4)
这是为实体指定相关名称的正式方式,以便您可以在查询的其他部分轻松解决该问题。
答案 6 :(得分:3)
在这种情况下,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
关键字用于表别名,因为许多常用数据库不支持它。
答案 7 :(得分:1)
在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)的个人讨论的回忆是,他们的回忆是,在定义标准时,一个供应商的产品(微软? )要求将其包含在内并且其他供应商的产品(Oracle的?)需要省略,因此选择的折衷方案是使其成为可选项。我没有引用这个,你要不要相信我!
在关系模型的早期,标题不相交的关系的交叉积(或theta-join或equi-join)似乎与两个同名属性产生关系; Codd在他的关系演算中对这个问题的解决方案是使用点限定,后来在SQL中进行了模拟(后来发现所谓的自然连接是原始的而没有丢失;也就是说,自然连接可以取代所有的-ta连接和甚至跨产品。)
答案 8 :(得分:0)
如果您使用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是多余的,但在许多其他地方需要它。