MySQL ORDER BY(排序) 语句

我们知道从 MySQL 表中使用 SELECT 语句来读取数据。

如果我们需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字段哪种方式来进行排序,再返回搜索结果。

MySQL ORDER BY(排序) 语句可以按照一个或多个列的值进行升序(ASC)或降序(DESC)排序。

语法

以下是 SELECT 语句使用 ORDER BY 子句将查询数据排序后再返回数据:

SELECT column1, column2, ...
FROM table_name
ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ...;

参数说明:

  • column1, column2, ... 是你要选择的列的名称,如果使用 * 表示选择所有列。
  • table_name 是你要从中查询数据的表的名称。
  • ORDER BY column1 [ASC | DESC], column2 [ASC | DESC], ... 是用于指定排序顺序的子句。ASC 表示升序(默认),DESC 表示降序。

更多说明:

  • 你可以使用任何字段来作为排序的条件,从而返回排序后的查询结果。
  • 你可以设定多个字段来排序。
  • 你可以使用 ASC 或 DESC 关键字来设置查询结果是按升序或降序排列。 默认情况下,它是按升序排列。
  • 你可以添加 WHERE...LIKE 子句来设置条件。

实例

以下是一些 ORDER BY 子句的使用实例。

1. 单列排序:

SELECT * FROM products
ORDER BY product_name ASC;

以上 SQL 语句将选择产品表 products 中的所有产品,并按产品名称升序 ASC 排序。

2. 多列排序:

SELECT * FROM employees
ORDER BY department_id ASC, hire_date DESC;

以上 SQL 语句将选择员工表 employees 中的所有员工,并先按部门 ID 升序 ASC 排序,然后在相同部门中按雇佣日期降序 DESC 排序。

3. 使用数字表示列的位置:

SELECT first_name, last_name, salary
FROM employees
ORDER BY 3 DESC, 1 ASC;

以上 SQL 语句将选择员工表 employees 中的名字和工资列,并按第三列(salary)降序 DESC 排序,然后按第一列(first_name)升序 ASC 排序。

4. 使用表达式排序:

SELECT product_name, price * discount_rate AS discounted_price
FROM products
ORDER BY discounted_price DESC;

以上 SQL 语句将选择产品表 products 中的产品名称和根据折扣率计算的折扣后价格,并按折扣后价格降序 DESC 排序。

5.从 MySQL 8.0.16 版本开始,可以使用 NULLS FIRST 或 NULLS LAST 处理 NULL 值:

SELECT product_name, price
FROM products
ORDER BY price DESC NULLS LAST;

以上 SQL 语句将选择产品表 products 中的产品名称和价格,并按价格降序 DESC 排序,将 NULL 值排在最后。

相反,如果你想让 NULL 值排在前面,可以这样写:

SELECT product_name, price
FROM products
ORDER BY price DESC NULLS FIRST;

ORDER BY 子句是一个强大的工具,可以根据不同的业务需求对查询结果进行排序。在实际应用中,注意选择适当的列和排序顺序,以获得符合期望的排序效果。


在命令提示符中使用 ORDER BY 子句

以下将在 SELECT 语句中使用 ORDER BY 子句来读取 MySQL 数据表 runoob_tbl 中的数据:

实例

尝试以下实例,结果将按升序及降序排列。

SQL 排序

mysql> use RUNOOB;
Database changed
mysql> SELECT * from runoob_tbl ORDER BY submission_date ASC;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
| 1         | 学习 PHP    | 教程      | 2017-04-12      |
| 2         | 学习 MySQL  | 教程      | 2017-04-12      |
+-----------+---------------+---------------+-----------------+
4 rows in set (0.01 sec)
 
mysql> SELECT * from runoob_tbl ORDER BY submission_date DESC;
+-----------+---------------+---------------+-----------------+
| runoob_id | runoob_title  | runoob_author | submission_date |
+-----------+---------------+---------------+-----------------+
| 1         | 学习 PHP    | 教程      | 2017-04-12      |
| 2         | 学习 MySQL  | 教程      | 2017-04-12      |
| 4         | 学习 Python | RUNOOB.COM    | 2016-03-06      |
| 3         | 学习 Java   | RUNOOB.COM    | 2015-05-01      |
+-----------+---------------+---------------+-----------------+
4 rows in set (0.01 sec)

读取 runoob_tbl 表中所有数据并按 submission_date 字段的升序排列。


在 PHP 脚本中使用 ORDER BY 子句

你可以使用 PHP 函数的 mysqli_query() 及相同的 SELECT 带上 ORDER BY 子句的命令来获取数据。

