NULL-значения в базе данных

NULL означает отсутствие, неизвестность информации. Значение NULL не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому NULL не равно ни логическому значению FALSE, ни пустой строке, ни нулю. При сравнении NULL с любым значением будет получен результат NULL, а не FALSE и не 0. Более того, NULL не равно NULL! Довольно часто программисты избегают null-значений и для нулевых полей в базе выставляют значения по умолчанию типа 0, '' (пустая строка). Во-первых, это неправильно с точки зрения семантики: 0 все-таки означает наличие информации. Во-вторых, использование подобных дефолтных значений может привести к ошибкам.

Допустим, есть табличка product, в которой хранятся модели ноутбуков. У каждой модели есть производитель, описание и цена. Цена может принимать null, т.к. в момент добавления нового товара она может быть неизвестна. Допустим, необходимо вычислить среднюю стоимость для ноутбуков hp. Когда все цены известны, проблем не возникает.

SELECT brand, AVG(price) avg_price
FROM product
WHERE brand = 1
GROUP BY brand

1) В первом эксперименте поле price будет иметь значение по умолчанию '' (пустая строка). Цена модели № 4 неизвестна (ее значение 0 или ''). В этом случае средняя цена вычисляется не верно, т.к. в расчете учитывается и ноутбук, не имеющий цены.

avg = (400+300+500+0) / 4 = 300

null, sql

2) Во втором эксперименте поле price имеет значение null. В этом случае база игнорирует null-значения при группировке. Среднее значение высчитывается без учета модели № 4, у которой неизвестна цена.

avg = (400+300+500) / 3 = 400

null-значения

Таким образом, используйте null-значения там, где они действительно нужны по смыслу.

#1

можно было в запросе написать IS NOT NULL

Alex, 2.12.2008 - 18:02
#2

Можно использовать в запросе более правильное условие
price is not null and price>0
А еще лучше не объединять в одной таблице сам ноутбук и его цену. Это ведь разные сущности, верно? И реализованы они должны быть в разных таблицах, тогда не возникнет вопрос об использовании null или нулевых значений в таком ракурсе

Виталий, 2.03.2010 - 05:20
Оставить комментарий