PostgreSQL

PostgreSQL — وجود (EXISTS)

آخرین بروزرسانی: 1404/08/18

وجود (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 یعنی «هیچ سطری نیست».
  • برای روابط وجود/عدم وجود عالی است.
  • شرط زیربررسی را ایندکس پسند بنویس.
  • لینک تمرینی را باز کن و تست کن.