زبان SQL برای مدیریت دادهها در سیستمهای مدیریت پایگاه داده رابطهای (RDBMS) استفاده میشود. یکی از قابلیتهای مهم SQL، امکان نوشتن یک کوئری داخل کوئری دیگر است که به آن Subquery یا Nested Query گفته میشود. در این حالت، یک دستور SELECT داخل پرانتز قرار میگیرد و درون یک دستور اصلی مانند SELECT، INSERT یا DELETE استفاده میشود.
در این آموزش یاد میگیرید چطور از کوئریهای تو در تو در دستورات SELECT، INSERT و DELETE استفاده کنید. همچنین با توابع تجمیعی (Aggregate Functions) در Subquery آشنا میشوید و نحوه مقایسه دادهها با استفاده از شرطهای WHERE و LIKE را یاد خواهید گرفت.
پیشنیازها
برای انجام این آموزش، به یک سیستم دارای پایگاه داده رابطهای که از SQL پشتیبانی کند نیاز دارید. مثالهای این راهنما بر اساس محیط زیر تست شدهاند:
-
نصب و ایمنسازی 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;| نوع عبارت | کاربرد Nested Query |
|---|---|
| SELECT | فیلتر کردن نتایج بر اساس خروجی یک کوئری دیگر |
| INSERT | درج داده در یک جدول بر اساس نتیجهی کوئری روی جدول دیگر |
| DELETE | حذف رکوردهایی که در نتیجهی یک زیرکوئری مشخص میشوند |
جمعبندی
کوئریهای تو در تو در SQL بسیار قدرتمند هستند چون:
-
امکان انجام چند مرحله پردازش داده در یک کوئری را میدهند
-
نیاز به اجرای چند کوئری جداگانه را کاهش میدهند
-
در دستورات
SELECT،INSERTوDELETEکاربرد دارند -
برای تحلیلهای پیشرفته و فیلتر کردن دقیق دادهها بسیار مفیدند
یادگیری Subquery یکی از مهارتهای کلیدی برای کار حرفهای با SQL و پایگاه داده است.
