“AS”在SQL中意味着什么?

时间:2017-03-20 17:14:42

标签: sql postgresql relational-database

以下是PostgreSQL documentationSELECT的概要。在我看来,有时我们写<expression> AS <name>,有时写<name> AS <expression>。在普通英语中,我倾向于认为<expression> AS <name>更为常见(例如“请将她称为。史密斯博士,请。,我无法理解如何思考{{ 1}}。

  1. 我们如何区分使用<name> AS <expression><name> AS <expression>的位置?
  2. 每个最简单的例子是什么?
  3. 在普通语言中是否存在各种相似之处,这样可以直观地显示何时使用什么?
  4. <expression> as <name>

2 个答案:

答案 0 :(得分:2)

我喜欢这个问题。

以下是我如何看待它以及如何向人们解释它,希望它有所帮助:

让我们从<expression> as <name>开始吧。现实生活中最简单的比喻是缩写。它的创建是为了使代码更清晰,更易于阅读并且更简单。让我们想象一个场景:我们的数据库中有来自麻省理工学院以及马萨诸塞州汽车部门的所有学生的数据,我们希望找到有学生资料的学生超速罚单和他们支付的金额。

SELECT
    government.SocialSecurityAdministration.FirstName,
    government.SocialSecurityAdministration.LastName,
    education.MasachusettsInstituteOfTechnology.Faculty
    government.DepartmentOfMotorVehiclesTickets.TicketTotal,
    government.SocialSecurityAdministration.SocialSecurityNumber
FROM
    education.MasachusettsInstituteOfTechnology
    INNER JOIN government.DepartmentOfMotorVehiclesTickets ON education.MasachusettsInstituteOfTechnology.SocialSecurityNumber = government.DepartmentOfMotorVehicles.SocialSecurityNumber
    INNER JOIN government.SocialSecurityAdministration ON government.DepartmentOfMotorVehicles.SocialSecurityNumber = government.SocialSecurityAdministration.SocialSecurityNumber
看起来很难看,不是吗?在现实生活中,我们将麻省理工学院缩写为麻省理工学院,并将机动车系缩写为 DMV 。我不知道社会保障管理局的官方缩写(但我们可以提出一个)虽然我们说 SSN 当我们指的是社会安全号码时。让我们实现这个想法:

SELECT
        ssnAdm.FirstName,
        ssnAdm.LastName,
        ssnAdm.Faculty
        dmv.TicketTotal,
        ssnAdm.SocialSecurityNumber AS ssn
    FROM
        education.MasachusettsInstituteOfTechnology AS mit
        INNER JOIN government.DepartmentOfMotorVehiclesTickets AS dmv ON mit.SocialSecurityNumber = dmv.SocialSecurityNumber
        INNER JOIN government.SocialSecurityAdministration AS ssAdm ON dmv.SocialSecurityNumber = dmv.SocialSecurityNumber

现在看起来更好,不是吗?

现在到<name> as <expression>部分。这样做是为了简化代码以及一些性能优化,但现在我们将重点放在简化上。使用我上面使用的相同示例,您可能想要/询问以下内容:“对于已收到票证的每个MIT学生,我需要知道他们的SSN的最后4位数字,他们的姓氏,他们的银行帐户中的金额和他们的最后一次VISA交易金额“。 是的,您为CIA工作。

让我们写下来:

SELECT
    RIGHT(4,ts.ssn) as LastFourDigitsSsn,
    ts.LastName,
    bad.TotalAmount,
    ISNULL(visa.TransactionAmt,'Student uses MasterCard') AS VisaTransaction
FROM
    (SELECT
        ssnAdm.FirstName,
        ssnAdm.LastName,
        ssnAdm.Faculty
        dmv.TicketTotal,
        ssnAdm.SocialSecurityNumber AS ssn
    FROM
        education.MasachusettsInstituteOfTechnology AS mit
        INNER JOIN government.DepartmentOfMotorVehiclesTickets AS dmv ON mit.SocialSecurityNumber = dmv.SocialSecurityNumber
        INNER JOIN government.SocialSecurityAdministration AS ssAdm ON dmv.SocialSecurityNumber = dmv.SocialSecurityNumber
    ) AS ts
    INNER JOIN business.BankAccountsData AS bad ON ts.ssn = bad.SocialSecurityNumber
    OUTER APPLY (SELECT TOP 1 TransactionAmt FROM business.VisaProcessingData vpd WHERE vpd.BankAccountID = bad.ID ORDER BY TransactionDateTime DESC) as visa
嗯,看起来又丑陋了。但是,如果我们稍微简化它并在实际陈述之外表达某些事情呢?那是<name> as <expression>进来的时候。让我们这样做:

WITH MitTicketedStudents AS (
    SELECT
        ssnAdm.LastName,
        ssnAdm.SocialSecurityNumber as ssn,
        RIGHT(4,ssnAdm.SocialSecurityNumber) as LastFourDigitsSsn
    FROM
        education.MasachusettsInstituteOfTechnology AS mit
        INNER JOIN government.DepartmentOfMotorVehiclesTickets AS dmv ON mit.SocialSecurityNumber = dmv.SocialSecurityNumber
        INNER JOIN government.SocialSecurityAdministration AS ssAdm ON dmv.SocialSecurityNumber = dmv.SocialSecurityNumber
),
LatestVisaTransactions AS (
    SELECT DISTINCT
        BankAccountID,
        FIRST_VALUE(TransactionAmt) OVER (PARTITION BY BankAccountId ORDER BY TransactionDateTime DESC) as TransactionAmt
    FROM
        business.VisaProcessingData
)

-- And let's use our expressions now

SELECT
    mts.LastFourDigitsSsn,
    mts.LastName,
    bad.TotalAmount,
    ISNULL(lvt.TransactionAmt,'Student uses MasterCard') AS VisaTransaction
FROM
    MitTicketedStudents mts
    INNER JOIN business.BankAccountsData AS bad ON mts.ssn = bad.SocialSecurityNumber
    LEFT OUTER JOIN LatestVisaTransactions lvt ON bad.ID = lvt.BankAccountID;

看起来更好,不是吗?

结论:当您想要使用<name> as <expression>分隔代码时,如果您想使用别名来简化代码,请使用<expression> as <name>

答案 1 :(得分:1)

重要的是它出现在哪里。

mytable:
mycolumn myothercolumn
----------------------
       1             a
       2             b

SELECT myrow.mycolumn * 2 AS mylabel
FROM (SELECT * FROM mytable) AS myrow
WHERE myrow.mycolumn > 1

mylabel
-------
      4

在SELECT中,我们引用表达式AS的值作为一些输出列名(&#34;列别名&#34;)。在FROM中,我们引用(一个典型的行)表达式AS值的某个名称(&#34;表别名&#34;,&#34;相关名称&#34;)。

(事实证明,如果我们在SELECT子句中使用AS但不在FROM子句中使用AS,那么由于语法错误的细节问题较少。)

AS还有其他用途。上下文也决定了它们的含义,它们也对应于使用名称来引用某些内容。

在技术背景下,根据技术术语的日常含义,尝试理解某些东西的含义,包括理解一个基于其名称的东西,结果证明没有帮助。 SQL语言设计师[原文如此]并没有选择始终拥有<expression> AS <name><name> AS <expression>。就是这样。这就是你如何写东西让你的程序做东西。 (接受但更现代的计算机语言设计原则确实建议使用更经常的符号。)