Конференция "Базы" » count (таблица.*) [FB]
 
  • Цукор5 (29.08.11 13:01) [0]
    Как-то подзабыл синтаксис. Как писать правильно?

    Здесь все работает.
    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

  • Цукор5 (29.08.11 13:18) [1]
    Пардон, уже не надо.
    Там оказывается нужно поставить вместо звезды любое поле и всё заработает.
    Типа так:
    select count(t1.ID), t2.Name from Table1 t1, Table2 t2 where t1.IdName=t2.Id group by t2.name

  • Sergey13 © (29.08.11 13:27) [2]
    > [1] Цукор5   (29.08.11 13:18)
    > Там оказывается нужно поставить вместо звезды любое поле и всё заработает.

    Таки наверное не любое, а уникальное? Иначе, ИМХО, можно получить странное.
  • Кщд (29.08.11 13:52) [3]
    >Sergey13 ©   (29.08.11 13:27) [2]
    >Таки наверное не любое, а уникальное?
    почему?
  • Sergey13 © (29.08.11 14:04) [4]
    > [3] Кщд   (29.08.11 13:52)

    Сейчас проверил - вроде и на самом деле любое можно. Но почему то по привычке уже count(id) всегда ставлю на автомате в подобных случаях.
  • Anatoly Podgoretsky © (29.08.11 16:57) [5]

    > Таки наверное не любое, а уникальное? Иначе, ИМХО, можно
    > получить странное.

    Так разницы не будет по сравнению со звездочкой
  • Anatoly Podgoretsky © (29.08.11 16:58) [6]

    > Там оказывается нужно поставить вместо звезды любое поле
    > и всё заработает.

    Результаты могут быть совсем другие.
  • Игорь Шевченко © (29.08.11 22:52) [7]
    Вроде как поведение COUNT в стандарте чуть ли не с SQL-86 описано и все производители DBMS этого стандарта придерживаются
  • Anatoly Podgoretsky © (30.08.11 19:02) [8]
    > Игорь Шевченко  (29.08.2011 22:52:07)  [7]

    Ну я многое видел в MySQL которое не то что не по стандарту, а резко
    отличается даже от здравого смысла.
  • Игорь Шевченко © (30.08.11 19:56) [9]

    > Ну я многое видел в MySQL которое не то что не по стандарту,
    >  а резко
    > отличается даже от здравого смысла.


    Еще были всякие Raima (Velocis), Gupta и прочие со своими изобретениями.
  • Anatoly Podgoretsky © (30.08.11 22:48) [10]
    > Игорь Шевченко  (30.08.2011 19:56:09)  [9]

    Слава богу, что основные сервера как правило не отличаются от стандарта, в
    основном добавлением своих функций, count у всех работает одинаково, по
    стандарту.
  • Vitalts (05.09.11 15:34) [11]
    Count не учитывает NULL значения, посему, либо по полю, в котором наверняка не пустые значения, либо, что мне больше всего импонирует count(1)
  • Vitalts (05.09.11 15:41) [12]
    Count(1), кстати, работает быстрее, нежели count(*)
  • Игорь Шевченко © (05.09.11 16:54) [13]

    > Count(1), кстати, работает быстрее, нежели count(*)


    Почему ?
  • Anatoly Podgoretsky © (06.09.11 08:39) [14]
    > Игорь Шевченко  (05.09.2011 16:54:13)  [13]

    А должно медленнее, ведь при этом подсчеты требуются дополнительные
    действия, проверка на NULL
  • Vitalts (06.09.11 08:44) [15]
    count(1) (или другое статическое число)  считает кол-во записей без проверок NULL значений, потому и быстрее.
    [quote]
    Таки наверное не любое, а уникальное? Иначе, ИМХО, можно получить странное.[/quote]
    Вот это странное - и есть count() полю, содержадему NULL значения, он возвращает кол-во не нулевых значений этого поля, а не общее кол-во записей.
  • Игорь Шевченко © (06.09.11 12:26) [16]

    > 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(*) FROM foo;

     COUNT(*)
                                                                         
    ----------                                                                      
            3                                                                      

    SQL> SELECT COUNT(1) FROM foo;

     COUNT(1)                                                                      
    ----------                                                                      
            3                                                                      

    SQL> SELECT COUNT(bar) FROM foo;

    COUNT(BAR)                                                                      
    ----------                                                                      
            1                                                                      

  • Anatoly Podgoretsky © (06.09.11 12:29) [17]
    > Vitalts  (06.09.2011 08:44:15)  [15]

    Противоречит большинству СУБД и стандарту. Если поле указано, а оно указано
    в каноническом виде, то обязано проверять, или это какая то кривая СУБД
  • Vitalts (06.09.11 13:32) [18]
    Хм, по поводу count(*) был не прав, учитывает все записи без разбора, соответсвенно должно также быстро работать как и count(<статическое значение>)
  • Anatoly Podgoretsky © (06.09.11 13:45) [19]
    > Vitalts  (06.09.2011 13:32:18)  [18]

    <статическое значение> это и есть указание поля, значит медленнее.
 
Конференция "Базы" » count (таблица.*) [FB]
Есть новые Нет новых   [134431   +11][b:0][p:0.002]