Sorting and Pagination
ORDER BY and LIMIT clauses are used to sort query results and limit the number of rows returned. This chapter introduces how to use these clauses.
ORDER BY Sorting
Basic Syntax
sql
SELECT column1, column2
FROM table_name
ORDER BY column1 [ASC|DESC];Ascending Order (Default)
sql
-- Sort by age ascending
SELECT name, age
FROM users
ORDER BY age;
-- Or explicitly specify ASC
SELECT name, age
FROM users
ORDER BY age ASC;Descending Order
sql
-- Sort by age descending
SELECT name, age
FROM users
ORDER BY age DESC;Multi-Column Sorting
sql
-- Sort by city first, then by age
SELECT name, city, age
FROM users
ORDER BY city ASC, age DESC;Sort by Expression
sql
-- Sort by calculated result
SELECT name, price, quantity, price * quantity AS total
FROM order_items
ORDER BY price * quantity DESC;
-- Sort by string length
SELECT name
FROM users
ORDER BY LENGTH(name);NULL Value Sorting
sql
-- NULL values default to last (ASC) or first (DESC)
SELECT name, email
FROM users
ORDER BY email;
-- Force NULL values first
SELECT name, email
FROM users
ORDER BY email IS NULL DESC, email;LIMIT Results
Basic Syntax
sql
SELECT column1, column2
FROM table_name
LIMIT number;Limit Rows
sql
-- Return only first 5 records
SELECT name, age
FROM users
LIMIT 5;OFFSET Skip Rows
sql
-- Skip first 10, return next 5
SELECT name, age
FROM users
LIMIT 5 OFFSET 10;
-- MySQL shorthand
SELECT name, age
FROM users
LIMIT 10, 5; -- LIMIT offset, countPagination
Calculate Pagination Parameters
sql
-- Page 1 (10 per page)
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 0;
-- Page 2
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 10;
-- Page 3
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 20;Pagination Formula
OFFSET = (page_number - 1) * page_size
LIMIT = page_sizeTOP N Queries
Query Top N Records
sql
-- Query 5 oldest users
SELECT name, age
FROM users
ORDER BY age DESC
LIMIT 5;
-- Query top 10 best-selling products
SELECT name, sales_count
FROM products
ORDER BY sales_count DESC
LIMIT 10;Practical Examples
Product List Pagination
sql
-- Product list, sorted by sales, page 2
SELECT
id,
name,
price,
sales_count
FROM products
WHERE is_active = TRUE
ORDER BY sales_count DESC, id ASC
LIMIT 20 OFFSET 20;Latest Orders
sql
-- Get latest 10 orders
SELECT
order_number,
user_id,
total_amount,
created_at
FROM orders
ORDER BY created_at DESC
LIMIT 10;Leaderboard
sql
-- Top 20 users by spending
SELECT
u.username,
SUM(o.total_amount) AS total_spent,
COUNT(o.id) AS order_count
FROM users u
JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username
ORDER BY total_spent DESC
LIMIT 20;Performance Optimization
1. Create Indexes for Sort Columns
sql
-- Create index for commonly sorted columns
CREATE INDEX idx_age ON users(age);
CREATE INDEX idx_created_at ON orders(created_at);2. Avoid Deep Pagination
sql
-- Not recommended: Deep pagination performs poorly
SELECT * FROM users
ORDER BY id
LIMIT 20 OFFSET 100000;
-- Recommended: Use WHERE condition
SELECT * FROM users
WHERE id > 100000
ORDER BY id
LIMIT 20;Different Database Syntax
MySQL
sql
SELECT * FROM users
ORDER BY id
LIMIT 10 OFFSET 20;SQL Server
sql
-- SQL Server 2012+
SELECT * FROM users
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;Oracle
sql
-- Oracle 12c+
SELECT * FROM users
ORDER BY id
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY;Best Practices
- Always use ORDER BY with pagination
- Create indexes for sort columns
- Avoid deep pagination
- Use stable sort columns (like primary key)
- Consider cursor-based pagination instead of OFFSET
Summary
- ORDER BY: Sort results
- ASC/DESC: Ascending/descending
- LIMIT: Limit number of rows
- OFFSET: Skip specified rows
- Pagination: LIMIT + OFFSET for pagination
- Performance: Create indexes, avoid deep pagination
Next Step: Learn GROUP BY