Apa tujuan kata kunci SQL "AS"?

138

Anda dapat mengatur alias tabel dalam SQL dengan mengetikkan pengenal tepat setelah nama tabel.

SELECT * FROM table t1;

Anda bahkan dapat menggunakan kata kunci ASuntuk menunjukkan alias.

SELECT * FROM table AS t1;

Apa bedanya jika ada?

Saya melihat orang DBA lama cenderung menulis pernyataan tanpa AS, tetapi sebagian besar tutorial baru menggunakannya.

Pembaruan: Saya tahu apa tujuan dari alias tabel dan kolom. Saya ingin tahu, apa alasan memiliki kata kunci terpisah untuk menyetel alias saat berfungsi tanpa itu juga.

viam0Zah
sumber
12
Dari msdn.microsoft.com/en-us/library/ms179300.aspx Klausa AS adalah sintaksis yang ditentukan dalam standar ISO untuk menetapkan nama ke kolom kumpulan hasil. Ini adalah sintaks yang lebih disukai untuk digunakan di SQL Server 2005.
Adriaan Stander
3
Ini juga digunakan untuk memisahkan deklarasi prosedur dengan skripnya. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Jawaban:

135

Tidak ada perbedaan antara kedua pernyataan di atas. AS hanyalah cara yang lebih eksplisit untuk menyebut alias

Sachin Shanbhag
sumber
10
Sebenarnya, tidak ada perbedaan dalam SQL tetapi beberapa alat / pustaka yang bergantung dapat bergantung pada kata kunci kecil ini. Sebagai contoh: JDBC 4.0. Bergantung pada penggunaan alias tanpa 'penyebab AS' dan tanpa Anda akan menerima perilaku yang berbeda - lihat jawaban ini stackoverflow.com/a/4271250/814304 . Saya ingin merekomendasikan SELALU menggunakan bentuk semantik lengkap untuk menghindari masalah seperti itu.
iMysak
Bisakah saya memiliki alias untuk lebih dari satu kolom? seperti, dua kolom dengan alias tunggal?
Deepak Keynes
@Bayu_joo Gabungkan saja (||) kolom-kolomnya lalu berikan alias misalnya SELECT foo || bar AS foobar.
Rupert Madden-Abbott
Ya @ RupertMadden-Abbott, terima kasih! tapi saya menunggu agak lama, saya dalam konteks.
Deepak Keynes
Alias ​​di pilih tidak dapat digunakan di klausa mana tetapi dari ... karena X dapat digunakan di klausa mana
Muhammad Umer
38

Semua orang yang menjawab sebelum saya benar. Anda menggunakannya sebagai nama pintasan alias untuk tabel saat Anda memiliki kueri panjang atau kueri yang memiliki gabungan. Berikut beberapa contoh.

Contoh 1

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

Contoh 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

Contoh 3 Ini adalah praktik yang baik untuk menggunakan kata kunci AS, dan sangat direkomendasikan, tetapi dimungkinkan untuk melakukan kueri yang sama tanpa satu (dan saya sering melakukannya).

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

Seperti yang Anda ketahui, saya meninggalkan kata kunci AS di contoh terakhir. Dan itu bisa digunakan sebagai alias.

Contoh 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

Output dari Contoh 4

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

Jika Anda tidak yakin sintaks mana yang harus dipilih, terutama jika tampaknya tidak banyak yang memisahkan pilihan, bacalah buku tentang heuristik. Sejauh yang saya tahu, satu-satunya buku heuristik untuk SQL adalah 'Joe Celko's SQL Programming Style':

Nama korelasi lebih sering disebut alias, tapi saya akan formal. Dalam SQL-92, mereka dapat memiliki ASoperator opsional , dan harus digunakan untuk menjelaskan bahwa ada sesuatu yang diberi nama baru. [p16]

