Articles

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 nameoszlopot 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 orderstá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);