Skip to content

SQL Queries

Basic Queries

-- Select all columns
SELECT * FROM users

-- Select specific columns
SELECT name, email, age FROM users

-- Filter with WHERE
SELECT * FROM users WHERE age > 30

-- Sort results
SELECT * FROM users ORDER BY age DESC

-- Limit results
SELECT * FROM users LIMIT 10

Common Table Expressions (CTEs)

-- Simple CTE
WITH high_earners AS (
    SELECT name, salary FROM users WHERE salary > 80000
)
SELECT * FROM high_earners ORDER BY salary DESC

-- Multiple CTEs
WITH
    dept_avg AS (
        SELECT department, AVG(salary) as avg_sal 
        FROM users GROUP BY department
    ),
    high_depts AS (
        SELECT * FROM dept_avg WHERE avg_sal > 70000
    )
SELECT * FROM high_depts

Window Functions

-- Row number
SELECT name, salary,
       ROW_NUMBER() OVER (ORDER BY salary DESC) as rank
FROM users

-- Partition by
SELECT department, name, salary,
       RANK() OVER (PARTITION BY department ORDER BY salary DESC) as dept_rank
FROM users

-- Running totals
SELECT name, salary,
       SUM(salary) OVER (ORDER BY name) as running_total
FROM users

Subqueries

-- Scalar subquery
SELECT name, salary
FROM users
WHERE salary > (SELECT AVG(salary) FROM users)

-- EXISTS subquery
SELECT u.name
FROM users u
WHERE EXISTS (
    SELECT 1 FROM orders o WHERE o.user_id = u.id
)

Joins

-- Inner join
SELECT users.name, orders.amount
FROM users
JOIN orders ON users.id = orders.user_id

-- Left join with aggregation
SELECT
    users.name,
    COUNT(orders.id) AS order_count,
    SUM(orders.amount) AS total_spent
FROM users
LEFT JOIN orders ON users.id = orders.user_id
GROUP BY users.name

Set Operations

-- Union
SELECT name FROM users WHERE department = 'Engineering'
UNION
SELECT name FROM users WHERE department = 'Marketing'

-- Intersect
SELECT user_id FROM orders WHERE status = 'completed'
INTERSECT
SELECT user_id FROM orders WHERE status = 'shipped'