您可以在SQL中设置表别名,在表名后面键入标识符.
SELECT * FROM table t1;
Run Code Online (Sandbox Code Playgroud)
您甚至可以使用关键字AS来指示别名.
SELECT * FROM table AS t1;
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别?
我看到老DBA的人倾向于不用编写语句AS,但大多数新教程都使用它.
更新:我知道表和列别名的用途是什么.我很好奇,有什么原因可以设置一个单独的关键字来设置别名,而它也可以在没有它的情况下工作.
Sac*_*hag 119
上述两个陈述之间没有区别.AS只是提及别名的一种更明确的方式
Xst*_*ity 36
在我之前回答的每个人都是正确的.当您有长查询或具有连接的查询时,可以将它用作表的别名快捷方式名称.这是几个例子.
例1
SELECT P.ProductName,
P.ProductGroup,
P.ProductRetailPrice
FROM Products AS P
Run Code Online (Sandbox Code Playgroud)
例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
Run Code Online (Sandbox Code Playgroud)
示例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
Run Code Online (Sandbox Code Playgroud)
如您所知,我在最后一个示例中省略了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
Run Code Online (Sandbox Code Playgroud)
例4的输出
Product Retail Price Quantity Ordered
Blue Raspberry Gum $10 pk/$50 Case 2 Cases
Twizzler $5 pk/$25 Case 10 Cases
Run Code Online (Sandbox Code Playgroud)
one*_*hen 20
如果您不确定选择哪种语法,尤其是在选项分离似乎不多的情况下,请参阅有关启发式的书籍.据我所知,SQL的唯一启发式书是'Joe Celko的SQL编程风格':
相关名称通常称为别名,但我将是正式的.在SQL-92中,它们可以有一个可选的
AS运算符,它应该用来表明某些东西被赋予一个新的名字.[P16]
这样,如果你的团队不喜欢这个惯例,你可以责怪Celko - 我知道我这样做;)
更新1:IIRC很长一段时间,Oracle不支持AS(先前的相关名称)关键字,这可以解释为什么一些旧的定时器不习惯使用它.
更新2:术语"相关名称"虽然由SQL标准使用,但却不合适.基本概念是" 范围变量 ".
更新3:我刚刚重新阅读了Celko所写的内容并且他错了:该表未被重命名!我现在想:
相关名称通常称为别名,但我将是正式的.在标准SQL中,它们可以有一个可选的
AS关键字,但不应该使用它,因为它可能会给人的印象是某些东西在没有时被重命名.实际上,应该省略它以强制它是一个范围变量.
Buh*_*ndi 12
该AS关键字是给一个ALIAS名到数据库表或表列.在您的示例中,两个语句都是正确的,但是存在需要AS子句的情况(尽管AS运算符本身是可选的),例如
SELECT salary * 2 AS "Double salary" FROM employee;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,Employee表有一salary列,我们只想要一个新名称的工资的两倍Double Salary.
对不起,如果我的解释无效.
根据您的评论更新,您说得对,我以前的陈述无效.我能想到的唯一原因是该AS子句已经在SQL世界中存在了很长时间,它已被合并到现在的RDMS中以实现向后兼容性.
如果你不使用'SELECT*'(这是一个你应该摆脱的坏习惯),使用会更加明显:
SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
Run Code Online (Sandbox Code Playgroud)
在 SQL 的早期,它被选择作为如何处理重复列名问题的解决方案(见下面的注释)。
\n\n借用另一个答案的查询:
\n\nSELECT P.ProductName,\n P.ProductRetailPrice,\n O.Quantity\n FROM Products AS P\n INNER JOIN Orders AS O ON O.ProductID = P.ProductID\n WHERE O.OrderID = 123456\nRun Code Online (Sandbox Code Playgroud)\n\n该列ProductID(可能还有其他列)对于两个表来说是通用的,并且由于连接条件语法需要引用这两个表,因此“点限定”可以消除歧义。
当然,更好的解决方案是从一开始就不允许出现重复的列名!令人高兴的是,如果您使用更新的语法,则不再NATURAL JOIN需要范围变量P和:O
SELECT ProductName, ProductRetailPrice, Quantity\n FROM Products NATURAL JOIN Orders\n WHERE OrderID = 123456\nRun Code Online (Sandbox Code Playgroud)\n\n但为什么AS关键字是可选的呢?根据我与 SQL 标准委员会的一位成员(Joe Celko 或 Hugh Darwen)的个人讨论,他们的回忆是,在定义标准时,一个供应商的产品(微软的?)要求将其包含在内,而另一个供应商的产品(Oracle 的?)则要求将其省略,因此选择的折衷方案是使其成为可选的。我对此没有任何引用,你要么相信我,要么不相信我!
在关系模型的早期,标题不相交的关系的叉积(或 theta 连接或等连接)似乎会产生具有两个同名属性的关系;Codd在他的关系演算中对这个问题的解决方案是使用点限定,后来在SQL中进行了模拟(后来才意识到所谓的自然连接是原始的无损失的;也就是说,自然连接可以代替所有的theta -连接甚至叉积。)
\n\n\n