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 BY
clauza nu se poate referi la coloanele listă care nu sunt denumite înGROUP BY
clauza. 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);
Leave a Reply