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);
Leave a Reply