Mệnh đề ORDER BY trong MySQL

Mệnh đề ORDER BY trong MySQL
Mệnh đề ORDER BY trong MySQL

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
Trần Thị Vân | Content Creator Web Mới
Trần Thị Vân
Trần Thị Vân là Content Creator tại Web Mới, phụ trách nghiên cứu, biên soạn nội dung và chia sẻ kiến thức về website, SEO, lập trình cùng các xu hướng công nghệ
Đánh giá
Chia sẻ nội dung đánh giá của bạn về Mệnh đề ORDER BY trong MySQL
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 *
Đánh giá của bạn
Tên *
Email
Số điện thoại *
Bình luận, Hỏi đáp
Yêu Cầu Báo Giá
Gửi trang web mẫu cần làm theo, chúng tôi sẽ báo giá đến bạn từ Email (tanlucit09@gmail.com - Bùi Tấn Lực) hoặc Zalo (Lực IT - 0398259259) !