Trong MariaDB, ROWNUM()
là một hàm dựng sẵn trả về số lượng hàng được chấp nhận hiện tại trong ngữ cảnh hiện tại. Mục đích chính của nó là mô phỏng ROWNUM
cột giả trong Oracle.
ROWNUM()
có thể được sử dụng theo cách có tác dụng tương tự như LIMIT
mệnh đề - để giới hạn số lượng kết quả được trả về bởi một truy vấn.
Khi ở chế độ Oracle, nó có thể được gọi là ROWNUM
(tức là không có dấu ngoặc đơn).
ROWNUM()
chức năng được hỗ trợ từ MariaDB 10.6.1.
Cú pháp
Cú pháp như sau:
ROWNUM()
Không cần đối số hoặc được chấp nhận.
Khi ở chế độ Oracle, nó có thể được gọi mà không có dấu ngoặc đơn, như sau:
ROWNUM
Sử dụng cú pháp này bắt chước ROWNUM
cột giả trong Oracle.
Ví dụ
Hãy chạy một truy vấn trả về tất cả các hàng từ một bảng có tên là Pets
:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets;
Kết quả:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +----------+-------+---------+ 8 rows in set (0.001 sec)
Chúng ta có thể thấy rằng tám hàng đã được trả lại.
Giá trị được trả về bởi ROWNUM()
hàm tăng dần với mỗi hàng. Trong trường hợp này, nó xảy ra trùng với các giá trị trong PetId
nhưng đây hoàn toàn là sự trùng hợp ngẫu nhiên. PetId
cột có thể đã sử dụng bất kỳ giá trị nào, nhưng ROWNUM()
sẽ vẫn như nó ở đây.
Để minh họa ý tôi, hãy tinh chỉnh truy vấn để trả lại ít kết quả hơn:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE PetId > 4;
Kết quả:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 5 | Tweet | | 2 | 6 | Fluffy | | 3 | 7 | Bark | | 4 | 8 | Meow | +----------+-------+---------+ 4 rows in set (0.010 sec)
Giới hạn các hàng được trả về
Như đã đề cập, ROWNUM()
có thể được sử dụng theo cách có tác dụng tương tự như LIMIT
mệnh đề - để giới hạn số lượng kết quả được trả về bởi một truy vấn.
Đây là một ví dụ:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5;
Kết quả:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
Đây là cách chúng tôi sẽ có được hiệu ứng tương tự bằng cách sử dụng LIMIT
mệnh đề:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
LIMIT 5;
Kết quả:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | +----------+-------+---------+ 5 rows in set (0.001 sec)
Có sự khác biệt giữa việc sử dụng LIMIT
và ROWNUM()
để giới hạn các hàng được trả về.
Sự khác biệt chính là LIMIT
hoạt động trên tập kết quả trong khi ROWNUM
hoạt động dựa trên số lượng hàng được chấp nhận (trước bất kỳ ORDER
nào hoặc GROUP BY
mệnh đề).
Dưới đây là một ví dụ minh chứng cho sự khác biệt này:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
WHERE ROWNUM() <= 5
ORDER BY PetId Desc;
Kết quả:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 5 | 5 | Tweet | | 4 | 4 | Wag | | 3 | 3 | Scratch | | 2 | 2 | Fetch | | 1 | 1 | Fluffy | +----------+-------+---------+ 5 rows in set (0.129 sec)
Và đây nó đang sử dụng LIMIT
mệnh đề:
SELECT
ROWNUM(),
PetId,
PetName
FROM Pets
ORDER BY PetId Desc
LIMIT 5;
Kết quả:
+----------+-------+---------+ | ROWNUM() | PetId | PetName | +----------+-------+---------+ | 8 | 8 | Meow | | 7 | 7 | Bark | | 6 | 6 | Fluffy | | 5 | 5 | Tweet | | 4 | 4 | Wag | +----------+-------+---------+ 5 rows in set (0.000 sec)
Bỏ qua dấu ngoặc đơn
Khi chạy ở chế độ Oracle, có thể bỏ qua dấu ngoặc đơn. Làm điều này cho phép bạn mô phỏng ROWNUM
cột giả trong Oracle.
Dưới đây là một ví dụ về việc chuyển sang chế độ Oracle:
SET SQL_MODE='ORACLE';
Bây giờ chúng ta có thể chạy ROWNUM
không có dấu ngoặc đơn:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Kết quả:
+--------+-------+---------+ | ROWNUM | PetId | PetName | +--------+-------+---------+ | 1 | 1 | Fluffy | | 2 | 2 | Fetch | | 3 | 3 | Scratch | | 4 | 4 | Wag | | 5 | 5 | Tweet | | 6 | 6 | Fluffy | | 7 | 7 | Bark | | 8 | 8 | Meow | +--------+-------+---------+ 8 rows in set (0.029 sec)
Lưu ý rằng điều này chỉ khả dụng khi ở chế độ Oracle. Sử dụng ROWNUM
không có dấu ngoặc đơn khi không ở chế độ Oracle dẫn đến lỗi.
Để chứng minh, hãy chuyển sang chế độ mặc định:
SET SQL_MODE=DEFAULT;
Bây giờ hãy chạy lại truy vấn:
SELECT
ROWNUM,
PetId,
PetName
FROM Pets;
Kết quả:
ERROR 1054 (42S22): Unknown column 'ROWNUM' in 'field list'
Xem tài liệu MariaDB để biết một số cân nhắc về tối ưu hóa và các yếu tố khác.