Mệnh đề ORDER BY trong MySQL
Trần Thị Vân
- 1074
- 13/08/2025
Chức năng của Mệnh đề ORDER BY trong MySQL
Mệnh đề ORDER BY trong MySQL được sử dụng để sắp xếp một cột hay nhiều cột theo thứ tự tăng dần hoặc giảm dần, nếu order by hơn một cột thì ưu tiên phần để phía trước.
Code Mệnh đề ORDER BY trong MySQL
select ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 order by id desc;
select ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 order by id asc;
select ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 order by id_cha1 desc,id desc;
<?php
$dbhost = 'localhost';
$dbuser = 'webmoi_userdata'; // Tên username
$dbpass = 'xgZwEfQWE'; // Mật khẩu
// Kết nối đến tên username
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
if(! $conn ){
die('Không kết nối được: ' . mysql_error());
}
// Chọn tên database
mysql_select_db('webmoi_tendata');
// Xét kiểu tiếng việt
mysql_query('SET NAMES "utf8"');
// order by id desc
echo "<b>order by id desc</b><br>";
$sql ="select ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 order by id desc";
$ketquamot = mysql_query($sql,$conn);
if(!$ketquamot){
die('Không thể lấy dữ liệu: ' . mysql_error());
}
// Dùng vòng lặp để lấy ra từng hàng trong bảng
while($row = mysql_fetch_array($ketquamot, MYSQL_ASSOC)){
echo "ID: {$row['id']} <br> ".
"Tên sản phẩm: {$row['ten']} <br> ".
"Giá : {$row['gia']} <br> ".
"--------------------------------<br>";
}
// order by id asc
echo "<b>order by id asc</b><br>";
$sql ="select ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 order by id asc";
$ketquahai = mysql_query($sql,$conn);
if(!$ketquahai){
die('Không thể lấy dữ liệu: ' . mysql_error());
}
// Dùng vòng lặp để lấy ra từng hàng trong bảng
while($row = mysql_fetch_array($ketquahai, MYSQL_ASSOC)){
echo "ID: {$row['id']} <br> ".
"Tên sản phẩm: {$row['ten']} <br> ".
"Giá : {$row['gia']} <br> ".
"--------------------------------<br>";
}
// order by id_cha1 desc,id desc
echo "<b>order by id_cha1 desc,id desc</b><br>";
echo "<b>id_cha1 sắp xếp từ cao tới thấp trước, nếu id_cha1 bằng nhau thì sắp xếp id từ cao tới thấp</b><br>";
$sql ="select ten,id,gia,id_cha1 from tb_sanpham where hienthi=1 order by id_cha1 desc,id desc";
$ketquaba = mysql_query($sql,$conn);
if(!$ketquaba){
die('Không thể lấy dữ liệu: ' . mysql_error());
}
// Dùng vòng lặp để lấy ra từng hàng trong bảng
while($row = mysql_fetch_array($ketquaba, MYSQL_ASSOC)){
echo "ID cha cấp một: {$row['id_cha1']} <br> ".
"ID: {$row['id']} <br> ".
"Tên sản phẩm: {$row['ten']} <br> ".
"Giá : {$row['gia']} <br> ".
"--------------------------------<br>";
}
// Đóng kết nối database
mysql_close($conn);
?>
Kết quả:
order by id desc
ID: 7
Tên sản phẩm: Micro AKG D7 S
Giá : 3400000
--------------------------------
ID: 6
Tên sản phẩm: Micro Shure SM58-LC
Giá : 2700000
--------------------------------
ID: 4
Tên sản phẩm: Dàn âm thanh nghe nhạc AV02
Giá : 30000000
--------------------------------
ID: 3
Tên sản phẩm: Dàn âm thanh nghe nhạc AV01
Giá : 25000000
--------------------------------
ID: 2
Tên sản phẩm: Dàn karaoke gia đình KTreasure TD12 mới nhất
Giá : 44550000
--------------------------------
ID: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure FE12 thương hiệu Đức
Giá : 55000000
--------------------------------
order by id asc
ID: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure FE12 thương hiệu Đức
Giá : 55000000
--------------------------------
ID: 2
Tên sản phẩm: Dàn karaoke gia đình KTreasure TD12 mới nhất
Giá : 44550000
--------------------------------
ID: 3
Tên sản phẩm: Dàn âm thanh nghe nhạc AV01
Giá : 25000000
--------------------------------
ID: 4
Tên sản phẩm: Dàn âm thanh nghe nhạc AV02
Giá : 30000000
--------------------------------
ID: 6
Tên sản phẩm: Micro Shure SM58-LC
Giá : 2700000
--------------------------------
ID: 7
Tên sản phẩm: Micro AKG D7 S
Giá : 3400000
--------------------------------
order by id_cha1 desc,id desc
id_cha1 sắp xếp từ cao tới thấp trước, nếu id_cha1 bằng nhau thì sắp xếp id từ cao tới thấp
ID cha cấp một: 2
ID: 7
Tên sản phẩm: Micro AKG D7 S
Giá : 3400000
--------------------------------
ID cha cấp một: 2
ID: 6
Tên sản phẩm: Micro Shure SM58-LC
Giá : 2700000
--------------------------------
ID cha cấp một: 1
ID: 4
Tên sản phẩm: Dàn âm thanh nghe nhạc AV02
Giá : 30000000
--------------------------------
ID cha cấp một: 1
ID: 3
Tên sản phẩm: Dàn âm thanh nghe nhạc AV01
Giá : 25000000
--------------------------------
ID cha cấp một: 1
ID: 2
Tên sản phẩm: Dàn karaoke gia đình KTreasure TD12 mới nhất
Giá : 44550000
--------------------------------
ID cha cấp một: 1
ID: 1
Tên sản phẩm: Dàn karaoke gia đình KTreasure FE12 thương hiệu Đức
Giá : 55000000
--------------------------------
Những lưu ý khi sử dụng ORDER BY trong MySQL
Khi truy vấn bắt đầu có nhiều điều kiện và dữ liệu lớn, việc sử dụng ORDER BY không chỉ đơn giản là chọn tăng dần hay giảm dần. Cần xác định đúng thứ tự ưu tiên, hiểu cách MySQL xử lý giá trị NULL và cân nhắc hiệu suất để kết quả vừa chính xác vừa nhanh.
Thứ tự ưu tiên khi sắp xếp nhiều cột
Khi có nhiều cột trong ORDER BY, MySQL sẽ sắp xếp theo cột đứng trước trước. Chỉ khi các bản ghi có cùng giá trị ở cột đó, cột tiếp theo mới được dùng để phân loại tiếp.
Ví dụ, truy vấn dưới đây ưu tiên sắp xếp sản phẩm theo danh mục, sau đó mới sắp xếp giá trong từng danh mục:
SELECT *
FROM products
ORDER BY category_id ASC, price DESC;
Điều này có nghĩa là category_id quyết định nhóm dữ liệu trước, còn price chỉ quyết định thứ tự giữa những sản phẩm thuộc cùng một nhóm. Nếu đảo vị trí hai cột, kết quả sắp xếp cũng thay đổi hoàn toàn.
Sự khác biệt giữa ASC, DESC và giá trị NULL
ASC sắp xếp theo thứ tự tăng dần, còn DESC sắp xếp theo thứ tự giảm dần. Tuy nhiên, khi cột có giá trị NULL, kết quả có thể không giống cách hiểu thông thường về giá trị lớn nhất hoặc nhỏ nhất.
Trong MySQL, khi sắp xếp tăng dần, các giá trị NULL được ưu tiên trước các giá trị không phải NULL. Khi sắp xếp giảm dần, chúng thường nằm ở cuối danh sách. Vì vậy, nếu NULL có ý nghĩa đặc biệt trong dữ liệu, nên chủ động xử lý nó thay vì chỉ thay đổi ASC thành DESC.
Tối ưu ORDER BY khi truy vấn nhiều dữ liệu
Với bảng có số lượng bản ghi lớn, ORDER BY có thể trở thành một phần gây tốn tài nguyên nếu MySQL phải sắp xếp một tập dữ liệu lớn sau khi truy vấn. Việc lựa chọn cột sắp xếp phù hợp và xây dựng index đúng cách có thể giúp giảm lượng dữ liệu cần xử lý.
Nếu chỉ cần lấy một số kết quả đầu tiên, nên kết hợp ORDER BY với LIMIT để tránh xử lý và trả về nhiều bản ghi không cần thiết.
SELECT id, name, price
FROM products
ORDER BY price DESC
LIMIT 10;
Ngoài ra, không nên tạo index một cách tùy tiện chỉ vì một cột xuất hiện trong ORDER BY. Hiệu quả thực tế còn phụ thuộc vào điều kiện WHERE, thứ tự các cột trong index và cách MySQL thực hiện toàn bộ truy vấn.
Lời kết
Cảm ơn các bạn đã tham khảo bài viết Mệnh đề ORDER BY trong MySQL.
Tải file database .sql về nếu muốn kiểm tra hoặc thực hành Tải về.
- 0 Bình luận
Email, Điện thoại của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *