۱۴۰۴/۰۷/۰۱
🔹 چرا
🔹 معادل با
🔹 کجاها از
مثال 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):
- جدول Customers خونده میشه (مثلاً 100 مشتری داریم).
- برای هر مشتری، سابکوئری اجرا میشه:
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 استفاده کنیم؟
- وقتی میخوایم فقط وجود یا عدم وجود رکورد رو چک کنیم.
- مثال: مشتریانی که سفارش دارند.
- مثال: کارمندانی که سابقه مرخصی دارند.
- وقتی نیاز به شرطهای پیچیده روی جدول دوم داریم.
مثلا:SELECT E.Name FROM Employees E WHERE EXISTS ( SELECT 1 FROM Salaries S WHERE S.EmpID = E.EmpID AND S.Amount > 5000 );→ فقط کارمندانی که حقوق بالای ۵۰۰۰ داشتهاند. - وقتی میخوایم سریعتر باشه نسبت به
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
[your-shortcode]