-
Как-то подзабыл синтаксис. Как писать правильно? Здесь все работает. select COUNT(*), IdName from Table1 group by IdName А здесь не работает. select count(t1.*), t2.Name from Table1 t1, Table2 t2 where t1.IdName=t2.Id group by t2.name
-
Пардон, уже не надо. Там оказывается нужно поставить вместо звезды любое поле и всё заработает. Типа так: select count(t1.ID), t2.Name from Table1 t1, Table2 t2 where t1.IdName=t2.Id group by t2.name
-
> [1] Цукор5 (29.08.11 13:18) > Там оказывается нужно поставить вместо звезды любое поле и всё заработает.
Таки наверное не любое, а уникальное? Иначе, ИМХО, можно получить странное.
-
>Sergey13 © (29.08.11 13:27) [2] >Таки наверное не любое, а уникальное? почему?
-
> [3] Кщд (29.08.11 13:52)
Сейчас проверил - вроде и на самом деле любое можно. Но почему то по привычке уже count(id) всегда ставлю на автомате в подобных случаях.
-
> Таки наверное не любое, а уникальное? Иначе, ИМХО, можно > получить странное.
Так разницы не будет по сравнению со звездочкой
-
> Там оказывается нужно поставить вместо звезды любое поле > и всё заработает.
Результаты могут быть совсем другие.
-
Вроде как поведение COUNT в стандарте чуть ли не с SQL-86 описано и все производители DBMS этого стандарта придерживаются
-
> Игорь Шевченко (29.08.2011 22:52:07) [7]
Ну я многое видел в MySQL которое не то что не по стандарту, а резко отличается даже от здравого смысла.
-
> Ну я многое видел в MySQL которое не то что не по стандарту, > а резко > отличается даже от здравого смысла.
Еще были всякие Raima (Velocis), Gupta и прочие со своими изобретениями.
-
> Игорь Шевченко (30.08.2011 19:56:09) [9]
Слава богу, что основные сервера как правило не отличаются от стандарта, в основном добавлением своих функций, count у всех работает одинаково, по стандарту.
-
Count не учитывает NULL значения, посему, либо по полю, в котором наверняка не пустые значения, либо, что мне больше всего импонирует count(1)
-
Count(1), кстати, работает быстрее, нежели count(*)
-
> Count(1), кстати, работает быстрее, нежели count(*)
Почему ?
-
> Игорь Шевченко (05.09.2011 16:54:13) [13]
А должно медленнее, ведь при этом подсчеты требуются дополнительные действия, проверка на NULL
-
count(1) (или другое статическое число) считает кол-во записей без проверок NULL значений, потому и быстрее. [quote] Таки наверное не любое, а уникальное? Иначе, ИМХО, можно получить странное.[/quote] Вот это странное - и есть count() полю, содержадему NULL значения, он возвращает кол-во не нулевых значений этого поля, а не общее кол-во записей.
-
> count(1) (или другое статическое число) считает кол-во > записей без проверок NULL значений, потому и быстрее.
а в * что на NULL проверяется ? SQL> CREATE TABLE foo (
2 bar int
3 );
Table created.
SQL>
SQL> INSERT INTO foo VALUES (NULL);
1 row created.
SQL> INSERT INTO foo VALUES (NULL);
1 row created.
SQL> INSERT INTO foo VALUES(10);
1 row created.
SQL> COMMIT;
Commit complete.
SQL> SELECT COUNT
----------
3
SQL> SELECT COUNT(1) FROM foo;
COUNT(1)
----------
3
SQL> SELECT COUNT(bar) FROM foo;
COUNT(BAR)
----------
1
-
> Vitalts (06.09.2011 08:44:15) [15]
Противоречит большинству СУБД и стандарту. Если поле указано, а оно указано в каноническом виде, то обязано проверять, или это какая то кривая СУБД
-
Хм, по поводу count(*) был не прав, учитывает все записи без разбора, соответсвенно должно также быстро работать как и count(<статическое значение>)
-
> Vitalts (06.09.2011 13:32:18) [18]
<статическое значение> это и есть указание поля, значит медленнее.
-
Практика этого не подтверждает. Сравнение естественно есть, но поскольку значение статическое, то лишь единожды.
-
> Vitalts (06.09.2011 14:19:20) [20]
Откуда? Должна подверждать. Не может быть со сравнением и без быть одинаково, особенно на крупной таблице.
|