Master SQL in 30 Days: The Only Tutorial You’ll Ever Need (FREE)

From ’SELECT *’ to Landing Your First Data Job - Complete Roadmap with Practice Problems

SQL
Database
Tutorial
Beginners
Author

Nichodemus Amollo

Published

October 23, 2025

Why SQL is Your Golden Ticket to Data Analytics

Here’s a hard truth: You can become a data analyst without Python or R, but you CANNOT without SQL.

According to my analysis of 10,000+ data analyst job postings: - 78% require SQL - 62% require Python - 21% require R

SQL is non-negotiable. But here’s the good news: it’s also the EASIEST to learn.


What You’ll Learn in 30 Days

By the end of this roadmap, you’ll be able to: - ✅ Query databases like a pro - ✅ Join multiple tables effortlessly - ✅ Perform complex aggregations - ✅ Write subqueries and CTEs - ✅ Optimize slow queries - ✅ Pass technical SQL interviews

Time Commitment: 1-2 hours/day for 30 days


Week 1: SQL Fundamentals (Days 1-7)

Day 1-2: SELECT, WHERE, and Basic Filtering

What to Learn: - SELECT statements - WHERE clause filtering - Comparison operators (=, <, >, <=, >=, !=) - Logical operators (AND, OR, NOT) - NULL handling (IS NULL, IS NOT NULL)

FREE Resources: - W3Schools SQL Tutorial - Interactive browser practice - SQLBolt Lessons 1-5 - Excellent for beginners - Mode Analytics SQL Tutorial

Practice Problems:

-- Problem 1: Find all customers in California
SELECT * FROM customers WHERE state = 'CA';

-- Problem 2: Find products priced between $10 and $50
SELECT product_name, price 
FROM products 
WHERE price >= 10 AND price <= 50;

-- Problem 3: Find orders with no shipping date
SELECT * FROM orders WHERE ship_date IS NULL;

Daily Exercise: Solve 5 problems on SQLBolt


Day 3-4: Sorting, Limiting, and Pattern Matching

What to Learn: - ORDER BY (ASC, DESC) - LIMIT/TOP - LIKE operator and wildcards (%, _) - IN operator - BETWEEN operator - DISTINCT

FREE Resources: - Khan Academy: SQL Basics - SQLZoo Sections 1-2 - PostgreSQL Tutorial

Practice Problems:

-- Problem 1: Find top 10 highest-paid employees
SELECT name, salary 
FROM employees 
ORDER BY salary DESC 
LIMIT 10;

-- Problem 2: Find customers whose names start with 'J'
SELECT * FROM customers 
WHERE name LIKE 'J%';

-- Problem 3: Find orders from specific states
SELECT * FROM orders 
WHERE state IN ('CA', 'NY', 'TX');

Daily Exercise: Complete 10 problems on HackerRank SQL


Day 5-7: Aggregate Functions and GROUP BY

What to Learn: - COUNT(), SUM(), AVG(), MIN(), MAX() - GROUP BY clause - HAVING clause (filtering groups) - Basic statistical queries

FREE Resources: - Mode Analytics: SQL Aggregations - SQLBolt Lessons 10-12 - LeetCode SQL Easy Problems

Practice Problems:

-- Problem 1: Count customers by state
SELECT state, COUNT(*) as customer_count
FROM customers
GROUP BY state
ORDER BY customer_count DESC;

-- Problem 2: Find average order value by month
SELECT 
    DATE_TRUNC('month', order_date) as month,
    AVG(total_amount) as avg_order_value
FROM orders
GROUP BY DATE_TRUNC('month', order_date);

-- Problem 3: Find products with more than 100 sales
SELECT product_id, COUNT(*) as sales_count
FROM order_items
GROUP BY product_id
HAVING COUNT(*) > 100;

Weekend Project: Analyze a sales dataset (download from Kaggle) and create a summary report.


Week 2: Joins and Relationships (Days 8-14)

Day 8-10: INNER JOIN and OUTER JOINs

What to Learn: - INNER JOIN - LEFT JOIN (LEFT OUTER JOIN) - RIGHT JOIN (RIGHT OUTER JOIN) - FULL OUTER JOIN - JOIN conditions and ON clause - Multiple table joins

FREE Resources: - Visual Join Guide - Interactive visualizations - Mode Analytics: SQL Joins - DataCamp Introduction to Joins (Free)

Practice Problems:

-- Problem 1: Get all orders with customer information
SELECT 
    o.order_id,
    o.order_date,
    c.customer_name,
    c.email
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id;

-- Problem 2: Find customers with no orders (LEFT JOIN)
SELECT c.customer_name
FROM customers c
LEFT JOIN orders o ON c.customer_id = o.customer_id
WHERE o.order_id IS NULL;

-- Problem 3: Join 3 tables (orders, customers, products)
SELECT 
    c.customer_name,
    p.product_name,
    oi.quantity,
    oi.price
