首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 入門

MySQL ORDER BY 排序查詢全解析:ASC/DESC、多欄位排序與 PHP 實戰

     編輯:MySQL 入門

MySQL ORDER BY 排序查詢全解析:ASC/DESC、多欄位排序與 PHP 實戰

資料讀取後,排序 是呈現邏輯的關鍵:最新文章優先、價格由低到高、依照姓名筆畫序……MySQL 的 ORDER BY 子句提供靈活、強大的排序能力,支援單欄位、多欄位、升序/降序混合指定。

核心語法

SELECT field1, field2, ... 
FROM table_name
[WHERE condition]
ORDER BY field1 [ASC|DESC], field2 [ASC|DESC], ...;
  • ASC:升序(預設),數值由小到大、字串按字典序、日期由舊到新。
  • DESC:降序,相反方向。
  • 可指定多個排序欄位,先按第一欄位排序,相同值再按第二欄位排序,以此類推。
  • 可搭配 WHERE、LIKE 等條件子句。

命令列實戰:runoob_tbl 教程表

升序排列(ASC)— 作者名 A-Z

mysql> SELECT * FROM runoob_tbl ORDER BY runoob_author ASC;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
+-----------+---------------+---------------+-----------------+

降序排列(DESC)— 作者名 Z-A

mysql> SELECT * FROM runoob_tbl ORDER BY runoob_author DESC;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3 | JAVA Tutorial | Sanjay | 2007-05-06 |
| 1 | Learn PHP | John Poul | 2007-05-24 |
| 2 | Learn MySQL | Abdul S | 2007-05-24 |
+-----------+---------------+---------------+-----------------+

進階:多欄位混合排序

需求:先按 submission_date 降序(最新優先),日期相同再按 runoob_author 升序。

mysql> SELECT * FROM runoob_tbl
    -> ORDER BY submission_date DESC, runoob_author ASC;

PHP 腳本整合:動態排序參數

<?php
$order = $_GET['order'] ?? 'DESC'; // ASC 或 DESC
$allowed = ['ASC', 'DESC'];
$order = in_array(strtoupper($order), $allowed) ? strtoupper($order) : 'DESC';

$sql = "SELECT runoob_id, runoob_title, runoob_author, submission_date
        FROM runoob_tbl
        ORDER BY runoob_author $order";

$retval = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($retval)) {
    echo "ID: {$row['runoob_id']} <br>";
    echo "Title: {$row['runoob_title']} <br>";
    echo "Author: {$row['runoob_author']} <br>";
    echo "Date: {$row['submission_date']} <br><hr>";
}
?>

效能優化關鍵點

  1. 索引支援排序: INDEX (runoob_author) 可避免 filesort,大幅提升 ORDER BY runoob_author 效能。
  2. 複合索引順序要匹配: ORDER BY a, b 需 INDEX (a, b),順序一致才能用上索引。
  3. 避免「排序欄位不一致」: ORDER BY a ASC, b DESC 若索引為 (a ASC, b ASC) 可能導致 filesort(MySQL 8.0+ 支援降序索引可解決)。
  4. LIMIT 配合排序: ORDER BY id DESC LIMIT 10 取最新 10 筆,配合主鍵索引極快。

常見誤區提醒

  • 無 ORDER BY 不保證順序: 不加 ORDER BY 時,回傳順序取決於存儲引擎、索引、平行執行計畫,不可依賴。
  • 字串排序受 Collation 影響: utf8mb4_general_ci 不區分大小寫,utf8mb4_bin 區分大小寫且按二進制碼點排序。
  • NULL 排序規則: ASC 時 NULL 在最前,DESC 時 NULL 在最後(可用 ORDER BY col IS NULL, col 自訂)。

靈活運用 ORDER BY,配合合適索引,即能高效實現各類排序需求,讓資料呈現更符合業務邏輯。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved