زیرپرسوجو (Subquery) در SQL، به کوئریهایی گفته میشود که در داخل یک کوئری دیگر قرار دارند. زیرپرسوجوها میتوانند در بخشهای مختلف یک کوئری، از جمله بخشهای SELECT، WHERE، FROM، و HAVING استفاده شوند. زیرپرسوجوها به شما این امکان را میدهند که نتایج یک پرسوجو را به عنوان ورودی برای پرسوجوهای دیگر استفاده کنید و عملیات پیچیدهتری را در پایگاه داده انجام دهید.
انواع زیرپرسوجوها:
- زیرپرسوجوی اسکالر (Scalar Subquery)
- زیرپرسوجوی ستونی (Column Subquery)
- زیرپرسوجوی چند ستونی (Multiple Column Subquery)
- زیرپرسوجوی جداکننده (Correlated Subquery)
1. زیرپرسوجوی اسکالر (Scalar Subquery):
زیرپرسوجوی اسکالر، یک پرسوجوی تکستونی و تکردیفی است که فقط یک مقدار (یا یک رکورد) را برمیگرداند. این نوع زیرپرسوجو معمولاً در بخشهایی مانند SELECT یا WHERE استفاده میشود.
ساختار:
FROM جدول
WHERE ستون3 = (SELECT MAX(ستون3) FROM جدول2);
مثال:
اگر بخواهید فهرستی از کاربرانی را که دارای بالاترین امتیاز در جدول امتیازات هستند، نمایش دهید، میتوانید از یک زیرپرسوجوی اسکالر استفاده کنید:
FROM کاربران
WHERE امتیاز = (SELECT MAX(امتیاز) FROM امتیازات);
در اینجا:
- زیرپرسوجو، حداکثر امتیاز را از جدول امتیازات استخراج میکند.
- سپس، در پرسوجوی اصلی، کاربران با این امتیاز را نمایش میدهد.
2. زیرپرسوجوی ستونی (Column Subquery):
در این نوع زیرپرسوجو، چندین مقدار از یک ستون برمیگردد و این مقادیر در بخشهای مختلف از جمله WHERE با عملگرهایی مانند IN یا NOT IN مقایسه میشوند.
ساختار:
FROM جدول
WHERE ستون3 IN (SELECT ستون4 FROM جدول2);
مثال:
اگر بخواهید کاربرانی را پیدا کنید که در یک یا چند پروژه در جدول پروژهها ثبتنام کردهاند، میتوانید از یک زیرپرسوجوی ستونی استفاده کنید:
FROM کاربران
WHERE کاربر_id IN (SELECT کاربر_id FROM پروژهها WHERE پروژه_id IN (1, 2, 3));
در اینجا:
- زیرپرسوجو، کاربر_id کاربران ثبتنام کرده در پروژههای با پروژه_id 1، 2 و 3 را استخراج میکند.
- سپس، در پرسوجوی اصلی، کاربرانی که در این پروژهها ثبتنام کردهاند، نمایش داده میشوند.
3. زیرپرسوجوی چند ستونی (Multiple Column Subquery):
این نوع زیرپرسوجو مقادیر بیشتری را در مقایسه با زیرپرسوجوی ستونی برمیگرداند و از آن میتوان برای مقایسه چندین ستون در بخشهایی مانند WHERE استفاده کرد.
ساختار:
FROM جدول
WHERE (ستون3, ستون4) IN (SELECT ستون5, ستون6 FROM جدول2);
مثال:
فرض کنید که در جدول سفارشات، به دنبال سفارشهایی با مشخصات خاص میگردید که معادل مشخصات موجود در جدول محصولات باشند. برای این کار میتوانید از یک زیرپرسوجوی چند ستونی استفاده کنید:
FROM سفارشات
WHERE (مشتری_id, تاریخ) IN (SELECT مشتری_id, تاریخ FROM محصولات WHERE قیمت > 500);
در اینجا:
- زیرپرسوجو دو ستون (مشتری_id و تاریخ) را از جدول محصولات استخراج میکند.
- سپس، در پرسوجوی اصلی، سفارشاتی که این دو ویژگی را داشته باشند، نمایش داده میشود.
4. زیرپرسوجوی جداکننده (Correlated Subquery):
زیرپرسوجوی جداکننده (Correlated Subquery) برخلاف سایر زیرپرسوجوها که مستقل از پرسوجوی اصلی اجرا میشوند، برای هر ردیف پرسوجوی اصلی یک بار اجرا میشود. در این نوع زیرپرسوجو، از مقادیری که در ردیفهای پرسوجوی اصلی موجود هستند برای انجام عملیات در زیرپرسوجو استفاده میشود.
ساختار:
FROM جدول1
WHERE EXISTS (SELECT 1 FROM جدول2 WHERE جدول1.ستون = جدول2.ستون);
مثال:
اگر بخواهید فهرستی از مشتریانی را که سفارشهایی از نوع خاص دارند، نمایش دهید، میتوانید از زیرپرسوجوی جداکننده استفاده کنید:
FROM مشتریان
WHERE EXISTS (SELECT 1 FROM سفارشات WHERE مشتریان.id = سفارشات.مشتری_id AND سفارشات.نوع = 'الکترونیک');
در اینجا:
- برای هر مشتری در جدول مشتریان، زیرپرسوجو بررسی میکند که آیا سفارشاتی از نوع 'الکترونیک' در جدول سفارشات وجود دارد یا نه.
- اگر چنین سفارشاتی وجود داشته باشد، آن مشتری در نتایج نمایش داده میشود.
نکات مهم:
- زیرپرسوجوهای غیر همزمان (Non-Correlated Subqueries): این زیرپرسوجوها به طور مستقل از پرسوجوی اصلی اجرا میشوند و میتوانند تنها یک بار اجرا شوند.
- زیرپرسوجوهای همزمان (Correlated Subqueries): این زیرپرسوجوها برای هر ردیف پرسوجوی اصلی به طور جداگانه اجرا میشوند.
- عملگرهای استفادهشده با زیرپرسوجوها: معمولاً از عملگرهایی مانند IN، EXISTS، ANY، ALL برای مقایسه نتایج زیرپرسوجو استفاده میشود.
نتیجهگیری:
زیرپرسوجوها ابزاری قدرتمند در SQL هستند که امکان انجام عملیات پیچیدهتری را بر روی دادهها فراهم میکنند. از آنها میتوان در بخشهای مختلف یک پرسوجو استفاده کرد و با استفاده از انواع مختلف زیرپرسوجو (اسکالر، ستونی، چند ستونی و همزمان) به راحتی به نتایج دلخواه رسید.
