Articles

MySQL::MySQL5.6Reference Manual::12.19.3MySQL 처리의 그룹에 의해

12.19.3MySQL 처리의 그룹에 의해

기준에서 SQL, 을 포함하는 쿼리GROUP BYGROUP BYclause. 예를 들어,이 쿼리가 불법적 기준에서 SQL 기 때문에 끌어냅니다nameGROUP BY:

SELECT o.custid, c.name, MAX(o.payment) FROM orders AS o, customers AS c WHERE o.custid = c.custid GROUP BY o.custid;

에 대한 쿼리,법적으로nameGROUP BYclause.

MySQL 확장 표준 SQL 사용하의GROUP BYGROUP BYclause. 이것은 앞의 쿼리가 mysql 에서 합법적이라는 것을 의미합니다. 이 기능을 사용하여 불필요한 열 정렬 및 그룹화를 방지하여 더 나은 성능을 얻을 수 있습니다. 그러나,이것은 주로 유용할 때 모든 값을 각각에서 끌어냅니다 열에 포함되지 않은 경우GROUP BYORDER BYORDER BY에 영향을 미치지 않는 값에서 각 그룹 서버 선택합니다.

비슷한 MySQL 확장이HAVING절에 적용됩니다. 표준에서 SQL 쿼리를 참조할 수 없습니다를 끌어냅니다 열HAVINGGROUP BYclause. 계산을 단순화하기 위해 MySQL 확장은 이러한 열에 대한 참조를 허용합니다. 이 확장은 그룹화되지 않은 열에 동일한 그룹 별 값이 있다고 가정합니다. 그렇지 않으면 결과가 비 결정적입니다.

MySQLGROUP BY확장을 비활성화하고 표준 SQL 동작을 활성화하려면ONLY_FULL_GROUP_BYSQL 모드를 활성화하십시오. 이 경우,열을 없습에서 이름GROUP BYHAVING절로 묶지 않는 한 집계 기능입니다.

선택 목록 확장은ORDER BYORDER BYGROUP BYclause. (그러나,이전에 언급한ORDER BYONLY_FULL_GROUP_BYSQL 모드가 활성화 된 경우에는 적용되지 않습니다.

경우 쿼리가 집계 기GROUP BYclause,그것은 있을 수 없습 끌어냅니다 열을 선택 목록에서,HAVINGORDER BYONLY_FULL_GROUP_BY사용:

mysql> SELECT name, MAX(age) FROM t;ERROR 1140 (42000): Mixing of GROUP columns (MIN(),MAX(),COUNT(),...)with no GROUP columns is illegal if there is no GROUP BY clause

지 않고GROUP BYname값을 선택합니다.

표준 SQL 에 대한 또 다른 MySQL 확장은HAVING절에서 select 목록의 앨리어싱 된 표현식에 대한 참조를 허용합니다. ONLY_FULL_GROUP_BYnameordersONLY_FULL_GROUP_BY은 사용할 수 있습니다.

SELECT name, COUNT(name) FROM orders GROUP BY name HAVING COUNT(name) = 1;

다음과 같은 쿼리가 허용하는 경우에만ONLY_FULL_GROUP_BY사용할 수 없습니다.

SELECT name, COUNT(name) AS c FROM orders GROUP BY name HAVING c = 1;

하려고 하는 경우에 따라 표준 SQL 사용할 수 있습니만 열이 식은GROUP BY절입니다. 문제 해결 방법으로,별칭을 사용한 표현:

SELECT id, FLOOR(value/100) AS val FROM tbl_name GROUP BY id, val;

MySQL 허가 noncolumn 식GROUP BY조항,그래서 별칭을 불필요한다.

SELECT id, FLOOR(value/100) FROM tbl_name GROUP BY id, FLOOR(value/100);