۱۴۰۴/۰۷/۰۱ Nebular

مثال exist در query ها

کوئری حای exist:

SELECT C.CustomerID, C.Name
FROM Customers C
WHERE EXISTS (
    SELECT 1
    FROM Orders O
    WHERE O.CustomerID = C.CustomerID
);

🔹 مفهوم کلی:

  • این کوئری می‌گه: «همه‌ی مشتریانی رو بیار که حداقل یک سفارش دارند.»
  • به زبان ساده: چک می‌کنه آیا رابطه‌ای وجود دارد بین Customers و Orders برای هر مشتری یا نه.

🔹 چرا EXISTS ؟

  • EXISTS فقط بررسی می‌کنه وجود رکورد در ساب‌کوئری.
  • به محض اینکه یک رکورد معتبر پیدا بشه (یعنی O.CustomerID = C.CustomerID درست باشه)، دیگه ادامه نمی‌ده.
  • بنابراین معمولاً سریع‌تر از IN یا JOIN هست وقتی فقط وجود داشتن رکورد مهمه.

🔹 اجرای گام‌به‌گام (Trace):

  1. جدول Customers خونده می‌شه (مثلاً 100 مشتری داریم).
  2. برای هر مشتری، ساب‌کوئری اجرا می‌شه: SELECT 1 FROM Orders O WHERE O.CustomerID = C.CustomerID
    • اگر هیچ سفارشی برای اون مشتری نباشه → EXISTS = false → مشتری حذف می‌شه.
    • اگر حتی یک سفارش باشه → EXISTS = true → مشتری انتخاب می‌شه.

🔹 معادل با IN:

همون کوئری رو می‌شه با IN هم نوشت:

SELECT C.CustomerID, C.Name
FROM Customers C
WHERE C.CustomerID IN (
    SELECT O.CustomerID
    FROM Orders O
);

ولی فرق داره:

  • IN لیست همه‌ی CustomerIDها رو از Orders می‌سازه → بعد مقایسه می‌کنه.
  • EXISTS سریع‌تر متوقف می‌شه، مخصوصاً وقتی فقط دنبال وجود رکورد هستیم.

🔹 کجاها از EXISTS استفاده کنیم؟

  1. وقتی می‌خوایم فقط وجود یا عدم وجود رکورد رو چک کنیم.
    • مثال: مشتریانی که سفارش دارند.
    • مثال: کارمندانی که سابقه مرخصی دارند.
  2. وقتی نیاز به شرط‌های پیچیده روی جدول دوم داریم.
    مثلا: SELECT E.Name FROM Employees E WHERE EXISTS ( SELECT 1 FROM Salaries S WHERE S.EmpID = E.EmpID AND S.Amount > 5000 ); → فقط کارمندانی که حقوق بالای ۵۰۰۰ داشته‌اند.
  3. وقتی می‌خوایم سریع‌تر باشه نسبت به IN در دیتاست‌های بزرگ.

✅ خلاصه:

  • EXISTS → برای وجود داشتن رکورد، سریع و بهینه.
  • IN → برای مقایسه‌ی یک مقدار در برابر یک لیست.
  • JOIN → وقتی بخوایم علاوه بر وجود، اطلاعات جدول دوم رو هم نشون بدیم.

مثال ۱ – مشتریانی که سفارش دارند

روش ۱ – EXISTS

SELECT C.CustomerID, C.Name
FROM Customers C
WHERE EXISTS (
    SELECT 1
    FROM Orders O
    WHERE O.CustomerID = C.CustomerID
);

روش ۲ – IN

SELECT C.CustomerID, C.Name
FROM Customers C
WHERE C.CustomerID IN (
    SELECT O.CustomerID
    FROM Orders O
);

روش ۳ – JOIN

SELECT DISTINCT C.CustomerID, C.Name
FROM Customers C
JOIN Orders O ON C.CustomerID = O.CustomerID;

🔹 مثال ۲ – کارمندانی که حداقل یک مرخصی ثبت کرده‌اند

روش ۱ – EXISTS

SELECT E.EmployeeID, E.Name
FROM Employees E
WHERE EXISTS (
    SELECT 1
    FROM Leaves L
    WHERE L.EmployeeID = E.EmployeeID
);

روش ۲ – IN

SELECT E.EmployeeID, E.Name
FROM Employees E
WHERE E.EmployeeID IN (
    SELECT L.EmployeeID
    FROM Leaves L
);

روش ۳ – JOIN

SELECT DISTINCT E.EmployeeID, E.Name
FROM Employees E
JOIN Leaves L ON E.EmployeeID = L.EmployeeID;

🔹 مثال ۳ – محصولاتی که توسط مشتریان خریداری شده‌اند

روش ۱ – EXISTS

SELECT P.ProductID, P.ProductName
FROM Products P
WHERE EXISTS (
    SELECT 1
    FROM Orders O
    WHERE O.ProductID = P.ProductID
);

روش ۲ – IN

SELECT P.ProductID, P.ProductName
FROM Products P
WHERE P.ProductID IN (
    SELECT O.ProductID
    FROM Orders O
);

روش ۳ – JOIN

SELECT DISTINCT P.ProductID, P.ProductName
FROM Products P
JOIN Orders O ON P.ProductID = O.ProductID;

🔹 مثال ۴ – مشتریانی که فاکتور پرداخت‌شده دارند

روش ۱ – EXISTS

SELECT C.CustomerID, C.Name
FROM Customers C
WHERE EXISTS (
    SELECT 1
    FROM Invoices I
    WHERE I.CustomerID = C.CustomerID
      AND I.Status = 'Paid'
);

روش ۲ – IN

SELECT C.CustomerID, C.Name
FROM Customers C
WHERE C.CustomerID IN (
    SELECT I.CustomerID
    FROM Invoices I
    WHERE I.Status = 'Paid'
);

روش ۳ – JOIN

SELECT DISTINCT C.CustomerID, C.Name
FROM Customers C
JOIN Invoices I ON C.CustomerID = I.CustomerID
WHERE I.Status = 'Paid';

✅ نکته مهم:

  • EXISTS و IN فقط وجود رکورد رو بررسی می‌کنن.
  • JOIN علاوه بر وجود رکورد می‌تونه داده‌های جدول دوم رو هم بیاره (ولی ممکنه تکرار ایجاد کنه، برای همین DISTINCT می‌ذاریم).
Accept Cookies
Accept Cookies
[your-shortcode]