V SQL se operátor nerovná (!=
) 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 Owners;
Výsledek:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Příklad
Pokud bychom chtěli vrátit seznam všech vlastníků, kteří nemají OwnerId
z 3
, mohli bychom udělat toto:
SELECT *
FROM Owners
WHERE OwnerId != 3;
Výsledek:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Náš dotaz používá operátor nerovná se (!=
), abyste otestovali, zda OwnerId
sloupec není roven 3
. Dotaz vrátí všechny vlastníky kromě vlastníka číslo 3.
Ř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 majitelích, jejichž křestní jméno není Homer, mohli bychom udělat následující:
SELECT *
FROM Owners
WHERE FirstName != 'Homer';
Výsledek:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 3 | Nancy | Simpson | (489) 591-0408 | NULL | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
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 Owners
WHERE OwnerId != 1 AND OwnerId != 3;
Výsledek:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 4 | Boris | Trump | (349) 611-8908 | NULL | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Jakmile začnete používat více podmínek, měli byste pomocí závorek obklopit podmínky, které chcete vyhodnotit jako první. Pokud to neuděláte, můžete zjistit, že dostanete neočekávané výsledky, protože podmínky jsou vyhodnocovány v pořadí, které jste nezamýšleli.
Negování podmínky
Pokud použijete NOT
Chcete-li negovat podmínku poskytnutou operátorem nerovná se, nakonec získáte výsledky rovné (=
) operátor:
SELECT *
FROM Owners
WHERE NOT FirstName != 'Homer';
Výsledek:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
V tomto případě je lepší použít rovná se (=
), například takto:
SELECT *
FROM Owners
WHERE FirstName = 'Homer';
To samo o sobě lze samozřejmě negovat pomocí NOT
operátor, který by nám pak dal stejný výsledek, který se nerovná (!=
) nám operátor dává:
SELECT *
FROM Owners
WHERE NOT FirstName = 'Homer';
Hodnoty NULL
Možná jste si všimli, že naše původní vzorová tabulka obsahuje několik NULL
hodnoty v Email
sloupec.
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 Email
sloupec na NULL
.
SELECT * FROM Owners
WHERE Email != 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 Owners
WHERE Email IS NOT NULL;
Výsledek:
+-----------+-------------+------------+----------------+-------------------+ | OwnerId | FirstName | LastName | Phone | Email | |-----------+-------------+------------+----------------+-------------------| | 1 | Homer | Connery | (308) 555-0100 | [email protected] | | 2 | Bart | Pitt | (231) 465-3497 | [email protected] | | 5 | Woody | Eastwood | (308) 555-0112 | [email protected] | | 6 | Burt | Tyson | (309) 565-0112 | [email protected] | +-----------+-------------+------------+----------------+-------------------+
Nyní získáme pouze ty řádky, které nejsou NULL
v Email
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.