MySQL GIỚI HẠN & BẮT ĐẦU với các ví dụ

⚡ Tóm tắt thông minh

MySQL Từ khóa LIMIT giới hạn số lượng hàng mà một truy vấn trả về, và giá trị OFFSET quyết định hàng nào mà kết quả bắt đầu. Cả hai cùng nhau giúp giữ cho tập hợp kết quả nhỏ, làm cho trang tải nhanh và hỗ trợ phân trang từng bản ghi.

  • 🔢 Hành vi cốt lõi: LIMIT N trả về tối đa N hàng. Một bảng có ít hơn N hàng sẽ trả về tất cả các hàng mà không báo lỗi.
  • 0️⃣ Trường hợp số 0: LIMIT 0 không trả về hàng nào, do đó đây là một cách tiết kiệm chi phí để kiểm tra siêu dữ liệu cột.
  • 📍 Cú pháp bù trừ: Lệnh LIMIT 1, 2 bỏ qua một hàng và trả về hai hàng, do đó phần bù được ghi trước và số thứ tự hàng được ghi sau.
  • 📄 Công thức đánh số trang: OFFSET bằng kích thước trang nhân với số trang trừ đi một, kết quả sẽ được chuyển thành các trang được đánh số.
  • ↕️ Thứ tự phụ thuộc: Không có ORDER BY, MySQL LIMIT có thể trả về các hàng khác nhau trong mỗi lần chạy, vì vậy LIMIT chỉ mang tính xác định khi có sắp xếp rõ ràng.
  • ⚙️ Hỗ trợ cho tuyên bố: LIMIT cũng giới hạn số hàng bị ảnh hưởng bởi các thao tác UPDATE và DELETE, giúp bảo vệ bảng dữ liệu lớn khỏi tình trạng ghi dữ liệu không giới hạn.
  • 🐢 Lưu ý về hiệu năng: Một độ lệch lớn tạo ra MySQL Đọc và loại bỏ mọi hàng bị bỏ qua, do đó các trang sâu sẽ tăng trưởng chậm hơn.

MySQL GIỚI HẠN và BÙ TRỪ

Từ khóa LIMIT trong là gì? MySQL?

LIMIT Từ khóa này giới hạn số lượng hàng được trả về trong kết quả truy vấn. Nó có thể được sử dụng với các câu lệnh SELECT, UPDATE và DELETE, do đó nó giới hạn số hàng mà truy vấn đọc cũng như số hàng mà thao tác ghi ảnh hưởng đến.

Cú pháp của từ khóa LIMIT như sau.

SELECT {fieldname(s) | *} FROM tableName(s) [WHERE condition] LIMIT N;

tại ĐÂY

  • “CHỌN {tên trường | *} TỪ (các) tên bảng”Câu lệnh SELECT chứa các trường mà chúng tôi muốn trả về trong truy vấn của mình.
  • “[Điều kiện WHERE]” Tham số này là tùy chọn, nhưng khi được cung cấp, nó sẽ chỉ định một bộ lọc trên tập kết quả. Mệnh đề WHERE Lệnh này được áp dụng trước lệnh LIMIT, vì vậy quá trình lọc diễn ra trước và giới hạn được áp dụng cho những gì còn lại.
  • “GIỚI HẠN N” là từ khóa, và N N là bất kỳ số nào bắt đầu từ 0. Đặt giới hạn là 0 sẽ không trả về bản ghi nào cả. Đặt một số như 5 sẽ trả về năm bản ghi. Nếu bảng chứa ít hơn N bản ghi, tất cả các bản ghi sẽ được trả về và không có lỗi nào xảy ra.

Cú pháp ngắn gọn, nhưng lý do tồn tại của nó đáng được nêu rõ trước khi đưa ra ví dụ.

Tại sao chúng ta nên sử dụng từ khóa LIMIT?

Giả sử chúng ta đang phát triểnping Ứng dụng này chạy trên nền tảng myflixdb. Các nhà thiết kế hệ thống đã yêu cầu chúng tôi giới hạn số lượng bản ghi hiển thị trên mỗi trang xuống còn 20 bản ghi để khắc phục tình trạng tải chậm. Làm thế nào để chúng ta triển khai một hệ thống đáp ứng yêu cầu này?

Từ khóa LIMIT xử lý chính xác tình huống này. Thay vì kéo tất cả các hàng thành viên vào ứng dụng và loại bỏ hầu hết chúng, truy vấn trả về 20 bản ghi mỗi trang và cơ sở dữ liệu sẽ thực hiện công việc còn lại. Từ đó, có ba lợi ích.

  • Phản hồi nhanh hơn: Lượng dữ liệu được đọc từ ổ đĩa và lượng dữ liệu truyền qua mạng cũng ít hơn.
  • Giảm mức sử dụng bộ nhớ: Ứng dụng chỉ lưu trữ một trang các hàng, chứ không phải toàn bộ bảng.
  • Safer viết: một GIỚI HẠN về việc CẬP NHẬT hoặc một DELETE Câu lệnh này giới hạn số lượng hàng mà một lỗi có thể ảnh hưởng đến.

MySQL Ví dụ về truy vấn LIMIT

Các ví dụ bên dưới được chạy trên bảng members của cơ sở dữ liệu myflixdb. Ví dụ đầu tiên trả về hai hàng và không có gì hơn.

SELECT * FROM members LIMIT 2;
số thành viên_ tên đầy đủ giới ngày_sinh ngày_đăng_ký địa chỉ vật lý địa chỉ bưu điện số_liên_hệ e-mail số_thẻ_tín_dụng
1 Janet Jones Nữ 21-07-1980 NULL Lô đất đường số 4 số XNUMX Túi riêng 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Nữ 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL

Như kết quả trên cho thấy, chỉ có hai thành viên quay trở lại.

Lấy danh sách mười (10) thành viên từ cơ sở dữ liệu

Giả sử chúng ta muốn lấy danh sách 10 thành viên đăng ký đầu tiên từ cơ sở dữ liệu Myflix. Đoạn mã bên dưới sẽ yêu cầu điều đó.

SELECT * FROM members LIMIT 10;

Việc thực thi đoạn mã sẽ cho ra kết quả như hình bên dưới.

số thành viên_ tên đầy đủ giới ngày_sinh ngày_đăng_ký địa chỉ vật lý địa chỉ bưu điện số_liên_hệ e-mail số_thẻ_tín_dụng
1 Janet Jones Nữ 21-07-1980 NULL Lô đất đường số 4 số XNUMX Túi riêng 0759 253 542 janetjones@yagoo.cm NULL
2 Janet Smith Jones Nữ 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Nam 12-07-1989 NULL Đường số 3 34 NULL 12345 rm@tstreet.com NULL
4 Gloria Williams Nữ 14-02-1984 NULL Đường số 2 23 NULL NULL NULL NULL
5 Leonard Hofstadter Nam NULL NULL Tựa gỗ NULL 845738767 NULL NULL
6 Sheldon Cooper Nam NULL NULL Tựa gỗ NULL 976736763 NULL NULL
7 Rajesh Koothrappali Nam NULL NULL Tựa gỗ NULL 938867763 NULL NULL
8 Leslie Winkle Nam 14-02-1984 NULL Tựa gỗ NULL 987636553 NULL NULL
9 Howard Wolowitz Nam 24-08-1981 NULL Công viên Phía Nam PO Box 4563 987786553 lwolowitz[at]email.me NULL

Chỉ có 9 thành viên được trả về vì N trong mệnh đề LIMIT lớn hơn số lượng bản ghi trong bảng. Yêu cầu trả về 9 hàng một cách rõ ràng cũng cho ra cùng một tập kết quả.

SELECT * FROM members LIMIT 9;

💡 Mẹo: LIMIT chọn các hàng từ bất kỳ thứ tự nào mà máy chủ tạo ra. Thêm một ĐẶT BỞI Điều khoản này được sử dụng bất cứ khi nào danh tính của các hàng là quan trọng, nếu không thì cụm từ "10 thành viên đầu tiên" không đảm bảo sẽ luôn là cùng một chín người hai lần.

