Advanced SQL: Joins, Subqueries, Aggregates, and Window Functions in JDBC
Advanced SQL: Joins, Subqueries, Aggregates, and Window Functions in JDBC
Introduction
जब हम database operations को Java में perform करते हैं, तो JDBC (Java Database Connectivity) हमें SQL commands के साथ powerful integration देता है। लेकिन जब बात आती है advanced SQL concepts जैसे Joins, Subqueries, Aggregates और Window Functions की, तो इनकी understanding बहुत जरूरी हो जाती है, खासकर अगर आप college exams या interviews की तैयारी कर रहे हैं।
इस blog में हम step-by-step तरीके से जानेंगे कि ये SQL features क्या हैं, इन्हें JDBC में कैसे use किया जाता है और क्यों ये real-world database applications के लिए important हैं।
SQL Joins in JDBC
Join एक ऐसी SQL technique है जो दो या उससे ज्यादा tables के data को combine करती है। जब हमें related data अलग-अलग tables से चाहिए होता है, तो हम joins का use करते हैं।
Types of Joins
- INNER JOIN – केवल वही records लौटाता है जिनका match दोनों tables में होता है।
- LEFT JOIN – left table के सारे records और matched right table records देता है।
- RIGHT JOIN – right table के सारे records और matched left table records देता है।
- FULL JOIN – दोनों tables के सारे records देता है, चाहे match हो या न हो।
Example: INNER JOIN in JDBC
String query = "SELECT students.name, courses.course_name " +
"FROM students INNER JOIN courses " +
"ON students.course_id = courses.id";
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
System.out.println(rs.getString("name") + " - " + rs.getString("course_name"));
}
ऊपर दिए गए example में हमने students और courses table को INNER JOIN के जरिए जोड़ा है ताकि हमें हर student का course name मिल सके।
Why Joins are Important
- Data normalization में help करते हैं।
- Redundancy को कम करते हैं।
- Complex queries को efficient बनाते हैं।
Subqueries in JDBC
Subquery का मतलब होता है "query के अंदर query"। ये एक nested SQL query होती है जो किसी दूसरी query के अंदर execute होती है।
Types of Subqueries
- Single-row Subquery – एक ही value return करती है।
- Multi-row Subquery – एक से ज्यादा values return करती है।
- Correlated Subquery – outer query पर depend करती है।
Example: Subquery in JDBC
String query = "SELECT name FROM students " +
"WHERE course_id = (SELECT id FROM courses WHERE course_name = 'Java Programming')";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
System.out.println(rs.getString("name"));
}
इस example में subquery पहले course_id निकालती है, फिर outer query उसी id के students को fetch करती है।
Benefits of Subqueries
- Complex queries को simple parts में divide किया जा सकता है।
- Temporary tables की जरूरत नहीं होती।
- Dynamic filtering possible होता है।
Aggregate Functions in SQL
Aggregate Functions वो functions हैं जो rows के set पर calculations करते हैं और एक single result return करते हैं। ये functions analytical reports, summaries और data insights के लिए बहुत useful हैं।
Common Aggregate Functions
| Function | Use |
|---|---|
| COUNT() | Rows की गिनती करता है |
| SUM() | Numeric column का total निकालता है |
| AVG() | Average निकालता है |
| MAX() | Maximum value देता है |
| MIN() | Minimum value देता है |
Example: Aggregate Function in JDBC
String query = "SELECT COUNT(*) AS total_students, AVG(marks) AS avg_marks FROM students";
ResultSet rs = stmt.executeQuery(query);
if (rs.next()) {
System.out.println("Total Students: " + rs.getInt("total_students"));
System.out.println("Average Marks: " + rs.getDouble("avg_marks"));
}
ऊपर query से हमें students की total count और average marks एक ही result set में मिल जाता है।
Group By और Having Clause
जब हमें aggregate results को किसी specific group में categorize करना होता है, तब हम GROUP BY clause use करते हैं। और जब हमें aggregated results पर condition लगानी हो, तब HAVING clause काम आता है।
String query = "SELECT course_id, AVG(marks) AS avg_marks " +
"FROM students GROUP BY course_id HAVING AVG(marks) > 70";
ये query उन courses को दिखाएगी जिनका average marks 70 से ज्यादा है।
Window Functions in SQL
Window Functions advanced SQL feature हैं जो aggregate functions जैसे behave करते हैं लेकिन result set की हर row पर calculation करते हैं। ये ranking, cumulative totals और moving averages के लिए बहुत useful होते हैं।
Common Window Functions
- ROW_NUMBER() – हर row को unique number देता है।
- RANK() – समान values को same rank देता है और next rank skip करता है।
- DENSE_RANK() – समान values को same rank देता है लेकिन rank skip नहीं करता।
- SUM() OVER() – cumulative sum निकालता है।
Example: ROW_NUMBER() in JDBC
String query = "SELECT name, marks, " +
"ROW_NUMBER() OVER (ORDER BY marks DESC) AS rank " +
"FROM students";
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
System.out.println(rs.getInt("rank") + " - " + rs.getString("name") + " - " + rs.getInt("marks"));
}
इस example में हर student को उसके marks के आधार पर एक rank assign की गई है।
Example: SUM() OVER()
String query = "SELECT name, marks, " +
"SUM(marks) OVER (ORDER BY marks DESC) AS cumulative_total " +
"FROM students";
इस query में हमें हर row तक का total marks मिल जाता है, जो progress tracking के लिए बहुत useful होता है।
Integration of Advanced SQL with JDBC
JDBC के जरिए हम आसानी से advanced SQL queries को execute कर सकते हैं। इसके लिए हमें बस connection establish करना होता है, statement बनानी होती है, और result को process करना होता है।
Steps to Execute Advanced SQL Queries
- Step 1: Database driver load करें।
- Step 2: Connection establish करें।
- Step 3: Statement या PreparedStatement create करें।
- Step 4: Query execute करें।
- Step 5: ResultSet process करें।
- Step 6: Connection close करें।
Example: Full Integration
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/college", "root", "password");
String query = "SELECT course_id, COUNT(*) AS total, AVG(marks) AS avg_marks " +
"FROM students GROUP BY course_id HAVING AVG(marks) > 75";
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
System.out.println("Course ID: " + rs.getInt("course_id"));
System.out.println("Total Students: " + rs.getInt("total"));
System.out.println("Average Marks: " + rs.getDouble("avg_marks"));
}
con.close();
} catch (Exception e) {
e.printStackTrace();
}
ऊपर के code में JDBC का पूरा workflow दिखाया गया है जो किसी भी advanced SQL query को execute कर सकता है।
Important Notes for Exams
- Join queries हमेशा logically related columns पर करें।
- Subqueries performance को impact कर सकती हैं, इसलिए optimize करें।
- Aggregate functions हमेशा GROUP BY clause के साथ समझें।
- Window functions केवल advanced SQL databases (जैसे MySQL 8+, PostgreSQL, SQL Server) में available हैं।
- JDBC में ResultSet को हमेशा close करें ताकि memory leak न हो।
Summary Key Points
| Topic | Use | Example |
|---|---|---|
| Joins | Multiple tables से data combine करना | INNER JOIN, LEFT JOIN |
| Subqueries | Nested queries के जरिए data filter करना | WHERE (SELECT ...) |
| Aggregate | Summaries generate करना | COUNT(), AVG(), MAX() |
| Window Functions | Row-wise calculations | ROW_NUMBER(), RANK() |
| JDBC Integration | Java और SQL का bridge | DriverManager, Statement |