Sắp xếp và phân trang
Nội dung bài · 5 mục
- 1.Khái niệm
- 2.Ví dụ
- 3.Thử ngay
- 4.Lỗi hay gặp
- 5.Tóm tắt
Trang chủ cửa hàng chỉ hiện 3 món đắt nhất. Trang danh sách thì chia mỗi trang vài món, bấm "trang sau" để xem tiếp. Cả hai việc đều cần sắp xếp rồi lấy đúng một đoạn kết quả.
Khái niệm
↕️ ORDER BY: sắp xếp kết quả theo một hay nhiều cột, ASC là tăng dần (mặc định), DESC là giảm dần.
📄 Phân trang (pagination): chỉ lấy một đoạn của kết quả, trong Oracle viết bằng OFFSET ... ROWS FETCH NEXT ... ROWS ONLY.
Ví dụ
SELECT name, price
FROM products
ORDER BY price DESC
FETCH FIRST 3 ROWS ONLY;ORDER BY price DESC: giá cao xếp trước.FETCH FIRST 3 ROWS ONLY: chỉ lấy 3 dòng đầu sau khi đã sắp xếp.- Sắp theo nhiều cột:
ORDER BY city, name. Trùng thành phố thì xếp tiếp theo tên.
Trang thứ hai, mỗi trang 2 món:
SELECT name, price
FROM products
ORDER BY price DESC
OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY;OFFSET 2 ROWS bỏ qua 2 dòng của trang đầu, FETCH NEXT 2 ROWS ONLY lấy 2
dòng tiếp theo. Muốn lấy trang thứ n thì bỏ qua
(n - 1) × số dòng mỗi trang dòng.
Thử ngay
SELECT name, price
FROM products
ORDER BY price
OFFSET 1 ROWS FETCH NEXT 3 ROWS ONLY;Đoán trước khi chạy: sắp giá tăng dần, bỏ qua 1 dòng rồi lấy 3 dòng. Những món nào được lấy?
Xem kết quả
| NAME | PRICE |
|---|---|
| Thước | 7000 |
| Vở | 12000 |
| Balo | 350000 |
Sắp tăng dần là Bút bi, Thước, Vở, Balo, Máy tính. Bỏ qua Bút bi, lấy ba món tiếp theo.
Lỗi hay gặp
Phân trang mà không ORDER BY. Không có ORDER BY thì Oracle không đảm bảo
thứ tự nào cả, trang 2 có thể lặp lại món đã có ở trang 1.
-- SAI — thứ tự không xác định
SELECT name FROM products
OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY;-- ĐÚNG
SELECT name FROM products
ORDER BY product_id
OFFSET 2 ROWS FETCH NEXT 2 ROWS ONLY;Dùng ROWNUM kèm ORDER BY trong cùng một câu. Code Oracle cũ hay viết
như dưới. ROWNUM được đánh số trước khi sắp xếp, nên câu này lấy 3 dòng
bất kỳ rồi mới sắp, không phải 3 món đắt nhất.
-- SAI — không phải 3 món đắt nhất
SELECT name, price FROM products
WHERE ROWNUM <= 3
ORDER BY price DESC;-- ĐÚNG
SELECT name, price FROM products
ORDER BY price DESC
FETCH FIRST 3 ROWS ONLY;Tóm tắt
ORDER BY cộtsắp tăng dần, thêmDESCđể sắp giảm dần.FETCH FIRST n ROWS ONLYlấy n dòng đầu.- Phân trang:
OFFSET bỏ_qua ROWS FETCH NEXT số_dòng ROWS ONLY. - Luôn
ORDER BYtrước khi lấy một đoạn kết quả. TránhROWNUMkèmORDER BY.
Tự kiểm tra
0/3 câuMỗi trang 10 sản phẩm. Trang thứ 3 viết thế nào?
Muốn xem khách mới nhất trước, sắp theo ngày tạo. Viết thế nào?
Danh sách phân trang viết ORDER BY price. Hai món cùng giá 7000, lúc thì nằm ở trang 1, lúc lại ở trang 2. Sửa thế nào?