Giới hạn số lượng hàng là phần đầu tiên của tính năng. Chọn điểm bắt đầu của cửa sổ là phần thứ hai.

Sử dụng giá trị OFFSET trong truy vấn LIMIT

OFFSET Biến `value` thường được sử dụng cùng với từ khóa `LIMIT`. Nó chỉ định hàng mà máy chủ bắt đầu truy xuất dữ liệu, do đó các hàng trước điểm đó sẽ bị bỏ qua.

Giả sử chúng ta muốn lấy một số lượng thành viên giới hạn bắt đầu từ giữa bảng. Đoạn mã bên dưới bắt đầu từ hàng thứ hai và giới hạn kết quả ở hai bản ghi.

SELECT * FROM `members` LIMIT 1, 2;

Thực thi nó trong MySQL Workbench Khi so sánh với myflixdb, ta thu được kết quả sau.

số thành viên_ tên đầy đủ giới ngày_sinh ngày_đăng_ký địa chỉ vật lý địa chỉ bưu điện số_liên_hệ e-mail số_thẻ_tín_dụng
2 Janet Smith Jones Nữ 23-06-1980 NULL Melrose 123 NULL NULL jj@fstreet.com NULL
3 Robert Phil Nam 12-07-1989 NULL Đường số 3 34 NULL 12345 rm@tstreet.com NULL

Lưu ý rằng ở đây BÙA = 1, do đó hàng số 2 là hàng đầu tiên được trả về, và GIỚI HẠN = 2Do đó, chỉ có 2 bản ghi được trả về.

Ở dạng có hai tham số, độ lệch được viết trước và số thứ tự hàng được viết sau, điều này dễ dẫn đến việc đảo ngược thứ tự một cách vô tình. MySQL Nó cũng chấp nhận một dạng tường minh giúp loại bỏ sự mơ hồ, và đó là dạng nên ưu tiên sử dụng trong mã mới.

SELECT * FROM `members` LIMIT 2 OFFSET 1;

Cả hai câu lệnh đều trả về cùng hai hàng. Khi đã hiểu được độ lệch, mô hình phân trang mà mọi màn hình hiển thị danh sách đều dựa vào sẽ được suy ra trực tiếp từ đó.

Cách phân trang kết quả truy vấn bằng LIMIT và OFFSET

Phân trang chia một tập hợp kết quả lớn thành các trang được đánh số, và LIMIT cùng với OFFSET là cơ chế thực hiện điều đó. Hai giá trị chi phối mọi yêu cầu trang: kích thước trang, tức là số lượng bản ghi hiển thị trên một màn hình, và số trang mà người dùng yêu cầu.

Khoảng cách bù trừ được tính toán từ chúng bằng một công thức duy nhất.

-- OFFSET = page_size * (page_number - 1)
SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 0;   -- page 1

Trang 2 giữ nguyên giới hạn và dịch chuyển vị trí bù trừ về phía trước một kích thước trang.

SELECT membership_number, full_names
FROM members
ORDER BY membership_number ASC
LIMIT 20 OFFSET 20;  -- page 2

Ba quy tắc giúp tạo danh sách phân trang chính xác và nhanh chóng.

  1. Luôn sắp xếp: Một truy vấn phân trang mà không sử dụng mệnh đề ORDER BY có thể hiển thị cùng một bản ghi trên hai trang khác nhau và ẩn hoàn toàn một bản ghi khác, bởi vì máy chủ có quyền thay đổi thứ tự các hàng giữa các lần gọi.
  2. Sắp xếp theo một cột duy nhất: Các giá trị trùng lặp trong cột sắp xếp khiến thứ tự của các hàng trùng lặp không được xác định. Việc sắp xếp theo khóa chính, hoặc thêm khóa chính làm tiêu chí phân định thứ tự trùng lặp, sẽ giải quyết vấn đề này.
  3. Xem các trang ẩn: BÙ TRỪ 100000 lực MySQL Đọc một trăm nghìn dòng và loại bỏ chúng trước khi trả về hai mươi dòng tiếp theo. Thời gian phản hồi tăng lên theo số trang.

