복붙노트

[SQL] 이유는 명시 적으로 SQL에서 "GROUP BY"절을 모든 열을 지정해야합니까 - 왜 안 "GROUP BY *"?

SQL

이유는 명시 적으로 SQL에서 "GROUP BY"절을 모든 열을 지정해야합니까 - 왜 안 "GROUP BY *"?

이것은 항상 나를 방해하고있다 - 왜 SQL 문에서 GROUP BY 절 내가 모든 비 집계 열을 포함해야합니까? 이러한 열은 기본적으로 포함되어야한다 -의 일종 "GROUP BY *"- 그들은 모두 포함하지 않는 한 나는 심지어 쿼리를 실행할 수 있기 때문이다. 모든 열 중 하나를 집계로 또는 "GROUP BY"으로 지정할 수있다, 그러나 자동으로 분류되어야한다 집계되지 아무것도처럼 보인다.

는 ANSI-SQL 표준의 어쩌면 그것의 부분, 그러나 그렇다고하더라도, 그 이유를 이해하지 않습니다. 누군가의 도움이 날은이 규칙의 필요성을 이해할 수 있습니까?

해결법

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

    1.그것은 그들이 표준을 쓸 때 SQL 언어의 설계자는 생각으로 정확히 알 수 없지만 여기에 제 의견입니다.

    그것은 그들이 표준을 쓸 때 SQL 언어의 설계자는 생각으로 정확히 알 수 없지만 여기에 제 의견입니다.

    SQL은, 일반적으로, 명시 적 기대와 의도를 명시하도록 요구합니다. 언어는 "당신이 무슨 뜻인지 추측"을 시도하고 자동으로 빈칸을 채워하지 않습니다. 이것은 좋은 것입니다.

    쿼리를 작성할 때 가장 중요한 고려 사항은 정확한 결과를 얻을 수 있다는 것입니다. 당신이 실수를 한 경우, SQL 파서 정보 용 당신이 아니라 결과를 사용자의 의도에 대한 추측을하고 돌아보다가이 정확하지 않을 수 아마도 좋습니다. (당신은 당신이 아니라 그것을 검색하는 방법의 단계보다, 검색하려는 상태) SQL의 선언적 성격은 이미 실수로 실수를 쉽게 만들을 수 있습니다. 언어 구문에 fuzziniess을 소개이 더 나은하지 것이다.

    사실, 나는 언어가 바로 가기를 허용 여기서 생각할 수있는 모든 경우에 문제가 발생했습니다. 당신은 당신이에 가입하고 데이터베이스 열 이름에 기반을 추론 할 수 있도록하려는 열의 이름을 생략 할 수있는 - 예를 들어, 자연 조인 보자. 열 이름 변경 (그들은 자연스럽게 이상의처럼 시간) 일단 - 기존 쿼리의 의미는 그들과 함께 변경됩니다. 이 나쁜 ... 아주 나쁜입니다 - 당신이 정말로 데이터베이스 코드에서 무대 뒤에서 일어나는 마법의이 종류를 원하지 않는다.

    이 디자인 선택의 결과 중 하나는, 그러나, SQL은 명시 적 의도를 표현해야하는 장황한 언어 것입니다. 이것은 특정 구조가 너무 자세한 이유에 대한 자세한 당신이 좋아하는 것보다 코드 및 불만을 작성할 필요가 발생할 수 있습니다 ...하지만 하루의 끝에서 - 그것이 무엇이다.

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

    2.단지 이런 식의 간단한 : 당신은 SQL 엔진은 이전에 내부적으로 그룹 결과 세트가 당신에게 그것을 제시 할 절에서 SQL의 모든 열에 대한 의미, 절에서의 모든 단일 컬럼하여 SQL 그룹에 결과를 물었다. 너무 때문에 불가능 그룹을 부분적에서 모든 열 존재를 언급하도록 요청 이유를 설명 그래서. 당신은뿐만 아니라 모든 열을 그룹화하여 사용자의 의도를 달성 SQL 만 가능하다 GROUP BY 절을 언급합니다. 그것은 수학 제한입니다.

    단지 이런 식의 간단한 : 당신은 SQL 엔진은 이전에 내부적으로 그룹 결과 세트가 당신에게 그것을 제시 할 절에서 SQL의 모든 열에 대한 의미, 절에서의 모든 단일 컬럼하여 SQL 그룹에 결과를 물었다. 너무 때문에 불가능 그룹을 부분적에서 모든 열 존재를 언급하도록 요청 이유를 설명 그래서. 당신은뿐만 아니라 모든 열을 그룹화하여 사용자의 의도를 달성 SQL 만 가능하다 GROUP BY 절을 언급합니다. 그것은 수학 제한입니다.

  3. ==============================

    3.당신이 당신의 그룹에서 선택 항목에 포함되지 않은 필드를 포함 할 수 있다는 것입니다으로 내가 생각할 수있는 유일한 논리적 인 이유는 GROUP BY 절을 유지합니다.

    당신이 당신의 그룹에서 선택 항목에 포함되지 않은 필드를 포함 할 수 있다는 것입니다으로 내가 생각할 수있는 유일한 논리적 인 이유는 GROUP BY 절을 유지합니다.

    예를 들어.

    Select column1, SUM(column2) AS sum
     FROM table1
     GROUP BY column1, column3
    

    3 열이 다른 쿼리에 표시되지 않은 경우에도, 당신이 할 수있는 그것의 가치에 의하여, 여전히 그룹 결과. (물론 당신은 당신은 그들이 있었다으로 기록 그룹화 이유 결과에서 알 수없는, 그런 짓을하면.)

    코딩 속도를 향상을위한 간단하면서도 효과적인 도구가 될 것입니다 (비 집계 각 열에 의해 그룹화)이 압도적으로 가장 일반적인 시나리오에 대한 간단한 단축키처럼 보인다.

    아마도 "GROUP BY *"

    이미 SQL 도구 결과 열 번호로 열에 대한 참조를 허용하기에 매우 일반적이기 때문에 (예. 1,2,3 BY GROUP 등) 아직 간단한을 보일 수있을 것입니다 자동으로 모두를 포함하도록 사용자를 허용 할 수 하나의 키 입력에 비 집계 필드.

  4. from https://stackoverflow.com/questions/2777235/why-do-i-need-to-explicitly-specify-all-columns-in-a-sql-group-by-clause-why by cc-by-sa and MIT license