Quel est le but du mot-clé SQL «AS»?

137

Vous pouvez définir des alias de table dans SQL en tapant l'identifiant juste après le nom de la table.

SELECT * FROM table t1;

Vous pouvez même utiliser le mot-clé ASpour indiquer l'alias.

SELECT * FROM table AS t1;

Quelle est la différence entre eux, le cas échéant?

Je vois que les anciens DBA ont tendance à écrire des déclarations sans AS, mais la plupart des nouveaux didacticiels l'utilisent.

Mise à jour: je sais à quoi servent les alias de table et de colonne. Je suis curieux de savoir quelle est la raison d'avoir un mot clé séparé pour définir des alias alors que cela fonctionne également sans lui.

viam0Zah
la source
12
From msdn.microsoft.com/en-us/library/ms179300.aspx La clause AS est la syntaxe définie dans la norme ISO pour l'attribution d'un nom à une colonne de jeu de résultats. Il s'agit de la syntaxe préférée à utiliser dans SQL Server 2005.
Adriaan Stander
3
Il est également utilisé pour séparer la déclaration d'une procédure avec son script. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Réponses:

134

Il n'y a aucune différence entre les deux déclarations ci-dessus. AS est juste une manière plus explicite de mentionner l'alias

Sachin Shanbhag
la source
10
En fait, il n'y a pas de différence dans SQL mais certains outils / bibliothèques dépendants peuvent dépendre de ce petit mot-clé. Par exemple: JDBC 4.0. En fonction de l'utilisation d'alias avec 'AS cause' et sans, vous recevrez un comportement différent - voir cette réponse stackoverflow.com/a/4271250/814304 . Je voudrais recommander TOUJOURS d'utiliser la forme complète de la sémantique pour éviter de tels problèmes.
iMysak
Puis-je avoir des alias pour plus d'une colonne? comme, deux colonnes avec des alias simples?
Deepak Keynes
@Keynes Oui. Il suffit de concaténer (||) les colonnes et de lui donner un alias, par exemple SELECT foo || bar AS foobar.
Rupert Madden-Abbott
Oui @ RupertMadden-Abbott, merci! mais j'ai attendu un peu longtemps, j'étais en termes de contexte.
Deepak Keynes du
L'alias dans select ne peut pas être utilisé dans la clause where mais dans from ... car X peut être utilisé dans la clause where
Muhammad Umer
38

Tous ceux qui ont répondu avant moi ont raison. Vous l'utilisez en quelque sorte comme nom de raccourci d'alias pour une table lorsque vous avez de longues requêtes ou des requêtes qui ont des jointures. Voici quelques exemples.

Exemple 1

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

Exemple 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

Exemple 3 C'est une bonne pratique d'utiliser le mot clé AS, et très recommandé, mais il est possible d'effectuer la même requête sans un (et je le fais souvent).

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

Comme vous pouvez le constater, j'ai omis le mot clé AS dans le dernier exemple. Et il peut être utilisé comme alias.

Exemple 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

Sortie de l'exemple 4

Product             Retail Price     Quantity Ordered
Blue Raspberry Gum  $10 pk/$50 Case  2 Cases
Twizzler            $5 pk/$25 Case   10 Cases
XstreamINsanity
la source
21

Lorsque vous ne savez pas quelle syntaxe choisir, surtout quand il ne semble pas y avoir grand-chose pour séparer les choix, consultez un livre sur l'heuristique. Autant que je sache, le seul livre heuristique pour SQL est 'Joe Celko's SQL Programming Style':

Un nom de corrélation est plus souvent appelé un alias, mais je serai formel. Dans SQL-92, ils peuvent avoir un ASopérateur optionnel , et il devrait être utilisé pour indiquer clairement que quelque chose est donné un nouveau nom. [p16]

De cette façon, si votre équipe n'aime pas la convention, vous pouvez blâmer Celko - je sais que je l'aime;)


UPDATE 1: IIRC pendant longtemps, Oracle n'a pas pris en charge le ASmot-clé (nom de corrélation précédent), ce qui peut expliquer pourquoi certains anciens ne l'utilisent pas habituellement.


MISE À JOUR 2: le terme «nom de corrélation», bien qu'utilisé par le standard SQL, est inapproprié. Le concept sous-jacent est celui d'une « variable de plage ».


MISE À JOUR 3: Je viens de relire ce que Celko a écrit et il se trompe: la table n'est pas renommée! Je pense maintenant:

Un nom de corrélation est plus souvent appelé un alias, mais je serai formel. En SQL standard, ils peuvent avoir un ASmot-clé facultatif, mais il ne doit pas être utilisé car il peut donner l'impression que quelque chose est renommé alors que ce n'est pas le cas. En fait, il devrait être omis pour appliquer le fait qu'il s'agit d'une variable de plage.

un jour quand
la source
12