Đối với phân trang rất sâu, phân trang theo tập khóa hoàn toàn tránh được việc sử dụng offset. Thay vì đếm số hàng cần bỏ qua, truy vấn sẽ ghi nhớ khóa cuối cùng từ trang trước và yêu cầu các hàng sau đó.

SELECT membership_number, full_names
FROM members
WHERE membership_number > 20      -- last id from the previous page
ORDER BY membership_number ASC
LIMIT 20;

Hình thức này vẫn nhanh ở mọi độ sâu, vì chỉ mục nhảy thẳng đến khóa bắt đầu thay vì duyệt qua các hàng phía trước. Nhược điểm là các trang phải được duyệt theo trình tự, vì vậy việc nhảy...ping Việc chuyển trực tiếp đến trang 500 hiện không còn khả thi.

GIỚI HẠN trong MySQL so với TOP và FETCH FIRST

LIMIT không phải là một phần của mọi ngôn ngữ SQL, điều này rất quan trọng khi một truy vấn cần được chuyển đổi giữa các công cụ cơ sở dữ liệu. MySQL, PostgreSQLvà SQLite Chia sẻ từ khóa LIMIT. SQL Server sử dụng TOP, và Oracle Sử dụng mệnh đề FETCH FIRST tiêu chuẩn. Bảng dưới đây so sánh ba mệnh đề này.

Khoản Động cơ Ví dụ Bỏ qua các hàng
GIỚI HẠN … BÙ TRỪ MySQL, PostgreSQL, SQLite SELECT * FROM members LIMIT 20 OFFSET 40; Vâng, với OFFSET
TOP SQL server CHỌN 20 NGƯỜI HÀNG ĐẦU * TỪ các thành viên; Không, cần phải sử dụng lệnh OFFSET … FETCH.
TÌM HIỂU ĐẦU TIÊN Oracle, Db2, SQL chuẩn SELECT * FROM members FETCH FIRST 20 ROWS ONLY; Vâng, với OFFSET … HÀNG

Cách thức hoạt động là như nhau trong mọi trường hợp: giới hạn số lượng hàng và, tùy chọn, bỏ qua một số hàng trước đó. Chỉ có cách viết là khác nhau. Do đó, một truy vấn cần chạy trên nhiều công cụ khác nhau nên tách biệt điều khoản giới hạn số hàng thay vì phân tán nó trong toàn bộ mã nguồn.

Câu Hỏi Thường Gặp

Đúng vậy. Cả hai đều chấp nhận số hàng đơn giản, chẳng hạn như DELETE TỪ các thành viên GIỚI HẠN 10. Dạng bù trừ hai tham số không được phép ở đó, vì vậy chỉ có thể giới hạn số lượng hàng bị ảnh hưởng.

Chỉ số offset bắt đầu từ 0, vì vậy OFFSET 0 bắt đầu từ hàng đầu tiên và OFFSET 1 bắt đầu từ hàng thứ hai. Số thứ tự hàng là một đại lượng thông thường và được đọc như một số bình thường.

Chạy một câu lệnh SELECT COUNT(*) riêng biệt với cùng mệnh đề WHERE nhưng không có LIMIT. Câu lệnh COUNT cho ứng dụng biết có bao nhiêu trang, trong khi truy vấn LIMIT trả về các hàng của trang hiện tại.

Thường thì đúng vậy. Các trợ lý AI tích hợp trong các ứng dụng khách như... MySQL Workbench Viết lại truy vấn OFFSET thành mệnh đề WHERE trên khóa được nhìn thấy lần cuối. Hãy xác nhận rằng cột sắp xếp là duy nhất và đã được lập chỉ mục trước khi bạn tin tưởng vào kết quả viết lại.

Vì câu lệnh được tạo ra thường bỏ qua mệnh đề ORDER BY. Nếu không có lệnh sắp xếp rõ ràng, MySQL LIMIT có thể trả về các hàng theo bất kỳ thứ tự nào, vì vậy cùng một LIMIT có thể tạo ra một mẫu khác nhau trong mỗi lần chạy. Hãy tự thêm phần sắp xếp.

Tóm tắt bài viết này với: