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 работи. Малко необичайно, но все пак има известна логика в това.