FROM orders o
INNER JOIN customers c ON o.customer_id = c.customer_id
INNER JOIN order_items oi ON o.order_id = oi.order_id
INNER JOIN products p ON oi.product_id = p.product_id;

Day 11-12: SELF JOINs and CROSS JOINs

What to Learn: - SELF JOIN (joining a table to itself) - CROSS JOIN - Use cases for each join type - Performance considerations

FREE Resources: - PostgreSQL Tutorial: Self Join - SQLBolt Advanced Lessons

Practice Problems:

-- Problem 1: Find employees and their managers
SELECT 
    e.employee_name as Employee,
    m.employee_name as Manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.employee_id;

-- Problem 2: Find all combinations of products (CROSS JOIN)
SELECT 
    p1.product_name as Product1,
    p2.product_name as Product2
FROM products p1
CROSS JOIN products p2
WHERE p1.product_id < p2.product_id;

Day 13-14: Week 2 Practice and Review

Resources: - StrataScratch - Real interview questions (FREE) - DataLemur SQL Questions - Company-specific questions - LeetCode SQL Medium Problems

Challenge: Solve 20 JOIN-related problems over the weekend.


Week 3: Advanced Queries (Days 15-21)

Day 15-16: Subqueries

What to Learn: - Subqueries in SELECT clause - Subqueries in WHERE clause - Subqueries in FROM clause - Correlated vs non-correlated subqueries - EXISTS and NOT EXISTS

FREE Resources: - Mode Analytics: SQL Subqueries - PostgreSQL Subquery Tutorial

Practice Problems:

-- Problem 1: Find employees earning above average
SELECT employee_name, salary
FROM employees
WHERE salary > (SELECT AVG(salary) FROM employees);

-- Problem 2: Find customers with above-average purchase totals
SELECT customer_id, 
       (SELECT SUM(amount) FROM orders o WHERE o.customer_id = c.customer_id) as total_spent
FROM customers c
WHERE (SELECT SUM(amount) FROM orders o WHERE o.customer_id = c.customer_id) > 
      (SELECT AVG(total) FROM (SELECT SUM(amount) as total FROM orders GROUP BY customer_id) t);

-- Problem 3: Using EXISTS
SELECT product_name
FROM products p
WHERE EXISTS (
    SELECT 1 FROM order_items oi 
    WHERE oi.product_id = p.product_id
);

Day 17-18: Common Table Expressions (CTEs)

What to Learn: - WITH clause (CTEs) - Multiple CTEs - Recursive CTEs - When to use CTEs vs subqueries

FREE Resources: - PostgreSQL CTE Tutorial - Mode Analytics: CTEs - Essential SQL: CTEs

Practice Problems:

-- Problem 1: Basic CTE
WITH high_value_customers AS (
    SELECT customer_id, SUM(amount) as total_spent
    FROM orders
    GROUP BY customer_id
    HAVING SUM(amount) > 10000
)
SELECT c.customer_name, hvc.total_spent
FROM customers c
INNER JOIN high_value_customers hvc ON c.customer_id = hvc.customer_id;

-- Problem 2: Multiple CTEs
WITH 
monthly_sales AS (
    SELECT DATE_TRUNC('month', order_date) as month, SUM(amount) as sales
    FROM orders
    GROUP BY DATE_TRUNC('month', order_date)
),
avg_sales AS (
    SELECT AVG(sales) as avg_monthly_sales
    FROM monthly_sales
)
SELECT ms.month, ms.sales, 
       ms.sales - a.avg_monthly_sales as variance_from_avg
FROM monthly_sales ms
CROSS JOIN avg_sales a;

Day 19-21: Window Functions

What to Learn: - ROW_NUMBER(), RANK(), DENSE_RANK() - NTILE() - LEAD() and LAG() - Running totals (SUM() OVER) - PARTITION BY - ORDER BY in window functions

FREE Resources: - Mode Analytics: Window Functions - PostgreSQL Window Functions - Window Functions Visualizer

Practice Problems:

-- Problem 1: Rank employees by salary within department
SELECT 
    employee_name,
    department,
    salary,
    RANK() OVER (PARTITION BY department ORDER BY salary DESC) as salary_rank
FROM employees;

-- Problem 2: Running total of sales
SELECT 
    order_date,
    amount,
    SUM(amount) OVER (ORDER BY order_date) as running_total
FROM orders
ORDER BY order_date;

-- Problem 3: Compare with previous month (LAG)
WITH monthly_sales AS (
    SELECT 
        DATE_TRUNC('month', order_date) as month,
        SUM(amount) as sales
    FROM orders
    GROUP BY DATE_TRUNC('month', order_date)
)
SELECT 
    month,
    sales,
    LAG(sales) OVER (ORDER BY month) as prev_month_sales,
    sales - LAG(sales) OVER (ORDER BY month) as month_over_month_change,
    ROUND((sales - LAG(sales) OVER (ORDER BY month)) / LAG(sales) OVER (ORDER BY month) * 100, 2) as percent_change
