در برخی عبارات Structured Query Language (SQL)، بخش WHERE برای محدود کردن سطرهایی که عمل مورد نظر روی آنها انجام میشود، استفاده میشود. این بخش با تعیین معیارهای خاص، فقط سطرهایی که شرایط جستوجو را داشته باشند، تحت تاثیر قرار میدهد. شرایط جستوجو از یک یا چند گزاره (predicate) تشکیل میشوند که عبارات خاصی بوده و ارزیابی آنها به صورت “true”، “false”، یا “unknown” خواهد بود و عملیات روی سطرهایی انجام میشود که در آنها هر predicate در WHERE برابر “true” باشد.
SQL به کاربران این امکان را میدهد که شرایط جستوجو را با استفاده از انواع مختلفی از گزارهها بنویسند. هر نوع predicate از یک اپراتور خاص برای ارزیابی سطرها استفاده میکند. این راهنما به دو نوع از predicates و اپراتورهایشان میپردازد: اپراتورهای مقایسهای و اپراتور IS NULL.
با این که مثالهای این مقاله تنها از دستورات SELECT استفاده میکند، ولی این مفاهیم در بسیاری از عملیات SQL دیگر نیز کاربرد دارند؛ به خصوص، WHERE بخش حیاتی UPDATE و DELETE محسوب میشود.
برای دنبال کردن این مطلب، باید یک سیستم مدیریت پایگاه داده رابطهای (RDBMS) که از SQL استفاده میکند، داشته باشید. مثالهای این راهنما با محیط زیر اعتبارسنجی شده است:
توجه: بسیاری از RDBMSها پیادهسازی منحصر به فرد خود از SQL را دارند. اگرچه دستورات این مقاله در بیشتر RDBMSها شامل PostgreSQL و SQLite کار میکند، اما شاید سینتکس یا خروجی آنها اگر روی سیستمی غیر از MySQL تست کنید، کمی متفاوت باشد.
اگر پایگاه داده SQL شما روی سرور ریموت اجرا میشود، به سیستمتان SSH بزنید:
ssh sammy@your_server_ip
سپس پنجره دستورات MySQL را باز کنید و sammy را با نام کاربری خود جایگزین نمایید:
mysql -u sammy -p
از پنجره دستورات، پایگاه دادهای به نام comparison_null_db ایجاد کنید:
CREATE DATABASE comparison_null_db;
اگر پایگاه داده با موفقیت ایجاد شد، خروجی مشابه زیر دریافت خواهید کرد:
Output
Query OK, 1 row affected (0.01 sec)
برای انتخاب پایگاه داده comparison_null_db، دستور زیر را اجرا کنید:
USE comparison_null_db;
Output
Database changed
پس از انتخاب پایگاه داده، یک جدول داخل آن ایجاد نمایید.
برای مثال فرض کنید شما و دوستانتان تصمیم میگیرید بیشتر ورزش کنید و دویدن را به عنوان تمرین انتخاب میکنید. هر کدام هدفی شخصی برای تعداد مایلهایی که قصد دارید در یک ماه بدوید تعیین میکنید. شما قصد دارید اهداف و نتایج دوستان خود را در یک جدول SQL با سه ستون زیر ثبت کنید:
-- name: نام دوست
-- goal: هدف دویدن
-- result: تعداد مایل دویده شده
دستور CREATE TABLE زیر را برای ساخت جدول running_goals اجرا کنید:
CREATE TABLE running_goals (
name varchar(15),
goal int,
result int
);
Output
Query OK, 0 rows affected (0.012 sec)
سپس دادههای نمونه را با دستور زیر وارد جدول کنید. در این دادهها، هفت ردیف مربوط به هفت نفر از دوستان، اهداف آنها و نتایجشان ثبت شده است:
INSERT INTO running_goals
VALUES
('Michelle', 55, 48),
('Jerry', 25, NULL),
('Milton', 45, 52),
('Bridget', 40, NULL),
('Wanda', 30, 38),
('Stewart', 35, NULL),
('Leslie', 40, 44);
Output
Query OK, 7 rows affected (0.004 sec)
Records: 7 Duplicates: 0 Warnings: 0
توجه کنید که مقدار result در سه سطر برابر NULL است. فرض کنید این دوستان هنوز تعداد مایلهایی که دویدهاند را اعلام نکردهاند، به همین دلیل مقدارشان NULL درج شده است.
اکنون میتوانید ادامه آموزش را برای یادگیری نحوه استفاده از اپراتورهای مقایسهای و IS NULL دنبال کنید.
فیلتر کردن دادهها با استفاده از WHERE در SQL
در هر عملیات SQL که دادهای از یک جدول موجود میخواند، میتوانید بعد از بخش FROM، یک WHERE اضافه کنید تا دادههایی که عملیات روی آنها انجام میشود را محدود کنید. WHERE این کار را با تعریف یک شرط جستوجو انجام میدهد؛ هر ردیفی که با شرط جستوجو منطبق نباشد، حذف میشود و ردیفهایی که منطبق باشند، در خروجی باقی میماند.
یک شرط جستوجو از یک یا چند predicate یعنی عباراتی که یک یا چند مقدار را ارزیابی کرده و نتیجه را به صورت “true”، “false”، یا “unknown” بازمیگردانند تشکیل میشود. در SQL یک عبارت مقداری (value expression) که برگردان یک مقدار را دارد میتواند یک مقدار ثابت، مانند یک رشته یا عدد، یک عبارت ریاضیاتی، یا نام یک ستون باشد. توجه کنید معمولاً یکی از value expressionها، نام یک ستون از جدول موجود در FROM است.
هنگام اجرای پرس و جوهای SQL که دارای WHERE هستند، سیستم مدیریت پایگاه داده، شرط جستوجو را روی هر ردیف که توسط FROM تعیین شده، اعمال میکند. فقط ردیفهایی که برای تمام predicatesهای شرط، مقدار “true” داشته باشند، در نتیجه نهایی باقی خواهند ماند.
معرفی انواع predicateهای رایج در SQL
استاندارد SQL انواع متعددی از predicateها را معرفی میکند (۱۸ نوع)، ولی بسیاری از RDBMSها فقط بخشی از آنها را دارند. پنج نوع رایج predicate عبارتند از:
- مقایسهای: مقایسه دو عبارت مقداری با هم (معمولاً یکی نام ستون است) با شش عملگر مقایسهای
- Null: بررسی اینکه مقدار یک ستون برابر Null است یا نه با IS NULL
- رنج (Range): استفاده از BETWEEN برای بررسی اینکه یک مقدار بین دو مقدار دیگر قرار دارد یا نه
- عضویت (Membership): استفاده از IN برای بررسی عضویت یک مقدار در مجموعهای داده شده
- الگو (Pattern Match): با LIKE برای مطابقت مقدار با یک الگوی رشتهای
همانطور که در مقدمه گفته شد، تمرکز این مقاله روی استفاده از اپراتورهای مقایسه و IS NULL برای فیلتر کردن دادهها است.
استفاده از عملگرهای مقایسهای در WHERE
عملگرهای مقایسهای شش عدد هستند و معمولاً برای مقایسه مقدار یک ستون با یک مقدار ثابت یا ستون دیگر استفاده میشوند. سینتکس معمول آن به این شکل است:
SELECT column_list
FROM table_name
WHERE column_name OPERATOR value_expression;
مقدار ستون برای هر سطر با مقدار right مقایسه و بسته به صحت شرط، سطر فیلتر میشود یا نه.
مثلاً کوئری زیر مقدار name و goal دوستانی را نشان میدهد که هدف آنها دقیقاً ۴۰ مایل بوده است:
SELECT name, goal
FROM running_goals
WHERE goal = 40;
چون فقط دو نفر از دوستان هدف ۴۰ مایل داشتهاند، فقط دو ردیف برگردانده میشود:
Output
+---------+------+
| name | goal |
+---------+------+
| Bridget | 40 |
| Leslie | 40 |
+---------+------+
2 rows in set (0.00 sec)
برای آشنایی با سایر عملگرها، کوئریهای زیر را اجرا کنید. همه مشابه کوئری قبل هستند، فقط عملگرشان متفاوت است:
— برابر نبودن با ۴۰
SELECT name, goal FROM running_goals WHERE goal 40;
— کمتر بودن از ۴۰
SELECT name, goal FROM running_goals WHERE goal < 40;
— بیشتر بودن از ۴۰
SELECT name, goal FROM running_goals WHERE goal > 40;
— کمتر یا مساوی بودن با ۴۰
SELECT name, goal FROM running_goals WHERE goal <= 40;
— بیشتر یا مساوی بودن با ۴۰
SELECT name, goal FROM running_goals WHERE goal >= 40;
عملگرهای = و برای دادههای رشتهای هم کار میکنند. کوئری زیر فقط ردیفی که name آن ‘Leslie’ است را نمایش میدهد:
SELECT name FROM running_goals WHERE name = 'Leslie';
در مقایسه رشتهها با , =، ترتیب الفبایی سنجیده میشود؛ اگر تست کنید یک رشته “کمتر از” رشته دیگر است، چک میشود آیا از لحاظ حروف الفبا قبل از دیگری قرار دارد یا خیر. همچنین اگر “بیشتر از” را تست کنید یعنی رشته اول بعد از دوم قرار میگیرد.
کوئری زیر، سطرهایی که name آنها از لحاظ حروف الفبا قبل از ‘M’ است را نمایش میدهد:
SELECT name, goal FROM running_goals WHERE name < 'M';
در خروجی این کوئری، Michelle یا Milton دیده نمیشوند چون رشتههای با حرف اول M بعد از ‘M’ قرار میگیرند.
کار با مقدار NULL و اپراتور IS NULL در SQL
در SQL، NULL یعنی مقدار موجود نیست یا ناشناخته است. Null حالت است نه مقدار واقعی؛ یعنی همان صفر یا رشته خالی نیست.
برای تست اینکه یک ستون مقدار Null دارد یا نه، از IS NULL استفاده کنید:
SELECT name, result FROM running_goals WHERE result IS NULL;
در این کوئری، شرط بررسی میکند آیا مقدار result در هر سطر Null است یا نه و فقط سطرهایی را در خروجی میآورد که مقدار آن Null باشد. از آنجایی که سه نفر نتیجه را اعلام نکردهاند، فقط همین سه سطر در خروجی خواهد بود.
جمعبندی
در این راهنما یاد گرفتید که چگونه از عملگرهای مقایسهای و IS NULL در بخش WHERE کوئریهای SQL برای فیلتر کردن ردیفها استفاده کنید. اگرچه این دستورات در اکثر پایگاههای داده رابطهای اجرا میشوند، اما هر سیستم مدیریت پایگاه داده پیادهسازی متفاوت خودش از استاندارد SQL را دارد. برای اطلاعات بیشتر، به مستندات رسمی پایگاه دادهای که با آن کار میکنید مراجعه کنید.
از همراهی شما با پارمین کلود متشکریم.
نظرات کاربران