SELECT

SELECT [DISTINCT] <columns>
FROM <collection>
[WHERE <predicate>]
[GROUP BY <fields>] [HAVING <predicate>]
[ORDER BY <field> [ASC|DESC], ...]
[LIMIT <n>] [OFFSET <m>]

Filtering

SELECT * FROM users WHERE age > 30 AND status = 'active';
SELECT * FROM users WHERE name LIKE 'Ali%';
SELECT * FROM users WHERE email ILIKE '%@EXAMPLE.COM';
SELECT * FROM orders WHERE total BETWEEN 10 AND 100;
SELECT * FROM users WHERE role IN ('admin', 'editor');
SELECT * FROM users WHERE deleted_at IS NULL;

Aggregates

SELECT status, COUNT(*), AVG(age), MIN(salary), MAX(salary)
FROM employees WHERE department = 'sales'
GROUP BY status HAVING COUNT(*) > 5;

SELECT COUNT(DISTINCT user_id) FROM orders;

Window Functions

SELECT id,
    ROW_NUMBER() OVER (ORDER BY created_at) AS rn,
    RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS rank,
    LAG(salary, 1) OVER (ORDER BY created_at) AS prev_salary,
    SUM(amount) OVER (ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS running_total
FROM employees;

CTEs & Subqueries

WITH active AS (SELECT id FROM users WHERE status = 'active')
SELECT * FROM orders WHERE user_id IN (SELECT id FROM active);

-- Recursive CTE
WITH RECURSIVE subordinates AS (
    SELECT id, name, manager_id FROM employees WHERE id = 'emp_root'
    UNION ALL
    SELECT e.id, e.name, e.manager_id FROM employees e JOIN subordinates s ON e.manager_id = s.id
)
SELECT * FROM subordinates;

Set Operations

SELECT id FROM collection_a UNION ALL SELECT id FROM collection_b;
SELECT id FROM collection_a INTERSECT SELECT id FROM collection_b;
SELECT id FROM collection_a EXCEPT SELECT id FROM collection_b;

Computed Columns

SELECT price * qty AS total,
       UPPER(name) AS name_upper,
       CASE WHEN price > 100 THEN 'expensive' ELSE 'cheap' END AS tier
FROM orders;