5.1 Липса на значимост

Езикът SQL, подобно на езика Java, има специална ключова дума за обозначаване на липсата на стойност - тя е null. Или Howто често се пише - NULL.

Използването NULLв SQL е много подобно на използването на null в Java. В Java може да има обекти, чиито полета съдържат нулеви стойности. В SQL може да има таблици, чиито редове съдържат NULL стойности.

Позволете ми нарочно да добавя няколко небрандирани продукта към нашата table с продукти. Ако марката на продукта е неизвестна, тогава стойността ще бъде NULL.

За да покажем такива продукти, нека сортираме нашата продуктова table по id в обратен ред и да вземем 10 записа. Заявката ще изглежда така:

SELECT * FROM product
ORDER BY id DESC
LIMIT 10

Получаваме следния резултат от заявката:

document за самоличност име марка цена броя
15 Нит НУЛА 0,01 1000
14 Винт НУЛА 0,10 1000
13 Стойка ИКЕА 100,00 10
12 саксия Smartflower 99,00 9
единадесет Фотьойл Bosch 44.00 8
10 Плоча Bosch 199,00 10
9 Скрин ИКЕА 99,00 10
8 Лампа LG 15.00 часа 100
7 телевизор LG 350,00 4
6 Рафт Bosch 25.00 часа 114

Да, добавих нитове и винтове към масата. Имат цена и количество, но нямат марка.

5.2 Сравнение с NULL

Спомняте ли си, че понякога се ядосвахте в Java, когато използвате null? Че не можете да сравнявате променливи, които могат да се отнасят до нулеви стойности чрез equals(). Пример:

Product product1 = new Product();
Product product2 = null;
if (product2.equals(product1) {  //an exception will be raised here}

Няма да повярвате, но в езика SQL вие също чакате нюансите при работа с NULL стойности. И звучи нещо подобно:нищо не е NULL.

Ако се опитате да филтрирате всички продукти, чиято марка е null:

SELECT * FROM product
WHERE brand = NULL

Ще получите празна маса:

document за самоличност име марка цена броя

Но ако напишете в заявката, че марката не е равна на NULL, ще получите същия резултат:

SELECT * FROM product
WHERE brand != NULL

Отново ще получите празна маса:

document за самоличност име марка цена броя

Всяко сравнение/действие с NULL ще върне NULL:

Изразяване Резултат
марка = NULL НУЛА
марка != NULL НУЛА
NULL = NULL НУЛА
NULL != NULL НУЛА

дадори ако сравните NULL с NULL, тогава отговорът ще бъде NULL.

5.3 Е НУЛЕВ и НЕ Е НУЛЕВ

И така, How да проверим дали някое поле (or няHowва колона) има стойност NULL? И за това SQL има специален израз - IS NULL. Изглежда така.

variable IS NULL

Ако искате да проверите дали колона от вашата table не е равна на NULL, тогава трябва да напишете IS NOT NULL:

variable IS NOT NULL

Нека напишем заявка, която ще избере всички продукти от продуктовата table, чиято марка е равна на NULL. Такава заявка ще изглежда така:

SELECT * FROM product
WHERE brand IS NULL

И получаваме следния резултат от заявката:

document за самоличност име марка цена броя
14 Винт НУЛА 0,10 1000
15 Нит НУЛА 0,01 1000

Сега нека покажем всички продукти, чиято цена е под $20:

SELECT * FROM product
WHERE price  < 20

И получаваме следния резултат от заявката:

document за самоличност име марка цена броя
2 Председател ИКЕА 5.00 45
8 Лампа LG 15.00 часа 100
14 Винт НУЛА 0,10 1000
15 Нит НУЛА 0,01 1000

Сега уточняваме, че цената трябва да е под $20, а марката не е NULL.

SELECT * FROM product
WHERE price  < 20 AND brand IS NOT NULL

Получаваме следния резултат от заявката:

document за самоличност име марка цена броя
2 Председател ИКЕА 5.00 45
8 Лампа LG 15.00 часа 100

Страхотно, последните два реда ги няма. Ето How работи. Малко необичайно, но все пак има известна логика в това.