وجود (EXISTS)
«عملگر EXISTS» در PostgreSQL یک چک کننده وجود است. یعنی می پرسد: «آیا رکوردی هست؟». اگر زیربررسی (Subquery) حداقل یک سطر بدهد، نتیجه TRUE می شود. مثل بازی: اگر حتی یک کارت معتبر داری، بگو «هستم».
EXISTS چیست و کِی استفاده کنیم؟
EXISTS یعنی «وجود دارد». زیربررسی (Subquery) یک SELECT داخل WHERE است. اگر آن SELECT حتی یک سطر برگرداند، EXISTS برابر TRUE می شود. بنابراین، فهرست اصلی فقط ردیف های «دارای ارتباط» را نشان می دهد.
نکته: برای توضیح بیشتر ببینید: عملگر EXISTS. همچنین، برای مقایسه با عملگرهای دیگر به ANY و HAVING هم سر بزنید.
نمونه EXISTS: مشتریانی که سفارش دارند
می خواهیم فقط مشتریانی را ببینیم که حداقل یک سفارش دارند. اگر زیربررسی سفارش پیدا کند، EXISTS می گوید TRUE، پس آن مشتری انتخاب می شود.
SELECT
customers.customer_name
FROM
customers
WHERE
EXISTS (
SELECT
orders.order_id
FROM
orders
WHERE
orders.customer_id = customers.customer_id
);
در منبع گفته شد تعداد زیادی مشتری، حداقل یک سفارش داشتند. پس EXISTS برای «وجود رابطه» عالی است.
NOT EXISTS: مشتریان بدون سفارش
حالا برعکس می خواهیم. کسانی را پیدا کنیم که هیچ سفارشی ندارند. NOT EXISTS یعنی «هیچ نتیجه ای برنگردان».
SELECT
customers.customer_name
FROM
customers
WHERE
NOT EXISTS (
SELECT
orders.order_id
FROM
orders
WHERE
orders.customer_id = customers.customer_id
);
الگوی رایج در پروژه ها
1) نیاز داری «داشتن آیتم مرتبط» را بسنجی؟ EXISTS عالی است.
2) نیاز داری «نداشتن آیتم مرتبط» را بسنجی؟ NOT EXISTS بزن.
3) معمولاً از کلیدها در شرط زیربررسی استفاده کن.
هشدار: داخل زیربررسی، از ستون های درست و ایندکس دار استفاده کن. این کار، اجرا را سریع تر می کند.
جمع بندی سریع
- EXISTS یعنی «حداقل یک سطر هست».
- NOT EXISTS یعنی «هیچ سطری نیست».
- برای روابط وجود/عدم وجود عالی است.
- شرط زیربررسی را ایندکس پسند بنویس.
- لینک تمرینی را باز کن و تست کن.