Mục đích của từ khóa SQL AS AS là gì?


137

Bạn có thể đặt bí danh bảng trong SQL gõ định danh ngay sau tên bảng.

SELECT * FROM table t1;

Bạn thậm chí có thể sử dụng từ khóa ASđể chỉ ra bí danh.

SELECT * FROM table AS t1;

Sự khác biệt giữa chúng nếu có?

Tôi thấy những người DBA cũ có xu hướng viết các câu lệnh mà không có AS, nhưng hầu hết các hướng dẫn mới đều sử dụng nó.

Cập nhật: Tôi biết mục đích của bí danh bảng và cột. Tôi tò mò, lý do của việc có một từ khóa riêng để đặt bí danh trong khi nó cũng hoạt động mà không có nó.


12
Từ msdn.microsoft.com/en-us/l Library / ms179300.aspx Mệnh đề AS là cú pháp được xác định trong tiêu chuẩn ISO để gán tên cho cột tập kết quả. Đây là cú pháp ưa thích để sử dụng trong SQL Server 2005.
Adriaan Stander

3
Nó cũng được sử dụng để phân tách khai báo một thủ tục với tập lệnh của nó. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

Câu trả lời:


134

Không có sự khác biệt giữa cả hai tuyên bố trên. AS chỉ là một cách rõ ràng hơn để đề cập đến bí danh


10
Trên thực tế, không có sự khác biệt trong SQL nhưng một số công cụ / thư viện phụ thuộc có thể phụ thuộc vào từ khóa nhỏ này. Ví dụ: JDBC 4.0. Tùy thuộc vào việc sử dụng các bí danh w / 'AS gây ra' và w / o bạn sẽ nhận được các hành vi khác nhau - xem câu trả lời này stackoverflow.com/a/4271250/814304 . Tôi muốn đề nghị LUÔN LUÔN sử dụng hình thức ngữ nghĩa đầy đủ để tránh những vấn đề như vậy.
iMysak

Tôi có thể có bí danh cho nhiều hơn một cột không? như, hai cột với bí danh duy nhất?
Deepak Keynes

@Keynes Có. Chỉ cần nối (||) các cột và sau đó đặt bí danh, ví dụ: CHỌN foo | | thanh NHƯ foobar.
Rupert Madden-Abbott

Đúng @ RupertMadden-Abbott, cảm ơn! nhưng tôi đã đợi một chút lâu, tôi đã ở trong bối cảnh.
Deepak Keynes

38

Mọi người trả lời trước tôi đều đúng. Bạn sử dụng nó như một tên phím tắt bí danh cho một bảng khi bạn có các truy vấn dài hoặc các truy vấn có tham gia. Đây là một vài ví dụ.

ví dụ 1

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

Ví dụ 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

Ví dụ 3 Đó là một cách thực hành tốt để sử dụng từ khóa AS và rất được khuyến nghị, nhưng có thể thực hiện cùng một truy vấn mà không cần một (và tôi thường làm như vậy).

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

Như bạn có thể nói, tôi đã bỏ qua từ khóa AS trong ví dụ cuối cùng. Và nó có thể được sử dụng như một bí danh.

Ví dụ 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

Kết quả của ví dụ 4

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

21

Khi bạn không chắc chắn nên chọn cú pháp nào, đặc biệt là khi dường như không có nhiều sự phân tách các lựa chọn, hãy tham khảo một cuốn sách về heuristic. Theo như tôi biết, cuốn sách heuristic duy nhất cho SQL là 'Phong cách lập trình SQL của Joe Celko':

Một tên tương quan thường được gọi là bí danh, nhưng tôi sẽ chính thức. Trong SQL-92, họ có thể có một AStoán tử tùy chọn và nó nên được sử dụng để làm rõ rằng một cái gì đó đang được đặt tên mới. [tr16]

Bằng cách này, nếu nhóm của bạn không thích hội nghị, bạn có thể đổ lỗi cho Celko - tôi biết tôi làm vậy;)


