Hello! On Thursday 19 March 2009 23:38:56 Artem Chuprina wrote: > AP> create table tests(date text,value text); > AP> insert into tests (date,value) values ('2009-02-01',NULL); > AP> select count(value) from tests; > AP> 0 > AP> select count(*) from tests; > AP> 1 > > AP> Вопрос: сколько записей в таблице? > > На вопрос "сколько _записей_ в таблице" отвечает count(*). count(field) > отвечает на вопрос "сколько в таблице валидных значений этого поля". И > где тут проблема?
В реляционной модели count это счетчик _кортежей_, а не атрибутов, и уж тем более не должны подразумеваться неявные фильтры по какому-то значению. И вот этот запрос должен вернуть полное число кортежей: select count(value) from tests; Отфильтровать кортежи, где атрибут value Не NULL можно так: select count(value) from tests where not value is null; Итого появился некий неявный фильтр по атрибутам, который, вообще говоря, не предусмотрен теорией. Могу и подробнее показать, к чему это приводит. create table tests(date text,value text); insert into tests (date,value) values ('2009-02-01',NULL); insert into tests (date,value) values ('2009-02-01',NULL); insert into tests (date,value) values ('2009-02-02',1); offline1=# select * from tests; date | value ------------+------- 2009-02-01 | 2009-02-01 | 2009-02-02 | 1 Да, могу вам напомнить, что кортежи в БД должны быть уникальны. То, что мы видим выше, с точки зрения реляционной теории невозможно. Но это еще цветочки. А вот и ягодки: offline1=# select count(*) from tests where value<>1; count ------- 0 (1 row) offline1=# select count(*) from tests where value=1; count ------- 1 (1 row) offline1=# select count(*) from tests; count ------- 3 (1 row) СУБД нас убеждает, что 1+0=3 Это, по-вашему, не бред? Налицо нарушение аддитивности. Итого: СУБД не опознает кортежи с NULL-атрибутами. Да, СУБД позволила вам вставить эти записи, но кортежами они _не являются_ - проще говоря, мусор. И использование NULL-атрибутов в БД это ничто иное, как заполнение базы мусором. Best regards.