MySQL :: MySQL 5.6 Reference Manual :: 12.19.3 MySQL, Manipulace SKUPINOU POMOCÍ
12.19.3 MySQL Manipulaci SKUPINY
Ve standardní SQL, dotaz, který obsahuje GROUP BY
doložka nemůže odkazovat na nonaggregated sloupce v seznamu select, které nejsou uvedeny v GROUP BY
klauzule. Například, tento dotaz je nezákonné ve standardu SQL, protože nonaggregated name
sloupce v seznamu select, nezobrazí se v 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;
Pro dotaz být legální, name
sloupce musí být vynechán ze seznamu select nebo s názvem v GROUP BY
klauzule.
MySQL rozšiřuje standardní SQL používání GROUP BY
tak, že vyberte seznam může odkazovat na nonaggregated sloupce, které nejsou uvedeni v GROUP BY
klauzule. To znamená, že předchozí dotaz je v MySQL legální. Tuto funkci můžete použít k dosažení lepšího výkonu tím, že se vyhnete zbytečnému třídění a seskupování sloupců. Nicméně, to je užitečné především, když všechny hodnoty v každé nonaggregated sloupec není jmenován v GROUP BY
jsou stejné pro každou skupinu. Server si může vybrat libovolnou hodnotu z každé skupiny, takže pokud nejsou stejné, vybrané hodnoty jsou nedeterministické. Kromě toho nelze výběr hodnot z každé skupiny ovlivnit přidáním klauzule ORDER BY
. Třídění sady výsledků nastane po zvolení hodnot a ORDER BY
nemá vliv na to, které hodnoty v každé skupině server zvolí.
podobné rozšíření MySQL platí pro klauzuli HAVING
. Ve standardním SQL nemůže dotaz odkazovat na neagregované sloupce v klauzuli HAVING
, které nejsou pojmenovány v klauzuli GROUP BY
. Pro zjednodušení výpočtů přípona MySQL povoluje odkazy na takové sloupce. Toto rozšíření předpokládá, že sloupce bez seskupení mají stejné hodnoty podle skupin. V opačném případě je výsledek nedeterministický.
Chcete-li zakázat rozšíření MySQL GROUP BY
a povolit standardní chování SQL, povolte režimONLY_FULL_GROUP_BY
SQL. V tomto případě sloupce, které nejsou pojmenovány v klauzuli GROUP BY
, nelze použít v seznamu select nebo HAVING
, pokud nejsou uzavřeny v agregované funkci.
rozšíření select list platí také pro ORDER BY
. To znamená, že můžete odkazovat na neagregované sloupce v klauzuli ORDER BY
, které se nezobrazují v klauzuli GROUP BY
. (Nicméně, jak již bylo zmíněno, ORDER BY
nemá vliv na to, které hodnoty jsou vybrány z neagregovaných sloupců; třídí je až poté, co byly vybrány.) Toto rozšíření neplatí, pokud je povolen režim SQL ONLY_FULL_GROUP_BY
.
v Případě, že dotaz má agregační funkce a ne GROUP BY
klauzule, že nemůže mít nonaggregated sloupce v seznamu select, HAVING
stavu, nebo ORDER BY
seznam ONLY_FULL_GROUP_BY
povoleno:
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
Bez GROUP BY
, tam je jedna skupina a to je nedeterministické, které name
, hodnota se volí pro skupiny.
Další MySQL rozšíření standardu SQL umožňuje odkazy v HAVING
klauzule alias výrazy v seznamu select. Povolení ONLY_FULL_GROUP_BY
tomu zabrání. Například následující dotaz vrátí name
hodnoty, které se vyskytují pouze jednou v tabulce orders
; dotaz je přijat bez ohledu na to, zda ONLY_FULL_GROUP_BY
je povoleno:
SELECT name, COUNT(name) FROM orders GROUP BY name HAVING COUNT(name) = 1;
následující dotaz je přijat, pouze pokud ONLY_FULL_GROUP_BY
je zakázáno.
SELECT name, COUNT(name) AS c FROM orders GROUP BY name HAVING c = 1;
Pokud jste se snaží dodržovat standard SQL, můžete použít pouze sloupce výrazů v GROUP BY
klauzule. Jako řešení, použít alias pro výraz:
SELECT id, FLOOR(value/100) AS val FROM tbl_name GROUP BY id, val;
MySQL umožňuje noncolumn výrazů v GROUP BY
doložky, takže alias je zbytečné:
SELECT id, FLOOR(value/100) FROM tbl_name GROUP BY id, FLOOR(value/100);
Leave a Reply