در Structured Query Language یا SQL، دستوراتی که شامل WHERE میشوند، مشخص میکنند که عملیات مورد نظر روی کدام ردیفهای جدول اعمال شود. این کار با تعیین معیارهایی که هر ردیف باید برای تاثیرگذاری توسط عملیات، آنها را داشته باشد انجام میشود.
در این مقاله، سینتکس کلی که در WHERE به کار میرود را بررسی میکنیم. همچنین نحوه ترکیب چند شرط در یک WHERE برای فیلتر بهتر دادهها، و چگونگی استفاده از NOT برای حذف ردیفهایی که شرایط خاصی دارند را توضیح میدهیم.
هرچند مثالهای این مطلب با کوئری SELECT نوشته شدهاند، اما مفاهیم بیانشده در سایر عملیاتها هم کاربرد دارند. در واقع WHERE بخش مهمی از دستورهای UPDATE و DELETE نیز هست.
برای دنبالکردن مثالها، کافی است یک سرور با دیتابیس رابطهای (RDBMS) که از SQL پشتیبانی کند داشته باشید. مثالهای این مطلب با محیط زیر تست شدهاند:
نکته: بسیاری از RDBMSها نسخه منحصر به فردی از SQL را دارند. بیشتر دستورات این مقاله در اکثر RDBMSها کاربردی هستند، اما ممکن است سینتکس یا خروجی در غیر از MySQL کمی متفاوت باشد.
اگر دیتابیس شما روی سرور راه دور اجرا میشود، با SSH به سرور وصل شوید:
سپس با نام کاربری خودتان وارد MySQL شوید:
mysql -u user -p
در پنجره MySQL، یک دیتابیس با نام where_db بسازید:
CREATE DATABASE where_db;
اگر دیتابیس با موفقیت ساخته شده باشد، خروجی مشابه زیر دریافت میکنید:
Query OK, 1 row affected (0.00 sec)
برای انتخاب دیتابیس where_db از دستور زیر استفاده کنید:
USE where_db;
بعد از انتخاب دیتابیس، یک جدول جدید بسازید. فرض کنیم اطلاعات بازیکنان یک لیگ گلف را ثبت میکنید. جدول شامل ۶ ستون خواهد بود:
دستور ساخت جدول golfers به شکل زیر است:
CREATE TABLE golfers (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
rounds_played INT,
best INT,
worst INT,
average FLOAT,
wins INT
);
برای واردکردن اطلاعات نمونه به جدول، از دستور زیر استفاده کنید. این دادهها شامل ۷ بازیکن مختلف است:
INSERT INTO golfers (name, rounds_played, best, worst, average, wins)
VALUES
('Matt', 21, 66, 92, 83.2, 9),
('Liz', 19, 72, 95, 86.1, 7),
('Pat', NULL, 69, 98, 79.4, 8),
('Nick', 23, 68, 99, 89.5, 3),
('Tony', NULL, 74, 96, 88.7, 1),
('Vic', 18, 71, 97, 85.0, 1),
('Al', 22, 73, 93, 81.4, 5);
در این دادهها برخی مقدارهای rounds_played برابر NULL هستند. فرض میکنیم این افراد تعداد دورهای بازیشان را اعلام نکردهاند. همچنین طبق قواعد گلف، امتیاز کمتر به معنای عملکرد بهتر است، بنابراین ستون best همیشه کمتر از worst خواهد بود.
استفاده از WHERE در کوئریهای SQL
در SQL، هر دستور شامل کلیدواژههای مختلفی است که وظایفی مانند ساخت جدول، وارد کردن یا حذف داده، و تغییر ساختار جدول را انجام میدهد. WHERE بعد از FROM قرار میگیرد تا ردیفهای هدف را مشخص کند:
SELECT column_name
FROM table_name
WHERE search_condition;
بعد از WHERE، یک search condition (شرط جستجو) میآید که شامل یک یا چند predicate (عبارت منطقی) است و برای هر ردیف، نتیجه “true”، “false” یا “unknown” برمیگرداند.
عبارات داخل WHERE میتوانند اشکال مختلفی داشته باشند، اما معمولاً ساختاری مثل زیر دارند:
column_name = value
column_name < value
column_name BETWEEN value1 AND value2
...
هنگام اجرای کوئری، سیستم مدیریت دیتابیس شرط جستجو را برای هر ردیف اعمال میکند و فقط ردیفهایی که نتیجه تمام predicateها “true” شود را برمیگرداند.
به عنوان مثال، این کوئری همه ردیفهای جدول golfers را برمیگرداند زیرا شرط WHERE همیشه درست است:
SELECT name
FROM golfers
WHERE (2 + 2) = 4;
برای فیلتر دقیقتر، معمولاً از نام ستونها استفاده میکنید. مثال زیر فقط بازیکنانی را نمایش میدهد که تعداد بردشان برابر با ۱ است:
SELECT name, wins
FROM golfers
WHERE wins = 1;
اپراتوری که استفاده میکنید بر اساس نوع فیلتر شما متفاوت است.
پیشفرضهای معمول در WHERE
- مقایسه: اپراتورهای مقایسه (=، ، =، ) برای مقایسه مقدار دو ستون یا مقدار ثابت.
- Null: با استفاده از IS NULL بررسی میکنیم آیا مقدار ستونی Null است یا خیر.
- محدوده: با BETWEEN بررسی میکنیم آیا مقدار یک ستون در بین دو مقدار خاص قرار دارد.
- عضویت: با استفاده از IN بررسی میکنیم آیا مقدار ستون عضو یک مجموعه خاص است یا نه.
- الگو: با LIKE بررسی میکنیم آیا مقدار ستون یک الگوی خاص را دارد یا خیر (با استفاده از wildcards مانند % یا _).
ترکیب چند predicate با AND و OR
گاهی نیاز است نتیجه دقیقتری بگیرید؛ این کار با ترکیب چند عبارت شرطی با AND یا OR ممکن است.
مثال زیر دو شرط را با AND ترکیب کرده است:
SELECT name, best, worst, average
FROM golfers
WHERE best < 70 AND worst < 96;
یا این کوئری، شرایط را با OR ترکیب کرده و ردیفهایی را برمیگرداند که حداقل یکی از شروط برقرار باشد:
SELECT name, best, worst, average
FROM golfers
WHERE best < 70 OR worst < 96;
میتوانید تعداد بیشتری شرط را ترکیب کنید، اما اولویت انجام عملیاتها اهمیت دارد. معمولاً AND ارجحیت بیشتری نسبت به OR دارد.
برای اولویتبندی شرطها از پرانتز استفاده کنید:
SELECT name, average, worst, rounds_played
FROM golfers
WHERE worst < 95 AND rounds_played BETWEEN 19 AND 23 OR average < 85;
یا مشابه مثال بالا ولی با پرانتز:
SELECT name, average, worst, rounds_played
FROM golfers
WHERE (average < 85 OR worst < 95) AND rounds_played BETWEEN 19 AND 23;
در کوئریهایی با شرطهای ترکیبی زیاد، پرانتزگذاری باعث خوانایی بهتر و نتایج درستتر میشود.
استفاده از NOT برای حذف دادهها
با NOT میتوانید ردیفهایی که شرط خاصی دارند را حذف کنید. به طور مثال:
SELECT name
FROM golfers
WHERE name NOT LIKE 'A%';
برای بررسی مقدار Null از ترکیب IS و NOT استفاده میشود:
SELECT name, rounds_played
FROM golfers
WHERE rounds_played IS NOT NULL;
همچنین میتوان NOT را بعد از WHERE برای حذف ردیفهایی که چند شرط مشخص را دارند به کار برد:
SELECT name, average, best, wins
FROM golfers
WHERE NOT (average < 80 AND best < 70);
نتیجه این کوئری صرفاً ردیفهایی را حذف میکند که هر دو شرط داخل پرانتز برقرار باشد.
اگر میخواهید ردیفهایی را بر اساس شرط سوم نیز حذف کنید، همه را داخل پرانتز قرار دهید:
SELECT name, average, best, wins
FROM golfers
WHERE NOT (average < 80 AND best < 70 AND wins = 9);
استفاده از NOT به همراه اپراتورهای مقایسه معمولاً مجاز نیست، زیرا میتوانید با جایگزینی اپراتور معکوس، همان هدف را به دست آورید (مثلاً به جای =).
جمعبندی
در این مقاله با نحوه نوشتن WHERE برای فیلتر دادهها آشنا شدید؛ همچنین یاد گرفتید چگونه شرطهای متعددی را ترکیب کنید و با کلیدواژه NOT اطلاعات خاص را از نتایج حذف نمایید.
دستورات این مقاله معمولاً در اکثر دیتابیسها کاربرد دارند، اما برای استفاده حرفهای همیشه مستندات رسمی RDBMS خود را بخوانید.
برای یادگیری بیشتر SQL و پردازش ابری، دیگر آموزشهای جامع ParminCloud را مطالعه کنید.
از اینکه با پارمین کلود همراهید، متشکریم.
نظرات کاربران