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: