Porovnávací operátory jsou důležitou součástí většiny programovacích jazyků.
Porovnávací operátory se používají k porovnání dvou výrazů. Výsledek je buď true
nebo false
. Může to být také neznámé. To může být také reprezentováno buď 1
, 0
, nebo NULL
, v závislosti na jazyce. Tyto výrazy jsou obvykle známé jako „booleovské výrazy“.
Při použití s databázemi lze v dotazech SQL použít operátory porovnání k filtrování dat podle určitých kritérií.
Běžné porovnávací operátory
Většina programovacích jazyků podporuje následující operátory porovnání v té či oné podobě:
OPERÁTOR | SMYSL |
---|---|
= | Rovno |
> | Větší než |
< | Méně než |
>= | Větší nebo rovno |
<= | Menší nebo rovno |
<> | Nerovná se |
SQL používá stejnou syntaxi, jaká je uvedena v tabulce výše.
Některé jazyky používají jinou syntaxi, aby nedošlo k záměně s operátory přiřazení. Například Python a JavaScript používají ==
místo =
. ColdFusion na druhé straně používá eq
.
Různé datové typy
Některé jazyky mají speciální operátor, který určuje, že obě hodnoty musí být stejného datového typu.
Například JavaScript také obsahuje ===
operátor, který určuje, že se obě hodnoty rovnají a že musí mít stejný datový typ. Ale pokud je datový typ irelevantní, použijte ==
namísto.
Příklady
Větší než operátor
Zde je příklad použití operátoru Greater Than v dotazu T-SQL.
SELECT Name, Population
FROM country
WHERE Population > 100000000
ORDER BY Population DESC;
Výsledek:
+--------------------+--------------+ | Name | Population | |--------------------+--------------| | China | 1277558000 | | India | 1013662000 | | United States | 278357000 | | Indonesia | 212107000 | | Brazil | 170115000 | | Pakistan | 156483000 | | Russian Federation | 146934000 | | Bangladesh | 129155000 | | Japan | 126714000 | | Nigeria | 111506000 | +--------------------+--------------+
V tomto příkladu jsem použil operátor Greater Than (>
) a vyberte pouze země s počtem obyvatel vyšším než 1 000 0000.
Operátor se rovná
Zde je další příklad, kde používám operátor rovná se (=
) vrátí data, která se přesně rovnají dané hodnotě.
SELECT CountryCode, Name
FROM city
WHERE CountryCode = 'AFG'
Výsledek:
+---------------+----------------+ | CountryCode | Name | |---------------+----------------| | AFG | Kabul | | AFG | Qandahar | | AFG | Herat | | AFG | Mazar-e-Sharif | +---------------+----------------+
V tomto případě vracím pouze ta města, jejichž kód země je roven AFG
.
To ukazuje, že operátory porovnání nejsou omezeny pouze na číselné datové typy.
Data
Můžete také použít porovnávací operátory pro data, například:
SELECT * FROM Artists
WHERE ActiveFrom > '1990-01-01';
Výsledek:
+------------+----------------+--------------+ | ArtistId | ArtistName | ActiveFrom | |------------+----------------+--------------| | 5 | Devin Townsend | 1993-01-01 | | 8 | Maroon 5 | 1994-01-01 | | 9 | The Script | 2001-01-01 | | 14 | Karnivool | 1997-01-01 | | 15 | Birds of Tokyo | 2004-01-01 | +------------+----------------+--------------+
Jak můžete vidět, jediné vrácené výsledky jsou ty, které jsou vyšší než (po) zadaném datu.
Větší než nebo rovno operátoru
Mohu použít operátor Větší než nebo Rovná se k zahrnutí zadaného data do výsledků.
SELECT * FROM Artists
WHERE ActiveFrom >= '1990-01-01';
Výsledek:
+------------+----------------+--------------+ | ArtistId | ArtistName | ActiveFrom | |------------+----------------+--------------| | 5 | Devin Townsend | 1993-01-01 | | 8 | Maroon 5 | 1994-01-01 | | 9 | The Script | 2001-01-01 | | 14 | Karnivool | 1997-01-01 | | 15 | Birds of Tokyo | 2004-01-01 | | 16 | Bodyjar | 1990-01-01 | +------------+----------------+--------------+
V tomto případě je vrácen jeden řádek navíc (poslední řádek).
Méně než operátor
Zde je to, co se stane, když změním svůj dotaz tak, aby používal operátor Menší než.
SELECT * FROM Artists
WHERE ActiveFrom < '1990-01-01';
Výsledek:
+------------+------------------------+--------------+ | ArtistId | ArtistName | ActiveFrom | |------------+------------------------+--------------| | 1 | Iron Maiden | 1975-12-25 | | 2 | AC/DC | 1973-01-11 | | 3 | Allan Holdsworth | 1969-01-01 | | 4 | Buddy Rich | 1919-01-01 | | 6 | Jim Reeves | 1948-01-01 | | 7 | Tom Jones | 1963-01-01 | | 10 | Lit | 1988-06-26 | | 11 | Black Sabbath | 1968-01-01 | | 12 | Michael Learns to Rock | 1988-03-15 | | 13 | Carabao | 1981-01-01 | +------------+------------------------+--------------+
Dostanu všechny řádky, které jsou menší než zadané datum.
Porovnání hodnot NULL
NULL
hodnoty mohou při použití porovnávacích operátorů věci mírně zkomplikovat. Stručně řečeno, můžete získat jiný výsledek v závislosti na konfiguraci vašeho prostředí.
Například v SQL Server, pokud použijete operátor Equals (=
) nebo operátor Nerovná se (<>
) pro testování proti NULL
, váš výsledek bude záviset na vašem ANSI_NULLS
nastavení (tj. zda je ON
nebo OFF
).
Chcete-li testovat proti NULL
SQL Server také poskytuje IS NULL
predikát, který funguje konzistentně bez ohledu na váš ANSI_NULLS
nastavení. To také zahrnuje IS NOT NULL
varianta pro testování proti jiným než NULL
hodnoty.
Níže je uveden příklad, který ukazuje, co tím myslím.
ANSI_NULLS ON
Nejprve nastavíme ANSI_NULLS
na ON
a poté spusťte několik testů proti NULL
.
SET ANSI_NULLS ON;
SELECT NULL
WHERE NULL = NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT NULL
WHERE NULL IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Výsledek:
(0 rows affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected) (0 rows affected)
ANSI_NULLS OFF
Nyní nastavíme ANSI_NULLS
na OFF
a poté spusťte stejné testy.
SET ANSI_NULLS OFF;
SELECT NULL
WHERE NULL = NULL;
SELECT NULL
WHERE 1 = NULL;
SELECT NULL
WHERE NULL IS NULL;
SELECT 'Not NULL'
WHERE 1 IS NOT NULL;
SELECT 'Not NULL'
WHERE 1 <> NULL;
Výsledek:
+--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) (0 rows affected) +--------------------+ | (No column name) | |--------------------| | NULL | +--------------------+ (1 row affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected) +--------------------+ | (No column name) | |--------------------| | Not NULL | +--------------------+ (1 row affected)