Subquery در SQL
Subquery یا زیرمجموعه، پرس و جوی داخلی در یک پرس و جوی خارجی است. Subquery برای بازیابی دادههایی که در شرط (WHERE
), بخش HAVING
یا حتی ستونهای خروجی (SELECT
) پرس و جوی اصلی استفاده میشود. Subquery ابتدا اجرا میشود و خروجی آن به عنوان ورودی برای پرس و جوی اصلی در نظر گرفته میشود.
انواع Subquery:
- Scalar subquery: خروجی یک مقدار واحد برمیگرداند (مانند حداکثر، حداقل، تعداد و …)
- Single-row subquery: خروجی آن یک تک رکورد است.
- Multiple-row subquery: خروجی آن شامل چندین رکورد است.
استفاده از Subquery:
- فیلتر کردن دادهها: با استفاده از Subquery در شرط
WHERE
میتوان دادهها را بر اساس خروجی Subquery فیلتر کرد. - مقایسه با نتایج دیگر پرس و جوها: میتوان نتایج Subquery را با نتایج پرس و جوی اصلی مقایسه کرد.
- استخراج دادههای وابسته: برای استخراج دادههای مرتبط از جداول دیگر میتوان از Subquery استفاده کرد.
مثالها:
- فیلتر کردن بر اساس Subquery (Scalar):
فرض کنید میخواهیم لیست کارمندانی را نمایش دهیم که حقوقشان بالاترین حقوق در کل شرکت باشد.
SELECT EmployeeID, Name, Salary
FROM Employees
WHERE Salary = (
SELECT MAX(Salary)
FROM Employees
);
در این مثال، Subquery MAX(Salary)
بالاترین حقوق را از جدول Employees
استخراج میکند و پرس و جوی اصلی کارمندانی را انتخاب میکند که حقوقشان با این مقدار برابر باشد.
- فیلتر کردن بر اساس Subquery (Single-row):
فرض کنید میخواهیم لیست سفارشات با مبلغی بالاتر از میانگین کل مبلغ سفارشات را نمایش دهیم.
SELECT OrderID, OrderDate, TotalAmount
FROM Orders
WHERE TotalAmount > (
SELECT AVG(TotalAmount)
FROM Orders
);
در این مثال، Subquery AVG(TotalAmount)
میانگین کل مبلغ سفارشات را محاسبه میکند و پرس و جوی اصلی سفارشاتی را انتخاب میکند که مبلغ آنها از این مقدار بیشتر باشد.
- استخراج دادههای وابسته با Subquery (Multiple-row):
فرض کنید میخواهیم لیست دورههایی را نمایش دهیم که توسط هیچ دانشجویی انتخاب نشدهاند.
SELECT CourseID, CourseName
FROM Courses
WHERE CourseID NOT IN (
SELECT CourseID
FROM Enrollments
);
در این مثال، Subquery تمام کدهای دورههای موجود در جدول Enrollments
را برمیگرداند. پرس و جوی اصلی دورههایی را انتخاب میکند که کد آنها در خروجی Subquery وجود ندارد (یعنی هیچ دانشجویی در آنها ثبتنام نکرده است).
نکات:
- Subqueryها میتوانند تو در تو (Nested) باشند، یعنی یک Subquery میتواند درون Subquery دیگری قرار گیرد.
- استفاده از Subquery میتواند خوانایی پرس و جو را کاهش دهد. در برخی موارد ممکن است بتوان از JOIN برای دستیابی به نتیجه مشابه استفاده کرد.
- برای بهبود کارایی پرس و جوهای دارای Subquery، استفاده از ایندکس (Indexes) مناسب توصیه میشود.
امیدوارم این توضیح برای شما مفید بوده باشد. اگر سوال دیگری در مورد Subquery یا هر موضوع مرتبط با SQL دارید، لطفاً بپرسید.