[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Perl or Python?



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.

Reply to: