راهنمای جامع عملگرهای مقایسهای SQL: کاوش در قدرت شرطگذاری دادهها
عملگرهای مقایسهای SQL ابزارهای ضروری برای فیلتر کردن و مقایسه مقادیر در پایگاه داده هستند. این عملگرها در بند `WHERE` یک عبارت `SELECT`, `UPDATE` یا `DELETE` استفاده میشوند تا ردیفهایی را که یک شرط خاص را برآورده میکنند، بازیابی یا تغییر دهند. درک صحیح این عملگرها برای هر توسعهدهنده SQL Server یا متخصص داده ضروری است، زیرا به شما امکان میدهد دادههای خود را با دقت و انعطافپذیری بالا مدیریت کنید.
برای شروع کار با مثالهای این مقاله و اجرای صحیح آنها، ابتدا باید یک پایگاه داده نمونه و جدول مربوطه را ایجاد و با دادهها پر کنید. اسکریپت زیر پایگاه داده `ComparisonOperatorDB` را ایجاد کرده و جدول `Operators` را به همراه چند ردیف داده آماده میکند تا بتوانید عملگرهای مختلف را تست کنید.
USE [master]
GO
IF EXISTS (SELECT name FROM master.sys.databases WHERE name = N'ComparisonOperatorDB')
DROP DATABASE [ComparisonOperatorDB]
GO
CREATE DATABASE [ComparisonOperatorDB]
GO
USE [ComparisonOperatorDB]
GO
CREATE TABLE [dbo].[Operators](
[Id] [int] IDENTITY(1,1) NOT NULL,
[OperatorName] [varchar](50) NULL,
[OperatorDescription] [varchar](100) NULL,
[Value1] [int] NULL,
[Value2] [int] NULL,
[StringValue1] [varchar](50) NULL,
[StringValue2] [varchar](50) NULL,
[DateValue] [datetime] NULL,
[TimeValue] [time](7) NULL,
CONSTRAINT [PK_Operators] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT INTO [dbo].[Operators] ([OperatorName], [OperatorDescription], [Value1], [Value2], [StringValue1], [StringValue2], [DateValue], [TimeValue])
VALUES
('Equal', 'Compares two expressions for equality', 10, 10, 'Apple', 'Apple', '2023-01-01', '10:00:00'),
('Not Equal', 'Compares two expressions for inequality', 20, 15, 'Banana', 'Orange', '2023-01-02', '11:00:00'),
('Greater Than', 'Compares two expressions. Returns TRUE if the left expression has a greater value than the right expression', 30, 25, 'Cherry', 'Date', '2023-01-03', '12:00:00'),
('Less Than', 'Compares two expressions. Returns TRUE if the left expression has a lesser value than the right expression', 40, 45, 'Elderberry', 'Fig', '2023-01-04', '13:00:00'),
('Greater Than or Equal', 'Compares two expressions. Returns TRUE if the left expression has a greater value than or equal to the right expression', 50, 50, 'Grape', 'Grape', '2023-01-05', '14:00:00'),
('Less Than or Equal', 'Compares two expressions. Returns TRUE if the left expression has a lesser value than or equal to the right expression', 60, 65, 'Honeydew', 'Imbe', '2023-01-06', '15:00:00'),
('Not Greater Than', 'Compares two expressions. Returns TRUE if the left expression is NOT greater than the right expression', 70, 75, 'Jackfruit', 'Kiwi', '2023-01-07', '16:00:00'),
('Not Less Than', 'Compares two expressions. Returns TRUE if the left expression is NOT less than the right expression', 80, 75, 'Lemon', 'Mango', '2023-01-08', '17:00:00'),
('Between', 'Determines if a value is within a specified range', 90, 100, 'Nectarine', 'Orange', '2023-01-09', '18:00:00'),
('Like', 'Compares a string expression with a pattern', NULL, NULL, 'Pineapple', 'Pumpkin', '2023-01-10', '19:00:00'),
('In', 'Compares a value with a list of values', 110, NULL, 'Quince', NULL, '2023-01-11', '20:00:00'),
('Is Null', 'Tests for NULL values', NULL, NULL, NULL, NULL, NULL, NULL),
('All', 'Compares a scalar value with a single-column set of values', 120, NULL, 'Raspberry', NULL, '2023-01-12', '21:00:00'),
('Any', 'Compares a scalar value with a single-column set of values', 130, NULL, 'Strawberry', NULL, '2023-01-13', '22:00:00'),
('Exists', 'Tests for the existence of any rows in a subquery', 140, NULL, 'Tangerine', NULL, '2023-01-14', '23:00:00');
GO
با داشتن دادههای آماده، بیایید به بررسی هر یک از عملگرهای مقایسهای در SQL Server بپردازیم.
عملگر مساوی (=)
عملگر مساوی برای مقایسه دو عبارت و تعیین اینکه آیا آنها با هم برابر هستند، استفاده میشود. اگر مقادیر برابر باشند، شرط `TRUE` بازمیگردد. این عملگر برای فیلتر کردن دقیق دادهها بر اساس یک مقدار مشخص بسیار کاربردی است.
SELECT Id, OperatorName, Value1, Value2, StringValue1
FROM dbo.Operators
WHERE Value1 = 10;
در این مثال، تمام ردیفهایی را که مقدار ستون `Value1` آنها دقیقاً برابر با 10 است، بازیابی میکنیم. این یکی از پرکاربردترین عملگرهای مقایسهای در SQL است.
SELECT Id, OperatorName, Value1, Value2, StringValue1
FROM dbo.Operators
WHERE StringValue1 = 'Apple';
همچنین میتوانید از عملگر مساوی برای مقایسه رشتهها استفاده کنید، همانطور که در این کوئری برای یافتن `StringValue1` برابر با ‘Apple’ نشان داده شده است.
عملگر نامساوی (<> یا !=)
عملگر نامساوی (“ یا `!=`) برای مقایسه دو عبارت و تعیین اینکه آیا آنها با هم برابر نیستند، به کار میرود. اگر مقادیر نابرابر باشند، شرط `TRUE` بازمیگردد. این عملگر برای حذف مقادیر خاص از نتایج جستجو مفید است.
SELECT Id, OperatorName, Value1, Value2, StringValue1
FROM dbo.Operators
WHERE Value1 10;
این کوئری تمام ردیفهایی را که `Value1` آنها برابر با 10 نیست، بازمیگرداند. میتوانید به جای “ از `!=` نیز استفاده کنید.
SELECT Id, OperatorName, Value1, Value2, StringValue1
FROM dbo.Operators
WHERE StringValue1 != 'Apple';
این مثال ردیفهایی را نشان میدهد که `StringValue1` آنها ‘Apple’ نیست.
عملگر بزرگتر از (>)
عملگر بزرگتر از (`>`) برای مقایسه دو عبارت و بررسی اینکه آیا عبارت سمت چپ بزرگتر از عبارت سمت راست است، به کار میرود. این عملگر برای فیلتر کردن دادهها بر اساس یک آستانه حداقل بسیار مفید است.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 > 20;
این کوئری تمامی ردیفهایی را که `Value1` آنها بزرگتر از 20 است، بازیابی میکند.
عملگر کوچکتر از (<)
عملگر کوچکتر از (`<`) برعکس عملگر بزرگتر از عمل میکند و بررسی میکند که آیا عبارت سمت چپ کوچکتر از عبارت سمت راست است. این برای تعیین حداکثر آستانه و فیلتر کردن مقادیر زیر آن استفاده میشود.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 < 50;
در این مثال، تمام ردیفهایی که `Value1` آنها کوچکتر از 50 است، انتخاب میشوند.
عملگر بزرگتر یا مساوی (>=)
عملگر بزرگتر یا مساوی (`>=`) مقایسه میکند که آیا عبارت سمت چپ بزرگتر یا برابر با عبارت سمت راست است. این عملگر شامل خود مقدار آستانه نیز میشود و برای تعیین حداقل مقدار مجاز بسیار کاربردی است.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 >= 50;
این کوئری تمام ردیفهایی را که `Value1` آنها 50 یا بیشتر است، بازمیگرداند.
عملگر کوچکتر یا مساوی (<=)
عملگر کوچکتر یا مساوی (`<=`) بررسی میکند که آیا عبارت سمت چپ کوچکتر یا برابر با عبارت سمت راست است. این شامل خود مقدار آستانه نیز میشود و برای تعیین حداکثر مقدار مجاز کاربرد دارد.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 <= 60;
این مثال تمام ردیفهایی را که `Value1` آنها 60 یا کمتر است، انتخاب میکند.
عملگر نامساوی (!>) (برابر با <=)
عملگر `!>` به معنای “نه بزرگتر از” است و دقیقاً معادل عملگر کوچکتر یا مساوی (`<=`) عمل میکند. اگرچه کمتر رایج است، اما همان نتیجه را میدهد.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 !> 70;
این کوئری ردیفهایی را بازمیگرداند که `Value1` آنها بزرگتر از 70 نیست (یعنی کوچکتر یا مساوی 70 است).
عملگر نامساوی (!<) (برابر با >=)
عملگر `!=`) عمل میکند. این نیز کمتر مورد استفاده قرار میگیرد اما کارایی مشابهی دارد.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 !< 80;
این مثال ردیفهایی را انتخاب میکند که `Value1` آنها کوچکتر از 80 نیست (یعنی بزرگتر یا مساوی 80 است).
عملگر BETWEEN
عملگر `BETWEEN` برای تعیین اینکه آیا یک مقدار در یک محدوده مشخص قرار دارد یا خیر، استفاده میشود. این عملگر شامل هر دو مقدار شروع و پایان محدوده است (اینکلوسیو). استفاده از `BETWEEN` برای فیلتر کردن دادهها در یک بازه خاص، به خصوص برای تاریخها و اعداد، بسیار مفید است.
SELECT Id, OperatorName, Value1, Value2
FROM dbo.Operators
WHERE Value1 BETWEEN 80 AND 100;
این کوئری تمام ردیفهایی را که `Value1` آنها بین 80 و 100 (شامل 80 و 100) است، بازمیگرداند.
SELECT Id, OperatorName, StringValue1, StringValue2
FROM dbo.Operators
WHERE StringValue1 BETWEEN 'Cherry' AND 'Grape';
`BETWEEN` همچنین میتواند با رشتهها و تاریخها استفاده شود. این مثال ردیفهایی را بازمیگرداند که `StringValue1` آنها به ترتیب الفبایی بین ‘Cherry’ و ‘Grape’ قرار دارد.
SELECT Id, OperatorName, DateValue
FROM dbo.Operators
WHERE DateValue BETWEEN '2023-01-01' AND '2023-01-05';
این کوئری ردیفهایی را با `DateValue` بین تاریخهای مشخص شده، شامل هر دو تاریخ، فیلتر میکند.
عملگر LIKE
عملگر `LIKE` برای جستجوی الگوها در دادههای رشتهای استفاده میشود. این عملگر با کاراکترهای وایلدکارد (wildcard characters) مانند `%` (برای مطابقت با صفر یا چند کاراکتر) و `_` (برای مطابقت با یک کاراکتر واحد) ترکیب میشود تا جستجوهای انعطافپذیری را امکانپذیر سازد.
SELECT Id, OperatorName, StringValue1
FROM dbo.Operators
WHERE StringValue1 LIKE 'P%';
این مثال تمام ردیفهایی را که `StringValue1` آنها با حرف ‘P’ شروع میشود، بازمیگرداند.
SELECT Id, OperatorName, StringValue1
FROM dbo.Operators
WHERE StringValue1 LIKE '%e';
این کوئری ردیفهایی را که `StringValue1` آنها به حرف ‘e’ ختم میشود، انتخاب میکند.
SELECT Id, OperatorName, StringValue1
FROM dbo.Operators
WHERE StringValue1 LIKE '%n%';
این مثال ردیفهایی را بازمیگرداند که `StringValue1` آنها در هر جایی شامل حرف ‘n’ باشد.
SELECT Id, OperatorName, StringValue1
FROM dbo.Operators
WHERE StringValue1 LIKE '_a%';
این کوئری ردیفهایی را انتخاب میکند که `StringValue1` آنها حرف دومشان ‘a’ باشد.
عملگر IN
عملگر `IN` برای مقایسه یک مقدار با لیستی از مقادیر مشخص شده استفاده میشود. اگر مقدار در لیست موجود باشد، شرط `TRUE` بازمیگردد. این عملگر جایگزین کارآمدی برای چندین عبارت `OR` است.
SELECT Id, OperatorName, StringValue1
FROM dbo.Operators
WHERE StringValue1 IN ('Apple', 'Banana', 'Cherry');
این مثال تمام ردیفهایی را که `StringValue1` آنها یکی از مقادیر ‘Apple’, ‘Banana’ یا ‘Cherry’ باشد، بازمیگرداند.
SELECT Id, OperatorName, Value1
FROM dbo.Operators
WHERE Value1 IN (10, 20, 30, 110);
`IN` همچنین میتواند با مقادیر عددی استفاده شود، همانطور که در این کوئری برای یافتن `Value1`های خاص نشان داده شده است.
عملگر IS NULL و IS NOT NULL
عملگر `IS NULL` برای آزمایش اینکه آیا یک ستون حاوی مقدار `NULL` است یا خیر، استفاده میشود. `NULL` نشاندهنده عدم وجود داده است و با عملگرهای مقایسهای استاندارد (مانند `=`, “) قابل مقایسه نیست. عملگر `IS NOT NULL` برعکس آن عمل میکند و ردیفهایی را که ستونشان دارای مقدار `NULL` نیست، برمیگرداند.
SELECT Id, OperatorName, Value1, StringValue1
FROM dbo.Operators
WHERE Value1 IS NULL;
این کوئری تمام ردیفهایی را که `Value1` آنها `NULL` است، انتخاب میکند.
SELECT Id, OperatorName, Value1, StringValue1
FROM dbo.Operators
WHERE StringValue1 IS NOT NULL;
این مثال تمام ردیفهایی را که `StringValue1` آنها `NULL` نیست، بازمیگرداند.
عملگر ALL
عملگر `ALL` برای مقایسه یک مقدار مقیاسی (scalar value) با هر مقدار در مجموعهای از مقادیر تک ستونی استفاده میشود. شرط `TRUE` بازمیگردد اگر مقدار مقیاسی با تمام مقادیر مجموعه مقایسه شده، شرط را برآورده کند.
SELECT Id, OperatorName, Value1
FROM dbo.Operators
WHERE Value1 > ALL (SELECT Value2 FROM dbo.Operators WHERE Value2 IS NOT NULL);
این کوئری ردیفهایی را انتخاب میکند که `Value1` آنها بزرگتر از تمامی مقادیر در ستون `Value2` باشد. (یعنی بزرگتر از بزرگترین `Value2` موجود)
عملگر ANY / SOME
عملگرهای `ANY` و `SOME` مشابه هستند و برای مقایسه یک مقدار مقیاسی با هر مقدار در مجموعهای از مقادیر تک ستونی استفاده میشوند. شرط `TRUE` بازمیگردد اگر مقدار مقیاسی با حداقل یکی از مقادیر مجموعه مقایسه شده، شرط را برآورده کند. `SOME` یک مترادف برای `ANY` است.
SELECT Id, OperatorName, Value1
FROM dbo.Operators
WHERE Value1 > ANY (SELECT Value2 FROM dbo.Operators WHERE Value2 IS NOT NULL);
این کوئری ردیفهایی را انتخاب میکند که `Value1` آنها بزرگتر از حداقل یکی از مقادیر در ستون `Value2` باشد. (یعنی بزرگتر از کوچکترین `Value2` موجود)
عملگر EXISTS
عملگر `EXISTS` برای آزمایش وجود هر ردیف در یک زیرکوئری استفاده میشود. اگر زیرکوئری حداقل یک ردیف را بازگرداند، `EXISTS` مقدار `TRUE` را برمیگرداند؛ در غیر این صورت، `FALSE` را برمیگرداند. این عملگر به جای مقایسه مقادیر، وجود یا عدم وجود ردیفها را بررسی میکند و برای بررسی وابستگیها یا شرایط پیچیده بسیار قدرتمند است.
SELECT Id, OperatorName, StringValue1
FROM dbo.Operators AS O
WHERE EXISTS (
SELECT 1
FROM dbo.Operators
WHERE StringValue1 = O.StringValue1 AND Value1 = 10
);
در این مثال، تمام ردیفهایی را از جدول `Operators` انتخاب میکنیم که `StringValue1` آنها در زیرکوئری وجود داشته باشد و `Value1` آن 10 باشد. این به معنای یافتن ردیفهایی است که `StringValue1` آنها با یک ردیف دیگر که `Value1` آن 10 است، یکسان است. این عملگر بهینه برای بررسی وجود دادهها بدون نیاز به بازیابی خود دادهها است.
SELECT Id, OperatorName, Value1
FROM dbo.Operators O
WHERE EXISTS (
SELECT 1
FROM dbo.Operators
WHERE O.Value1 = Value2
);
این کوئری تمام ردیفهایی را انتخاب میکند که `Value1` آنها برابر با هر `Value2` موجود در جدول باشد. این یک روش کارآمد برای یافتن مطابقت بین دو ستون در همان جدول یا جداول مختلف است.