CẬP NHẬT 1: IIRC trong một thời gian dài, Oracle đã không hỗ trợ AStừ khóa (tên tương quan trước), điều này có thể giải thích tại sao một số bộ tính giờ cũ không sử dụng nó theo thói quen.


CẬP NHẬT 2: thuật ngữ 'tên tương quan', mặc dù được sử dụng bởi Tiêu chuẩn SQL, nhưng không phù hợp. Khái niệm cơ bản là một " biến phạm vi ".


CẬP NHẬT 3: Tôi vừa đọc lại những gì Celko đã viết và anh ấy đã sai: bảng không được đổi tên! Bây giờ tôi nghĩ:

Một tên tương quan thường được gọi là bí danh, nhưng tôi sẽ chính thức. Trong SQL chuẩn, họ có thể có một AStừ khóa tùy chọn nhưng nó không nên được sử dụng bởi vì nó có thể mang lại ấn tượng rằng một cái gì đó đang được đổi tên khi nó không được đổi tên. Trong thực tế, nó nên được bỏ qua để thực thi quan điểm rằng đó là một biến phạm vi.


12

Các AStừ khóa là để đưa ra một ALIAS tên cho bảng cơ sở dữ liệu của bạn hoặc để cột bảng. Trong ví dụ của bạn, cả hai câu lệnh đều đúng nhưng có trường hợp cần mệnh đề AS (mặc dù ASchính toán tử là tùy chọn), vd

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

Trong trường hợp này, Employeebảng có một salarycột và chúng tôi chỉ muốn nhân đôi mức lương với một tên mới Double Salary.

Xin lỗi nếu lời giải thích của tôi không hiệu quả.


Cập nhật dựa trên nhận xét của bạn, bạn nói đúng, tuyên bố trước đây của tôi không hợp lệ. Lý do duy nhất tôi có thể nghĩ đến là ASmệnh đề này đã tồn tại từ lâu trong thế giới SQL mà nó được kết hợp trong RDMS ngày nay để tương thích ngược ..


3
Không, ASkhông bắt buộc hoặc cần thiết ngay cả trong trường hợp này. Hãy thử SELECT 1 + 1 "result".
viam0Zah

6

Việc sử dụng sẽ rõ ràng hơn nếu bạn không sử dụng 'CHỌN *' (đó là một thói quen xấu bạn nên từ bỏ):

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

1
Tôi biết mục đích của bí danh bảng là gì. Tôi tò mò, lý do của việc có một từ khóa riêng để đặt bí danh trong khi nó cũng hoạt động mà không có nó.
viam0Zah

4

Đây là một cách chính thức để chỉ định tên tương quan cho một thực thể để bạn có thể giải quyết nó dễ dàng trong một phần khác của truy vấn.


3

Trong AStrường hợp này là một từ khóa tùy chọn được định nghĩa trong ANSI SQL 92 để xác định một <<correlation name>, thường được gọi là bí danh cho một bảng.

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

Có vẻ như một cách thực hành tốt nhất KHÔNG sử dụng AStừ khóa cho các bí danh bảng vì nó không được hỗ trợ bởi một số cơ sở dữ liệu thường được sử dụng.


Bạn có bất kỳ ví dụ nào về các dbs không sử dụng từ khóa 'as' không?
D-Jones

3
Tôi tin rằng Oracle là một trong số họ không hỗ trợ astừ khóa cho các bí danh bảng.
Geert Bellekens

1
"Từ khóa AS là tùy chọn. Bí danh đổi tên một cách hiệu quả mục danh sách được chọn trong thời gian truy vấn. Bí danh có thể được sử dụng trong order_by_clause nhưng không phải là mệnh đề khác trong truy vấn." docs.oracle.com/cd/B28359_01/server.111/b28286/ sắt . Cũng liên quan stackoverflow.com/a/8451257/1359796
HEDMON

2

Trong những ngày đầu của SQL, nó được chọn là giải pháp cho vấn đề làm thế nào để xử lý các tên cột trùng lặp (xem ghi chú bên dưới).

Để mượn một truy vấn từ một câu trả lời khác:

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

