Articles

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);