SELECT cust_email FROM customer AS c WHERE c.cust_email="pankaj@yahoo.com"
SELECT cust_email FROM customer WHERE cust_email="pankaj@yahoo.com"
我有这两个执行相同操作的sql查询,我的问题是给客户另一个名字选择数据的用途是什么?
答案 0 :(得分:3)
这就是所谓的别名。在您的情况下,它不是必需的。
当当前名称不方便,不确定或未知时(用于组功能),它用于使查询更容易。
用户强>
Id int (PK)
Name nvarchar(50)
<强>图书强>
Id int (PK)
UserId int (FK)
Name nvarchar(30)
现在,如果您查询两个表,它将是不明确的,因为名称相似。 在这里你可以使用别名:
SELECT u.Id as UserId, u.Name as UserName, b.Name AS BookName
FROM Users AS u
INNER JOIN Books AS b
ON u.Id = b.UserId
您将获得结果:
| UserId | UserName | BookName |
--------------------------------
| 1 | John | Book123 |
| 2 | Mark | BookXYZ |
etc...
如果您在具有相同名称的列上进行连接,则必须使用别名。否则,它将是一个错误的语法。
INNER JOIN Books ON Id = Id ???
群组功能命名。
例如,在具有类似函数的查询中。
SELECT COUNT(*) as RowsCount FROM Users
SELECT CONCAT(FirstName, " ", LastName, " ", MiddleName) as FullName FROM Users
您可以使用列别名设置名称并在SQL阅读器或其他位置访问它。
在某些情况下,它可以用于别名列以方便:
SELECT Id, HasUserEverBeenOnAHelpPage as Value FROM SomeTable
并获取
| UserId | Value |
------------------
| 1 | true |
| 2 | false |
而不是
| UserId | HasUserEverBeenOnAHelpPage |
---------------------------------------
| 1 | true |
| 2 | false |
这并不意味着它不能用于其他情况。有时,它甚至用于代码可读性和程序员的便利性:
SELECT u.Id,
u.FirstName,
u.LastName,
ua.City,
ua.AddressLine,
ua.PostalCode,
us.Language,
us.IsCookieEnabled,
lh.LastEnterDate
FROM Users as u
INNER JOIN UserAddresses as ua
ON ua.UserId = u.Id
INNER JOIN UserSettings as us,
ON us.UserId = u.Id
INNER JOIN LoginHistory as lh
ON lh.UserId = u.Id
在这种情况下,名称不是暧昧的,并且可以在没有别名的情况下轻松完成此查询。但是,使用它们更方便:
SELECT Users.Id,
Users.FirstName,
Users.LastName,
UserAddresses.City,
UserAddresses.AddressLine,
UserAddresses.PostalCode,
UserSettings.Language,
UserSettings.IsCookieEnabled,
LoginHistory.LastEnterDate
FROM Users
INNER JOIN UserAddresses
ON UserAddresses.UserId = Users.Id
INNER JOIN UserSettings
ON UserSettings .UserId = Users.Id
INNER JOIN LoginHistory
ON LoginHistory .UserId = Users.Id
在这里阅读更多:
http://www.w3schools.com/sql/sql_alias.asp
When to use SQL Table Alias
http://www.techonthenet.com/sql/alias.php
答案 1 :(得分:0)
在这种情况下,它没有任何区别 但是当您有一个使用多个表连接的查询时,使用表名的别名可以使查询更具可读性。 但是,我使用的命名约定会使别名表名称完全无用(除了多次连接同一个表时)。 You can read about it here.
从性能的角度来看,它不会改变任何东西。
答案 2 :(得分:0)
从单个表中查询时,实际上不需要使用别名(但最好习惯使用它。)
查询多个表,加入等时(特别是多次引用同一个表时),需要它。
$ awk -v RS= '/\[token]/ {f=1} f && gsub(/#provider/, "provider") {f=0}1' ORS='\n\n' file
[test]
#provider = keystone.token.providers.uuid.Provider
#driver = keystone.token.persistence.backends.sql.Token
#caching = true
#cache_time = <None>
[token]
provider = keystone.token.providers.uuid.Provider
#driver = keystone.token.persistence.backends.sql.Token
#caching = true
#cache_time = <None>
[trust]
#provider = keystone.token.providers.uuid.Provider
#driver = keystone.token.persistence.backends.sql.Token
#caching = true
#cache_time = <None>
此外,在嵌套选择中使用是明智的,特别是当多个表共享相同的列名时。这是为了确保您引用要引用的表中的列,而不是另一个列。
答案 3 :(得分:0)
可以有更多理由这样做。
答案 4 :(得分:0)
当您选择一个功能时,这些自定义名称(别名)很有用,例如
SELECT RTRIM(XMLAGG(XMLELEMENT(E, text, '').EXTRACT('//text()') ORDER BY line)
.GetClobVal(),
',')
FROM all_source t
WHERE owner = 'QA_OWNER'
AND NAME = 'PKG_PRJ_TEST_MANUAL';
这将返回一个包含愚蠢且有时无法预测的名称的列。例如,您将无法将其用作子查询。
例如,为您授予其他项目用户的视图中的列提供自定义名称也很不错。你的名字对他们来说可能毫无意义。
通常 - 别名可提高可读性。