Какова цель ключевого слова SQL «AS»?

137

Вы можете установить псевдонимы таблиц в SQL, вводя идентификатор сразу после имени таблицы.

SELECT * FROM table t1;

Вы даже можете использовать ключевое слово, ASчтобы указать псевдоним.

SELECT * FROM table AS t1;

Какая разница между ними, если таковые имеются?

Я вижу, что старые администраторы баз данных, как правило, пишут заявления без AS, но большинство новых руководств используют его.

Обновление: я знаю, каково назначение псевдонимов таблиц и столбцов. Мне любопытно, в чем причина наличия отдельного ключевого слова для установки псевдонимов, хотя оно работает и без него.

viam0Zah
источник
12
От msdn.microsoft.com/en-us/library/ms179300.aspx Предложение AS - это синтаксис, определенный в стандарте ISO для назначения имени столбцу набора результатов. Это предпочтительный синтаксис для использования в SQL Server 2005.
Adriaan Stander,
3
Он также используется для разделения объявления процедуры и ее сценария. CREATE PROC Test @Param1 INT AS SELECT @Param1
Том Блю Пиддок

Ответы:

134

Там нет никакой разницы между обоими утверждениями выше. AS - это просто более явный способ упоминания псевдонима.

Сачин Шанбхаг
источник
10
На самом деле нет никакой разницы в SQL, но некоторые зависимые инструменты / библиотеки могут зависеть от этого небольшого ключевого слова. Как пример: JDBC 4.0. В зависимости от использования псевдонимов с / как причина и без, вы получите различное поведение - см. Этот ответ stackoverflow.com/a/4271250/814304 . Я хотел бы рекомендовать ВСЕГДА использовать полную форму семантики, чтобы избежать таких проблем.
iMysak
Могу ли я иметь псевдонимы для более чем одного столбца? типа две колонки с одинаковыми псевдонимами?
Дипак Кейнс
@ Кейнс Да. Просто объедините (||) столбцы, а затем присвойте ему псевдоним, например, SELECT foo || Бар, как Foobar.
Руперт Мэдден-Эбботт
Да @ RupertMadden-Abbott, спасибо! но я ждал немного долго, я был с точки зрения контекста.
Дипак Кейнс
Псевдоним в select нельзя использовать в предложении where, но в from ... как X можно использовать в предложении where
Мухаммед Умер
38

Каждый, кто ответил до меня, прав. Вы используете его как псевдоним для таблицы, если у вас есть длинные запросы или запросы, которые имеют соединения. Вот пара примеров.

Пример 1

SELECT P.ProductName,
       P.ProductGroup,
       P.ProductRetailPrice
FROM   Products AS P

Пример 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

Пример 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

Как вы можете сказать, в последнем примере я пропустил ключевое слово 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

Выход из примера 4

Product             Retail Price     Quantity Ordered
Blue Raspberry Gum  $10 pk/$50 Case  2 Cases
Twizzler            $5 pk/$25 Case   10 Cases
XstreamINsanity
источник
21

Если вы не уверены, какой синтаксис выбрать, особенно когда кажется, что разделить выбор не так уж и много, обратитесь к книге по эвристике. Насколько я знаю, единственная книга по эвристике для SQL - это «Стиль программирования Джо Селко для SQL»:

Имя корреляции чаще называют псевдонимом, но я буду формальным. В SQL-92 они могут иметь необязательный ASоператор, и его следует использовать, чтобы прояснить, что что-то получает новое имя. [р16]

Таким образом, если ваша команда не любит съезд, вы можете обвинить Челко - я знаю, что мне нравится;)


ОБНОВЛЕНИЕ 1: IIRC в течение длительного времени, Oracle не поддерживал ASключевое слово (имя предшествующей корреляции), которое может объяснить, почему некоторые старые таймеры не используют его как обычно.


ОБНОВЛЕНИЕ 2: термин «имя корреляции», хотя и используется стандартом SQL, неуместен. Основополагающим понятием является понятие « переменной диапазона ».


ОБНОВЛЕНИЕ 3: Я просто перечитал то, что написал Celko, и он не прав: таблица не переименовывается! Теперь я думаю:

Имя корреляции чаще называют псевдонимом, но я буду формальным. В стандартном SQL они могут иметь необязательное ASключевое слово, но его не следует использовать, поскольку это может создать впечатление, что что-то переименовывается, когда это не так. Фактически, это должно быть опущено для обеспечения того, что это переменная диапазона.

onedaywhen
источник
12

ASКлючевое слово, чтобы дать ALIAS имя таблицы базы данных или столбец таблицы. В вашем примере оба утверждения верны, но существуют обстоятельства, когда требуется предложение AS (хотя сам ASоператор является необязательным), например

SELECT salary * 2 AS "Double salary" FROM employee;

В этом случае в Employeeтаблице есть salaryстолбец, и мы просто хотим получить двойную зарплату с новым именем Double Salary.

Извините, если мое объяснение неэффективно.


Обновление на основе вашего комментария, вы правы, мое предыдущее утверждение было недействительным. Единственная причина, по которой я могу придумать, состоит в том, что это ASпредложение давно существует в мире SQL, которое было включено в современные RDMS для обратной совместимости.

Бухаке синди
источник
3
Нет, ASне требуется или нужно даже в этом случае. Попробуй SELECT 1 + 1 "result".
viam0Zah
6

Использование становится более очевидным, если вы не используете «SELECT *» (что является плохой привычкой, из которой следует отказаться):

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
Николас Найт
источник
1
Я знаю, какова цель псевдонимов таблиц. Мне любопытно, в чем причина наличия отдельного ключевого слова для установки псевдонимов, хотя оно работает и без него.
viam0Zah
4

Это формальный способ задания имени корреляции для сущности, чтобы вы могли легко обратиться к нему в другой части запроса.

