이 기능은 모호한 쿼리를 허용하고 해당 열에서 임의의 값을 선택하여 결과 집합을 자동으로 반환합니다. 실제로는 그룹 내에서 물리적으로 먼저 저장된 행의 값인 경향이 있습니다.
GROUP BY 조건의 열에 기능적으로 종속 된 열만 선택하면 이러한 쿼리가 모호하지 않습니다. 즉, 그룹을 정의하는 값마다 "모호한"열의 고유 한 값만있을 수 있으면 아무런 문제가 없습니다. 이 쿼리는 논리적 모호성을 초래할 수 없지만, 마이크로 소프트 SQL 서버 (및 ANSI의 SQL)에서 불법 것 : ONLY_FULL_GROUP_BY
: 또한
SELECT AVG(table1.col1), table1.personID, persons.col4
FROM table1 JOIN persons ON (table1.personID = persons.id)
GROUP BY table1.personID;
, MySQL은이 표준에 따라 행동 할 수있는 SQL 모드가 있습니다
FWIW, SQLite는 또한이 모호한 GROUP BY 절을 허용하지만 그룹의 마지막 행의 값을 선택합니다. 이상 버전에서 내가 테스트 †
†. 무슨 임의의 될 것을 의미하는 MySQL 또는 SQLite 향후 구현을 변경할 수 있으며 일부 다른 동작이 있습니다. 따라서 현재 이와 같은 모호한 상황에있는 것처럼 행동에 의존해서는 안됩니다. 결정을 명확하게하고 애매하지 않도록 쿼리를 다시 작성하는 것이 좋습니다. 이것이 MySQL 5.7이 기본적으로 ONLY_FULL_GROUP_BY를 활성화하는 이유입니다.
저는 이것이 완전히 사실이 아니라고 말하고 싶습니다. ANSI SQL-99에서 선택된 필드는 집계이어야하며, 기능은 group by 절에 따라 다릅니다. user_id로 그룹화 할 때 user_name을 선택하면됩니다. SQL Server와 Oracle은 user_id가 group by list에있을 때 user_name을 선택하지 못하도록하기 때문에이를 준수하지 않습니다. MySQL은 실제로 선택된 컬럼이 실제로 user_id에 기능상으로 종속되어 있는지 여부를 확인하지 않기 때문에이를 준수하지 않습니다. –
@ThorstenKettner, 고맙습니다. 당신 말이 맞습니다. MySQL 5.7이 개선되었으며 ANSI SQL을 지원하는 경우 훨씬 더 지능적입니다. –