【问题标题】:In SQL, what is the letter after a table name in a select statement?在 SQL 中,select 语句中表名后面的字母是什么?
【发布时间】:2009-06-15 15:48:46
【问题描述】:

SELECT a.NAME, a.NUMBER, a.STRING, a.RDB$DB_KEY FROM ADMIN a

a 代表什么?

谢谢。

【问题讨论】:

    标签: sql


    【解决方案1】:

    a 是表 ADMIN

    的别名

    SQL Alias

    【讨论】:

    • 那么为什么不简单地从 AMDIN 中选择 NAME、NUMBER、STRING、RDB$DB_KEY 呢?
    • @Jack 这是一个完全有效的查询
    • @Jack:如果您引用两个表(例如 ADMIN_1、ADMIN_2)并且它们有共同的列(例如 NAME),那么您的 SELECT 必须区分这些表,以便知道哪一个从拉。所以使用 a.NAME 比 ADMIN_1.NAME 短。
    【解决方案2】:

    基本概念是“范围变量”。

    Chris Date 和 Hugh Darwen 认为口语术语“别名”和 SQL 标准的术语“相关名称”“不恰当”并且“严重 [歪曲] 真实情况”。

    Hugh Darwen, “SQL: A Comparative Survey”:

    你可能有 学习了一个不同的范围变量术语,Codd 在 他的早期论文,但直到 2003 年才被 SQL 标准采用。在 一些 SQL 文本它被称为别名,但这根本不合适, 真的,因为这意味着它是一个表名,因此 表示一个表而不是一行。 SQL 标准同样使用 不恰当的术语相关名称(它不表示相关, 不管是什么),但仅适用于名称为 明确给出(通过示例中的AS),而不是在以下情况下 一个简单的表名兼作范围变量名。在 SQL:2003 中 范围变量被用作一个方便的单一术语来涵盖 更一般的情况。

    C. J. Date, “SQL and Relational Theory: How to Write Accurate SQL Code”:

    关系模型中的范围变量是“范围 over" 某个表中的一组行(或某些表中的一组元组) 关系,更准确地说)。在 SQL 中,这些变量定义为 在 FROMJOIN,如下例:

    SELECT SX.SNO 
    FROM   S AS SX 
    WHERE  SX.STATUS > 15
    

    SX 这里是一个范围变量,其范围跨越表S;其他 也就是说,它的允许值是表S 的行。你可以想到 SELECT 表达式总体评估如下。第一的, 范围变量采用其允许值之一,例如行 对于供应商SNO = ‘S1’。该行中的状态值是否更大 超过 15?如果是,则供应商编号’S1’ 将出现在结果中。 接下来,范围变量移动到表S 的另一行,比如说 供应商行SNO = ‘S2’;再次,如果该行中的状态值 大于 15,则相关供应商编号出现在 结果。以此类推

    SQL 要求 SELECT 表达式始终为 根据范围变量制定;如果没有这样的变量 明确指定,它假定存在隐含的 与对应表同名

    警告:许多 SQL 文本 将范围变量名称(或相关名称)称为 别名,并且 将它们描述为好像它们只是表格的替代名称 它们的范围超过了。但这样的描述严重歪曲 真实的事态——事实上,它暴露出严重缺乏 了解真正发生的事情 - 并且强烈反对 该帐户。


    有趣的是,LINQ 可以正确识别范围变量,例如

    【讨论】:

      【解决方案3】:

      表 ADMIN 的别名。这里没有必要,因为您的查询中只有一个表。

      当你有多个表,并且某些列是相同的,那么你需要区分它们。一种方法是在列名前面写表名。例如,

      Select ADMIN.Name, person.name from ADMIN, person where person.id = admin.id
      

      为缩短此时间,请为表名添加别名。

      select a.Name, p.Name from ADMIN a, person p where person.id = admin.id
      

      【讨论】:

        【解决方案4】:

        A 是表的别名。

        您可以将 a 更改为任何有效的标识符,它不依赖于底层架构。 通常它用于区分不同表中的字段,节省您每次输入完整的表名(使 SQL 更容易阅读短别名)。

        您提供的示例中实际上并不需要它,

        SELECT NAME, NUMBER, STRING, RDB$DB_KEY FROM AMDIN
        

        应该也能正常工作

        【讨论】:

          【解决方案5】:

          查询使用类似这样的名称,这样您就不必编写 ADMIN.NAME、ADMIN.NUMBER 等。如果您的表上有 15 个字段并且您的表有一个类似 VPCPDEEE 的名称,它会变得非常一遍又一遍地输入相同的表名很烦人。

          【讨论】:

          • 读起来也很累——而且我们读代码的次数比写代码的次数多得多。别名增强了可读性。
          【解决方案6】:

          a 是所谓的表别名。在查询部分显示:

          FROM ADMIN a
          

          通过在表名后放置“a”,您创建了一个别名,现在可以使用该别名代替表名。如果没有别名,您将需要使用表的全名来完全限定您在查询中引用的列名。

          如果没有表别名,您的查询将如下所示:

          SELECT ADMIN.NAME, ADMIN.NUMBER, ADMIN.STRING, ADMIN.RDB$DB_KEY FROM ADMIN
          

          虽然您只是从单个表中选择列,但在此示例中实际上根本不需要表名(或别名)。

          【讨论】:

            【解决方案7】:

            A 是表 ADMIN 的简写符号(术语:别名

            【讨论】:

              【解决方案8】:

              a = 管理员

              等效:

              SELECT ADMIN.NAME, ADMIN.NUMBER, ADMIN.STRING, ADMIN.RDB$DB_KEY FROM ADMIN
              

              【讨论】:

                【解决方案9】:

                a 用作 ADMIN 表的别名。

                什么时候使用别名是正确的,别名应该采取什么形式可以引起sql作者的一些强烈意见。

                这里有几个关于这个主题的 stackoverflow 问题。

                When to use SQL Table Alias

                SQL Table Aliases - Good or Bad?

                【讨论】:

                  猜你喜欢
                  • 2010-10-18
                  • 2011-03-27
                  • 2014-10-05
                  • 2010-09-17
                  • 1970-01-01
                  • 1970-01-01
                  • 2021-07-17
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多