<aside> 📊 Aggregate functions compute a single value from multiple rows. They summarize data.

</aside>


Basic Aggregate Functions

-- Total number of customers
SELECT COUNT(*) AS total_customers FROM customers;

-- Total sales
SELECT SUM(sales) AS total_sales FROM orders;

-- Average sales
SELECT AVG(sales) AS avg_sales FROM orders;

-- Highest score
SELECT MAX(score) AS max_score FROM customers;

-- Lowest score
SELECT MIN(score) AS min_score FROM customers;

GROUP BY — Aggregate Per Group

GROUP BY groups rows that have the same values, then applies aggregate functions to each group.

-- Summary per customer
SELECT
    customer_id,
    COUNT(*)     AS total_orders,
    SUM(sales)   AS total_sales,
    AVG(sales)   AS avg_sales,
    MAX(sales)   AS highest_sale,
    MIN(sales)   AS lowest_sale
FROM orders
GROUP BY customer_id;

HAVING — Filter Groups

Use HAVING to filter groups (like WHERE but for aggregate results).

-- Customers with total sales > 100
SELECT
    customer_id,
    SUM(sales) AS total_sales
FROM orders
GROUP BY customer_id
HAVING SUM(sales) > 100;

<aside> 💡 WHERE filters rows before grouping. HAVING filters groups after aggregation.

</aside>


SQL Execution Order