رفتن به محتوای اصلی
دیدگاه کلود | ارائه‌کننده سرورهای ابری و اختصاصی
آموزش استفاده از کوئری‌های تو در تو (Nested Queries) در SQL

آموزش استفاده از کوئری‌های تو در تو (Nested Queries) در SQL

زبان SQL برای مدیریت داده‌ها در سیستم‌های مدیریت پایگاه داده رابطه‌ای (RDBMS) استفاده می‌شود. یکی از قابلیت‌های مهم SQL، امکان نوشتن یک کوئری داخل کوئری دیگر است که به آن Subquery یا Nested Query گفته می‌شود. در این حالت، یک دستور SELECT داخل پرانتز قرار می‌گیرد و درون یک دستور اصلی مانند SELECT، INSERT یا DELETE استفاده می‌شود.

زبان 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 شوید:

 
mysql -u username -p

ساخت دیتابیس:

 
CREATE DATABASE zooDB; USE zooDB;

ساخت جدول نمونه

در این آموزش از جدولی به نام guests استفاده می‌کنیم که اطلاعات بازدیدکنندگان یک باغ‌وحش را نگه می‌دارد.

 
CREATE TABLE guests ( guest_id int, first_name varchar(30), last_name varchar(30), guest_type varchar(15), membership_type varchar(30), membership_cost decimal(5,2), total_visits int, PRIMARY KEY (guest_id) );

سپس داده‌های نمونه وارد می‌کنیم (چند رکورد نمونه کافی است).


استفاده از Nested Query در SELECT

فرض کنید می‌خواهید مهمانانی را پیدا کنید که تعداد بازدیدشان از میانگین بازدیدها بیشتر است.

این کوئری اشتباه است:

 
SELECT first_name, last_name, total_visits FROM guests WHERE total_visits > AVG(total_visits);

خطا به این دلیل است که توابع تجمیعی مثل AVG() نمی‌توانند مستقیماً در شرط WHERE استفاده شوند.

روش درست با Subquery

 
SELECT first_name, last_name, total_visits FROM guests WHERE total_visits > (SELECT AVG(total_visits) FROM guests);

در اینجا ابتدا Subquery اجرا شده و میانگین تعداد بازدیدها محاسبه می‌شود، سپس کوئری اصلی رکوردهای بزرگ‌تر از آن مقدار را نمایش می‌دهد.


استفاده از Nested Query در INSERT

می‌خواهیم اطلاعات برخی مهمانان را به جدول جدیدی منتقل کنیم و برای آن‌ها تخفیف اعمال کنیم.

ساخت جدول جدید

 
CREATE TABLE upgrade_guests ( guest_id int, first_name varchar(30), last_name varchar(30), membership_type varchar(30), membership_cost decimal(5,2), total_visits int, PRIMARY KEY (guest_id) );

درج داده با Subquery

 
INSERT INTO upgrade_guests SELECT guest_id, first_name, last_name, membership_type, (membership_cost * 0.85), total_visits FROM guests WHERE membership_type LIKE '%Resident%';

در اینجا:

  • Subquery داده‌ها را از جدول guests می‌گیرد

  • قیمت عضویت در 0.85 ضرب شده (۱۵٪ تخفیف)

  • فقط اعضایی که نوع عضویت آن‌ها شامل "Resident" است انتخاب می‌شوند


استفاده از Nested Query در DELETE

حالا می‌خواهیم کاربرانی را حذف کنیم که تعداد بازدیدشان از میانگین بیشتر است.

 
DELETE FROM upgrade_guests WHERE total_visits > (SELECT AVG(total_visits) FROM guests);

این دستور فقط از جدول upgrade_guests حذف می‌کند و به جدول اصلی کاری ندارد.

برای مشاهده نتیجه:

 
SELECT * FROM upgrade_guests ORDER BY total_visits;

جمع‌بندی

کوئری‌های تو در تو در SQL بسیار قدرتمند هستند چون:

  • امکان انجام چند مرحله پردازش داده در یک کوئری را می‌دهند

  • نیاز به اجرای چند کوئری جداگانه را کاهش می‌دهند

  • در دستورات SELECT، INSERT و DELETE کاربرد دارند

  • برای تحلیل‌های پیشرفته و فیلتر کردن دقیق داده‌ها بسیار مفیدند

یادگیری Subquery یکی از مهارت‌های کلیدی برای کار حرفه‌ای با SQL و پایگاه داده است.