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
 
английский язык для начинающих
Ашманов Египет Москва РХТУ Россия США Снежинск Таиланд Тушино Урал Челябинская область Яндекс алкоголь английский язык баги база данных безопасность бизнес блоги взлом видео выставка выходные горные лыжи дайвинг дауншифтинг допинг идиотизм инвентарь интернет книги кэширование мозг море музей ноутбук образование оптимизация отдых отпуск пароль плагин пора сваливать программирование программисты путешествия работа работоспособность радиация реклама самогоноварение собеседование социальные сети спам стартап статистика страны тайм-менеджмент техника учеба фантастика фото фриланс хакер экология электронные деньги юмор Ajax CMS DbSimple DDOS email FireFox Google honda htaccess HTML javascript jQuery life md5 MySQL PHP SEO soft SQL vkontakte Web web 2.0 wordpress