Прит Сангха
источник
3

ASВ этом случае является необязательным ключевым словом определено в ANSI SQL 92 , чтобы определить <<correlation name>, широко известный как псевдоним для таблицы.

<table reference> ::=
            <table name> [ [ AS ] <correlation name>
                [ <left paren> <derived column list> <right paren> ] ]
          | <derived table> [ AS ] <correlation name>
                [ <left paren> <derived column list> <right paren> ]
          | <joined table>

     <derived table> ::= <table subquery>

     <derived column list> ::= <column name list>

     <column name list> ::=
          <column name> [ { <comma> <column name> }... ]


     Syntax Rules

     1) A <correlation name> immediately contained in a <table refer-
        ence> TR is exposed by TR. A <table name> immediately contained
        in a <table reference> TR is exposed by TR if and only if TR
        does not specify a <correlation name>.

Лучше не использовать ASключевое слово для псевдонимов таблиц, так как оно не поддерживается рядом широко используемых баз данных.

Герт Беллекенс
источник
У вас есть примеры БД, которые не используют ключевое слово «как»?
D-Jones
3
Я считаю, что Oracle является одним из них, который не поддерживает asключевое слово для псевдонимов таблиц.
Герт Беллекенс
1
«Ключевое слово AS является необязательным. Псевдоним эффективно переименовывает элемент списка выбора на время запроса. Псевдоним может использоваться в order_by_clause, но не в других разделах запроса». docs.oracle.com/cd/B28359_01/server.111/b28286/… . Также связано stackoverflow.com/a/8451257/1359796
ХЕДМОН
2

На заре SQL он был выбран в качестве решения проблемы того, как обращаться с дублирующимися именами столбцов (см. Примечание ниже).

Чтобы заимствовать запрос из другого ответа:

SELECT P.ProductName,
       P.ProductRetailPrice,
       O.Quantity
  FROM Products AS P
       INNER JOIN Orders AS O ON O.ProductID = P.ProductID
 WHERE O.OrderID = 123456

Столбец ProductID(и, возможно, другие) является общим для обеих таблиц, и поскольку синтаксис условия соединения требует ссылки на обе таблицы, «точечная квалификация» обеспечивает устранение неоднозначности.

Конечно, лучшим решением было бы никогда не допускать дублирования имен столбцов! К счастью, если вы используете более новый NATURAL JOINсинтаксис, необходимость в переменных диапазона Pи Oуходит:

SELECT ProductName, ProductRetailPrice, Quantity
  FROM Products NATURAL JOIN Orders
 WHERE OrderID = 123456

Но почему ASключевое слово необязательно? Моя личная беседа с членом комитета по стандартизации SQL (Джо Селко или Хью Дарвеном) состояла в том, что их воспоминания заключались в том, что на момент определения стандарта продукт одного поставщика (Microsoft?) Требовал его включения, а другого - поставщика. продукт (Oracle?) требовал его упущения, поэтому выбранный компромисс состоял в том, чтобы сделать его необязательным. Я не цитирую это, вы либо верите мне, либо нет!


В первые дни реляционной модели перекрестное произведение (или тэта-соединение или равное соединение) отношений, заголовки которых не являются непересекающимися, создавало отношение с двумя атрибутами с одинаковым именем; Решением этой проблемы Кодд в своем реляционном исчислении было использование точечной квалификации, которая впоследствии была эмулирована в SQL (позже стало понятно, что так называемое естественное соединение было примитивным без потерь; то есть естественное соединение может заменить все тета-объединения и даже перекрестный продукт.)

Источник: Business System 12, примечания к слайдам презентации, представленной Хью Дарвеном на семинаре для разработчиков TTM, Университет Нортумбрии, 2-3 июня 2011 года.

onedaywhen
источник
«Конечно, лучшим решением было бы никогда не допускать дублирования имен столбцов!» - так что нельзя указывать company.name и country.name? а что если я присоединяюсь к самому столу? «На заре SQL он был выбран ...» У вас есть ссылка на это / это обоснование где-то задокументировано?
Боб
@Bob Я обновил свой ответ запиской (с цитатой) истории квалификации точек в SQL, плюс мое, по общему признанию, смутное воспоминание о том, почему ASключевое слово является необязательным (очевидно, без цитирования!). Хью ушел на пенсию несколько лет назад. Я думаю, что Celko мог бы все еще быть активным - его воспоминания добавят вес? Доказательств и следов бумаги просто не существует :(
onedaywhen
"его воспоминания прибавят в весе?"; Не нужно беспокоить мистера Селко; у документа BS12 есть собственные слова Дарвена о недостатках точечной квалификации - ограничения памяти 70-х и повторные объединения мне не приходили в голову. Я признаю, что, по той же причине, представляется весьма вероятным использование псевдонимов в SQL.
Боб
0

Например, если вы разрабатываете запрос с использованием редактора запросов в SQL Server 2012, вы получите следующее:

  SELECT        e.EmployeeID, s.CompanyName, o.ShipName
FROM            Employees AS e INNER JOIN
                         Orders AS o ON e.EmployeeID = o.EmployeeID INNER JOIN
                         Shippers AS s ON o.ShipVia = s.ShipperID
WHERE        (s.CompanyName = 'Federal Shipping')

Однако удаление AS не имеет никакого значения, как в следующем:

 SELECT        e.EmployeeID, s.CompanyName, o.ShipName
FROM            Employees e INNER JOIN
                         Orders o ON e.EmployeeID = o.EmployeeID INNER JOIN
                         Shippers s ON o.ShipVia = s.ShipperID
WHERE        (s.CompanyName = 'Federal Shipping')

В этом случае использование AS является излишним, но во многих других местах это необходимо.

user2063329
источник