زبان SQL برای مدیریت دادهها در سیستمهای مدیریت پایگاه داده رابطهای (RDBMS) استفاده میشود. یکی از قابلیتهای مهم SQL، امکان نوشتن یک کوئری داخل کوئری دیگر است که به آن Subquery یا Nested Query گفته میشود. در این حالت، یک دستور SELECT داخل پرانتز قرار میگیرد و درون یک دستور اصلی مانند SELECT، INSERT یا DELETE استفاده میشود.
در این آموزش یاد میگیرید چطور از کوئریهای تو در تو در دستورات SELECT، INSERT و DELETE استفاده کنید. همچنین با توابع تجمیعی (Aggregate Functions) در Subquery آشنا میشوید و نحوه مقایسه دادهها با استفاده از شرطهای WHERE و LIKE را یاد خواهید گرفت.
پیشنیازها
برای انجام این آموزش، به یک سیستم دارای پایگاه داده رابطهای که از SQL پشتیبانی کند نیاز دارید. مثالهای این راهنما بر اساس محیط زیر تست شدهاند:
-
سرور Ubuntu 20.04
-
نصب و ایمنسازی MySQL
-
داشتن کاربر غیر روت برای MySQL
توجه: هرچند بیشتر سیستمهای پایگاه داده از SQL استفاده میکنند، اما ممکن است تفاوتهای جزئی در سینتکس یا خروجی وجود داشته باشد.
اتصال به MySQL و ساخت دیتابیس نمونه
ابتدا وارد MySQL شوید:
ساخت دیتابیس:
ساخت جدول نمونه
در این آموزش از جدولی به نام guests استفاده میکنیم که اطلاعات بازدیدکنندگان یک باغوحش را نگه میدارد.
سپس دادههای نمونه وارد میکنیم (چند رکورد نمونه کافی است).
استفاده از Nested Query در SELECT
فرض کنید میخواهید مهمانانی را پیدا کنید که تعداد بازدیدشان از میانگین بازدیدها بیشتر است.
این کوئری اشتباه است:
خطا به این دلیل است که توابع تجمیعی مثل AVG() نمیتوانند مستقیماً در شرط WHERE استفاده شوند.
روش درست با Subquery
در اینجا ابتدا Subquery اجرا شده و میانگین تعداد بازدیدها محاسبه میشود، سپس کوئری اصلی رکوردهای بزرگتر از آن مقدار را نمایش میدهد.
استفاده از Nested Query در INSERT
میخواهیم اطلاعات برخی مهمانان را به جدول جدیدی منتقل کنیم و برای آنها تخفیف اعمال کنیم.
ساخت جدول جدید
درج داده با Subquery
در اینجا:
-
Subquery دادهها را از جدول
guestsمیگیرد -
قیمت عضویت در 0.85 ضرب شده (۱۵٪ تخفیف)
-
فقط اعضایی که نوع عضویت آنها شامل "Resident" است انتخاب میشوند
استفاده از Nested Query در DELETE
حالا میخواهیم کاربرانی را حذف کنیم که تعداد بازدیدشان از میانگین بیشتر است.
این دستور فقط از جدول upgrade_guests حذف میکند و به جدول اصلی کاری ندارد.
برای مشاهده نتیجه:
جمعبندی
کوئریهای تو در تو در SQL بسیار قدرتمند هستند چون:
-
امکان انجام چند مرحله پردازش داده در یک کوئری را میدهند
-
نیاز به اجرای چند کوئری جداگانه را کاهش میدهند
-
در دستورات
SELECT،INSERTوDELETEکاربرد دارند -
برای تحلیلهای پیشرفته و فیلتر کردن دقیق دادهها بسیار مفیدند
یادگیری Subquery یکی از مهارتهای کلیدی برای کار حرفهای با SQL و پایگاه داده است.

