Bài 6: Sắp xếp (ORDER BY) và Giới hạn dữ liệu (LIMIT)


I. Mục đích (Objectives)

Sau bài học này, người đọc sẽ:

  • Hiểu cơ chế sắp xếp dữ liệu mặc định và cách tùy biến với mệnh đề ORDER BY.
  • Phân biệt được sắp xếp tăng dần (ASC) và giảm dần (DESC).
  • Biết cách lấy ra “Top N” dòng dữ liệu đầu tiên bằng LIMIT.
  • Nắm vững kỹ thuật Phân trang (Pagination) bằng sự kết hợp giữa LIMIT và OFFSET – kiến thức nền tảng cho mọi website tin tức hay thương mại điện tử.

II. Yêu cầu (Prerequisites)

III. Nội dung chi tiết (Detailed Content)

1. Sắp xếp dữ liệu với ORDER BY

Mặc định, khi bạn dùng SELECT, thứ tự các dòng trả về là ngẫu nhiên (thường là theo thứ tự lúc bạn nhập liệu – Insert). Để sắp xếp lại, ta dùng ORDER BY.
Cú pháp:

SELECT cot1, cot2
FROM ten_bang
ORDER BY cot_can_sap_xep [ASC | DESC];
  • ASC (Ascending): Tăng dần (Mặc định, không ghi cũng được). A->Z, 0->9.
  • DESC (Descending): Giảm dần. Z->A, 9->0.

Ví dụ 1: Sắp xếp danh sách theo tên (A-Z)
Giáo viên thường cần danh sách theo Alpha để dễ điểm danh.

SELECT * FROM HocSinh
ORDER BY ho_ten ASC; 
-- Có thể viết tắt là: ORDER BY ho_ten

Ví dụ 2: Sắp xếp theo điểm số từ cao xuống thấp
Để xem ai là người điểm cao nhất.

SELECT * FROM HocSinh
ORDER BY diem_tb DESC;

Ví dụ 3: Sắp xếp đa tiêu chí (Nâng cao)
Bài toán: Sắp xếp học sinh theo Điểm giảm dần. Nhưng nếu 2 bạn bằng điểm nhau, thì bạn nào có tên vần A sẽ đứng trước (Tên tăng dần).

SELECT * FROM HocSinh
ORDER BY diem_tb DESC, ho_ten ASC;

Giải thích: Máy tính sẽ ưu tiên sắp xếp theo diem_tb trước. Chỉ khi nào điểm bằng nhau, nó mới xét tiếp đến ho_ten.

2. Giới hạn kết quả với LIMIT (Top N)

Đôi khi bạn có hàng nghìn dòng dữ liệu, nhưng bạn chỉ quan tâm đến vài dòng đầu tiên.
Cú pháp:

SELECT * FROM ten_bang LIMIT so_luong;

Ví dụ 4: Tìm ra 3 học sinh có điểm cao nhất (Top 3)
Đây là sự kết hợp kinh điển: Sắp xếp trước -> Cắt lấy phần ngọn sau.

SELECT * FROM HocSinh
ORDER BY diem_tb DESC
LIMIT 3;

Lưu ý: Nếu bạn dùng LIMIT mà quên ORDER BY, kết quả sẽ là 3 người ngẫu nhiên (hoặc 3 người nhập đầu tiên), điều này hoàn toàn sai về mặt ý nghĩa “Top cao nhất”.

3. Kỹ thuật Phân trang (Pagination) với OFFSET

Giả sử website của bạn có 100 bài viết, bạn không thể hiện hết lên 1 trang vì sẽ làm trang web rất dài và nặng. Bạn chia thành: Trang 1, Trang 2, Trang 3, … Mỗi trang 10 bài. SQLite hỗ trợ việc này qua từ khóa OFFSET (Bỏ qua).
Cú pháp:

LIMIT so_luong_lay OFFSET so_luong_bo_qua;

Ví dụ 5: Mô phỏng phân trang
Giả sử mỗi trang hiển thị 3 học sinh.

  • Trang 1: Lấy 3 người đầu tiên (Top 1, 2, 3).

    SELECT * FROM HocSinh ORDER BY diem_tb DESC LIMIT 3 OFFSET 0;
    -- Hoặc ngắn gọn: LIMIT 3
  • Trang 2: Lấy 3 người tiếp theo (Top 4, 5, 6). Nghĩa là “Bỏ qua” 3 người đầu.

    SELECT * FROM HocSinh ORDER BY diem_tb DESC LIMIT 3 OFFSET 3;
  • Trang 3: Lấy 3 người tiếp nữa (Top 7, 8, 9). Nghĩa là “Bỏ qua” 6 người đầu.

    SELECT * FROM HocSinh ORDER BY diem_tb DESC LIMIT 3 OFFSET 6;

Công thức cho Lập trình viên: Nếu bạn dạy sinh viên viết code phân trang, đây là công thức tổng quát: OFFSET = (Số_thứ_tự_trang – 1) * Số_dòng_mỗi_trang

IV. Tổng kết (Summary)

Hôm nay chúng ta đã nắm được bộ công cụ để trình bày dữ liệu:

  1. ORDER BY: Để sắp xếp trật tự.
  2. LIMIT: Để lấy số lượng bản ghi mong muốn.
  3. OFFSET: Để nhảy cóc, phục vụ phân trang.

Thứ tự ưu tiên của các từ khóa trong câu lệnh SQL: Hãy nhớ câu thần chú này để viết không bị lỗi cú pháp: SELECT -> FROM -> WHERE -> ORDER BY -> LIMIT.
(Ví dụ: Tìm các bạn họ Nguyễn (WHERE), sắp xếp điểm cao nhất (ORDER BY), lấy 3 bạn (LIMIT)).

You may also like...

Để lại một bình luận