จุดประสงค์ของ SQL keyword“ AS” คืออะไร?


138

คุณสามารถตั้งนามแฝงตารางใน 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
Adriaan Stander

3
นอกจากนี้ยังใช้เพื่อแยกการประกาศโพรซีเดอร์ด้วยสคริปต์ CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue' Piddock

คำตอบ:


135

ไม่มีความแตกต่างระหว่างข้อความทั้งสองข้างต้น AS เป็นเพียงวิธีการกล่าวถึงนามแฝงที่ชัดเจนยิ่งขึ้น


10
ที่จริงแล้วไม่มีความแตกต่างใน SQL แต่เครื่องมือ / ไลบรารีที่ต้องพึ่งพาบางตัวสามารถขึ้นอยู่กับคีย์เวิร์ดขนาดเล็กนี้ ดังตัวอย่าง: JDBC 4.0 ทั้งนี้ขึ้นอยู่กับการใช้นามแฝง w / 'เป็นสาเหตุ' และ w / o คุณจะได้รับพฤติกรรมที่แตกต่าง - เห็นคำตอบนี้stackoverflow.com/a/4271250/814304 ฉันอยากจะแนะนำให้ใช้ความหมายเต็มรูปแบบเสมอเพื่อหลีกเลี่ยงปัญหาดังกล่าว
iMysak

ฉันสามารถมีนามแฝงมากกว่าหนึ่งคอลัมน์ได้หรือไม่ เช่นสองคอลัมน์ที่มีนามแฝงเดียว?
Deepak Keynes

@Keynes ใช่ เพียงต่อ (||) คอลัมน์แล้วตั้งนามแฝงเช่น SELECT foo || บาร์ AS foobar
Rupert Madden-Abbott

ใช่ @ RupertMadden-Abbott ขอบคุณ! แต่ฉันรอนานหน่อยฉันอยู่ในแง่ของบริบท
Deepak Keynes

ไม่สามารถใช้นามแฝงในการเลือกในที่ซึ่งอนุประโยค แต่ในจาก ... เนื่องจากสามารถใช้ X ในประโยคที่
มูฮัมหมัดอุเมอร์

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]

ด้วยวิธีนี้หากทีมของคุณไม่ชอบการประชุมคุณสามารถตำหนิ Celko ได้ - ฉันรู้ว่าฉันทำ;)


อัปเดต 1: IIRC เป็นเวลานาน Oracle ไม่สนับสนุนASคีย์เวิร์ด (ชื่อสหสัมพันธ์ก่อนหน้า) ซึ่งอาจอธิบายได้ว่าเหตุใดตัวจับเวลาเก่าบางตัวจึงไม่ใช้เป็นปกติ


UPDATE 2: คำว่า 'correlation name' แม้ว่าจะใช้โดย SQL Standard แต่ก็ไม่เหมาะสม แนวคิดพื้นฐานคือ ' ตัวแปรช่วง '


อัปเดต 3: ฉันเพิ่งอ่านสิ่งที่ Celko เขียนอีกครั้งและเขาคิดผิด: ตารางไม่ได้ถูกเปลี่ยนชื่อ! ตอนนี้ฉันคิดว่า:

ชื่อสหสัมพันธ์มักเรียกว่านามแฝง แต่ฉันจะเป็นทางการ ใน Standard SQL พวกเขาสามารถมีASคีย์เวิร์ดที่เป็นทางเลือกได้แต่ไม่ควรใช้เนื่องจากอาจทำให้เกิดความรู้สึกว่ามีการเปลี่ยนชื่อบางสิ่งบางอย่างเมื่อไม่มี ในความเป็นจริงควรละเว้นเพื่อบังคับใช้จุดที่เป็นตัวแปรช่วง


13

ASคำหลักคือการให้ALIASชื่อตารางฐานข้อมูลของคุณหรือคอลัมน์ของตาราง ในตัวอย่างของคุณคำสั่งทั้งสองถูกต้อง แต่มีบางกรณีที่จำเป็นต้องใช้ประโยค AS (แม้ว่าASตัวดำเนินการจะเป็นทางเลือกก็ตาม) เช่น

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

ในกรณีนี้Employeeตารางมีคอลัมน์และเราต้องการเพียงแค่คู่ของเงินเดือนด้วยชื่อใหม่salaryDouble 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เพื่อกำหนด<<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 (และอาจเป็นอื่น ๆ ) เป็นเรื่องปกติสำหรับทั้งสองตารางและเนื่องจากไวยากรณ์เงื่อนไขการเข้าร่วมต้องการการอ้างอิงถึงทั้งสองอย่าง 'dot qualification' จึงทำให้เกิดการลดความสับสน