Dengan cara ini, jika tim Anda tidak menyukai konvensi tersebut, Anda dapat menyalahkan Celko - saya tahu saya menyukainya;)


UPDATE 1: IIRC untuk waktu yang lama, Oracle tidak mendukung ASkata kunci (nama korelasi sebelumnya), yang mungkin menjelaskan mengapa beberapa timer lama tidak menggunakannya secara biasa.


UPDATE 2: istilah 'nama korelasi', meskipun digunakan oleh Standar SQL, tidak tepat. Konsep yang mendasarinya adalah bahwa ' variabel jarak '.


PEMBARUAN 3: Saya baru saja membaca ulang apa yang ditulis Celko dan dia salah: tabel tidak diganti namanya! Sekarang saya berpikir:

Nama korelasi lebih sering disebut alias, tapi saya akan formal. Dalam SQL Standar, mereka dapat memiliki ASkata kunci opsional tetapi tidak boleh digunakan karena dapat memberikan kesan bahwa ada sesuatu yang diubah namanya padahal sebenarnya tidak. Sebenarnya, itu harus dihilangkan untuk memaksakan poin bahwa itu adalah variabel rentang.

onedaywhen
sumber
13

Kata ASkuncinya adalah memberi nama ALIAS untuk tabel database Anda atau ke kolom tabel. Dalam contoh Anda, kedua pernyataan itu benar tetapi ada keadaan di mana klausa AS diperlukan (meskipun ASoperator itu sendiri opsional), misalnya

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

Dalam hal ini, Employeetabel memiliki salarykolom dan kami hanya ingin gandakan gaji dengan nama baru Double Salary.

Mohon maaf jika penjelasan saya kurang efektif.


Pembaruan berdasarkan komentar Anda, Anda benar, pernyataan saya sebelumnya tidak valid. Satu-satunya alasan yang dapat saya pikirkan adalah bahwa ASklausa tersebut telah ada lama di dunia SQL yang telah dimasukkan dalam RDMS saat ini untuk kompatibilitas ke belakang ..

Buhake Sindi
sumber
3
Tidak, AStidak diperlukan atau dibutuhkan bahkan dalam kasus ini. Coba SELECT 1 + 1 "result".
viam0Zah
6

Penggunaannya lebih jelas jika Anda tidak menggunakan 'SELECT *' (yang merupakan kebiasaan buruk yang harus Anda hilangkan):

SELECT t1.colA, t2.colB, t3.colC FROM alongtablename AS t1, anotherlongtablename AS t2, yetanotherlongtablename AS t3 WHERE t1.colD = t2.colE...
Nicholas Knight
sumber
1
Saya tahu apa tujuan dari alias tabel. Saya ingin tahu, apa alasan memiliki kata kunci terpisah untuk menyetel alias saat berfungsi tanpa itu juga.
viam0Zah
4

Ini adalah cara formal untuk menentukan nama korelasi untuk entitas sehingga Anda bisa mengatasinya dengan mudah di bagian lain dari kueri.

Preet Sangha
sumber
3

Dalam AShal ini adalah kata kunci opsional yang ditentukan dalam ANSI SQL 92 untuk mendefinisikan <<correlation name>, biasanya dikenal sebagai alias untuk tabel.

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

Tampaknya praktik terbaik TIDAK menggunakan ASkata kunci untuk alias tabel karena tidak didukung oleh sejumlah database yang umum digunakan.

Geert Bellekens
sumber
Apakah Anda memiliki contoh dbs yang tidak menggunakan kata kunci 'as'?
D-Jones
3
Saya yakin Oracle adalah salah satunya yang tidak mendukung askata kunci alias tabel.
Geert Bellekens
1
"Kata kunci AS bersifat opsional. Alias ​​secara efektif mengganti nama item daftar pilihan selama kueri. Alias ​​tersebut dapat digunakan dalam order_by_clause tetapi tidak klausa lain dalam kueri." docs.oracle.com/cd/B28359_01/server.111/b28286/… . Juga terkait stackoverflow.com/a/8451257/1359796
HEDMON
2

