SQL Fundamentals
Structured Query Language (SQL) is the standard language for communicating with Relational Databases.
1. Core DML Statements
Data Manipulation Language (DML) is used to interact with the data stored within tables.
SELECT (Read)
SELECT id, email, created_at
FROM users
WHERE status = 'active'
ORDER BY created_at DESC
LIMIT 10;
INSERT (Create)
INSERT INTO users (username, email, password_hash)
VALUES ('alice123', 'alice@example.com', 'hashed_pw')
RETURNING id;
UPDATE (Update)
Always ensure you have a WHERE clause to avoid updating the entire table!
UPDATE users
SET status = 'suspended', updated_at = NOW()
WHERE id = 451;
DELETE (Delete)
Like UPDATE, always use a WHERE clause.
DELETE FROM sessions
WHERE expires_at < NOW();
2. Joins: Combining Data
Relational databases store data across multiple normalized tables. Joins allow you to retrieve related data in a single query.
[!TIP] ELI5: Visualizing JOINs with Venn Diagrams Think of two tables as overlapping circles.
- INNER JOIN: Only the overlapping middle part (Users who have placed Orders).
- LEFT JOIN: The entire left circle, plus the overlap (ALL Users, and their orders if they have any; otherwise, the order details are blank/NULL).
INNER JOIN
Returns records that have matching values in both tables.
SELECT orders.id, users.email, orders.total
FROM orders
INNER JOIN users ON orders.user_id = users.id;
LEFT JOIN
Returns all records from the left table (users), and the matched records from the right table (orders). If there is no match, the result is NULL from the right side.
SELECT users.username, orders.id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
3. Aggregation and Grouping
When analyzing data, you often need to calculate summaries (count, sum, average) across groups of records.
GROUP BY
Groups rows that have the same values into summary rows.
SELECT department, COUNT(id) as total_employees
FROM employees
GROUP BY department;
HAVING
The HAVING clause was added to SQL because the WHERE keyword cannot be used with aggregate functions. It filters the grouped results.
SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department
HAVING AVG(salary) > 80000;
4. Advanced: CTEs and Window Functions
Common Table Expressions (CTEs)
A CTE creates a temporary result set that you can reference within another statement. It drastically improves the readability of complex, nested queries.
WITH ActiveHighValueUsers AS (
SELECT id, username FROM users WHERE lifetime_value > 1000
)
SELECT u.username, COUNT(o.id) as order_count
FROM ActiveHighValueUsers u
JOIN orders o ON u.id = o.user_id
GROUP BY u.username;
Window Functions
Window functions perform calculations across a set of related rows without collapsing them into a single row like GROUP BY does.
-- Rank employees by salary within their department
SELECT
name,
department,
salary,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) as rank
FROM employees;