Nested Queries বা Subqueries হল এমন SQL কোয়েরি যা অন্য SQL কোয়েরির ভিতরে বসানো হয়। Java MySQL-এ যখন আপনাকে একাধিক সম্পর্কিত তথ্য একত্রিত করতে হয়, তখন Subqueries খুবই কার্যকরী হতে পারে। Subqueries মূলত একটি প্রধান (outer) কোয়েরির মধ্যে ভিতরে (inner) কোয়েরি হিসাবে থাকে এবং এটি একাধিক পর্যায়ে ডেটা সংগ্রহে সহায়তা করে।
এই গাইডে, Nested Queries এবং Subqueries এর ব্যবহারের উদাহরণ দেওয়া হয়েছে এবং Java MySQL এর সাথে তাদের ব্যবহারের পদ্ধতি আলোচনা করা হয়েছে।
1. Nested Query বা Subquery কী?
Nested Query বা Subquery হল এমন একটি কোয়েরি যা অন্য একটি কোয়েরির ভিতরে অবস্থান করে। এটি সাধারণত SELECT, INSERT, UPDATE, বা DELETE স্টেটমেন্টে ব্যবহৃত হতে পারে।
Subquery দুটি ধরণের হতে পারে:
- Single-row subquery: একটিমাত্র ফলাফল ফেরত দেয়।
- Multi-row subquery: একাধিক ফলাফল ফেরত দেয়।
Subquery দুটি ভাগে বিভক্ত:
- Scalar Subquery: এটি একটি একক মান ফেরত দেয়।
- IN, EXISTS Subquery: এটি একাধিক মান বা শর্ত ফেরত দেয়, যা মূল কোয়েরির জন্য শর্ত হিসাবে ব্যবহৃত হয়।
2. Nested Queries এর উদাহরণ
2.1 Single-row Subquery (Scalar Subquery)
একটি scalar subquery কেবল একটিমাত্র মান ফেরত দেয় এবং এই মানটি মূল কোয়েরিতে ব্যবহার করা হয়।
import java.sql.*;
public class NestedQueryExample {
public static void main(String[] args) {
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// MySQL ডেটাবেসে সংযোগ
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Nested Subquery দিয়ে SQL কোয়েরি তৈরি
String sql = "SELECT name FROM users WHERE age = (SELECT MAX(age) FROM users)";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// ফলাফল প্রিন্ট করা
while (rs.next()) {
System.out.println("Name: " + rs.getString("name"));
}
// রিসোর্স বন্ধ করা
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
(SELECT MAX(age) FROM users): এটি একটি scalar subquery যাusersটেবিল থেকে সর্বোচ্চ বয়স বের করে।WHERE age = (subquery): মূল কোয়েরি এই সর্বোচ্চ বয়সের সাথে মেলানো ইউজারের নাম ফেরত দেয়।
2.2 Multi-row Subquery
একটি multi-row subquery একাধিক ফলাফল ফেরত দেয় এবং IN বা EXISTS কন্ডিশন ব্যবহার করে মূল কোয়েরি পরিচালিত হয়।
import java.sql.*;
public class MultiRowSubqueryExample {
public static void main(String[] args) {
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// MySQL ডেটাবেসে সংযোগ
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Multi-row Subquery দিয়ে SQL কোয়েরি তৈরি
String sql = "SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100)";
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
// ফলাফল প্রিন্ট করা
while (rs.next()) {
System.out.println("Name: " + rs.getString("name"));
}
// রিসোর্স বন্ধ করা
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
SELECT user_id FROM orders WHERE amount > 100: এটি একটি multi-row subquery যাordersটেবিল থেকেamount > 100শর্তে ইউজারের আইডি ফেরত দেয়।WHERE id IN (subquery): মূল কোয়েরি এই আইডিগুলির সাথে মেলানো ইউজারের নাম ফিরিয়ে দেয়।
3. Subquery এর বিভিন্ন ধরনের ব্যবহার
3.1 Subquery in WHERE Clause
Subquery মূল কোয়েরির WHERE ক্লজে ব্যবহার হয়, যেখানে এর ফলাফল মূল কোয়েরির শর্ত হিসাবে কাজ করে।
SELECT name FROM users WHERE id IN (SELECT user_id FROM orders WHERE amount > 100);
এটি orders টেবিল থেকে amount > 100 শর্তের ভিত্তিতে ইউজারদের নাম ফিরিয়ে আনে।
3.2 Subquery in FROM Clause
Subquery FROM ক্লজে ব্যবহৃত হলে, এটি একটি টেম্পোরারি টেবিলের মত কাজ করে। এটি সাধারণত জটিল ডেটাবেস অপারেশন বা একাধিক টেবিলের ডেটা একত্রিত করার জন্য ব্যবহৃত হয়।
SELECT AVG(order_amount)
FROM (SELECT amount AS order_amount FROM orders WHERE user_id = 1) AS subquery;
এখানে, সাবকোয়েরি প্রথমে ইউজারের অর্ডারের পরিমাণ সংগ্রহ করে এবং প্রধান কোয়েরি তার গড় বের করে।
3.3 Subquery with EXISTS
EXISTS একটি কন্ডিশন যা চেক করে সাবকোয়েরি কোন ফলাফল ফেরত দেয় কিনা। এটি মূলত TRUE/FALSE ফলাফল দেয়।
SELECT name
FROM users
WHERE EXISTS (SELECT 1 FROM orders WHERE users.id = orders.user_id);
এখানে, সাবকোয়েরি চেক করে users টেবিলের যেই ইউজারের জন্য কোনো অর্ডার রয়েছে, তাদের নাম মূল কোয়েরি থেকে ফেরত আসে।
4. Nested Query / Subquery এর পারফরম্যান্স এবং ব্যবহার
- পারফরম্যান্স: Subqueries বিশেষত একাধিক রেকর্ড বা জটিল সম্পর্কযুক্ত ডেটা ফেরত দেওয়ার জন্য উপকারী। তবে, সঠিকভাবে ইনডেক্সিং না থাকলে পারফরম্যান্সে প্রভাব ফেলতে পারে।
- ব্যবহার: Subqueries যখন ব্যবহার করা হয়, তখন সেগুলি সহজে একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে পারে এবং এক্সটেনসিভ ডেটা অ্যানালাইসিসে সহায়তা করে। তবে, জটিল সিস্টেমে খুব বেশি nested query ব্যবহার করা হলে পারফরম্যান্স সমস্যা হতে পারে।
সারাংশ
Nested Queries বা Subqueries হল SQL কোয়েরি যা অন্য কোয়েরির ভিতরে থাকে এবং এটি একাধিক শর্ত বা সম্পর্কিত ডেটা একত্রিত করতে সাহায্য করে। Scalar subqueries একক মান ফেরত দেয়, এবং Multi-row subqueries একাধিক ফলাফল ফেরত দেয়। Java MySQL-এ PreparedStatement বা Statement ব্যবহার করে এধরনের কোয়েরি সহজে এক্সিকিউট করা যায়। Subqueries ডেটা এক্সট্রাকশন এবং সম্পর্কিত ডেটা ম্যানিপুলেশনকে সহজ করে তোলে, তবে সাবধানতার সাথে ব্যবহৃত না হলে পারফরম্যান্স সমস্যা সৃষ্টি করতে পারে।
Read more