@@ -96,8 +96,103 @@ var rows = db.ExecuteQuery("SELECT * FROM users WHERE age > 25");
9696- ** DDL** : CREATE TABLE, DROP TABLE, CREATE INDEX, DROP INDEX
9797- ** DML** : INSERT, SELECT, UPDATE, DELETE, INSERT BATCH
9898- ** Queries** : WHERE, ORDER BY, LIMIT, OFFSET, BETWEEN
99- - ** Aggregates** : COUNT, SUM, AVG, MIN, MAX, GROUP BY
100- - ** Advanced** : JOINs, subqueries, complex expressions
99+ - ** Aggregates** : COUNT, SUM, AVG, MIN, MAX, GROUP BY, HAVING
100+ - ** JOINs** : ✅ ** INNER, LEFT, RIGHT, FULL OUTER, CROSS** (Q1 2026 - ** Complete** )
101+ - ** Subqueries** : ✅ ** WHERE, FROM, SELECT, IN, EXISTS, Correlated** (Q1 2026 - ** Complete** )
102+ - ** Advanced** : Complex expressions, multi-table queries, query optimization
103+
104+ ---
105+
106+ ## ✅ ** Recently Completed Features (Q1 2026)**
107+
108+ ### 🔗 ** Full JOIN Support** - PRODUCTION READY
109+
110+ All JOIN types are fully implemented with hash join optimization:
111+
112+ ``` csharp
113+ // INNER JOIN - Only matched rows
114+ var results = db .ExecuteQuery (@"
115+ SELECT u.name, o.amount
116+ FROM users u
117+ INNER JOIN orders o ON u.id = o.user_id
118+ WHERE o.amount > 100
119+ " );
120+
121+ // LEFT OUTER JOIN - All left rows + matched right (NULL for unmatched)
122+ var results = db .ExecuteQuery (@"
123+ SELECT u.name, o.amount
124+ FROM users u
125+ LEFT JOIN orders o ON u.id = o.user_id
126+ " );
127+
128+ // FULL OUTER JOIN - All rows from both sides
129+ var results = db .ExecuteQuery (@"
130+ SELECT u.name, o.amount
131+ FROM users u
132+ FULL OUTER JOIN orders o ON u.id = o.user_id
133+ " );
134+
135+ // Multi-table JOINs
136+ var results = db .ExecuteQuery (@"
137+ SELECT c.name, r.name as region, SUM(o.amount) as total
138+ FROM customers c
139+ LEFT JOIN regions r ON c.region_id = r.id
140+ LEFT JOIN orders o ON o.customer_id = c.id
141+ GROUP BY c.name, r.name
142+ " );
143+ ```
144+
145+ ** Performance** : Hash join (O(n+m)) for large datasets, nested loop for small datasets
146+ ** Implementation** : ` JoinExecutor.cs ` with automatic algorithm selection
147+
148+ ---
149+
150+ ### 📊 ** Full Subquery Support** - PRODUCTION READY
151+
152+ All subquery types with automatic caching:
153+
154+ ``` csharp
155+ // Scalar subquery in SELECT (cached for performance)
156+ var results = db .ExecuteQuery (@"
157+ SELECT name,
158+ salary,
159+ (SELECT AVG(salary) FROM employees) as avg_salary,
160+ salary - (SELECT AVG(salary) FROM employees) as diff
161+ FROM employees
162+ " );
163+
164+ // Derived table in FROM
165+ var results = db .ExecuteQuery (@"
166+ SELECT dept_id, avg_salary
167+ FROM (
168+ SELECT department_id as dept_id,
169+ AVG(salary) as avg_salary
170+ FROM employees
171+ GROUP BY department_id
172+ ) dept_avg
173+ WHERE avg_salary > 50000
174+ " );
175+
176+ // IN with subquery
177+ var results = db .ExecuteQuery (@"
178+ SELECT * FROM orders
179+ WHERE customer_id IN (
180+ SELECT id FROM customers WHERE country = 'USA'
181+ )
182+ " );
183+
184+ // Correlated EXISTS
185+ var results = db .ExecuteQuery (@"
186+ SELECT * FROM orders o
187+ WHERE EXISTS (
188+ SELECT 1 FROM customers c
189+ WHERE c.id = o.customer_id AND c.active = 1
190+ )
191+ " );
192+ ```
193+
194+ ** Performance** : Non-correlated subqueries cached (O(1) after first execution)
195+ ** Implementation** : ` SubqueryExecutor.cs ` with streaming execution and caching
101196
102197---
103198
@@ -221,6 +316,9 @@ var rows = db.ExecuteQuery("SELECT * FROM users WHERE age > 25");
221316| ** Pure .NET** | ✅ | ❌ (P/Invoke) | ✅ |
222317| ** Hash Indexes** | ✅ ** O(1)** | ✅ | ✅ |
223318| ** B-tree Indexes** | ✅ ** O(log n)** | ✅ | ✅ |
319+ | ** JOINs (All Types)** | ✅ ** Full (INNER/LEFT/RIGHT/FULL/CROSS)** | ✅ | ✅ |
320+ | ** Subqueries (All Types)** | ✅ ** Full (WHERE/FROM/SELECT/IN/EXISTS)** | ✅ | ✅ |
321+ | ** Correlated Subqueries** | ✅ ** Full with caching** | ✅ | ✅ |
224322| ** AVX-512/AVX2** | ✅ | ❌ | ❌ |
225323| ** NativeAOT Ready** | ✅ | ❌ | ⚠️ Limited |
226324| ** Async/Await** | ✅ ** Full** | ⚠️ Limited | ⚠️ Limited |
0 commit comments