Subquery হল একটি SQL কুয়েরি যা অন্য কুয়েরির মধ্যে ব্যবহৃত হয়। এটি সাধারণত একটি Inner Query বা Subselect হিসেবে পরিচিত। Subquery দুটি ধরনের হতে পারে: Nested Query (নেস্টেড কুয়েরি) এবং Correlated Subquery (কোরিলেটেড সাবকুয়েরি)। উভয় ধরনের Subquery একে অপরের সাথে সম্পর্কিত হলেও, তাদের কার্যপদ্ধতি এবং ব্যবহারের ক্ষেত্রে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে।
1. Nested Query (নেস্টেড কুয়েরি)
Nested Query বা Independent Subquery একটি কুয়েরি যা বাইরের কুয়েরির সাথে স্বাধীনভাবে কাজ করে। অর্থাৎ, নেস্টেড কুয়েরি তার বাইরের কুয়েরির জন্য আউটপুট হিসেবে একটি মান (Scalar Value), সারি (Row), বা তালিকা (List of Values) প্রদান করে। নেস্টেড কুয়েরি শুধুমাত্র একবারই সম্পাদিত হয় এবং বাইরের কুয়েরির মানের উপর নির্ভরশীল নয়।
Nested Query এর সিনট্যাক্স:
SELECT column1, column2, ...
FROM table1
WHERE column3 = (SELECT column3 FROM table2 WHERE condition);
উদাহরণ:
ধরা যাক, আমাদের দুটি টেবিল রয়েছে:
- employees: কর্মচারীদের তথ্য
id,name,salary,department_id
- departments: বিভাগের তথ্য
department_id,department_name
আমরা এমন একটি কুয়েরি তৈরি করতে চাই যেখানে কর্মচারীরা তাদের বিভাগের উপর ভিত্তি করে নির্বাচিত হবে। ধরা যাক, আমরা এমন কর্মচারীদের চাই যারা "Sales" বিভাগে কাজ করছে।
SELECT name, salary
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = 'Sales'
);
এখানে, Nested Query ব্যবহার করা হয়েছে যা প্রথমে departments টেবিল থেকে department_id নিয়ে আসে এবং পরে সেটি employees টেবিলে ব্যবহার করা হয়। এই ধরনের কুয়েরি বাইরের কুয়েরির ফলাফলের ওপর নির্ভরশীল নয়, একে Independent Subquery বলা হয়।
2. Correlated Subquery (কোরিলেটেড সাবকুয়েরি)
Correlated Subquery হলো একটি কুয়েরি যা বাইরের কুয়েরির রেকর্ডের সাথে সম্পর্কিত হয়। এর মানে হলো, কোরিলেটেড সাবকুয়েরি বাইরের কুয়েরির প্রতিটি রেকর্ডের জন্য আলাদা আলাদা ফলাফল প্রদান করে এবং এটি বাইরের কুয়েরির রেকর্ডগুলির উপর ভিত্তি করে কাজ করে। এটি একাধিক বার সম্পাদিত হয়, প্রতিবার বাইরের কুয়েরির মান পরিবর্তিত হয়।
Correlated Subquery এর সিনট্যাক্স:
SELECT column1, column2, ...
FROM table1 t1
WHERE column1 = (
SELECT column2
FROM table2 t2
WHERE t1.column1 = t2.column1
);
উদাহরণ:
ধরা যাক, আমাদের একই দুটি টেবিল রয়েছে: employees এবং departments। তবে এবার আমরা এমন কর্মচারীদের চাই যারা তাদের বিভাগে সর্বোচ্চ বেতন পায়।
SELECT name, salary, department_id
FROM employees e1
WHERE salary = (
SELECT MAX(salary)
FROM employees e2
WHERE e1.department_id = e2.department_id
);
এখানে, Correlated Subquery ব্যবহৃত হয়েছে। প্রতিটি employees টেবিলের রেকর্ডের জন্য একটি সাবকুয়েরি চালানো হয়, যা তাদের বিভাগের মধ্যে সর্বোচ্চ বেতন নির্ধারণ করে। এই সাবকুয়েরি বাইরের কুয়েরির মান (যেমন: department_id) এর সাথে সম্পর্কিত। প্রতিটি কর্মচারীর জন্য কুয়েরি আলাদা ফলাফল প্রদান করে, যার মানে এটি বাইরের কুয়েরির প্রতিটি রেকর্ডের উপর নির্ভরশীল।
Nested Query এবং Correlated Subquery এর মধ্যে পার্থক্য:
| বৈশিষ্ট্য | Nested Query | Correlated Subquery |
|---|---|---|
| স্বাধীনতা | বাইরের কুয়েরির সাথে স্বাধীন | বাইরের কুয়েরির সাথে সম্পর্কিত |
| ফলাফলের সংখ্যা | একবারে একটি মান বা রেকর্ড প্রদান করে | প্রতিটি বাইরের কুয়েরি রেকর্ডের জন্য আলাদা ফলাফল প্রদান করে |
| কার্যপ্রণালী | সাবকুয়েরি একবারে সম্পাদিত হয় | সাবকুয়েরি বাইরের কুয়েরির জন্য প্রতিবার সম্পাদিত হয় |
| কর্মপ্রবাহ | বাইরের কুয়েরি একবারে সাবকুয়েরির ফলাফল ব্যবহার করে | বাইরের কুয়েরি সাবকুয়েরির মানের উপর ভিত্তি করে পরিবর্তন হয় |
| পারফরম্যান্স | ভালো (কারণ সাবকুয়েরি একবারই চলে) | কম কার্যকরী (কারণ সাবকুয়েরি বারবার চালাতে হয়) |
উপসংহার:
- Nested Query সহজ এবং স্বাধীনভাবে কাজ করে, যখন Correlated Subquery বাইরের কুয়েরির প্রতিটি রেকর্ডের জন্য আলাদা ফলাফল তৈরি করতে ব্যবহৃত হয় এবং এটি পারফরম্যান্সের দিক থেকে তুলনামূলকভাবে কম কার্যকরী হতে পারে।
- তবে, কোরিলেটেড সাবকুয়েরি আরও জটিল এবং শক্তিশালী কুয়েরি লেখা সম্ভব করে দেয় যেখানে বাইরের কুয়েরির সাথে গহীন সম্পর্ক স্থাপন করা প্রয়োজন।
Read more