Операторите за сравнение са важна част от повечето езици за програмиране.
Операторите за сравнение се използват за сравняване на два израза. Резултатът е или true
или false
. Може също да е неизвестно. Това може да бъде представено и с 1
, 0
или NULL
, в зависимост от езика. Те обикновено са известни като „булеви изрази“.
Когато се използват с бази данни, операторите за сравнение могат да се използват във вашите SQL заявки за филтриране на данни по определени критерии.
Общи оператори за сравнение
Повечето езици за програмиране поддържат следните оператори за сравнение в една или друга форма:
ОПЕРАТОР | ЗНАЧЕНИЕ |
---|---|
= | Равно на |
> | По-голямо от |
< | По-малко от |
>= | По-голямо или равно на |
<= | По-малко или равно на |
<> | Не е равно на |
SQL използва същия синтаксис, както е изброен в горната таблица.
Някои езици използват различен синтаксис, за да се избегне объркване с операторите за присвояване. Например Python и JavaScript използват ==
вместо =
. ColdFusion, от друга страна, използва eq
.
Различни типове данни
Някои езици имат специален оператор, който указва, че и двете стойности трябва да са от един и същ тип данни.
Например JavaScript включва и ===
оператор, който указва, че и двете стойности са равни и че те трябва да са от един и същ тип данни. Но ако типът данни е без значение, използвайте ==
вместо.
Примери
По-голямо от оператор
Ето пример за използване на оператора Greater Than в T-SQL заявка.
SELECT Name, Population
FROM country
WHERE Population > 100000000
ORDER BY Population DESC;
Резултат:
+--------------------+--------------+ | Name | Population | |--------------------+--------------| | China | 1277558000 | | India | 1013662000 | | United States | 278357000 | | Indonesia | 212107000 | | Brazil | 170115000 | | Pakistan | 156483000 | | Russian Federation | 146934000 | | Bangladesh | 129155000 | | Japan | 126714000 | | Nigeria | 111506000 | +--------------------+--------------+
В този пример използвах оператора Greater Than (>
), за да изберете само държави с население над 100000000.
Оператор Equals
Ето още един пример, където използвам оператора за равенство (=
), за да върне данни, които са точно равни на дадена стойност.
SELECT CountryCode, Name
FROM city
WHERE CountryCode = 'AFG'
Резултат:
+---------------+----------------+ | CountryCode | Name | |---------------+----------------| | AFG | Kabul | | AFG | Qandahar | | AFG | Herat | | AFG | Mazar-e-Sharif | +---------------+----------------+
В този случай връщам само онези градове, чийто код на държавата е равен на AFG
.
Това показва, че операторите за сравнение не са ограничени само до числови типове данни.
Дати
Можете също да използвате оператори за сравнение за дати, например:
SELECT * FROM Artists
WHERE ActiveFrom > '1990-01-01';
Резултат:
+------------+----------------+--------------+ | 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 | +------------+----------------+--------------+
Както можете да видите, единствените върнати резултати са тези, по-големи от (след) посочената дата.
По-голямо от или равно на оператор
Мога да използвам оператора По-голямо от или Равно на, за да включа посочената дата в резултатите.
SELECT * FROM Artists
WHERE ActiveFrom >= '1990-01-01';
Резултат:
+------------+----------------+--------------+ | 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 | +------------+----------------+--------------+
В този случай се връща един допълнителен ред (последният ред).
По-малко от оператор
Ето какво се случва, ако променя заявката си, за да използвам оператор по-малко от.
SELECT * FROM Artists
WHERE ActiveFrom < '1990-01-01';
Резултат:
+------------+------------------------+--------------+ | 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 | +------------+------------------------+--------------+
Получавам всички редове, които са по-малко от посочената дата.
Сравняване на NULL стойности
NULL
стойностите могат леко да усложнят нещата при използване на оператори за сравнение. Накратко, може да получите различен резултат в зависимост от това как е конфигурирана вашата среда.
Например, в SQL Server, ако използвате оператора Equals (=
) или операторът Not Equal (<>
), за да тествате срещу NULL
, резултатът ви ще зависи от вашия ANSI_NULLS
настройка (т.е. дали е ON
или OFF
).
За тестване срещу NULL
стойности, SQL Server също така предоставя IS NULL
предикат, който работи последователно, независимо от вашия ANSI_NULLS
настройка. Това също включва IS NOT NULL
вариант за тестване срещу не-NULL
стойности.
По-долу е даден пример, който демонстрира какво имам предвид.
ANSI_NULLS ON
Първо задаваме ANSI_NULLS
до ON
, след което изпълнете няколко теста срещу 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;
Резултат:
(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
Сега задаваме ANSI_NULLS
до OFF
, след което изпълнете същите тестове.
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;
Резултат:
+--------------------+ | (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)