В SQL, что означает Group By без Count (*) или Sum (), Max (), avg (), ... и для чего это нужно? - PullRequest
4 голосов
/ 24 апреля 2010

В SQL, если мы используем Group By без Count (*) или Sum () и т. Д., Результат будет следующим:

mysql>  select * from sentGifts;
+--------+------------+--------+------+---------------------+--------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID |
+--------+------------+--------+------+---------------------+--------+
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |
|      2 | 2010-04-24 |    123 | 4568 | 2010-04-24 01:56:04 |    100 |
|      3 | 2010-04-24 |    123 | NULL | NULL                |      1 |
|      4 | 2010-04-24 |   NULL |  111 | 2010-04-24 03:10:42 |      2 |
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |
|      6 | 2010-04-24 |     11 |  222 | 2010-04-24 03:54:49 |      6 |
|      7 | 2010-04-24 |      1 |    2 | 2010-04-24 03:58:45 |      6 |
+--------+------------+--------+------+---------------------+--------+
7 rows in set (0.00 sec)


mysql>  select *, count(*) from sentGifts group by whenSent;
+--------+------------+--------+------+---------------------+--------+----------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID | count(*) |
+--------+------------+--------+------+---------------------+--------+----------+
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |        1 |
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |        6 |
+--------+------------+--------+------+---------------------+--------+----------+
2 rows in set (0.00 sec)


mysql>  select * from sentGifts group by whenSent;
+--------+------------+--------+------+---------------------+--------+
| sentID | whenSent   | fromID | toID | trytryWhen          | giftID |
+--------+------------+--------+------+---------------------+--------+
|      5 | 2010-03-03 |     11 |   22 | 2010-03-03 00:00:00 |      6 |
|      1 | 2010-04-24 |    123 |  456 | 2010-04-24 01:52:20 |    100 |
+--------+------------+--------+------+---------------------+--------+
2 rows in set (0.00 sec)

Только одна строка возвращается для "группы". Что это означает, когда нет «Count (*)» и т. Д. При использовании «Group By», и что он использует? спасибо.

Ответы [ 2 ]

3 голосов
/ 24 апреля 2010

По умолчанию MySQL будет возвращать значение первой строки, с которой он сталкивается при выполнении запроса. Как будто используется агрегат по умолчанию arbitrary.

Это полезно, если у вас длинный список столбцов, в котором вы знаете, что большинство из них повторяются, например:

Login    LongName             City        PhoneNr      Time
Dude     Mr. Dude the 2nd     Jerk Town   12345678     13:01
Dude     Mr. Dude the 2nd     Jerk Town   12345678     13:05
Dude     Mr. Dude the 2nd     Jerk Town   12345678     13:12

Здесь вы могли бы group by login:

select LongName, City, PhoneNr, max(Time) from Logins group by login

Поскольку вы знаете, что Long Name зависит от Login, это будет работать, как и ожидалось. Все остальные системы СУБД, о которых я знаю, требуют от вас явного указания group by login, LongName, City, PhoneNr. Даже в MySQL это считается хорошей практикой.

0 голосов
/ 24 апреля 2010

group by без агрегатной функции в предложении select является функциональным эквивалентом использования select distinct, хотя система базы данных может выполнить его по-другому.

Кстати, запрос select * from sentGifts group by whenSent специфичен для MySQL: список select обычно включает только столбцы из предложения group by и агрегатные функции (поэтому PostgreSQL и, вероятно, MSSQL не сочтут запрос действительным). Даже если вы пометили вопрос как «MySQL», ваши вопросы начинаются с «В SQL», поэтому я думаю, что имеет смысл указать, что это поведение, вероятно, не является частью стандарта SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...