Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Lấy bản ghi đầu tiên và cuối cùng của bảng trong MySQL

Sử dụng UNION kết hợp hai truy vấn với LIMIT 1 và sắp xếp ngược nhau.

Tạo bảng demo

mysql> create table DemoTable694 (
    EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    EmployeeName varchar(100),
    EmployeeSalary int
);
Query OK, 0 rows affected (0.58 sec)

Chèn dữ liệu

mysql> insert into DemoTable694(EmployeeName, EmployeeSalary) values('Chris', 457647);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable694(EmployeeName, EmployeeSalary) values('Robert', 90883);
Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable694(EmployeeName, EmployeeSalary) values('David', 123532);
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable694(EmployeeName, EmployeeSalary) values('Mike', 989322);
Query OK, 1 row affected (0.22 sec)

Hiển thị tất cả

mysql> select * from DemoTable694;

Kết quả

+------------+--------------+----------------+
| EmployeeId | EmployeeName | EmployeeSalary |
+------------+--------------+----------------+
| 1          | Chris        | 457647         |
| 2          | Robert       | 90883          |
| 3          | David        | 123532         |
| 4          | Mike         | 989322         |
+------------+--------------+----------------+
4 rows in set (0.00 sec)

Truy vấn UNION: bản ghi đầu (ASC) và bản ghi cuối (DESC)

mysql> (select * from DemoTable694 order by EmployeeId ASC LIMIT 1)
UNION
(select * from DemoTable694 order by EmployeeId DESC LIMIT 1);

Kết quả

+------------+--------------+----------------+
| EmployeeId | EmployeeName | EmployeeSalary |
+------------+--------------+----------------+
| 1          | Chris        | 457647         |
| 4          | Mike         | 989322         |
+------------+--------------+----------------+
2 rows in set (0.00 sec)

Giải thích:

  • Phần 1: ORDER BY EmployeeId ASC LIMIT 1 → hàng đầu tiên (Id nhỏ nhất).
  • Phần 2: ORDER BY EmployeeId DESC LIMIT 1 → hàng cuối cùng (Id lớn nhất).
  • UNION: Gộp 2 kết quả, loại trùng (nếu bảng chỉ 1 hàng).

Cách khác (MySQL 8.0+): Dùng Window Function:

SELECT * FROM (
  SELECT *, ROW_NUMBER() OVER (ORDER BY EmployeeId) as rn_asc,
         ROW_NUMBER() OVER (ORDER BY EmployeeId DESC) as rn_desc
  FROM DemoTable694
) t WHERE rn_asc = 1 OR rn_desc = 1;