Advanced Queries

Learn advanced SQL techniques including aggregate functions, grouping, and subqueries.

Aggregate Functions

-- Count rows
SELECT COUNT(*) FROM users;
SELECT COUNT(DISTINCT age) FROM users;

-- Calculate average
SELECT AVG(age) FROM users;

-- Find min/max
SELECT MIN(age), MAX(age) FROM users;

-- Sum values
SELECT SUM(age) FROM users;

GROUP BY

-- Count users by age
SELECT age, COUNT(*) FROM users GROUP BY age;

-- Average age by name pattern
SELECT 
    CASE 
        WHEN name LIKE 'J%' THEN 'Starts with J'
        ELSE 'Other'
    END as name_group,
    AVG(age) as average_age
FROM users 
GROUP BY name_group;

HAVING (Filter Groups)

-- Find ages with more than one user
SELECT age, COUNT(*) 
FROM users 
GROUP BY age 
HAVING COUNT(*) > 1;

Subqueries

Subquery in WHERE

-- Find employees earning more than average
SELECT * FROM employees 
WHERE salary > (SELECT AVG(salary) FROM employees);

Subquery in FROM

-- Find departments with above-average salaries
SELECT department_name, avg_salary
FROM (
    SELECT 
        d.name as department_name,
        AVG(e.salary) as avg_salary
    FROM employees e
    JOIN departments d ON e.department_id = d.id
    GROUP BY d.name
) as dept_salaries
WHERE avg_salary > 70000;

Common SQL Patterns

Pagination

-- Page 1 (records 1-10)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 0;

-- Page 2 (records 11-20)
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 10;

Search Functionality

-- Basic text search
SELECT * FROM users 
WHERE name LIKE '%john%' OR email LIKE '%john%';

Date Operations

-- Recent records
SELECT * FROM users 
WHERE created_at >= DATE('now', '-7 days');

-- Age calculation
SELECT name, age, 
    DATE('now') - DATE(birthdate) as days_alive
FROM users;

Next Steps

Ready to work with multiple tables? Learn about Joins and Relationships to combine data from different tables.

Last updated on