SQL 키워드“AS”의 목적은 무엇입니까?


137

테이블 이름 바로 뒤에 식별자를 입력하여 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 서버에서 2005 사용하는 기본 구문
아드리안 스탠

3
또한 스크립트로 프로 시저 선언을 분리하는 데 사용됩니다. CREATE PROC Test @Param1 INT AS SELECT @Param1
Tom 'Blue'Piddock

답변:


134

위의 두 진술 사이에는 차이가 없습니다. AS는 별칭을 언급하는 더 명확한 방법입니다.


10
실제로 SQL에는 차이가 없지만 일부 종속 도구 / 라이브러리는이 작은 키워드에 의존 할 수 있습니다. 예를 들어 : JDBC 4.0. 'AS cause'/ 별칭 별명 사용에 따라 다른 동작이 발생 합니다. 이 답변은 stackoverflow.com/a/4271250/814304를 참조하십시오 . 이러한 문제를 피하기 위해 항상 완전한 형태의 의미를 사용하는 것이 좋습니다.
iMysak

둘 이상의 열에 대한 별칭을 가질 수 있습니까? 단일 별칭이있는 두 개의 열?
Deepak Keynes

@Keynes 예. 열을 연결 (||) 한 다음 별명을 지정하십시오. 예 : SELECT foo || foobar로 바아.
Rupert Madden-Abbott

@ @ RupertMadden-Abbott, 감사합니다! 그러나 나는 조금 오래 기다렸다, 나는 문맥의 관점에서 있었다.
Deepak Keynes

select의 별칭은 where 절에서 사용할 수 없지만 ...에서 X는 where 절에서 사용할 수 있으므로
Muhammad Umer

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에 대한 유일한 휴리스틱 책은 'Joe Celko의 SQL 프로그래밍 스타일'입니다.

상관 관계 이름을 더 자주 별칭이라고하지만 공식적인 이름입니다. SQL-92에서는 선택적인 AS연산자 를 사용할 수 있으며 무언가 새로운 이름을 부여 받도록해야합니다. [p16]

이런 식으로 팀이 컨벤션을 좋아하지 않는다면 Celko를 비난 할 수 있습니다.


업데이트 1 : IIRC는 오랫동안 Oracle은 AS(이전 상관 명) 키워드를 지원하지 않았는데 , 이는 일부 오래된 타이머가 습관적으로 사용하지 않는 이유를 설명 할 수 있습니다.


업데이트 2 : SQL 표준에서 사용되지만 '상관 이름'이라는 용어는 부적절합니다. 기본 개념은 ' 범위 변수 ' 의 개념입니다 .


업데이트 3 : Celko이 작성한 것을 다시 읽었으며 잘못되었습니다. 테이블 이름이 바뀌지 않습니다! 나는 지금 생각한다 :

상관 관계 이름을 더 자주 별칭이라고하지만 공식적인 이름입니다. 표준 SQL에서는 선택적 AS키워드를 가질 수 있지만 이름이 바뀌지 않을 때 이름이 바뀌는 느낌을 줄 수 있으므로 사용해서는 안됩니다. 실제로 범위 변수라는 점을 적용하기 위해 생략해야합니다.


12

AS키워드는 제공하는 것입니다 별칭 데이터베이스 테이블 또는 테이블의 컬럼 이름입니다. 귀하의 예에서 두 진술은 정확하지만 AS 절이 필요한 상황이 있습니다 ( AS연산자 자체는 선택 사항 이지만 ).

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

이 경우 Employee테이블에 salary열이 있고 새로운 이름으로 급여의 두 배를 원합니다.Double 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일반적으로 사용되는 여러 데이터베이스에서 지원하지 않으므로 테이블 별칭에 키워드 를 사용하지 않는 것이 좋습니다 .


'as'키워드를 사용하지 않는 db의 예가 있습니까?
D-Jones

3
오라클은 as테이블 별칭에 대한 키워드를 지원하지 않는 것 중 하나라고 생각 합니다.
Geert Bellekens 2016 년

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(및 기타)은 두 테이블에 공통이며 결합 조건 구문은 두 테이블 모두에 대한 참조를 필요로하기 때문에 '도트 제한'은 명확성을 제공합니다.

물론 더 나은 솔루션은 처음에 중복 열 이름을 허용하지 않는 것입니다! 당신이 새로운 사용하는 경우 행복하게, NATURAL JOIN구문, 범위 변수의 필요성 PO멀리 간다 :

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

그러나 왜 AS키워드가 선택 사항입니까? 는 SQL 표준위원회의 회원과 개인적인 토론에서 내 기억은 (하나 조 셀코 또는 휴 다웬)는 것이 었습니다 자신의 기억이 (마이크로 소프트의는?)의 포함을 요구 한 업체의 제품 표준을 정의하는 시간과 다른 벤더의에서, 그 것이었다 product (Oracle 's?)는 생략이 필요했기 때문에 선택한 절충안은 선택 사항이되었습니다. 나는 이것에 대한 인용이 없다, 당신은 나를 믿거 나 말거나!


관계형 모델의 초기에, 제목이 분리되지 않은 관계의 교차 곱 (또는 세타 조인 또는 동일 조인)은 동일한 이름의 두 속성과의 관계를 생성하는 것으로 보입니다. 관계형 미적분학에서이 문제에 대한 Codd의 해결책은 나중에 도트 자격을 사용하는 것이 었는데, 나중에 SQL에서 에뮬레이트되었습니다 (나중에 소위 자연 조인은 손실없이 원시적이라는 것을 깨달았습니다. 즉 자연 조인은 모든 세타 조인과 교차 제품.)

출처 : Business System 12, 노섬 브리아 대학교 (University of Northumbria)의 TTM Implementers 'Workshop에서 발표 된 프레젠테이션 슬라이드를 중심으로 한 노트, 휴 다웬 (Hugh Darwen)


"물론, 더 나은 해결책은 처음에는 중복 열 이름을 허용하지 않는 것입니다!"-company.name 및 country.name은 허용되지 않아야합니까? 그리고 테이블을 자체에 조인하면 어떻게됩니까? "SQL의 초기에는 선택되었습니다 ..."이것에 대한 참조가 있습니까?이 이론적 근거는 어딘가에 기록되어 있습니까?

@ 밥 나는 SQL에서 도트 자격의 역사에 대한 메모 (인용)와 AS키워드가 선택적인 이유에 대한 모호한 기억으로 인용하여 답변을 업데이트했습니다 (인용, 분명히!). 휴는 몇 년 전에 은퇴했습니다. Celko가 여전히 활동적이라고 생각합니다. 그의 추억이 무게를 더할까요? 증거와 종이 흔적은 단순히 존재하지 않습니다 :(
onedayhen

"그의 기억은 무게를 더할 것인가?"; 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.