<aside> 📊 Aggregate functions compute a single value from multiple rows. They summarize data.
</aside>
-- 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 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;
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>