该函数用于执行 SQL 命令,然后通过 PHP 函数 mysqli_fetch_array() 来输出所有查询的数据。

实例

尝试以下实例,查询后的数据按 submission_date 字段的降序排列后返回。

MySQL ORDER BY 测试:

<?php
$dbhost = 'localhost';  // mysql服务器主机地址
$dbuser = 'root';            // mysql用户名
$dbpass = '123456';          // mysql用户名密码
$conn = mysqli_connect($dbhost, $dbuser, $dbpass);
if(! $conn )
{
    die('连接失败: ' . mysqli_error($conn));
}
// 设置编码,防止中文乱码
mysqli_query($conn , "set names utf8");
 
$sql = 'SELECT runoob_id, runoob_title, 
        runoob_author, submission_date
        FROM runoob_tbl
        ORDER BY  submission_date ASC';
 
mysqli_select_db( $conn, 'RUNOOB' );
$retval = mysqli_query( $conn, $sql );
if(! $retval )
{
    die('无法读取数据: ' . mysqli_error($conn));
}
echo '<h2>教程 MySQL ORDER BY 测试<h2>';
echo '<table border="1"><tr><td>教程 ID</td><td>标题</td><td>作者</td><td>提交日期</td></tr>';
while($row = mysqli_fetch_array($retval, MYSQLI_ASSOC))
{
    echo "<tr><td> {$row['runoob_id']}</td> ".
         "<td>{$row['runoob_title']} </td> ".
         "<td>{$row['runoob_author']} </td> ".
         "<td>{$row['submission_date']} </td> ".
         "</tr>";
}
echo '</table>';
mysqli_close($conn);
?>
### MySQLORDER BY 排序方法及使用示例 在 MySQL 中,`ORDER BY` 子句用于对查询结果集按照一个或多个列进行排序。默认情况下,排序方式为升序(ASC),但也可以通过指定 `DESC` 关键字实现降序排序。 #### 基本语法 ```sql SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...; ``` #### 简单排序示例 假设有一个名为 `order_test` 的表,其中包含一个 `score` 字段。要按照 `score` 升序排列所有记录,可以使用以下 SQL 语句: ```sql SELECT * FROM order_test ORDER BY score ASC; ``` 此查询将返回 `order_test` 表中的所有记录,并按 `score` 字段的值从小到大排序[^1]。 #### 多字段排序 如果需要根据多个字段进行排序,可以在 `ORDER BY` 后面列出这些字段,并为每个字段指定排序方向。例如,先按 `province` 升序,再按 `city` 降序: ```sql SELECT * FROM order_test ORDER BY province ASC, city DESC; ``` 在这种情况下,MySQL 会首先按照 `province` 字段的拼音首字母 ASCII 规则进行排序。如果多个记录的 `province` 相同,则进一步按照 `city` 字段的拼音首字母进行降序排列[^3]。 #### 使用索引优化排序 当处理大量数据时,为了提高排序效率,可以考虑为经常用于排序的字段添加索引。如果查询能够利用索引完成排序MySQL 将不会执行额外的排序操作,从而减少资源消耗。例如,如果 `city` 和 `name` 字段已经被包含在一个覆盖索引中,那么以下查询可以直接使用索引而无需额外排序: ```sql SELECT city, name FROM order_test ORDER BY city, name; ``` 在这种情况下,查询的执行计划中的 `Extra` 字段会显示 `Using index`,表明没有发生 `filesort` 操作[^4]。 #### 降序排序示例 若希望按某个字段进行降序排序,可以使用 `DESC` 关键字。例如,要按 `score` 字段降序排列: ```sql SELECT * FROM order_test ORDER BY score DESC; ``` 此查询将返回 `order_test` 表中的所有记录,并按 `score` 字段的值从大到小排序[^1]。 #### 结合 WHERE 条件使用 `ORDER BY` 通常与 `WHERE` 子句一起使用,以先筛选出符合条件的数据,再对其进行排序。例如: ```sql SELECT * FROM order_test WHERE province = 'Beijing' ORDER BY score DESC; ``` 此查询将仅返回 `province` 为 'Beijing' 的记录,并按 `score` 字段降序排列。 #### 性能注意事项 - **索引使用**:确保排序字段上有合适的索引,以避免 `filesort` 操作,提高查询性能[^2]。 - **避免不必要的排序**:如果查询结果不需要排序,应省略 `ORDER BY` 子句,以减少数据库负担。 - **合理选择排序字段**:尽量选择区分度高的字段进行排序,以提高排序效率。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值