MySQL :: MySQL 5.6 referencia kézikönyv :: 12.19.3 MySQL kezelése csoport által
12.19.3 MySQL kezelése csoport által
a standard SQL, a lekérdezés, amely magában foglalja aGROUP BY
záradék nem hivatkozhat a nemgregált a kiválasztott lista oszlopai, amelyek nem szerepelnek a GROUP BY
záradékban. Ez a lekérdezés például a standard SQL-ben illegális, mivel a kijelölési lista nem taggregált name
oszlopa nem jelenik meg a 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;
ahhoz, hogy a lekérdezés legális legyen, a name
oszlopot ki kell hagyni a kiválasztott listából, vagy a GROUP BY
pontban meg kell nevezni.
a MySQL kiterjeszti a GROUP BY
szabványos SQL használatát, hogy a select lista a GROUP BY
záradékban nem nevezett nemgregált oszlopokra hivatkozhasson. Ez azt jelenti, hogy az előző lekérdezés legális a MySQL-ben. Ezzel a funkcióval jobb teljesítményt érhet el a felesleges oszloprendezés és csoportosítás elkerülésével. Ez azonban elsősorban akkor hasznos, ha a GROUP BY
– ban meg nem nevezett nemgregált oszlopokban szereplő összes érték azonos az egyes csoportoknál. A szerver szabadon választhat bármilyen értéket az egyes csoportokból, így hacsak nem azonosak, a kiválasztott értékek nem determinisztikusak. Ezenkívül az egyes csoportok értékeinek kiválasztását nem lehet befolyásolni egy ORDER BY
záradék hozzáadásával. Az eredményhirdetés az értékek kiválasztása után történik, és aORDER BY
nem befolyásolja, hogy a kiszolgáló mely értékeket választja az egyes csoportokon belül.
hasonló MySQL kiterjesztés vonatkozik a HAVING
záradékra. A standard SQL-ben a lekérdezés nem hivatkozhat a HAVING
záradék nem nevezett oszlopaira, amelyek nem szerepelnek a GROUP BY
záradékban. A számítások egyszerűsítése érdekében a MySQL kiterjesztés lehetővé teszi az ilyen oszlopokra való hivatkozásokat. Ez a kiterjesztés feltételezi, hogy a nem csoportosított oszlopok azonos csoportszintű értékekkel rendelkeznek. Ellenkező esetben az eredmény nem determinisztikus.
a MySQLGROUP BY
kiterjesztés letiltásához és a standard SQL viselkedés engedélyezéséhez engedélyezze aONLY_FULL_GROUP_BY
SQL módot. Ebben az esetben a GROUP BY
záradékban meg nem nevezett oszlopok nem használhatók a select listában vagy a HAVING
záradékban, kivéve, ha egy aggregált függvényben van.
a select list kiterjesztés a ORDER BY
– ra is vonatkozik. Ez azt jelenti, hogy a ORDER BY
záradék nem jelenik meg a GROUP BY
záradékban. (Azonban, amint azt korábban említettük, a ORDER BY
nem befolyásolja, hogy mely értékeket választják ki a nemgregált oszlopokból; csak a választás után rendezi őket.) Ez a kiterjesztés nem érvényes, ha a ONLY_FULL_GROUP_BY
SQL mód engedélyezve van.
Ha egy lekérdezés összesített függvényekkel rendelkezik, és nincs GROUP BY
záradék, akkor nem lehet nem elkülönített oszlop a kiválasztási listában, HAVING
állapot, vagy ORDER BY
lista ONLY_FULL_GROUP_BY
engedélyezve:
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
nélkül GROUP BY
, van egy csoport, és ez nondeterminisztikus, amely name
érték választani a csoport.
egy másik MySQL kiterjesztés a standard SQL számára lehetővé teszi a HAVING
hivatkozásokat a select listában szereplő aliased kifejezésekre. A ONLY_FULL_GROUP_BY
engedélyezése megakadályozza ezt. Például a következő lekérdezés name
értékeket ad vissza, amelyek csak egyszer fordulnak elő a orders
táblázatban; a lekérdezés elfogadásra kerül, függetlenül attól, hogy a ONLY_FULL_GROUP_BY
engedélyezve van-e:
SELECT name, COUNT(name) FROM orders GROUP BY name HAVING COUNT(name) = 1;
a következő lekérdezés csak akkor fogadható el, ha a ONLY_FULL_GROUP_BY
le van tiltva.
SELECT name, COUNT(name) AS c FROM orders GROUP BY name HAVING c = 1;
ha szabványos SQL-t próbál követni, akkor csak oszlopkifejezéseket használhat a GROUP BY
záradékokban. Kerülő megoldásként használja egy alias a kifejezés:
SELECT id, FLOOR(value/100) AS val FROM tbl_name GROUP BY id, val;
MySQL lehetővé teszi noncolumn kifejezéseket GROUP BY
záradékok, így az alias felesleges:
SELECT id, FLOOR(value/100) FROM tbl_name GROUP BY id, FLOOR(value/100);
Leave a Reply