2010-05-05 3 views
9

이것은 항상 저를 괴롭혔습니다 - 왜 SQL 문에서 GROUP BY 절이 모든 비 집합 열을 포함해야합니까? 이 열은 기본적으로 포함되어야합니다 (일종의 "GROUP BY *"- 모두 포함되어 있지 않으면 쿼리를 실행할 수 없기 때문에). 모든 열은 집계되거나 "GROUP BY"에 지정되어야하지만 집계되지 않은 것이 자동으로 그룹화되어야합니다.SQL "GROUP BY"절의 모든 열을 명시 적으로 지정해야하는 이유 - "GROUP BY *"가 아닌 이유는 무엇입니까?

어쩌면 ANSI-SQL 표준의 일부 일지 모르지만 그 이유는 모르겠습니다. 누군가이 대회에 대한 필요성을 이해하도록 도와 줄 수 있습니까?

+0

관련 http://stackoverflow.com/questions/416625/why-does-sql-force-me-to-repeat-all-aggregated-fields-from-my-select-clause-i –

+0

Ah - 그것은 중복이다. 나는이 질문을 닫을 것이다. – SqlRyan

+1

멀티 캐스트 : http://stackoverflow.com/questions/2311034/is-sql-group-by-a-design-flaw – cindi

답변

19

그것은 여기 그들은 표준, 을 쓸 때 SQL 언어의 설계자는 생각으로 정확히 알고 어렵다하지만 나의 의견입니다.

SQL은 일반적으로 기대와 의도를 명시해야합니다. 언어는 "당신이 의미 한 것 같아요"으로 시도하지 않으며 자동으로 공백을 채 웁니다. 이것은 좋은 물건입니다.

쿼리를 작성할 때 가장 중요한 고려 사항은 이 올바른 결과를 나타냅니다.. 실수로 작성한 경우 SQL 구문 분석기가 사용자의 의도를 추측하고 올바르지 않을 수있는 결과를 반환하는 대신 사용자에게 알리는 것이 좋습니다. SQL의 선언적 특성 (검색 방법 단계가 아니라 검색하려는 내용을 기술 한 곳)을 사용하면 실수로 실수로 쉽게 실수를 범할 수 있습니다. 언어 구문에 fuzziniess를 도입해도 더 좋을 수는 없습니다..

실제로 언어가 허용되는 언어를 생각할 수있는 모든 경우 바로 가기이 문제를 일으켰습니다. 예를 들어 자연스러운 조인 - 조인 할 열의 이름을 생략하고 데이터베이스가 열 이름을 기반으로 해당 열을 유추 할 수 있도록합니다. 열 이름이 변경되면 (자연스럽게 시간이 지남에 따라) - 기존 쿼리의 의미가 변경됩니다 (). 이것은 나쁘다 ... 매우 나쁨 - 당신은 정말로이 종류의 마술이 데이터베이스 코드에서 일어나는 것을 원하지 않습니다. 이 디자인 선택의

한 결과는, 그러나, SQL은 명시 적 의도를 표현해야하는 장황한 언어 것입니다. 이것은 당신이 좋아하는 것보다 더 많은 코드를 작성해야하는 결과를 가져올 수 있으며, 특정 구문이 왜 장황한 이유에 대해 불만을 나타낼 수 있습니다. 그러나 결국에는 그것이 무엇입니까?

0

다음과 같이 간단합니다. from 절에있는 모든 단일 열로 결과를 sql 그룹화하도록 요청했습니다. 이는 from 절 SQL의 모든 열에 대해 결과 집합을 내부적으로 그룹화하여 내부에 표시합니다. 당신. 그래서 그것은 그것이 당신에게 부분적으로 가능한 그룹이 아니기 때문에 당신이 from 컬럼에있는 모든 컬럼을 언급하도록 요청하는 이유를 설명합니다. 모든 컬럼을 그룹화하여 sql이 의도 한 바를 달성 할 수있는 group by 절을 언급 한 경우. 그것은 수학 제한입니다.

0

GROUP BY 절을 그대로 유지하는 유일한 논리적 인 이유는 그룹화의 선택 열에 포함되지 않은 필드를 포함 할 수 있다는 것입니다. 예를 들어

.

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

column3은 쿼리의 다른 곳에서 표시되지 않지만 그 값으로 결과를 그룹화 할 수 있습니다. (물론 일단 그렇게하면 레코드가 그룹화 된 이유를 알 수 없습니다.)

압도적으로 가장 일반적인 시나리오의 간단한 지름길처럼 보입니다. 집합 열)은 코딩 속도를 높이는 간단하면서도 효과적인 도구입니다.

아마도 여전히 자동으로 사용자에게 허용 할 수 있도록 이미 SQL 도구 결과 열 번호로 열에 대한 참조를 허용하기에 아주 일반적인 (예. GROUP BY 1,2,3, 등) 그것은 간단 보일 것 때문에 "GROUP BY *"

하나의 키 스트로크에 모든 비 집합 필드를 포함하십시오.