SQL anahtar kelimesi “AS” nin amacı nedir?


137

Tablo adından hemen sonra tanımlayıcı yazarak SQL'de tablo diğer adlarını ayarlayabilirsiniz.

SELECT * FROM table t1;

ASTakma adı belirtmek için anahtar kelimeyi bile kullanabilirsiniz .

SELECT * FROM table AS t1;

Varsa aralarındaki fark nedir?

Eski DBA'lıların ifadesiz yazma eğiliminde olduklarını görüyorum AS, ancak yeni eğiticilerin çoğu bunu kullanıyor.

Güncelleme: Tablo ve sütun takma adlarının amacının ne olduğunu biliyorum. Merak ediyorum, takma adları olmadan da takma ad ayarlamak için ayrı bir anahtar kelimeye sahip olmanın nedeni nedir?


12
Gönderen msdn.microsoft.com/en-us/library/ms179300.aspx AS yantümce sonuç kümesi sütununda bir isim atamak için ISO standardında tanımlanan sözdizimi. Bu, SQL Server 2005'te kullanmak için tercih edilen sözdizimidir.
Adriaan Stander

3
Ayrıca, bir prosedürün bildirimini koduyla ayırmak için de kullanılır. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Yanıtlar:


134

Yukarıdaki her iki ifade arasında fark yoktur. AS, takma addan bahsetmenin daha açık bir yoludur


10
Aslında, SQL'de bir fark yoktur, ancak bazı bağımlı araçlar / kütüphaneler bu küçük anahtar kelimeye bağlı olabilir. Örneğin: JDBC 4.0. 'AS nedeni' ve w / o takma adları kullanmaya bağlı olarak farklı davranışlar alacaksınız - bu cevaba bakınız stackoverflow.com/a/4271250/814304 . Bu tür sorunlardan kaçınmak için DAİMA tam anlambilim biçimini kullanmanızı tavsiye ederim.
iMysak

Birden fazla sütun için takma ad alabilir miyim? mesela, tek takma adları olan iki sütun?
Deepak Keynes

@Keynes Evet. Sütunları birleştirin (||) ve sonra bir takma ad verin, örneğin SELECT foo || çubuk AS foobar.
Rupert Madden-Abbott

Evet @ RupertMadden-Abbott, teşekkürler! ama biraz bekledim, bağlam anlamındaydım.
Deepak Keynes

Seçili takma ad yan tümcesinde kullanılamaz, ancak ... yan tümcesinde X kullanılabilir
Muhammed Umer

38

Benden önce cevap veren herkes doğrudur. Birleştirilmiş uzun sorgularınız veya sorgularınız olduğunda tablo için bir diğer ad kısayol adı olarak kullanırsınız. İşte birkaç örnek.

örnek 1

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

ÖRNEK 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

Örnek 3 AS anahtar sözcüğünü kullanmak iyi bir uygulamadır ve çok önerilir, ancak aynı sorguyu bir tane olmadan da yapmak mümkündür (ve sık sık yaparım).

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

Anlayacağınız gibi, son örnekte AS anahtar kelimesini hariç tuttum. Ve takma ad olarak kullanılabilir.

Örnek 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

Örnek 4 Çıktısı

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

21

Hangi sözdizimini seçeceğinizden emin değilseniz, özellikle seçenekleri ayıracak fazla bir şey olmadığında, buluşsal yöntem hakkında bir kitaba başvurun. Bildiğim kadarıyla, SQL için tek sezgisel tarama kitabı 'Joe Celko'nun SQL Programlama Stili':

Bir korelasyon adı daha çok takma ad olarak adlandırılır, ancak resmi olacağım. SQL-92'de isteğe bağlı bir ASişleve sahip olabilirler ve bir şeyin yeni bir ad verildiğini açıkça belirtmek için kullanılmalıdır. [P16]

Bu şekilde, eğer ekibiniz sözleşmeyi sevmezse, Celko'yu suçlayabilirsiniz - biliyorum biliyorum;)


GÜNCELLEME 1: IIRC uzun bir süre boyunca, Oracle AS(eski korelasyon adı) anahtar kelimesini desteklemedi; bu, bazı eski zamanlayıcıların neden alışılmış şekilde kullanmadığını açıklayabilir.


GÜNCELLEME 2: SQL Standardı tarafından kullanılmasına rağmen 'korelasyon adı' terimi uygun değildir. Temel kavram, bir ' aralık değişkeni''dir .


GÜNCELLEME 3: Celko'nun yazdıklarını tekrar okudum ve o yanlış: tablo yeniden adlandırılmıyor! Şimdi düşünüyorum:

Bir korelasyon adı daha çok takma ad olarak adlandırılır, ancak resmi olacağım. Standart SQL'de isteğe bağlı bir ASanahtar kelimeye sahip olabilirler, ancak kullanılmaması gerekir, çünkü bir şeyin olmadığı zaman yeniden adlandırıldığı izlenimini verebilir. Aslında, bir aralık değişkeni olduğu noktasını zorlamak gerekir.


12

ASAnahtar kelimenin vermektir ALIAS veritabanı tabloya veya tablo sütununa ad. Örneğinizde, her iki ifade de doğrudur ancak AS yantümcesinin gerekli olduğu durumlar vardır ( ASoperatörün kendisi isteğe bağlı olsa da ), ör.

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

Bu durumda, Employeetablonun bir salarysütunu vardır ve maaşın iki katını yeni bir adla istiyoruz Double Salary.

Açıklamam etkili değilse üzgünüm.


Yorumunuza dayanarak güncelleme yapın, haklısınız, önceki bildirimim geçersizdi. Düşünebilmemin tek nedeni, ASmaddenin günümüzde RDMS'ye geriye dönük uyumluluk için dahil edildiği SQL dünyasında uzun süredir var olmasıdır.


