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.
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” là 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ệ | 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ệ | 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ệ | 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.
- 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.
- 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.
- 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.

