در SQL، پرسوجوهای وابسته (Correlated Subqueries) و پرسوجوهای غیر وابسته (Non-Correlated Subqueries) دو نوع مختلف از زیرپرسوجوها هستند که تفاوتهای قابل توجهی در نحوه اجرا و استفاده دارند. این تفاوتها عمدتاً در نحوه تعامل زیرپرسوجو با پرسوجوی اصلی و نحوه دسترسی به دادهها منعطف میشود. در اینجا به بررسی هر یک از این دو نوع پرسوجو میپردازیم.
1. پرسوجوهای غیر وابسته (Non-Correlated Subqueries)
پرسوجوهای غیر وابسته به پرسوجوهایی گفته میشود که به طور کامل مستقل از پرسوجوی اصلی اجرا میشوند. این پرسوجوها به هیچوجه به دادههای ردیفهای پرسوجوی اصلی وابسته نیستند و میتوانند یک بار اجرا شده و نتایج ثابت را برگردانند.
ویژگیها:
- اجرای یک بار: پرسوجوی غیر وابسته به صورت کامل از پرسوجوی اصلی جدا است و فقط یک بار اجرا میشود.
- استقلال از پرسوجوی اصلی: این نوع زیرپرسوجو هیچگونه ارتباطی با ستونهای پرسوجوی اصلی ندارد.
- نتایج ثابت: نتایج برگشتی از زیرپرسوجوی غیر وابسته ثابت است و برای همه ردیفهای پرسوجوی اصلی یکسان خواهد بود.
مثال:
فرض کنید شما یک جدول کاربران و یک جدول فاکتورها دارید و میخواهید اطلاعات کاربرانی را نمایش دهید که بزرگترین فاکتور موجود در جدول فاکتورها را دارند. این پرسوجو به شکل زیر خواهد بود:
FROM کاربران
WHERE فاکتور_مجموع = (SELECT MAX(مجموع) FROM فاکتورها);
در اینجا:
- زیرپرسوجو (SELECT MAX(مجموع) FROM فاکتورها) یک بار اجرا میشود و مقدار حداکثر مجموع فاکتورها را برمیگرداند.
- پرسوجوی اصلی تمامی کاربران با فاکتور_مجموع برابر با حداکثر مجموع فاکتورها را نمایش میدهد.
- پرسوجوی اصلی به دادههای ردیفهای آن هیچگونه وابستگی به زیرپرسوجو ندارد.
2. پرسوجوهای وابسته (Correlated Subqueries)
پرسوجوهای وابسته به پرسوجوهایی گفته میشود که برای هر ردیف از پرسوجوی اصلی، یک بار اجرا میشوند. در این نوع پرسوجو، زیرپرسوجو به ستونهای موجود در پرسوجوی اصلی وابسته است و برای هر ردیف پرسوجوی اصلی یک نتیجه متفاوت میدهد.
ویژگیها:
- اجرای چند بار: زیرپرسوجوی وابسته برای هر ردیف از پرسوجوی اصلی به طور جداگانه اجرا میشود.
- وابستگی به دادههای اصلی: زیرپرسوجو از ستونهای پرسوجوی اصلی برای تعیین نتایج خود استفاده میکند.
- نتایج متغیر: نتایج زیرپرسوجوی وابسته برای هر ردیف پرسوجوی اصلی ممکن است متفاوت باشد.
مثال:
فرض کنید یک جدول کاربران و یک جدول سفارشات دارید و میخواهید کاربرانی را که بیشترین تعداد سفارشات را نسبت به دیگران ثبت کردهاند، پیدا کنید. این پرسوجو میتواند به صورت زیر باشد:
FROM کاربران AS u
WHERE EXISTS (
SELECT 1
FROM سفارشات AS o
WHERE o.کاربر_id = u.id
GROUP BY o.کاربر_id
HAVING COUNT(o.سفارش_id) > 5
);
در اینجا:
- زیرپرسوجو برای هر ردیف از کاربران اجرا میشود.
- در این پرسوجو، هر کاربر_id از جدول سفارشات با id موجود در جدول کاربران مقایسه میشود.
- برای هر کاربر، تعداد سفارشات آن کاربر در جدول سفارشات بررسی میشود و اگر کاربر بیش از 5 سفارش داشته باشد، آن کاربر در نتایج نمایش داده میشود.
تفاوتهای کلیدی بین پرسوجوهای وابسته و غیر وابسته:
ویژگی | پرسوجوی غیر وابسته (Non-Correlated) | پرسوجوی وابسته (Correlated) |
---|---|---|
ارتباط با پرسوجوی اصلی | مستقل از پرسوجوی اصلی | وابسته به دادههای پرسوجوی اصلی |
تعداد اجرا | یک بار اجرا میشود برای کل پرسوجو | برای هر ردیف پرسوجوی اصلی اجرا میشود |
نتایج | نتایج ثابت برای همه ردیفها | نتایج ممکن است برای هر ردیف متفاوت باشد |
کاربرد معمول | مقایسه یک مقدار ثابت با نتایج پرسوجو | انجام محاسبات وابسته به هر ردیف پرسوجو |
عملکرد | معمولاً سریعتر به دلیل اجرای یک بار | ممکن است کندتر باشد زیرا برای هر ردیف اجرا میشود |
نتیجهگیری:
- پرسوجوهای غیر وابسته زمانی مفید هستند که بخواهید یک مقدار ثابت را برای تمام ردیفها مقایسه کنید.
- پرسوجوهای وابسته زمانی کاربرد دارند که نتایج پرسوجو برای هر ردیف باید به طور جداگانه محاسبه شود و به دادههای هر ردیف پرسوجوی اصلی وابسته باشد.
درک تفاوتهای این دو نوع پرسوجو به شما این امکان را میدهد که عملیات پیچیدهتری را در پایگاه داده خود انجام دهید و از قدرت SQL در پردازش دادهها بهرهبرداری کنید.
