Articles

MySQL :: MySQL 5.6 Referansehåndbok :: 12.19.3 MySQL Håndtering AV GRUPPE ved

12.19.3 MySQL Håndtering AV GRUPPE VED

i standard SQL kan en spørring som inneholder en GROUP BY klausul ikke referere til ikke-aggregerte kolonner i select liste som Ikke Er Navngitt I GROUP BY – setningsdelen. Denne spørringen er for eksempel ulovlig i standard SQL fordi den ikke-aggregertename – kolonnen i select-listen ikke vises i 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;

for at spørringen skal være lovlig, måname – kolonnen utelates fra select-listen eller navngitt iGROUP BY – setningsdelen.

MySQL utvider STANDARD SQL-bruk av GROUP BY slik at select-listen kan referere til ikke-aggregerte kolonner som ikke er navngitt iGROUP BY – klausulen. Dette betyr at forrige spørring er lovlig I MySQL. Du kan bruke denne funksjonen til å få bedre ytelse ved å unngå unødvendig kolonnesortering og gruppering. Dette er imidlertid nyttig først og fremst når alle verdier i hver ikke-aggregert kolonne som ikke er navngitt i GROUP BY er de samme for hver gruppe. Serveren er fri til å velge hvilken som helst verdi fra hver gruppe, så med mindre de er de samme, er de valgte verdiene ikke-deterministiske. Videre kan valget av verdier fra hver gruppe ikke påvirkes ved å legge til enORDER BY – setningsdel. Sortering av resultatsett skjer etter at verdier er valgt, og ORDER BY påvirker ikke hvilke verdier i hver gruppe serveren velger.

En Lignende MySQL-utvidelse gjelder forHAVING – klausulen. I standard SQL kan en spørring ikke referere til ikke-aggregerte kolonner i HAVING – setningsdelen som ikke er navngitt iGROUP BY – setningsdelen. For å forenkle beregninger tillater En MySQL-utvidelse referanser til slike kolonner. Denne utvidelsen antar at de ikke-grupperte kolonnene har samme gruppevis verdier. Ellers er resultatet ikke-deterministisk.

hvis Du vil deaktivere MySQLGROUP BY – utvidelsen og aktivere STANDARD SQL-oppførsel, aktiverer DUONLY_FULL_GROUP_BY SQL-modus. I dette tilfellet kan kolonner som ikke er navngitt i GROUP BY – setningsdelen ikke brukes i select-listen eller HAVING – setningsdelen med mindre den er vedlagt i en aggregatfunksjon.

select list-utvidelsen gjelder også for ORDER BY. Det vil si at du kan referere til ikke-aggregerte kolonner iORDER BY – klausulen som ikke vises iGROUP BY – klausulen. (Men som nevnt tidligere, ORDER BY påvirker ikke hvilke verdier som er valgt fra ikke-aggregerte kolonner; det sorterer dem bare etter at de er valgt.) Denne utvidelsen gjelder ikke hvisONLY_FULL_GROUP_BY SQL-modus er aktivert.

Hvis en spørring har aggregatfunksjoner og ingen GROUP BY – klausul, kan den ikke ha ikke-aggregerte kolonner i select-listen,HAVING betingelse, ellerORDER BY liste medONLY_FULL_GROUP_BY aktivert:

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

Uten GROUP BY, det er en enkelt gruppe, og det er ikke-deterministisk somname verdi å velge for gruppen.

En Annen MySQL-utvidelse til standard SQL tillater referanser iHAVING – klausulen til aliasede uttrykk i select-listen. AktiveringONLY_FULL_GROUP_BY forhindrer dette. Følgende spørring returnerer for eksempelname verdier som bare forekommer en gang i tabellen orders; spørringen godtas uansett omONLY_FULL_GROUP_BY er aktivert:

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

følgende spørring godtas bare hvis ONLY_FULL_GROUP_BY er deaktivert.

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

hvis du prøver å følge standard SQL, kan du bare bruke kolonneuttrykk iGROUP BY klausuler. Som en løsning, bruk et alias for uttrykket:

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

MySQL tillater ikke-kolonneuttrykk i GROUP BY klausuler, så aliaset er unødvendig:

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