Subqueries এবং Nested Queries উভয়ই SQL কুয়েরির এমন একটি অংশ যা একটি মূল কুয়েরি (Main Query) এর মধ্যে অন্তর্ভুক্ত থাকে এবং অন্যান্য কুয়েরি বা ডেটাবেস অপারেশনের সাথে সংযুক্ত থাকে। সাধারণভাবে, এগুলো ডেটাবেসের মধ্যে আরও জটিল বা অভ্যন্তরীণ লজিক অ্যাপ্লাই করতে ব্যবহৃত হয়। PostgreSQL এ, সেগুলি বিভিন্নভাবে ব্যবহার করা যায় এবং তাদের কার্যকারিতা নির্ভর করে কুয়েরির কাঠামো এবং সমস্যার ধরণ অনুযায়ী।
1. Subqueries (সাবকুয়েরি)
Subquery হল এমন একটি কুয়েরি যা অন্য কুয়েরির মধ্যে ব্যবহৃত হয়। এটি প্রধানত SELECT, INSERT, UPDATE, অথবা DELETE কুয়েরির অংশ হিসেবে ব্যবহার করা যায়। একটি সাবকুয়েরি সাধারণত একটি নির্দিষ্ট ফলাফল তৈরি করে যা মূল কুয়েরি দ্বারা ব্যবহার করা হয়। এটি Scalar subquery, Column subquery, Row subquery, এবং Table subquery হিসেবে থাকতে পারে।
Types of Subqueries:
- Scalar Subquery:
- এটি একটি একক মান (একটি সেল) রিটার্ন করে।
উদাহরণ:
SELECT name FROM employees WHERE salary = (SELECT MAX(salary) FROM employees);এখানে সাবকুয়েরিটি সর্বোচ্চ বেতন নির্বাচন করে, এবং প্রধান কুয়েরি সেই বেতন অনুযায়ী কর্মচারী নির্বাচন করে।
- Column Subquery:
- এটি একটি কলাম (একাধিক মান) রিটার্ন করে।
উদাহরণ:
SELECT name, salary FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'New York');এখানে সাবকুয়েরিটি নির্দিষ্ট স্থানে (New York) কর্মরত সকল ডিপার্টমেন্টের আইডি রিটার্ন করে, এবং মূল কুয়েরি সেই ডিপার্টমেন্টের কর্মচারীদের তালিকা তৈরি করে।
- Row Subquery:
- এটি একাধিক কলাম এবং একাধিক রেকর্ড রিটার্ন করে।
উদাহরণ:
SELECT name, department_id, salary FROM employees WHERE (department_id, salary) IN (SELECT department_id, MAX(salary) FROM employees GROUP BY department_id);এখানে সাবকুয়েরিটি প্রতিটি বিভাগের সর্বোচ্চ বেতন রিটার্ন করে এবং মূল কুয়েরি সেই বেতন অনুযায়ী কর্মচারীদের নির্বাচন করে।
- Table Subquery:
- এটি একাধিক কলাম এবং একাধিক রেকর্ডের একটি টেবিল রিটার্ন করে।
উদাহরণ:
SELECT name, department_id FROM employees WHERE (department_id, salary) IN (SELECT department_id, salary FROM employees WHERE salary > 50000);এখানে সাবকুয়েরি যেসব কর্মচারীর বেতন ৫০,০০০ এর বেশি, তাদের ডিপার্টমেন্ট আইডি এবং বেতন রিটার্ন করে।
Subquery Usage in WHERE, FROM, and SELECT Clauses:
WHERE clause: সাবকুয়েরি সাধারণত
WHEREশর্তের মধ্যে ব্যবহার হয়।SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);FROM clause: সাবকুয়েরি একটি টেবিলের মতো
FROMক্লজেও ব্যবহার করা যেতে পারে।SELECT department_id, MAX(salary) FROM (SELECT department_id, salary FROM employees) AS temp GROUP BY department_id;SELECT clause: সাবকুয়েরি মূল কুয়েরির কলাম হিসাবে ব্যবহার করা যেতে পারে।
SELECT name, (SELECT MAX(salary) FROM employees WHERE department_id = e.department_id) AS max_salary FROM employees e;
2. Nested Queries (নেস্টেড কুয়েরি)
Nested Query হল এমন একটি কুয়েরি যেখানে একটি কুয়েরি অন্য কুয়েরির ভিতরে থাকে। নেস্টেড কুয়েরি এবং সাবকুয়েরি প্রায় একই ধারণা, তবে নেস্টেড কুয়েরি সাধারণত অনেক গভীর স্তরে থাকতে পারে (যেমন একের মধ্যে আরেকটি কুয়েরি)।
Types of Nested Queries:
- Single-Level Nested Query:
- এখানে একটি কুয়েরি অন্য কুয়েরির মধ্যে অন্তর্ভুক্ত থাকে।
উদাহরণ:
SELECT name FROM employees WHERE department_id IN (SELECT department_id FROM departments WHERE location = 'Boston');
- Multi-Level Nested Query:
- এটি একটি কুয়েরি যে একাধিক স্তরে থাকে।
উদাহরণ:
SELECT name FROM employees WHERE department_id IN ( SELECT department_id FROM departments WHERE location IN ( SELECT location FROM cities WHERE city_name = 'Boston' ) );
Performance Considerations for Nested Queries:
- Nested Queries বা Subqueries সাধারণত পারফরম্যান্সে প্রভাব ফেলতে পারে, বিশেষত যদি এগুলি বড় ডেটাসেটে ব্যবহৃত হয়। এটি কুয়েরি অপটিমাইজেশন দ্বারা সমাধান করা যেতে পারে যেমন
EXPLAIN ANALYZEব্যবহার করা।
3. Correlated vs Uncorrelated Subqueries
- Uncorrelated Subquery:
- এটি একটি স্বাধীন সাবকুয়েরি, যা মূল কুয়েরির কোনো রেকর্ডের সাথে সম্পর্কিত নয়। একে একবারই এক্সিকিউট করা যায় এবং পরে মূল কুয়েরিতে ব্যবহার করা যায়।
উদাহরণ:
SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees);
- Correlated Subquery:
- এটি মূল কুয়েরির প্রতিটি রেকর্ডের সাথে সম্পর্কিত। এই ধরনের সাবকুয়েরি মূল কুয়েরির প্রতিটি রেকর্ডের জন্য আলাদাভাবে এক্সিকিউট হয়।
উদাহরণ:
SELECT name FROM employees e WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
4. Advantages and Disadvantages
Advantages of Subqueries and Nested Queries:
- Readability: সাবকুয়েরি এবং নেস্টেড কুয়েরি ব্যবহার করলে কুয়েরি গঠন পরিষ্কার হতে পারে, বিশেষ করে জটিল শর্ত বা একাধিক লজিক একত্রিত করার ক্ষেত্রে।
- Modularity: আপনি একটি বড় কুয়েরিকে ছোট ছোট অংশে ভাগ করে সাবকুয়েরির মাধ্যমে সহজে ব্যাখ্যা করতে পারেন।
- Reusability: একাধিক কুয়েরি অংশের জন্য সাবকুয়েরি ব্যবহার করা যেতে পারে।
Disadvantages of Subqueries and Nested Queries:
- Performance: সাবকুয়েরি বা নেস্টেড কুয়েরি যখন বৃহৎ ডেটাবেসে ব্যবহৃত হয়, তখন এটি কুয়েরির পারফরম্যান্সে নেতিবাচক প্রভাব ফেলতে পারে। বিশেষ করে যদি সাবকুয়েরি বারবার এক্সিকিউট হয়।
- Complexity: নেস্টেড কুয়েরি অত্যধিক জটিল হয়ে উঠতে পারে, বিশেষত যখন অনেক স্তরে থাকে।
Conclusion
Subqueries এবং Nested Queries PostgreSQL এ জটিল কুয়েরি লেখার জন্য ব্যবহৃত হয়। সাবকুয়েরি একে অপরের মধ্যে ডেটা প্রক্রিয়া করতে সক্ষম করে এবং বিভিন্ন ধরণের ডেটা সম্পর্ক অনুসন্ধানে সহায়তা করে। তবে, এগুলির ব্যবহার করলে পারফরম্যান্স এবং কুয়েরি অপটিমাইজেশন বিষয়ে সতর্কতা অবলম্বন করা উচিত।
Read more