แน่นอนทางออกที่ดีกว่าคือไม่อนุญาตให้มีชื่อคอลัมน์ซ้ำกันตั้งแต่แรก! อย่างน่ายินดีหากคุณใช้NATURAL JOINไวยากรณ์ที่ใหม่กว่าความต้องการตัวแปรช่วงPและOหายไป:

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

แต่ทำไมASคำหลักจึงเป็นตัวเลือก? ความทรงจำของฉันจากการสนทนาส่วนตัวกับสมาชิกของคณะกรรมการมาตรฐาน SQL (ไม่ว่าจะเป็น Joe Celko หรือ Hugh Darwen) ก็คือความทรงจำของพวกเขาคือในช่วงเวลาของการกำหนดมาตรฐานผลิตภัณฑ์ของผู้จำหน่ายรายหนึ่ง (ของ Microsoft?) จำเป็นต้องมีการรวมเข้าด้วยกันและผู้ขายรายอื่น ผลิตภัณฑ์ (ของ Oracle?) ต้องการการละเว้นดังนั้นการประนีประนอมที่เลือกคือการทำให้เป็นทางเลือก ฉันไม่มีการอ้างอิงสำหรับเรื่องนี้คุณจะเชื่อฉันหรือไม่!


ในช่วงแรก ๆ ของแบบจำลองเชิงสัมพันธ์ผลิตภัณฑ์ไขว้ (หรือทีต้าเข้าร่วมหรือเข้าร่วม) ของความสัมพันธ์ที่มีส่วนหัวไม่ปะติดปะต่อกันดูเหมือนจะสร้างความสัมพันธ์ที่มีสองคุณลักษณะที่มีชื่อเดียวกัน วิธีแก้ปัญหาของ Codd ในแคลคูลัสเชิงสัมพันธ์ของเขาคือการใช้ dot qualification ซึ่งต่อมาถูกจำลองใน SQL (ภายหลังได้รับรู้ว่าสิ่งที่เรียกว่าการรวมตามธรรมชาตินั้นเป็นแบบดั้งเดิมโดยไม่มีการสูญเสียนั่นคือการรวมตามธรรมชาติสามารถแทนที่การรวมทีต้าทั้งหมดและ แม้แต่ข้ามผลิตภัณฑ์)

ที่มา: Business System 12, Notes ใส่สไลด์ของงานนำเสนอที่ TTM Implementers 'Workshop, University of Northumbria, 2-3 มิถุนายน 2554 โดย Hugh Darwen


"แน่นอนทางออกที่ดีกว่าคือไม่อนุญาตให้มีชื่อคอลัมน์ซ้ำกันตั้งแต่แรก!" ดังนั้นจึงไม่ควรอนุญาต company.name และ country.name? แล้วถ้าฉันร่วมโต๊ะกับตัวเองล่ะ? "ในช่วงแรกของ SQL มีการเลือกใช้ ... " คุณมีเอกสารอ้างอิงสำหรับสิ่งนี้ / เหตุผลนี้มีการบันทึกไว้ที่ไหนหรือไม่?
Bob

@ Bob ฉันได้อัปเดตคำตอบของฉันด้วยหมายเหตุ (พร้อมการอ้างอิง) ของประวัติความเป็นมาของคุณสมบัติจุดใน SQL รวมถึงความทรงจำที่คลุมเครือของฉันว่าทำไมASคำหลักจึงเป็นทางเลือก (ไม่มีการอ้างอิงแน่นอน!) ฮิวจ์เกษียณเมื่อไม่กี่ปีก่อน ฉันคิดว่า Celko อาจยังคงเคลื่อนไหวอยู่ - ความทรงจำของเขาจะเพิ่มน้ำหนักหรือไม่? หลักฐานและกระดาษเส้นทางก็ไม่ได้อยู่ :(
onedaywhen

"ความทรงจำของเขาจะเพิ่มน้ำหนักหรือไม่"; ไม่ต้องไปรบกวนคุณ Celko; เอกสาร BS12 มีคำพูดของ Darwen เกี่ยวกับข้อบกพร่องของคุณสมบัติจุด - ข้อ จำกัด ด้านความจำในยุค 70 และการรวมซ้ำไม่ได้เกิดขึ้นกับฉัน ฉันจะยอมรับว่ามันดูเหมือนเป็นไปได้มากที่ทำให้นามแฝงกลายเป็น SQL ด้วยเหตุผลเดียวกัน
Bob

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

ในกรณีนี้การใช้ AS นั้นไม่จำเป็น แต่ในที่อื่น ๆ จำเป็นต้องใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.