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);
Leave a Reply