Le ASmot clé est de donner un nom ALIAS à votre table de base de données ou à une colonne de table. Dans votre exemple, les deux déclarations sont correctes mais il y a des circonstances où la clause AS est nécessaire (bien que l' ASopérateur lui-même soit facultatif), par exemple

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

Dans ce cas, la Employeetable a une salarycolonne et nous voulons juste le double du salaire avec un nouveau nom Double Salary.

Désolé si mon explication n'est pas efficace.


Mise à jour en fonction de votre commentaire, vous avez raison, ma déclaration précédente était invalide. La seule raison à laquelle je peux penser est que la ASclause existe depuis longtemps dans le monde SQL pour laquelle elle a été incorporée dans les SGBDR de nos jours à des fins de compatibilité descendante.

Buhake Sindi
la source
3
Non, ASn'est pas nécessaire ou nécessaire même dans ce cas. Essayez SELECT 1 + 1 "result".
viam0Zah
6

L'utilisation est plus évidente si vous n'utilisez pas 'SELECT *' (ce qui est une mauvaise habitude dont vous devriez vous débarrasser):

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
Nicolas Knight
la source
1
Je sais à quoi servent les alias de table. Je suis curieux de savoir quelle est la raison d'avoir un mot-clé séparé pour définir des alias alors que cela fonctionne également sans lui.
viam0Zah
4

C'est une manière formelle de spécifier un nom de corrélation pour une entité afin que vous puissiez l'adresser facilement dans une autre partie de la requête.

Preet Sangha
la source
3

Dans ASce cas, il s'agit d'un mot clé facultatif défini dans ANSI SQL 92 pour définir un <<correlation name>, communément appelé alias pour une table.

<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>.

Il semble préférable de NE PAS utiliser le ASmot - clé pour les alias de table car il n'est pas pris en charge par un certain nombre de bases de données couramment utilisées.

Geert Bellekens
la source
Avez-vous des exemples de dbs qui n'utilisent pas le mot clé "as"?
D-Jones
3
Je pense qu'Oracle est l'un d'entre eux qui ne prend pas en charge le asmot - clé pour les alias de table.
Geert Bellekens
1
"Le mot clé AS est facultatif. L'alias renomme effectivement l'élément de la liste de sélection pendant la durée de la requête. L'alias peut être utilisé dans la clause order_by_clause mais pas dans les autres clauses de la requête." docs.oracle.com/cd/B28359_01/server.111/b28286/… . Aussi lié stackoverflow.com/a/8451257/1359796
HEDMON
2

Au début de SQL, il a été choisi comme solution au problème de la gestion des noms de colonne en double (voir la note ci-dessous).

Pour emprunter une requête à une autre réponse:

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

La colonne ProductID(et peut-être d'autres) est commune aux deux tables et comme la syntaxe de la condition de jointure nécessite une référence aux deux, la «qualification de point» permet de lever l'ambiguïté.

Bien sûr, la meilleure solution était de ne jamais avoir autorisé les noms de colonnes en double! Heureusement, si vous utilisez la nouvelle NATURAL JOINsyntaxe, le besoin des variables de plage Pet Odisparaît:

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

Mais pourquoi le ASmot - clé est-il facultatif? Mon souvenir d'une discussion personnelle avec un membre du comité de normalisation SQL (Joe Celko ou Hugh Darwen) était que leur souvenir était qu'au moment de la définition de la norme, le produit d'un fournisseur (Microsoft?) Nécessitait son inclusion et celui d'un autre fournisseur. produit (Oracle?) exigeait son omission, le compromis choisi était donc de le rendre facultatif. Je n'ai aucune citation pour cela, vous me croyez ou non!


Dans les premiers jours du modèle relationnel, le produit croisé (ou thêta-jointure ou équi-jointure) de relations dont les en-têtes ne sont pas disjoints semblait produire une relation avec deux attributs du même nom; La solution de Codd à ce problème dans son calcul relationnel était l'utilisation de la qualification de point, qui a ensuite été émulée en SQL (on s'est rendu compte plus tard que la jointure naturelle était primitive sans perte; c'est-à-dire que la jointure naturelle peut remplacer toutes les jointures thêta et même produit croisé.)

Source: Business System 12, Notes associées aux diapositives de la présentation donnée à l'atelier des implémenteurs de TTM, Université de Northumbria, 2-3 juin 2011 par Hugh Darwen

un jour quand
la source
"Bien sûr, la meilleure solution était de ne jamais avoir autorisé les noms de colonne en double en premier lieu!" - donc company.name et country.name ne devraient pas être autorisés? et si je joignais une table à elle-même? "Au début de SQL, il a été choisi ..." Avez-vous une référence pour cela / cette justification est-elle documentée quelque part?
Bob
@Bob J'ai mis à jour ma réponse avec une note (avec citation) de l'histoire de la qualification de point en SQL, plus mon souvenir vague, certes, de la raison pour laquelle le ASmot-clé est facultatif (pas de citation, évidemment!). Hugh a pris sa retraite il y a quelques années. Je pense que Celko pourrait être encore actif - ses souvenirs ajouteraient-ils du poids? Les preuves et la trace
écrite
"ses souvenirs ajouteraient-ils du poids?"; Inutile de déranger M. Celko; le doc BS12 a les propres mots de Darwen sur les lacunes de la qualification de point - les contraintes de mémoire des années 70 et les jointures répétées ne m'étaient pas venues à l'esprit. Je vais admettre qu'il semble très possible que l'aliasing soit transformé en SQL pour la même raison.
Bob le
0

Si vous concevez une requête à l'aide de l'éditeur de requête dans SQL Server 2012 par exemple, vous obtiendrez ceci:

  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')

Cependant, la suppression de l'AS ne fait aucune différence comme dans ce qui suit:

 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')

Dans ce cas, l'utilisation de l'AS est superflue mais dans de nombreux autres endroits, elle est nécessaire.

user2063329
la source