V SQL se operátor nerovná operátoru (<> ) porovnává nerovnost dvou výrazů. To znamená, že testuje, zda jeden výraz není rovno jinému výrazu.
Pokud je jeden nebo oba operandy NULL , NULL je vráceno.
SQL má také jiný operátor, který se nerovná operátoru (!= ), který dělá to samé. Který z nich použijete, může záviset na vaší DBMS, kterou z nich používáte nejpohodlněji, a možná také na tom, zda vaše organizace má nějaké konvence kódování, které určují, která z nich by se měla používat.
Tabulka zdrojů
Představte si, že naše databáze obsahuje následující tabulku. Toto je tabulka, kterou použijeme pro příklady na této stránce.
SELECT * FROM Pets; Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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)
Příklad
Pokud bychom chtěli získat všechna domácí zvířata, která ne mít určitého vlastníka, mohli bychom udělat toto:
SELECT *
FROM Pets
WHERE OwnerId <> 3; Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Náš dotaz používá operátor nerovná se (<> ), abyste otestovali, zda OwnerId sloupec není roven 3 . Dotaz vrátí všechna domácí zvířata, která nemají vlastníka číslo 3 jako vlastníka.
Řetězce
Při porovnávání s hodnotou řetězce použijte kolem řetězce uvozovky. Pokud bychom například chtěli získat informace o všech domácích mazlíčcích, kteří se nejmenují Fluffy, mohli bychom udělat následující:
SELECT *
FROM Pets
WHERE PetName <> 'Fluffy'; Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Více podmínek
Pokud máte více podmínek, můžete použít více operátorů (ať už oba stejné operátory nebo různé).
Takhle:
SELECT * FROM Pets
WHERE OwnerId <> 1 AND OwnerId <> 3; Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Negace podmínky
Pokud použijete NOT Chcete-li negovat podmínku poskytnutou operátorem nerovná se, nakonec dostanete výsledky rovného (= ) operátor:
SELECT *
FROM Pets
WHERE NOT PetName <> 'Fluffy'; Výsledek:
+---------+-------------+-----------+-----------+------------+ | PetId | PetTypeId | OwnerId | PetName | DOB | |---------+-------------+-----------+-----------+------------| | 1 | 2 | 3 | Fluffy | 2020-11-20 | | 6 | 3 | 4 | Fluffy | 2020-09-17 | +---------+-------------+-----------+-----------+------------+
V tomto případě je lepší použít rovnou (= ), například takto:
SELECT *
FROM Pets
WHERE PetName = 'Fluffy';
To samo o sobě lze samozřejmě negovat pomocí NOT operátor, který by nám pak dal stejný výsledek, jako je rovno (<> ) nám operátor dává:
SELECT *
FROM Pets
WHERE NOT PetName = 'Fluffy'; Hodnoty NULL
Možná jste si všimli, že naše původní vzorová tabulka obsahuje několik NULL hodnoty ve sloupci DOB.
Sloupec obsahující NULL znamená, že nemá žádnou hodnotu. To se liší od 0 nebo false nebo dokonce prázdný řetězec.
K porovnání s NULL nelze použít operátor nerovná se . Ve skutečnosti to může záviset na vašem DBMS a jeho konfiguraci. Ale teď se podívejme, co se stane, když se pokusím porovnat sloupec DOB s NULL .
SELECT * FROM Pets
WHERE DOB <> NULL; Výsledek:
(0 rows affected)
Způsob testování, zda není NULL hodnoty je použít IS NOT NULL .
Proto bychom museli výše uvedené prohlášení přepsat následovně.
SELECT * FROM Pets
WHERE DOB IS NOT NULL; Výsledek:
+---------+-------------+-----------+-----------+------------+ | 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 | +---------+-------------+-----------+-----------+------------+
Nyní získáme pouze ty řádky, které nejsou NULL v DOB sloupec.
Pokud máte zájem, přečtěte si SQL Server ANSI_NULLS Explained abyste viděli, jak můžete změnit způsob NULL hodnoty jsou zpracovávány v SQL Server.