Cột ProductID (và có thể cả các khác) là chung cho cả hai bảng và do cú pháp điều kiện nối yêu cầu tham chiếu đến cả hai, 'tiêu chuẩn chấm' cung cấp sự phân định.

Tất nhiên, giải pháp tốt hơn là không bao giờ cho phép các tên cột trùng lặp ở vị trí đầu tiên! Hạnh phúc, nếu bạn sử dụng phiên bản mới hơn NATURAL JOINcú pháp, sự cần thiết của các biến phạm vi PObiến mất:

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

Nhưng tại sao AStừ khóa là tùy chọn? Hồi ức của tôi từ một cuộc thảo luận cá nhân với một thành viên của ủy ban tiêu chuẩn SQL (Joe Celko hoặc Hugh Darwen) là hồi ức của họ là tại thời điểm xác định tiêu chuẩn, một sản phẩm của nhà cung cấp (của Microsoft?) Yêu cầu đưa vào và một nhà cung cấp khác sản phẩm (của Oracle?) yêu cầu thiếu sót của nó, vì vậy sự thỏa hiệp được chọn là làm cho nó trở thành tùy chọn. Tôi không có trích dẫn cho điều này, bạn có tin tôi hay không!


Trong những ngày đầu của mô hình quan hệ, sản phẩm chéo (hoặc tham gia hoặc tham gia đẳng thức) của các mối quan hệ có tiêu đề không tách rời nhau xuất hiện để tạo ra mối quan hệ với hai thuộc tính cùng tên; Giải pháp của Codd cho vấn đề này trong phép tính quan hệ của anh ta là sử dụng tiêu chuẩn chấm, sau này được mô phỏng trong SQL (sau đó người ta nhận ra rằng cái gọi là tham gia tự nhiên là nguyên thủy mà không mất; thậm chí sản phẩm chéo.)

Nguồn: Hệ thống kinh doanh 12, Ghi chú được trình bày trong các bài thuyết trình được đưa ra tại Hội thảo của người triển khai TTM, Đại học Northumbria, ngày 2-3 tháng 6 năm 2011 bởi Hugh Darwen


"Tất nhiên, giải pháp tốt hơn là không bao giờ cho phép các tên cột trùng lặp ở vị trí đầu tiên!" - vậy không nên cho phép công ty.name và country.name? và nếu tôi tham gia một bảng vào chính nó thì sao? "Trong những ngày đầu của SQL, nó đã được chọn ..." bạn có tham khảo cho điều này không / đây có phải là tài liệu hợp lý ở đâu đó không?
Bob

@Bob Tôi đã cập nhật câu trả lời của mình bằng một ghi chú (có trích dẫn) về lịch sử đủ điều kiện chấm trong SQL, cộng với hồi ức mơ hồ được thừa nhận của tôi về lý do AStừ khóa là tùy chọn (rõ ràng không có trích dẫn!). Hugh đã nghỉ hưu vài năm trước. Tôi nghĩ Celko có thể vẫn hoạt động - liệu những hồi ức của anh ta có tăng thêm trọng lượng không? Bằng chứng và dấu vết giấy đơn giản là không tồn tại :(
onedaywhen

"Hồi ức của anh ấy sẽ tăng thêm trọng lượng?"; Không cần phải làm phiền ông Celko; tài liệu BS12 có những từ riêng của Darwen về những thiếu sót của trình độ chấm - những hạn chế về bộ nhớ của thập niên 70 và các phép nối lặp lại đã xảy ra với tôi. Tôi sẽ thừa nhận rằng có vẻ như rất có thể răng cưa đã biến nó thành SQL vì lý do tương tự.
Bob

0

Nếu bạn thiết kế truy vấn bằng trình soạn thảo Truy vấn trong SQL Server 2012 chẳng hạn, bạn sẽ nhận được điều này:

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

Tuy nhiên, loại bỏ AS không tạo ra bất kỳ sự khác biệt nào như sau:

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

Trong trường hợp này, việc sử dụng AS là không cần thiết nhưng ở nhiều nơi khác thì cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.