本教程将演示如何使用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子句之后。
要对结果集进行排序,请指定要排序的列以及排序顺序的类型:
asc
表示)desc
表示)如果未指定排序顺序,则数据库系统通常默认按升序(asc
)对结果集进行排序。
当在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
列的值的字母顺序进行排序。
要将员工按名字(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 su
和alexander lee
的位置变化。
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
除了字符和数字,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
子句根据一个或多个列的升序或降序来对结果集进行排序。