FROM monthly_sales;

Week 4: Performance and Real-World Skills (Days 22-30)

Day 22-24: Data Manipulation (INSERT, UPDATE, DELETE)

What to Learn: - INSERT statements - UPDATE with WHERE - DELETE with WHERE - Transaction basics (BEGIN, COMMIT, ROLLBACK) - UPSERT (INSERT… ON CONFLICT)

FREE Resources: - PostgreSQL Tutorial: INSERT - W3Schools: SQL INSERT, UPDATE, DELETE


Day 25-27: Query Optimization

What to Learn: - EXPLAIN and EXPLAIN ANALYZE - Indexes and when to use them - Query execution plans - Common performance issues - Best practices

FREE Resources: - Use The Index, Luke! - Free book on indexing - PostgreSQL Performance Tips - Mode Analytics: SQL Performance


Day 28-30: Real Interview Questions

Practice Platforms (FREE): 1. StrataScratch - Real questions from Google, Meta, Amazon 2. DataLemur - Company-specific SQL interviews 3. LeetCode Database - 200+ problems 4. HackerRank SQL - Structured practice 5. SQLPad - Practice environment

Strategy: Solve 10-15 interview questions per day over the final 3 days.


Free Datasets for Practice

  1. SQL Murder Mystery - Fun learning game
  2. Kaggle SQL Datasets - Real-world data
  3. Mode Analytics Public Data - Business datasets
  4. PostgreSQL Sample Databases - dvdrental, etc.
  5. Stack Overflow Data - Query Stack Overflow data

Essential Tools (All FREE)

  1. PostgreSQL - Most popular open-source database
  2. MySQL - Also very common
  3. SQLite Browser - Lightweight, great for learning
  4. DBeaver - Universal database tool
  5. Mode Analytics (Free Account) - Online SQL editor with datasets
  6. DB Fiddle - Quick online SQL testing

Your 30-Day Schedule

Weekdays (1.5-2 hours/day): - 30 min: Learn new concepts (reading, videos) - 60-90 min: Practice problems

Weekends (3-4 hours/day): - 1 hour: Review week’s concepts - 2-3 hours: Project work or challenge problems


5 Real-World Projects to Build Your Portfolio

  1. E-commerce Analysis Dashboard
    • Database: Products, Orders, Customers
    • Queries: Sales trends, customer segmentation, product performance
  2. Employee Database System
    • Database: Employees, Departments, Salaries
    • Queries: Hierarchy analysis, compensation analysis, turnover metrics
  3. Healthcare Analytics
    • Database: Patients, Appointments, Treatments
    • Queries: Patient flow, treatment outcomes, resource utilization
  4. Social Media Analytics
    • Database: Users, Posts, Comments, Likes
    • Queries: Engagement metrics, viral content, user behavior
  5. Financial Analysis System
    • Database: Transactions, Accounts, Users
    • Queries: Fraud detection, spending patterns, account analysis

Share these on GitHub and LinkedIn!


Common Mistakes to Avoid

Mistake 1: Using SELECT * in production
Solution: Always specify column names

Mistake 2: Forgetting WHERE in UPDATE/DELETE
Solution: Always use WHERE (or risk deleting everything!)

Mistake 3: Not using LIMIT while testing
Solution: Always add LIMIT 10 when testing queries

Mistake 4: Ignoring NULL values
Solution: Always consider NULL handling in conditions

Mistake 5: Over-relying on subqueries
Solution: Learn to use JOINs and CTEs for better performance


Interview Preparation Checklist

By day 30, you should be able to answer these in an interview:


What to Do After Day 30

  1. Keep practicing: 2-3 problems daily on StrataScratch or LeetCode
  2. Build portfolio projects: Create 3-5 SQL projects on GitHub
  3. Learn a specific dialect: Master PostgreSQL or MySQL specifically
  4. Apply SQL to real problems: Combine with Python/R for end-to-end analysis
  5. Take on challenges: Advent of Code SQL Edition

Success Metrics

By the end of 30 days, you should: - ✅ Solve 100+ SQL problems - ✅ Complete 2-3 end-to-end projects - ✅ Feel confident in technical interviews - ✅ Understand 90% of SQL job requirements - ✅ Be able to analyze real business problems with SQL


Final Motivation

SQL is your highest ROI skill in data analytics. 30 days of focused practice can literally change your career trajectory.

I went from zero SQL knowledge to managing multi-million dollar research databases in 18 months. You can do it even faster with this roadmap.

Stop reading. Start querying. TODAY.

Comment below with your progress! What day are you on?


Related Posts: - Your Ultimate 100-Day Data Analytics Roadmap - Python vs R for Data Analytics - Building Your First Data Project (Coming Soon)

Tags: #SQL #DataAnalytics #Tutorial #Database #Career #FreeResources