Common Table Expressions (CTE)
CTEs create temporary named result sets for use in queries.| Database | Output |
|---|---|
| PostgreSQL | WITH active_users AS (SELECT * FROM users WHERE active = true) |
| MySQL | WITH active_users AS (SELECT * FROM users WHERE active = true) |
Use Cases
CTEs are useful for:- Breaking complex queries into readable parts
- Reusing the same subquery multiple times
- Recursive queries
Subqueries
Filter using results from another query.| Database | Output |
|---|---|
| PostgreSQL | SELECT * FROM ... WHERE id IN (SELECT id FROM users WHERE active = true) |
Example: Users with Orders
EXISTS
Check if a subquery returns any results.| Database | Output |
|---|---|
| PostgreSQL | SELECT EXISTS(SELECT 1 FROM users WHERE email = '[email protected]') |
| MongoDB | db.users.countDocuments({ email: '[email protected]' }, { limit: 1 }) |
Set Operations
Combine results from multiple queries.UNION
Combine results, removing duplicates.| Database | Output |
|---|---|
| PostgreSQL | (SELECT * FROM users WHERE age > 50) UNION (SELECT * FROM users WHERE role = 'premium') |
UNION ALL
Combine results, keeping duplicates.INTERSECT
Return only rows that appear in both queries.| Database | Output |
|---|---|
| PostgreSQL | (SELECT * FROM users WHERE age > 30) INTERSECT (SELECT * FROM users WHERE active = true) |
EXCEPT
Return rows from first query that don’t appear in second.| Database | Output |
|---|---|
| PostgreSQL | (SELECT * FROM users WHERE active = true) EXCEPT (SELECT * FROM users WHERE role = 'banned') |
CASE Expressions
Conditional logic within queries. CASE must be used within GET expressions.| Database | Output |
|---|---|
| PostgreSQL | SELECT *, CASE WHEN age > 25 THEN 'adult' ELSE 'minor' END AS category FROM users |
Multiple Conditions
CASE in WHERE
Database Support
| Feature | PostgreSQL | MySQL | MongoDB |
|---|---|---|---|
| CTE | Yes | Yes (8.0+) | No |
| SUBQUERY | Yes | Yes | Via aggregation |
| EXISTS | Yes | Yes | Via count |
| UNION | Yes | Yes | Via $unionWith |
| UNION ALL | Yes | Yes | Via $unionWith |
| INTERSECT | Yes | Yes (8.0+) | Via aggregation |
| EXCEPT | Yes | Yes (8.0+) | Via aggregation |
| CASE | Yes | Yes | Via $cond |

