Articles

MySQL :: MySQL 5.6 Reference Manual :: 12.19.3 Obsługa MySQL grupy przez

12.19.3 Obsługa MySQL grupy przez

w standardowym SQL zapytanie zawierające GROUP BY nie może odnosić się do kolumny niezagregowane na liście select, które nie są wymienione w klauzuli GROUP BY. Na przykład to zapytanie jest nielegalne w standardowym SQL, ponieważ niezagregowana kolumnaname na liście select nie pojawia się w GROUP 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;

aby zapytanie było zgodne z prawem, kolumnaname musi zostać pominięta na liście select lub nazwana w klauzuliGROUP BY.

MySQL rozszerza standardowe użycie SQL GROUP BY tak, że lista select może odnosić się do niezagregowanych kolumn nie wymienionych w klauzuli GROUP BY. Oznacza to, że poprzednie zapytanie jest legalne w MySQL. Możesz użyć tej funkcji, aby uzyskać lepszą wydajność, unikając niepotrzebnego sortowania i grupowania kolumn. Jest to jednak przydatne przede wszystkim wtedy, gdy wszystkie wartości w każdej niezagregowanej kolumnie nie nazwanej w GROUP BY są takie same dla każdej grupy. Serwer może wybrać dowolną wartość z każdej grupy, więc o ile nie są one takie same, wybrane wartości są nieokreślone. Ponadto na wybór wartości z każdej grupy nie ma wpływu dodanie klauzuliORDER BY. Sortowanie zestawów wyników następuje po wybraniu wartości, a ORDER BY nie ma wpływu na to, które wartości w każdej grupie wybiera serwer.

podobne rozszerzenie MySQL dotyczy klauzuli HAVING. W standardowym SQL zapytanie nie może odnosić się do niezagregowanych kolumn w klauzuli HAVING, które nie są wymienione w klauzuli GROUP BY. Aby uprościć obliczenia, rozszerzenie MySQL zezwala na odwołania do takich kolumn. To rozszerzenie zakłada, że kolumny niezgrupowane mają te same wartości dotyczące grup. W przeciwnym razie wynik jest niedeterministyczny.

aby wyłączyć rozszerzenie MySQLGROUP BY I włączyć standardowe zachowanie SQL, włącz trybONLY_FULL_GROUP_BY SQL. W tym przypadku kolumny nie wymienione w klauzuliGROUP BY nie mogą być użyte na liście select lubHAVING, chyba że są zamknięte w funkcji agregującej.

rozszerzenie listy select dotyczy równieżORDER BY. Oznacza to, że możesz odwołać się do niezagregowanych kolumn w klauzuli ORDER BY, które nie występują w klauzuli GROUP BY. (Jednak, jak wspomniano wcześniej, ORDER BY nie ma wpływu na to, które wartości są wybierane z niezagregowanych kolumn; sortuje je tylko po ich wybraniu.) To rozszerzenie nie ma zastosowania, jeśli ONLY_FULL_GROUP_BY tryb SQL jest włączony.

Jeśli zapytanie ma funkcje zagregowane i nie maGROUP BY klauzuli, nie może mieć niezagregowanych kolumn na liście select,HAVING warunek lub ORDER BY lista z ONLY_FULL_GROUP_BY włączone:

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

bezGROUP BY istnieje jedna grupa i nie jest ona określona, któraname wartość do wyboru dla grupy.

kolejne rozszerzenie MySQL do standardowego SQL pozwala na odniesienia w klauzuli HAVING do aliasowanych wyrażeń na liście select. Włączenie opcji ONLY_FULL_GROUP_BY zapobiega temu. Na przykład następujące zapytanie zwracaname wartości, które występują tylko raz w tabeli orders; zapytanie jest akceptowane niezależnie od tego, czy ONLY_FULL_GROUP_BY jest włączone:

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

następujące zapytanie jest akceptowane tylko wtedy, gdy ONLY_FULL_GROUP_BY jest wyłączone.

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

Jeśli próbujesz postępować zgodnie ze standardowym SQL, możesz używać tylko wyrażeń kolumnowych w klauzulachGROUP BY. Jako obejście, użyj aliasu wyrażenia:

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

MySQL zezwala na wyrażenia nieliniowe w klauzulach GROUP BY, więc alias jest niepotrzebny:

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