Brightlane's internal customer directory displays 10 accounts per page, sorted alphabetically by customer name. The front-end is rendering page 2.
Write a query to return the ID, name, and email for the 10 customers on that page.
Assumptions:
- The
customerstable contains every customer Brightlane has on file. - Page 1 is rows 1–10, page 2 is rows 11–20, page 3 is rows 21–30, and so on.
- To land on page 2, skip the first 10 rows with
OFFSET 10, then take the next 10 withLIMIT 10.
Output:
- One row per customer on page 2, with columns
id,name, andemail, sorted bynameascending.
Schema · ecommerce 5 tables
Run previews · Check grades
Write a query, then run it to see results here.
Worked solution Try it yourself first
SELECT
id,
name,
email
FROM
customers
ORDER BY
name
LIMIT
10
OFFSET
10 The shape
OFFSET 10 skips past the first page, LIMIT 10 returns the next ten rows, and the alphabetical sort is what makes "page 2" mean something stable between page loads.
Clause by clause
SELECT id, name, emailpicks the three columns the directory row displays.FROM customersreads the full customer file. The pagination window is carved out later in the pipeline.ORDER BY namesorts alphabetically — the same key the directory uses to define what "page 2" means. Ascending is the default.LIMIT 10 OFFSET 10is the pagination pair.OFFSET 10discards the first ten rows (page 1), andLIMIT 10returns the next ten. David Lee at row 11 lands as the first row of page 2.
Why this and not LIMIT 20
LIMIT 20 would return the first twenty customers — page 1 and page 2 stacked together. The front-end needs page 2 by itself, which is what OFFSET exists for. LIMIT caps the back, OFFSET trims the front, and together they carve out a window in the middle of the sorted result.
The formula behind the offset is OFFSET = (page - 1) * page_size. For a page size of 10, page 2 needs OFFSET 10, page 3 needs OFFSET 20, and so on. The same query shape works for any page by recomputing the offset.
The trap
Drop the ORDER BY and the pagination quietly breaks. Without a sort, PostgreSQL is free to return rows in whatever order is convenient, and "the first ten rows" can shift between runs. A customer on page 2 yesterday might land on page 3 today — or get missed entirely — even though no underlying data changed. OFFSET only means "page 2" when paired with a sort key that defines what page 1 was.
You practiced pairing OFFSET with LIMIT to pull a single page out of a sorted result. The recurring shape: OFFSET skips past prior pages, LIMIT caps the current page — together they implement the everyday "page N of M" pattern.