zoukankan      html  css  js  c++  java
  • 如何使用SQL ORDER BY子句按升序或降序进行排序

    本教程将演示如何使用SQL ORDER BY子句根据指定的标准按升序或降序对结果集进行排序。

    1. SQL ORDER BY子句简介

    当使用SELECT语句查询表中的数据时,结果集中显示的行的顺序可能与您的预期不符。

    在某些情况下,结果集中显示的行按其物理存储在表中的顺序排列。 但是,如果查询优化器使用索引来处理查询,则行记录将显示为它们以索引键顺序存储。 因此,结果集中的行顺序未确定或不可预测。

    查询优化器是数据库系统中的内置软件组件,用于确定SQL语句查询请求数据的最有效方式。

    要准确指定结果集中的行顺序,请在SELECT语句中添加使用ORDER BY子句,如下所示:

    SELECT 
        column1, column2
    FROM
        table_name
    ORDER BY column1 ASC , 
             column2 DESC;
    

    在此语法中,ORDER BY子句放在FROM子句之后。 如果SELECT语句包含WHERE子句,则ORDER BY子句必须放在WHERE子句之后。

    更多教程请访问 http://www.manongzj.com

    要对结果集进行排序,请指定要排序的列以及排序顺序的类型:

    • 升序(使用:ASC表示)
    • 降序(使用:DESC表示)

    如果未指定排序顺序,则数据库系统通常默认按升序(ASC)对结果集进行排序。

    当在ORDER BY子句中包含多个列时,数据库系统首先根据第一列对结果集进行排序,然后根据第二列对排序的结果集进行排序,依此类推。

    2. SQL ORDER BY子句示例

    我们将使用示例数据库中的employees表进行演示。

    SELECT
        employee_id,
        first_name,
        last_name,
        hire_date,
        salary
    FROM
        employees;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+------------+--------+
    | employee_id | first_name | last_name | hire_date  | salary |
    +-------------+------------+-----------+------------+--------+
    |         100 | Steven     | Lee       | 1987-06-17 | 24000  |
    |         101 | Neena      | Wong      | 1989-09-21 | 17000  |
    |         102 | Lex        | Liang     | 1993-01-13 | 17000  |
    |         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
    |         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
    |         105 | David      | Liang     | 1997-06-25 | 4800   |
    |         106 | Valli      | Chen      | 1998-02-05 | 4800   |
    |         107 | Diana      | Chen      | 1999-02-07 | 4200   |
    ... ...
    |         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
    |         201 | Michael    | Zhou      | 1996-02-17 | 13000  |
    |         202 | Pat        | Zhou      | 1997-08-17 | 6000   |
    |         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
    |         204 | Hermann    | Wu        | 1994-06-07 | 10000  |
    |         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
    |         206 | William    | Wu        | 1994-06-07 | 8300   |
    +-------------+------------+-----------+------------+--------+
    40 rows in set
    

    似乎行记录显示为存储在employees表中顺序。 要按字母顺序按名字对员工进行排序,请按如下方式添加ORDER BY子句进行查询:

    SELECT
        employee_id,
        first_name,
        last_name,
        hire_date,
        salary
    FROM
        employees
    ORDER BY
        first_name;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+------------+--------+
    | employee_id | first_name | last_name | hire_date  | salary |
    +-------------+------------+-----------+------------+--------+
    |         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
    |         115 | Alexander  | Su        | 1995-05-18 | 3100   |
    |         114 | Avg        | Su        | 1994-12-07 | 11000  |
    |         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
    |         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
    ... ...
    |         117 | Sigal      | Zhang     | 1997-07-24 | 3000   |
    |         100 | Steven     | Lee       | 1987-06-17 | 24000  |
    |         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
    |         106 | Valli      | Chen      | 1998-02-05 | 4800   |
    |         206 | William    | Wu        | 1994-06-07 | 8300   |
    +-------------+------------+-----------+------------+--------+
    40 rows in set
    

    现在,结果集按first_name列的值的字母顺序进行排序。

    3. SQL ORDER BY - 按多列排序示例

    要将员工按名字(first_name)列升序排列,然后再按姓氏(last_name)降序排序,请使用以下语句:

    SELECT
        employee_id,
        first_name,
        last_name,
        hire_date,
        salary
    FROM
        employees
    ORDER BY
        first_name,
        last_name DESC;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+------------+--------+
    | employee_id | first_name | last_name | hire_date  | salary |
    +-------------+------------+-----------+------------+--------+
    |         115 | Alexander  | Su        | 1995-05-18 | 3100   |
    |         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
    |         114 | Avg        | Su        | 1994-12-07 | 11000  |
    |         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
    |         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
    |         179 | Charles    | Yang      | 2000-01-04 | 6200   |
    ... ...
    |         113 | Min        | Su        | 1999-12-07 | 6900   |
    |         122 | Min        | Liu       | 1995-05-01 | 7900   |
    |         108 | Nancy      | Chen      | 1994-08-17 | 12000  |
    |         101 | Neena      | Wong      | 1989-09-21 | 17000  |
    |         202 | Pat        | Zhou      | 1997-08-17 | 6000   |
    |         192 | Sarah      | Zhang     | 1996-02-04 | 4000   |
    |         123 | Shanta     | Liu       | 1997-10-10 | 6500   |
    |         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
    |         116 | Shelli     | Zhang     | 1997-12-24 | 3000   |
    |         117 | Sigal      | Zhang     | 1997-07-24 | 3000   |
    |         100 | Steven     | Lee       | 1987-06-17 | 24000  |
    |         203 | Susan      | Zhou      | 1994-06-07 | 6500   |
    |         106 | Valli      | Chen      | 1998-02-05 | 4800   |
    |         206 | William    | Wu        | 1994-06-07 | 8300   |
    +-------------+------------+-----------+------------+--------+
    40 rows in set
    

    首先,数据库系统按升序对第一列(first_name)的结果集进行排序,然后按降序对按姓氏(last_name)排序的排序结果进行排序。 请注意两名员工:Alexander SuAlexander Lee的位置变化。

    4. SQL ORDER BY - 按数字列示例排序

    SQL用于按字母顺序对数据进行排序,如上例所示,并以数字方式对数据进行排序。 例如,以下语句选择员工数据,并按降序对薪水(salary)列结果进行排序:

    SELECT
        employee_id,
        first_name,
        last_name,
        hire_date,
        salary
    FROM
        employees
    ORDER BY
        salary DESC;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+------------+--------+
    | employee_id | first_name | last_name | hire_date  | salary |
    +-------------+------------+-----------+------------+--------+
    |         100 | Steven     | Lee       | 1987-06-17 | 24000  |
    |         101 | Neena      | Wong      | 1989-09-21 | 17000  |
    |         102 | Lex        | Liang     | 1993-01-13 | 17000  |
    |         145 | John       | Liu       | 1996-10-01 | 14000  |
    |         146 | Karen      | Liu       | 1997-01-05 | 13500  |
    |         201 | Michael    | Zhou      | 1996-02-17 | 13000  |
    |         108 | Nancy      | Chen      | 1994-08-17 | 12000  |
    |         205 | Shelley    | Wu        | 1994-06-07 | 12000  |
    ... ...
    |         193 | Britney    | Zhao      | 1997-03-03 | 3900   |
    |         115 | Alexander  | Su        | 1995-05-18 | 3100   |
    |         116 | Shelli     | Zhang     | 1997-12-24 | 2900   |
    |         117 | Sigal      | Zhang     | 1997-07-24 | 2800   |
    |         126 | Irene      | Liu       | 1998-09-28 | 2700   |
    |         118 | Guy        | Zhang     | 1998-11-15 | 2600   |
    |         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
    +-------------+------------+-----------+------------+--------+
    40 rows in set
    

    5. SQL ORDER BY - 按日期排序示例

    除了字符和数字,SQL还可以按日期对结果集进行排序。 以下语句按hire_date列中的值按升序对员工进行排序。

    SELECT
        employee_id,
        first_name,
        last_name,
        hire_date,
        salary
    FROM
        employees
    ORDER BY
        hire_date;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+------------+--------+
    | employee_id | first_name | last_name | hire_date  | salary |
    +-------------+------------+-----------+------------+--------+
    |         100 | Steven     | Lee       | 1987-06-17 | 24000  |
    |         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
    |         101 | Neena      | Wong      | 1989-09-21 | 17000  |
    |         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
    |         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
    |         102 | Lex        | Liang     | 1993-01-13 | 17000  |
    |         204 | Hermann    | Wu        | 1994-06-07 | 10000  |
    ......
    |         107 | Diana      | Chen      | 1999-02-07 | 4200   |
    |         178 | Kimberely  | Yang      | 1999-05-24 | 7000   |
    |         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
    |         113 | Min        | Su        | 1999-12-07 | 6900   |
    |         179 | Charles    | Yang      | 2000-01-04 | 6200   |
    +-------------+------------+-----------+------------+--------+
    40 rows in set
    

    要查看刚刚加入公司的最新员工,可以按雇用日期(hire_date)的降序对员工进行排序,如下面的语句所示:

    SELECT
        employee_id,
        first_name,
        last_name,
        hire_date,
        salary
    FROM
        employees
    ORDER BY
        hire_date DESC;
    

    执行上面查询语句,得到以下结果 -

    +-------------+------------+-----------+------------+--------+
    | employee_id | first_name | last_name | hire_date  | salary |
    +-------------+------------+-----------+------------+--------+
    |         179 | Charles    | Yang      | 2000-01-04 | 6200   |
    |         113 | Min        | Su        | 1999-12-07 | 6900   |
    |         119 | Karen      | Zhang     | 1999-08-10 | 2500   |
    |         178 | Kimberely  | Yang      | 1999-05-24 | 7000   |
    ......
    |         104 | Bruce      | Wong      | 1991-05-21 | 6000   |
    |         103 | Alexander  | Lee       | 1990-01-03 | 9000   |
    |         101 | Neena      | Wong      | 1989-09-21 | 17000  |
    |         200 | Jennifer   | Zhao      | 1987-09-17 | 4400   |
    |         100 | Steven     | Lee       | 1987-06-17 | 24000  |
    +-------------+------------+-----------+------------+--------+
    40 rows in set
    

    在本教程中,您学习了如何使用SQL ORDER BY子句根据一个或多个列的升序或降序来对结果集进行排序。

  • 相关阅读:
    实现两个整数变量的互换
    Js中replace替换所有*
    下载win10系统
    Linux网络基本网络配置方法介绍
    搭建Linux虚拟服务器
    解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
    详细QRCode生成二维码和下载实现案例
    Win10中Vue.js的安装和项目搭建
    什么是Docker,它可干什么?
    Win10下搭建Git服务器
  • 原文地址:https://www.cnblogs.com/myhomepages/p/15822651.html
Copyright © 2011-2022 走看看