Яке призначення ключового слова SQL “AS”?


137

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

SELECT * FROM table t1;

Ви навіть можете використовувати ключове слово ASдля позначення псевдоніма.

SELECT * FROM table AS t1;

Яка різниця між ними, якщо така є?

Я бачу, що старі люди DBA прагнуть писати заяви без AS, але більшість нових навчальних посібників використовують це.

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


12
З msdn.microsoft.com/en-us/library/ms179300.aspx Стаття AS - це синтаксис, визначений у стандарті ISO для присвоєння імені стовпцю набору результатів. Це кращий синтаксис для використання в SQL Server 2005.
Адріан Стандер

3
Він також використовується для відокремлення декларації процедури зі своїм сценарієм. CREATE PROC Test @Param1 INT AS SELECT @Param1
Том "Блакитний" Піддон

Відповіді:


134

Немає різниці між обома твердженнями вище. AS - лише більш чіткий спосіб згадування псевдоніма


10
Насправді в SQL немає різниці, але деякі невеликі ключові слова можуть залежати від деяких інструментів / бібліотек. Наприклад: JDBC 4.0. Залежно від використання псевдонімів, які не спричиняють причину, а також без поведінки, ви отримаєте різну поведінку - див. Цю відповідь stackoverflow.com/a/4271250/814304 . Я хотів би рекомендувати ЗАВЖДИ використовувати повну семантичну форму, щоб уникнути подібних питань.
iMysak

Чи можу я мати псевдоніми для більше одного стовпця? як, два стовпці з одинарними псевдонімами?
Діпак Кейнс

@Keynes Так. Просто з'єднайте стовпці (||) і надайте йому псевдонім, наприклад SELECT foo || бар AS foobar.
Руперт Мадден-Абботт

Так @ RupertMadden-Abbott, дякую! але я довго чекала, я була з точки зору контексту.
Діпак Кейнс

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 Joe Celko»:

Ім’я кореляції частіше називають псевдонімом, але я буду формальним. У SQL-92 вони можуть мати необов'язковий ASоператор, і його слід використовувати, щоб зрозуміти, що щось присвоюється новій назві. [p16]

Таким чином, якщо вашій команді не подобається конвенція, ви можете звинувачувати Челько - я знаю, що я роблю;)


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


ОНОВЛЕННЯ 2: термін "ім'я кореляції", хоча він використовується стандартом SQL, є недоречним. В основі лежить концепція ' змінної діапазону '.


ОНОВЛЕННЯ 3: Я просто перечитав те, що написав Селко, і він помиляється: таблицю не перейменовують! Я зараз думаю:

Ім’я кореляції частіше називають псевдонімом, але я буду формальним. У стандартному 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 для визначення a <<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ключове слово для псевдонімів таблиці, оскільки воно не підтримується низкою часто використовуваних баз даних.


Чи є у вас приклади dbs, які не використовують ключове слово "as"?
D-Jones

3
Я вважаю, Oracle - один із них, який не підтримує asключове слово для псевдонімів таблиці.
Geert Bellekens

1
"Ключове слово AS необов'язкове. Псевдонім ефективно перейменовує елемент списку вибору протягом тривалості запиту. Псевдонім може бути використаний у order_by_clause, але не в інших пунктах запиту." docs.oracle.com/cd/B28359_01/server.111/b28286 / ... . Крім того, пов'язані stackoverflow.com/a/8451257/1359796
HEDMON

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 (згодом було зрозуміло, що так зване природне з'єднання примітивне без втрат; тобто природне з'єднання може замінити всі тета-приєднання та рівний перехресний продукт.)

Джерело: Бізнес-система 12, Примітки, викладені на слайдах презентації, представлених на семінарі для виконавців TTM, Університет Нортумбрія, 2-3 червня 2011 року Х'ю Дарвен


"Звичайно, кращим рішенням було ніколи в першу чергу не було дозволено повторювати назви стовпців!" - значить, не слід дозволяти ім'я компанії.імена і країни? а що робити, якщо я приєднав до себе стіл? "У перші дні SQL його вибирали ..." у вас є посилання на це / чи це обґрунтування десь задокументоване?
Боб

@Bob Я оновив свою відповідь приміткою (із цитуванням) історії крапкової кваліфікації в SQL, а також моїм невиразним спогадом про те, чому ASключове слово необов’язкове (цитування, очевидно, не потрібно!). Х'ю вийшов на пенсію кілька років тому. Я думаю, що Селько може все ще бути активним - додали б його спогади вагу? Доказів і паперових слідів просто не існує :(
день, коли

"додали б його спогади вагу?"; Не потрібно турбувати пана Целька; BS12 doc має власні слова Дарвена про недоліки точкової кваліфікації - обмеження пам’яті 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')

У цьому випадку використання АС зайве, але в багатьох інших місцях воно необхідне.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.