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


137

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

SELECT * FROM table t1;

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

SELECT * FROM table AS t1;

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

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

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


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

21

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

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

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


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


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


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

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


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 года.


«Конечно, лучшим решением было бы никогда не допускать дублирования имен столбцов!» - так что нельзя указывать 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 является излишним, но во многих других местах это необходимо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.