MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

MariaDB ROWNUM () Giải thích

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 LIMITROWNUM() để 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MariaDB JSON_MERGE_PATCH () Giải thích

  2. Tổng quan về Phân cụm ProxySQL trong ClusterControl

  3. Cài đặt WordPress với Nginx, MariaDB 10 và PHP 7 trên Debian 9

  4. Cách bảo vệ cơ sở dữ liệu MySQL &MariaDB của bạn trước các cuộc tấn công mạng khi ở trên mạng công cộng

  5. Cách NOT RLIKE hoạt động trong MariaDB