فیلتر دادهها با SQL BETWEEN: جامعترین راهنما با مثالهای کاربردی
عملگر SQL BETWEEN یک اپراتور منطقی است که به شما امکان میدهد یک محدوده را برای بررسی اینکه آیا یک مقدار در آن محدوده قرار دارد یا خیر، مشخص کنید. این عملگر شامل مقادیر ابتدا و انتها (inclusive) میشود. میتوانید از عملگر BETWEEN برای انواع دادههای عددی، متنی و تاریخ در کوئریهای SQL خود استفاده کنید. عملکرد آن مشابه ترکیب عملگرهای بزرگتر یا مساوی (>=) و کوچکتر یا مساوی (<=) است.
نحو استفاده از عملگر BETWEEN به شرح زیر است:
`value BETWEEN low AND high`
در اینجا، `value` ستون یا عبارتی است که قرار است بررسی شود، و `low` و `high` مقادیر ابتدایی و انتهایی محدوده را مشخص میکنند که شامل هر دو مقدار مرزی میشود.
استفاده از BETWEEN با اعداد
بیایید با یک مثال ساده از کاربرد عملگر BETWEEN برای فیلتر کردن مقادیر عددی شروع کنیم. ابتدا یک جدول نمونه به نام `NumbersExample` ایجاد میکنیم و چند عدد را در آن وارد میکنیم.
`
CREATE TABLE [dbo].[NumbersExample]( [Id] [int] IDENTITY(1,1) NOT NULL, [Value] [int] NULL ) ON [PRIMARY]; INSERT INTO NumbersExample VALUES (1), (5), (10), (15), (20), (25), (30), (35), (40), (45), (50), (55), (60), (65), (70), (75), (80), (85), (90), (95), (100);
`
حالا، برای بازیابی تمام مقادیری که بین 20 و 80 (شامل خود 20 و 80) قرار دارند، از کوئری زیر استفاده میکنیم:
`
SELECT Value FROM [dbo].[NumbersExample] WHERE Value BETWEEN 20 AND 80;
`
این کوئری تمام اعداد بین 20 تا 80 را از جدول `NumbersExample` انتخاب میکند.
استفاده از BETWEEN با تاریخها
عملگر BETWEEN در هنگام فیلتر کردن محدوده تاریخها بسیار مفید است. برای مثال، فرض کنید میخواهید رکوردهایی را بازیابی کنید که در یک بازه زمانی خاص ایجاد شدهاند. ابتدا یک جدول نمونه برای تاریخها ایجاد میکنیم:
`
CREATE TABLE [dbo].[DateExample]( [Id] [int] IDENTITY(1,1) NOT NULL, [EventDate] [datetime] NULL ) ON [PRIMARY]; INSERT INTO DateExample VALUES (GETDATE()), (DATEADD(day, -5, GETDATE())), (DATEADD(day, -15, GETDATE())), (DATEADD(day, -25, GETDATE())), (DATEADD(day, -35, GETDATE())), (DATEADD(day, -45, GETDATE())), (DATEADD(day, -55, GETDATE())), (DATEADD(day, -65, GETDATE()));
`
برای بازیابی رکوردهایی که در 30 روز گذشته ایجاد شدهاند، میتوانید از کوئری زیر استفاده کنید:
`
SELECT EventDate FROM [dbo].[DateExample] WHERE EventDate BETWEEN DATEADD(day, -30, GETDATE()) AND GETDATE();
`
برای بازیابی رویدادها در یک ماه خاص، مانند ژانویه 2023، میتوانید مقادیر تاریخ را به صورت رشته مشخص کنید:
`
SELECT EventDate FROM [dbo].[DateExample] WHERE EventDate BETWEEN '2023-01-01' AND '2023-01-31';
`
**نکته مهم در مورد نوع داده DATETIME:**
هنگام استفاده از عملگر BETWEEN با نوع داده DATETIME، اگر کران بالای محدوده (تاریخ پایانی) را فقط با فرمت تاریخ (مثلاً ‘2023-01-31’) مشخص کنید، این به معنای ابتدای آن روز (یعنی 00:00:00) خواهد بود. بنابراین، کوئری بالا فقط رکوردهایی را تا ساعت 00:00:00.000 روز 31 ژانویه 2023 شامل میشود و رکوردهای ایجاد شده در طول روز 31 ژانویه را نادیده میگیرد.
برای اینکه کل روز پایانی را شامل شود، باید کران بالا را به صورت دقیق با زمان پایانی روز (‘2023-01-31 23:59:59.997’) مشخص کنید:
`
SELECT EventDate FROM [dbo].[DateExample] WHERE EventDate BETWEEN '2023-01-01' AND '2023-01-31 23:59:59.997';
`
یا یک روش جایگزین و مطمئنتر، استفاده از ترکیب عملگرهای مقایسهای است که کران بالای محدوده را به ابتدای روز بعدی تنظیم کنید و از `<` استفاده کنید:
`
SELECT EventDate FROM [dbo].[DateExample] WHERE EventDate >= '2023-01-01' AND EventDate < '2023-02-01';
`
استفاده از BETWEEN با رشتهها (کاراکترها)
عملگر BETWEEN با انواع داده کاراکتری یا رشتهای نیز کار میکند. مقایسه بر اساس ترتیب کلاژن (collation) پایگاه داده یا ستون انجام میشود. بیایید یک مثال با جدول حاوی نامها را بررسی کنیم:
`
CREATE TABLE [dbo].[TextExample]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NULL ) ON [PRIMARY]; INSERT INTO TextExample VALUES ('Apple'), ('Banana'), ('Cherry'), ('Date'), ('Elderberry'), ('Fig'), ('Grape'), ('Honeydew'), ('Kiwi');
`
برای انتخاب نامهایی که بین ‘Banana’ و ‘Fig’ (شامل خودشان) قرار دارند:
`
SELECT Name FROM [dbo].[TextExample] WHERE Name BETWEEN 'Banana' AND 'Fig';
`
این کوئری تمام نامهایی را که به ترتیب الفبایی بین ‘Banana’ و ‘Fig’ قرار دارند، بازیابی میکند.
عملگر NOT BETWEEN
برای بازیابی مقادیری که در یک محدوده مشخص قرار نمیگیرند، میتوانید عملگر NOT را با BETWEEN ترکیب کنید. این ترکیب به شما کمک میکند تا دادههایی را انتخاب کنید که خارج از محدوده مورد نظر شما هستند.
به عنوان مثال، برای انتخاب اعدادی که **خارج** از محدوده 20 تا 80 هستند:
`
SELECT Value FROM [dbo].[NumbersExample] WHERE Value NOT BETWEEN 20 AND 80;
`
مقایسه BETWEEN با عملگرهای >= و <=
همانطور که قبلاً ذکر شد، عملگر BETWEEN معادل استفاده از ترکیب عملگرهای بزرگتر یا مساوی (>=) و کوچکتر یا مساوی (<=) است. هر دو کوئری زیر نتایج یکسانی را برمیگردانند:
با استفاده از BETWEEN:
`
SELECT Value FROM [dbo].[NumbersExample] WHERE Value BETWEEN 20 AND 80;
`
با استفاده از >= و <=:
`
SELECT Value FROM [dbo].[NumbersExample] WHERE Value >= 20 AND Value <= 80;
`
در حالی که هر دو کوئری خروجی یکسانی تولید میکنند، استفاده از `BETWEEN` اغلب راهی موجزتر و خواناتر برای بیان شرایط محدوده ارائه میدهد، به ویژه در هنگام کار با کوئریهای پیچیدهتر.