Articles

MySQL :: MySQL 5.6 Manual de referință :: 12.19.3 manipularea MySQL a grupului de

12.19.3 manipularea MySQL a grupului de

în SQL standard, o interogare care include o GROUP BYclauza nu se poate referi la coloanele listă care nu sunt denumite înGROUP BYclauza. De exemplu, această interogare este ilegală în SQL standard, deoarece nonaggregated name coloana din Lista select nu apare în 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;

pentru ca interogarea să fie legală, coloananame trebuie omisă din lista de selectare sau denumită în clauzaGROUP BY.

MySQL extinde utilizarea SQL standard aGROUP BY astfel încât Lista select se poate referi la coloane neagregate care nu sunt denumite în clauzaGROUP BY. Aceasta înseamnă că interogarea precedentă este legală în MySQL. Puteți utiliza această caracteristică pentru a obține performanțe mai bune, evitând sortarea și gruparea inutilă a coloanelor. Cu toate acestea, acest lucru este util în primul rând atunci când toate valorile din fiecare coloană neagregată care nu sunt denumite în GROUP BY sunt aceleași pentru fiecare grup. Serverul este liber să aleagă orice valoare din fiecare grup, deci dacă nu sunt aceleași, valorile alese sunt nedeterministe. În plus, selecția valorilor din fiecare grup nu poate fi influențată prin adăugarea unei clauze ORDER BY. Sortarea seturilor de rezultate are loc după ce valorile au fost alese și ORDER BY nu afectează valorile din fiecare grup pe care le alege serverul.

o extensie MySQL similară se aplică clauzeiHAVING. În SQL standard, o interogare nu se poate referi la coloanele neagregate din clauzaHAVING care nu sunt denumite în clauzaGROUP BY. Pentru a simplifica calculele, o extensie MySQL permite trimiteri la astfel de coloane. Această extensie presupune că coloanele nongrupate au aceleași valori de grup. În caz contrar, rezultatul este nedeterminist.

pentru a dezactiva Extensia MySQL GROUP BY și pentru a activa comportamentul SQL standard, activați modul SQL ONLY_FULL_GROUP_BY. În acest caz, coloanele care nu sunt denumite în clauza GROUP BY nu pot fi utilizate în lista de selectare sau în clauza HAVING decât dacă sunt incluse într-o funcție agregată.

extensia select list se aplică șiORDER BY. Adică, puteți face referire la coloanele neagregate din clauza ORDER BY care nu apar în clauza GROUP BY. (Cu toate acestea, așa cum am menționat anterior, ORDER BY nu afectează valorile care sunt alese dintre coloanele neagregate; le sortează numai după ce au fost alese.) Această extensie nu se aplică dacă ONLY_FULL_GROUP_BY modul SQL este activat.

dacă o interogare are funcții agregate și nu GROUP BY clauză, nu poate avea coloane neagregate în lista de selectare,HAVING condiție sau ORDER BY listă cu ONLY_FULL_GROUP_BY activat:

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

fărăGROUP BY, există un singur grup și este nedeterminist carename valoare de ales pentru grup.

o altă extensie MySQL la SQL standard permite referințe înHAVING clauza pentru expresii aliased în lista select. Activarea ONLY_FULL_GROUP_BY previne acest lucru. De exemplu, următoarea interogare returneazăname valori care apar o singură dată în tabel orders; interogarea este acceptată indiferent dacăONLY_FULL_GROUP_BY este activată:

SELECT name, COUNT(name) FROM orders GROUP BY name HAVING COUNT(name) = 1;

următoarea interogare este acceptată numai dacăONLY_FULL_GROUP_BY este dezactivată.

SELECT name, COUNT(name) AS c FROM orders GROUP BY name HAVING c = 1;

Dacă încercați să urmați SQL standard, puteți utiliza numai expresii de coloană înGROUP BY clauze. Ca soluție, utilizați un alias pentru expresia:

SELECT id, FLOOR(value/100) AS val FROM tbl_name GROUP BY id, val;

MySQL permite expresii non-coloane înGROUP BY clauze, deci aliasul nu este necesar:

SELECT id, FLOOR(value/100) FROM tbl_name GROUP BY id, FLOOR(value/100);