В SQL операторът не е равен на (<>
) сравнява неравенството на два израза. Тоест, тества дали един израз не равно на друг израз.
Ако единият или и двата операнда са NULL
, NULL
се връща.
SQL също има друг оператор, който не е равен на (!=
), което прави същото. Коя от тях ще използвате може да зависи от вашата СУБД, коя ви е най-удобно да използвате и може би също така дали вашата организация има някакви конвенции за кодиране, които диктуват коя трябва да се използва.
Изходна таблица
Представете си, че нашата база данни съдържа следната таблица. Това е таблицата, която ще използваме за примерите на тази страница.
SELECT * FROM Pets;
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+ (8 rows affected)
Пример
Ако искахме да вземем всички домашни любимци, които не имаме определен собственик, бихме могли да направим това:
SELECT *
FROM Pets
WHERE OwnerId <> 3;
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 3 | 2 | 2 | Scratch | 2018-10-01 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Нашата заявка използва оператора не е равно на (<>
), за да проверите дали OwnerId
колоната не е равна на 3
. Заявката връща всички домашни любимци, които нямат собственик номер 3 като собственик.
Стрингове
Когато сравнявате със стойност на низ, използвайте кавички около низа. Например, ако искаме да получим информация за всички домашни любимци, които не се казват Fluffy, можем да направим следното:
SELECT *
FROM Pets
WHERE PetName <> 'Fluffy';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Множество условия
Ако имате няколко условия, можете да използвате множество оператори (независимо дали и двата едни и същи или различни).
Като това:
SELECT * FROM Pets
WHERE OwnerId <> 1 AND OwnerId <> 3;
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 3 | 2 | 2 | Scratch | 2018-10-01 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | | 7 | 3 | 2 | Bark | NULL | | 8 | 2 | 4 | Meow | NULL | +---------+-------------+-----------+-----------+------------+
Отрицание на условието
Ако използвате NOT
оператор за отхвърляне на условието, предоставено от оператора не е равно на, в крайна сметка ще получите резултатите от равно на (=
) оператор:
SELECT *
FROM Pets
WHERE NOT PetName <> 'Fluffy';
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
В този случай е по-добре просто да използвате равно на (=
) оператор, като този:
SELECT *
FROM Pets
WHERE PetName = 'Fluffy';
Разбира се, самото това може да бъде отречено с NOT
оператор, който след това ще ни даде същия резултат като равен на (<>
) операторът ни дава:
SELECT *
FROM Pets
WHERE NOT PetName = 'Fluffy';
NULL стойности
Може да сте забелязали, че нашата оригинална примерна таблица съдържа няколко NULL
стойности в колоната DOB.
Колона, съдържаща NULL
означава, че няма стойност. Това е различно от 0
или false
или дори празен низ.
Не можете да използвате оператора not equal to за сравнение с NULL
. Всъщност това може да зависи от вашата СУБД и нейната конфигурация. Но засега нека да разгледаме какво се случва, ако се опитам да сравня колоната DOB с NULL
.
SELECT * FROM Pets
WHERE DOB <> NULL;
Резултат:
(0 rows affected)
Начинът за тестване за не-NULL
стойности е да използвате IS NOT NULL
.
Следователно ще трябва да пренапишем горното изявление, както следва.
SELECT * FROM Pets
WHERE DOB IS NOT NULL;
Резултат:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 2 | 3 | 3 | Fetch | 2019-08-16 | | 3 | 2 | 2 | Scratch | 2018-10-01 | | 4 | 3 | 3 | Wag | 2020-03-15 | | 5 | 1 | 1 | Tweet | 2020-11-28 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
Сега получаваме само онези редове, които не са NULL
в DOB
колона.
Ако се интересувате, вижте SQL Server ANSI_NULLS Explained
за да видите как можете да промените начина NULL
стойностите се третират в SQL Server.