3
Hayır, ASbu durumda bile gerekli veya gerekli değildir. Deneyin SELECT 1 + 1 "result".
viam0Zah

6

'SELECT *' kullanmamanız durumunda (bu, kurtulmanız gereken kötü bir alışkanlıktır) kullanım daha açıktır:

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...

1
Tablo takma adlarının amacının ne olduğunu biliyorum. Merak ediyorum, takma adları olmadan da takma ad ayarlamak için ayrı bir anahtar kelimeye sahip olmanın nedeni nedir?
viam0Zah

4

Bir varlık için bir korelasyon adı belirtmenin resmi bir yoludur, böylece onu sorgunun başka bir bölümünde kolayca ele alabilirsiniz.


3

ASBu durumda tanımlanan isteğe bağlı bir anahtar kelime ANSI SQL 92 bir tanımlamak için <<correlation name>yaygın olarak bilinen, diğer adı için bir tablo.

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

ASSık kullanılan bir dizi veritabanı tarafından desteklenmediği için anahtar kelime tablo takma adları için KULLANILMAMASI iyi bir uygulama gibi görünüyor .


'As' anahtar kelimesini kullanmayan dbs örnekleriniz var mı?
D-Jones

3
Oracle'ın astablo takma adları için anahtar kelimeyi desteklemeyenlerden biri olduğuna inanıyorum .
Geert Bellekens

1
"AS anahtar sözcüğü isteğe bağlıdır. Takma ad, sorgu süresi boyunca seçim listesi öğesini etkili bir şekilde yeniden adlandırır. Takma ad, order_by_clause içinde kullanılabilir, ancak sorgudaki diğer tümceleri kullanamaz." docs.oracle.com/cd/B28359_01/server.111/b28286/… . Ayrıca ilgili stackoverflow.com/a/8451257/1359796
HEDMON

2

SQL'in ilk günlerinde, yinelenen sütun adlarıyla nasıl başa çıkılacağı sorununa çözüm olarak seçildi (aşağıdaki nota bakın).

Bir soruyu başka bir yanıttan ödünç almak için:

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

Sütun ProductID(ve muhtemelen diğerleri) her iki tablo için ortaktır ve birleştirme koşulu sözdizimi her ikisine de referans gerektirdiğinden, 'nokta kalifikasyonu' netleştirme sağlar.

Tabii ki, daha iyi bir çözüm asla ilk etapta yinelenen sütun adlarına izin vermemekti! Eğer yeni kullanırsanız mutlu ki, NATURAL JOINsözdizimi, aralık değişkenleri için ihtiyaç Pve Ouzağa gider:

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

Peki ASanahtar kelime neden isteğe bağlıdır? SQL standart komitesi üyesi ile kişisel tartışmadan Hatırladığım (ya Joe Celko veya Hugh Darwen) olmasıydı onların hatırlama (Microsoft'un?) Alınması yönünde gerekli bir satıcının ürünü standardını tanımlama zaman ve başka bir satıcının de o oldu ürün (Oracle'ın?) atlanmasını gerektirdi, bu nedenle seçilen uzlaşma onu isteğe bağlı hale getirmekti. Bunun için bir alıntım yok, ya bana inan ya da inanma!


İlişkisel modelin ilk günlerinde, başlıkları ayrık olmayan ilişkilerin çapraz çarpımı (veya teta-birleşim veya eşit-birleşim) aynı ismin iki niteliği ile bir ilişki oluşturduğu ortaya çıktı; Codd'un ilişkisel analizindeki bu soruna çözümü, daha sonra SQL'de taklit edilen nokta kalifikasyonunun kullanılmasıydı (daha sonra doğal birleştirmenin kayıpsız ilkel olduğu fark edildi; yani, doğal birleştirmenin tüm teta birleşimlerinin yerini alabileceği ve hatta çapraz ürün.)

Kaynak: Business System 12, TTM Uygulayıcıları Atölyesi, Northumbria Üniversitesi'nde verilen sunumun slaytlarına not veren notlar, 2-3 Haziran 2011, Hugh Darwen


"Tabii ki, en iyi çözüm hiçbir zaman ilk etapta yinelenen sütun adlarına izin vermemektir!" ve ya kendime bir masaya katılmış olsaydım? "SQL'in ilk günlerinde seçildi ..." bunun için bir referansınız var mı / bu mantık bir yerde belgelenmiş mi?
Bob

@Bob, cevabımı SQL'de nokta kalifikasyon geçmişinin bir notuyla (alıntı ile) güncelledim, ayrıca ASanahtar kelimenin neden isteğe bağlı olduğu konusunda açık bir şekilde hatırladığım (alıntı yok, açıkçası!). Hugh birkaç yıl önce emekli oldu. Bence Celko hala aktif olabilir - hatıraları kilo verir mi? Kanıt ve kağıt izi yoktur :(
gün2

"hatıraları kilo ekler miydi?"; Bay Celko'yu rahatsız etmeye gerek yok; BS12 dokümanı Darwen'in nokta yeterliliği eksiklikleri hakkında kendi sözlerine sahiptir - 70'lerin hafıza kısıtlamaları ve tekrarlanan birleşmeler bana gelmemişti. Aynı nedenden ötürü SQL içine yapılan takma çok mümkün görünüyor ki kabul edeceğim.
Bob

0

Örneğin SQL Server 2012'deki Sorgu düzenleyicisini kullanarak sorgu tasarlarsanız, bunu elde edersiniz:

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

Ancak AS'nin kaldırılması, aşağıdaki gibi bir fark yaratmaz:

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

Bu durumda AS kullanımı gereksizdir, ancak diğer birçok yerde gereklidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.