Pada masa awal SQL, ini dipilih sebagai solusi untuk masalah bagaimana menangani nama kolom duplikat (lihat catatan di bawah).

Untuk meminjam pertanyaan dari jawaban lain:

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

Kolom ProductID(dan mungkin lainnya) adalah umum untuk kedua tabel dan karena sintaks kondisi gabungan memerlukan referensi ke keduanya, 'kualifikasi titik' memberikan disambiguasi.

Tentu saja, solusi yang lebih baik adalah tidak pernah mengizinkan nama kolom duplikat! Untungnya, jika Anda menggunakan NATURAL JOINsintaks yang lebih baru , kebutuhan untuk variabel rentang Pdan Ohilang:

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

Tetapi mengapa ASkata kunci opsional? Ingatan saya dari diskusi pribadi dengan anggota komite standar SQL (baik Joe Celko atau Hugh Darwen) adalah bahwa ingatan mereka adalah bahwa, pada saat menentukan standar, produk satu vendor (Microsoft?) Memerlukan penyertaannya dan vendor lain produk (Oracle's?) memerlukan kelalaiannya, jadi kompromi yang dipilih adalah menjadikannya opsional. Saya tidak memiliki kutipan untuk ini, Anda percaya atau tidak!


Pada masa-masa awal model relasional, hasil perkalian silang (atau gabungan-theta atau gabungan-eku) dari relasi yang judulnya tidak terputus-putus tampak menghasilkan relasi dengan dua atribut dengan nama yang sama; Solusi Codd untuk masalah ini dalam kalkulus relasionalnya adalah penggunaan kualifikasi titik, yang kemudian ditiru dalam SQL (kemudian disadari bahwa apa yang disebut gabungan alami adalah primitif tanpa kerugian; yaitu, gabungan alami dapat menggantikan semua gabungan theta dan bahkan produk silang.)

Sumber: Business System 12, Catatan berupa slide presentasi yang diberikan pada TTM Implementers 'Workshop, University of Northumbria, 2-3 Juni 2011 oleh Hugh Darwen

onedaywhen
sumber
"Tentu saja, solusi yang lebih baik adalah tidak pernah mengizinkan nama kolom duplikat!" - jadi company.name dan country.name tidak boleh diizinkan? dan bagaimana jika saya bergabung dengan tabel itu sendiri? "Pada masa awal SQL, itu dipilih ..." apakah Anda memiliki referensi untuk ini / apakah alasan ini didokumentasikan di suatu tempat?
Bob
@Bob Saya telah memperbarui jawaban saya dengan catatan (dengan kutipan) dari sejarah kualifikasi titik dalam SQL, ditambah ingatan saya yang tidak jelas mengapa ASkata kunci itu opsional (jelas tidak ada kutipan!). Hugh pensiun beberapa tahun lalu. Saya pikir Celko mungkin masih aktif - apakah ingatannya menambah bobot? Bukti dan jejak kertas sama sekali tidak ada :(
onedaywhen
"akankah ingatannya menambah bobot?"; Tidak perlu merepotkan Tuan Celko; dok BS12 memiliki kata-kata Darwen sendiri tentang kekurangan kualifikasi titik - batasan memori tahun 70-an dan penggabungan berulang tidak terpikir oleh saya. Saya akan mengakui bahwa tampaknya sangat mungkin aliasing berhasil masuk ke SQL karena alasan yang sama.
Bob
0

Jika Anda mendesain kueri menggunakan editor kueri di SQL Server 2012 misalnya, Anda akan mendapatkan ini:

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

Namun menghapus AS tidak membuat perbedaan seperti berikut ini:

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

Dalam hal ini penggunaan AS berlebihan tetapi di banyak tempat lain itu dibutuhkan.

pengguna2063329
sumber