Някаква причина за клауза GROUP BY без функция за агрегиране?

В момента (задълбочено) изучавам SQL и попаднах на GROUP BYклаузата.

GROUP BY агрегира или групира набора от резултати според аргумента(ите), който му давате. Ако използвате тази клауза в заявка, тогава можете да изпълнявате обобщени функции върху набора от резултати, за да намерите статистическа информация в набора от резултати, като намиране на средни стойности (AVG()) или честота (COUNT()).

Въпросът ми е: изразът GROUP BY полезен ли е по някакъв начин без придружаваща агрегатна функция?

Актуализация Използването на GROUP BY като синоним на DISTINCT е (вероятно) лоша идея, защото подозирам, че е по-бавно.


person Niels Bom    schedule 04.02.2010    source източник


Отговори (5)


изразът GROUP BY полезен ли е по някакъв начин без придружаваща агрегатна функция?

Използването на DISTINCT би било синоним в такава ситуация, но причината, поради която искате/трябва да дефинирате клауза GROUP BY, би била, за да можете да дефинирате подробности за клауза HAVING.

Ако трябва да дефинирате HAVING клауза, вие трябва да дефинирате GROUP BY - не можете да го направите във връзка с DISTINCT.

person OMG Ponies    schedule 04.02.2010
comment
@Niels: Зависи от данните и модела на данни, но никога не съм имал нужда от IME, който мога да си спомня - person OMG Ponies; 04.02.2010

Можете да извършите DISTINCT избор, като използвате GROUP BY без никакви AGGREGATES.

person Adriaan Stander    schedule 04.02.2010

Групирането по може да се използва в двупосочността основно
1)във връзка с функциите за агрегиране на SQL
2)за елиминиране на дублиращи се редове от набор от резултати

Така че отговорът на вашия въпрос се крие във втората част на описаните по-горе USE.

person Ashish Agarwal    schedule 04.02.2010

Забележка: всичко по-долу се отнася само за MySQL

GROUP BY е гарантирано, че връща резултатите в ред, DISTINCT не е .

GROUP BY заедно с ORDER BY NULL е със същата ефективност като DISTINCT (и имплементиран по същия начин). Ако има индекс в полето, което се агрегира (или разграничава), и двете клаузи използват сканиране на свободен индекс върху това поле.

В GROUP BY можете да върнете негрупирани и неагрегирани изрази. MySQL ще избере произволни стойности от съответната група, за да изчисли израза.

С GROUP BY можете да пропуснете изразите GROUP BY от клаузата SELECT. С DISTINCT не можете. Всеки ред, върнат от DISTINCT, е гарантирано уникален.

person Quassnoi    schedule 04.02.2010

Използва се за повече от функции за агрегиране.

Например, разгледайте следния код:

SELECT product_name, MAX('last_purchased') FROM products GROUP BY product_name

Това ще върне само 1 резултат за продукт, но с последната актуализирана стойност на тези записи.

person Amirshk    schedule 04.02.2010
comment
MAX() е агрегатна функция. - person Max Shawabkeh; 04.02.2010
comment
@am: Нийлс пита за употреби без агрегатна функция - person Ashish Agarwal; 04.02.2010
comment
Не агрегира, а избира една стойност от списък. Съвкупността е колекция от елементи, които са събрани заедно, за да образуват общо количество - person Amirshk; 04.02.2010
comment
Това е агрегат, тъй като приема група от стойности, всяка от различен ред, и ви връща един резултат - това е дефиницията на агрегатните функции в SQL. - person Max Shawabkeh; 04.02.2010
comment
@Max, приема се като несправедлива езикова разлика :), предполагам, че не съм разбрал правилно Q. - person Amirshk; 04.02.2010