복붙노트

[SQL] SQL - 그룹에 의해 별칭을 사용

SQL

SQL - 그룹에 의해 별칭을 사용

SQL 구문에 대한 그냥 궁금해서. 나는 그래서 만약

SELECT 
 itemName as ItemName,
 substring(itemName, 1,1) as FirstLetter,
 Count(itemName)
FROM table1
GROUP BY itemName, FirstLetter

이것은 잘못된 때문에 것

GROUP BY itemName, FirstLetter 

정말해야

GROUP BY itemName, substring(itemName, 1,1)

그런데 왜 우리는 단순히 편의를 위해 전자를 사용할 수없는 이유는 무엇입니까?

해결법

  1. ==============================

    1.쿼리는 다음과 같은 순서로 실행 된 것처럼 SQL이 구현된다 :

    쿼리는 다음과 같은 순서로 실행 된 것처럼 SQL이 구현된다 :

    대부분의 관계형 데이터베이스 시스템의 경우,이 순서는이 이전 단계에서 도입 된해야하기 때문에 이름 (열 또는 별칭) 유효한있는 설명합니다.

    그래서 오라클과 SQL 서버에서는 GROUP BY는 SELECT 절 전에 실행되기 때문에 사용자가 SELECT 절에 정의하는 것이 GROUP BY 절에 용어를 사용할 수 없습니다.

    MySQL과 포스트 그레스가 허용 추가 멋있는 것을 보인다 :하지만 예외가 있습니다.

  2. ==============================

    2.별칭을 사용할 수 있도록 항상 하위 쿼리를 사용할 수 있습니다; 물론, (DB 서버가 모두 동일하게 실행 가능하지만, 확인 결코 아프지 않는다) 성능을 확인 :

    별칭을 사용할 수 있도록 항상 하위 쿼리를 사용할 수 있습니다; 물론, (DB 서버가 모두 동일하게 실행 가능하지만, 확인 결코 아프지 않는다) 성능을 확인 :

    SELECT ItemName, FirstLetter, COUNT(ItemName)
    FROM (
        SELECT ItemName, SUBSTRING(ItemName, 1, 1) AS FirstLetter
        FROM table1
        ) ItemNames
    GROUP BY ItemName, FirstLetter
    
  3. ==============================

    3.PostgreSQL의에서 적어도 당신은 절하여 GROUP의 결과 집합의 열 번호를 사용할 수 있습니다 :

    PostgreSQL의에서 적어도 당신은 절하여 GROUP의 결과 집합의 열 번호를 사용할 수 있습니다 :

    SELECT 
     itemName as ItemName,
     substring(itemName, 1,1) as FirstLetter,
     Count(itemName)
    FROM table1
    GROUP BY 1, 2
    

    물론 이것은 고통을 시작 당신은 대화 형으로이 일을하고 당신은 결과의 열 수 또는 순서를 변경할 수있는 쿼리를 편집합니다. 하지만 여전히.

  4. ==============================

    4.SQL Server는이 때문에 처리의 논리적 인 순서의 GROUP BY 절에서 별칭을 참조 할 수 없습니다. GROUP BY 절을 평가할 때 별명이 알려져되지 않도록 GROUP BY 절은 SELECT 절 전에 처리됩니다. 당신이 ORDER BY 절에서 별칭을 사용할 수있는 이유도 설명합니다.

    SQL Server는이 때문에 처리의 논리적 인 순서의 GROUP BY 절에서 별칭을 참조 할 수 없습니다. GROUP BY 절을 평가할 때 별명이 알려져되지 않도록 GROUP BY 절은 SELECT 절 전에 처리됩니다. 당신이 ORDER BY 절에서 별칭을 사용할 수있는 이유도 설명합니다.

    여기에 SQL 서버의 논리적 처리 단계에 대한 정보를 하나의 소스입니다.

  5. ==============================

    5.나는 왜 그런지 대답 만 별칭을 만들 적용 CROSS를 사용하여 SQL 서버에서이 제한을 해결하는 방법을 보여주고 싶었 아니에요. 당신은 다음과 같이, GROUP BY 절에서 사용 :

    나는 왜 그런지 대답 만 별칭을 만들 적용 CROSS를 사용하여 SQL 서버에서이 제한을 해결하는 방법을 보여주고 싶었 아니에요. 당신은 다음과 같이, GROUP BY 절에서 사용 :

    SELECT 
     itemName as ItemName,
     FirstLetter,
     Count(itemName)
    FROM table1
    CROSS APPLY (SELECT substring(itemName, 1,1) as FirstLetter) Alias
    GROUP BY itemName, FirstLetter
    
  6. ==============================

    6.(예 : 포스트 그레스로,이를 지원 서비스) 그룹에 의해 사용 별칭이 의도하지 않은 결과를 가질 수 있음을주의. 이미 내부 문에 존재하는 별칭을 만들 경우, 예를 들어, 그룹으로는 내부 필드 이름을 선택합니다.

    (예 : 포스트 그레스로,이를 지원 서비스) 그룹에 의해 사용 별칭이 의도하지 않은 결과를 가질 수 있음을주의. 이미 내부 문에 존재하는 별칭을 만들 경우, 예를 들어, 그룹으로는 내부 필드 이름을 선택합니다.

    -- Working example in postgres
    select col1 as col1_1, avg(col3) as col2_1
    from
        (select gender as col1, maritalstatus as col2, 
        yearlyincome as col3 from customer) as layer_1
    group by col1_1;
    
    -- Failing example in postgres
    select col2 as col1, avg(col3)
    from
        (select gender as col1, maritalstatus as col2,
        yearlyincome as col3 from customer) as layer_1
    group by col1;
    
  7. ==============================

    7.일부의 DBMS는 대신 전체 표현식을 반복 할 필요없이 별칭을 사용하게됩니다. 테라는 하나의 이러한 예이다.

    일부의 DBMS는 대신 전체 표현식을 반복 할 필요없이 별칭을 사용하게됩니다. 테라는 하나의 이러한 예이다.

    이 SO 질문에 설명 된 이유로 빌에서 권장하는대로 나는 서수 위치 표기법을 피하십시오.

    쉽고 강력한 대안은 항상 GROUP BY 절에 표현식을 반복하는 것입니다. DRY는 SQL에 적용되지 않습니다.

  8. ==============================

    8.SQLite는의보기에서 결과를 그룹화 할 때 별칭을 사용하여 조심하십시오. 별칭 이름에 기본 테이블의 컬럼 이름과 동일한 경우 예기치 않은 결과를 얻을 것이다 (보기에).

    SQLite는의보기에서 결과를 그룹화 할 때 별칭을 사용하여 조심하십시오. 별칭 이름에 기본 테이블의 컬럼 이름과 동일한 경우 예기치 않은 결과를 얻을 것이다 (보기에).

  9. ==============================

    9.위로 하루에 나는 RDB는, 이제 오라클에서 지원하는 전 감속 제품이 열 별칭이 GROUP BY에 사용 할 수 있음을 발견했다. 버전 11을 통해 주류 오라클은 열 별칭이 GROUP BY에 사용되는 것을 허용하지 않습니다. 확실하지 PostgreSQL을, SQL 서버, MySQL은, 등이 또는 허용하지 않습니다 무슨. YMMV.

    위로 하루에 나는 RDB는, 이제 오라클에서 지원하는 전 감속 제품이 열 별칭이 GROUP BY에 사용 할 수 있음을 발견했다. 버전 11을 통해 주류 오라클은 열 별칭이 GROUP BY에 사용되는 것을 허용하지 않습니다. 확실하지 PostgreSQL을, SQL 서버, MySQL은, 등이 또는 허용하지 않습니다 무슨. YMMV.

  10. from https://stackoverflow.com/questions/3841295/sql-using-alias-in-group-by by cc-by-sa and MIT license