这些选择查询之间的差异

时间:2015-06-09 08:57:41

标签: mysql sql

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查询,我的问题是给客户另一个名字选择数据的用途是什么?

5 个答案:

答案 0 :(得分:3)

这就是所谓的别名。在您的情况下,它不是必需的。
当当前名称不方便,不确定或未知时(用于组功能),它用于使查询更容易。

  1. JOIN查询中具有暧昧的示例。我们有两张桌子:
  2. 用户

    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 ???
    
    1. 群组功能命名。
      例如,在具有类似函数的查询中。

      SELECT COUNT(*) as RowsCount FROM Users
      SELECT CONCAT(FirstName, " ", LastName, " ", MiddleName) as FullName FROM Users
      
    2. 您可以使用列别名设置名称并在SQL阅读器或其他位置访问它。

      1. 在某些情况下,它可以用于别名列以方便:

        SELECT Id, HasUserEverBeenOnAHelpPage as Value FROM SomeTable
        
      2. 并获取

        | 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)

可以有更多理由这样做。

  1. 它可以使查询更具可读性。
  2. 当你进行自我加入时,你必须给每张桌子一个唯一的名字。

答案 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';

这将返回一个包含愚蠢且有时无法预测的名称的列。例如,您将无法将其用作子查询。
例如,为您授予其他项目用户的视图中的列提供自定义名称也很不错。你的名字对他们来说可能毫无意义。

通常 - 别名可提高可读性。